diff --git a/.github/workflows/Dockerfile b/.github/workflows/Dockerfile new file mode 100644 index 0000000000..371931a5e4 --- /dev/null +++ b/.github/workflows/Dockerfile @@ -0,0 +1,24 @@ +# GitHub action dockerfile +# Requires docker experimental features as buildx and BuildKit so not suitable for developers regular use. +# https://docs.docker.com/develop/develop-images/build_enhancements/#to-enable-buildkit-builds + +########################### +# Build binaries stage +########################### +FROM --platform=$BUILDPLATFORM golang:1.17.8-alpine3.15 AS build +ADD . /app +WORKDIR /app +# Arguments required to build binaries targetting the correct OS and CPU architectures +ARG TARGETOS TARGETARCH +# Actually building the binaries +RUN GOOS=$TARGETOS GOARCH=$TARGETARCH go install -v . ./cmd/... + +########################### +# Build docker image stage +########################### +FROM alpine:3.15 +COPY --from=build /go/bin /bin +# 8333 Mainnet Bitcoin peer-to-peer port +# 8334 Mainet RPC port +EXPOSE 8333 8334 +ENTRYPOINT ["btcd"] diff --git a/.github/workflows/dimagespub.yml b/.github/workflows/dimagespub.yml new file mode 100644 index 0000000000..19056ee07b --- /dev/null +++ b/.github/workflows/dimagespub.yml @@ -0,0 +1,52 @@ +name: Docker images build and publish + +on: + push: + tags: + - v* + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + # Build for default OS, linux, and common CPU architectures + # Reference https://github.com/docker/setup-buildx-action#quick-start + TPLATFORMS: linux/amd64,linux/arm64,linux/arm,linux/386 + +jobs: + build-push: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Docker Setup Buildx + id: buildx + uses: docker/setup-buildx-action@94ab11c41e45d028884a99163086648e898eed25 + + - name: Log in to the Container registry + uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + + - name: Build and push Docker images + uses: docker/build-push-action@ac9327eae2b366085ac7f6a2d02df8aa8ead720a + with: + file: .github/workflows/Dockerfile + labels: ${{ steps.meta.outputs.labels }} + platforms: ${{ env.TPLATFORMS }} + push: true + tags: ${{ steps.meta.outputs.tags }} diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml new file mode 100644 index 0000000000..c1625428d3 --- /dev/null +++ b/.github/workflows/go.yml @@ -0,0 +1,87 @@ +name: Build and Test +on: [push, pull_request] + +env: + # go needs absolute directories, using the $HOME variable doesn't work here. + GOCACHE: /home/runner/work/go/pkg/build + GOPATH: /home/runner/work/go + GO_VERSION: 1.17.5 + +jobs: + build: + name: Build + runs-on: ubuntu-latest + steps: + - name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: ${{ env.GO_VERSION }} + + - name: Check out source + uses: actions/checkout@v2 + + - name: Build + run: make build + + test-cover: + name: Unit coverage + runs-on: ubuntu-latest + steps: + - name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: ${{ env.GO_VERSION }} + + - name: Check out source + uses: actions/checkout@v2 + + - name: Test + run: make unit-cover + + - name: Send top-level coverage + uses: shogo82148/actions-goveralls@v1 + with: + path-to-profile: coverage.txt + flag-name: btcd + parallel: true + + - name: Send btcec + uses: shogo82148/actions-goveralls@v1 + with: + path-to-profile: btcec/coverage.txt + flag-name: btcec + parallel: true + + - name: Send btcutil coverage + uses: shogo82148/actions-goveralls@v1 + with: + path-to-profile: btcutil/coverage.txt + flag-name: btcutil + parallel: true + + - name: Send btcutil coverage for psbt package + uses: shogo82148/actions-goveralls@v1 + with: + path-to-profile: btcutil/psbt/coverage.txt + flag-name: btcutilpsbt + parallel: true + + - name: Notify coveralls all reports sent + uses: shogo82148/actions-goveralls@v1 + with: + parallel-finished: true + + test-race: + name: Unit race + runs-on: ubuntu-latest + steps: + - name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: ${{ env.GO_VERSION }} + + - name: Check out source + uses: actions/checkout@v2 + + - name: Test + run: make unit-race diff --git a/.gitignore b/.gitignore index 72fb9416ea..1e5a40ca27 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,23 @@ _cgo_export.* _testmain.go *.exe + +# Code coverage files +profile.tmp +profile.cov +coverage.txt +btcec/coverage.txt +btcutil/coverage.txt +btcutil/psbt/coverage.txt + +# vim +*.swp +*.swo +/.vim + +# Binaries produced by "make build" +/addblock +/btcctl +/btcd +/findcheckpoint +/gencerts diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 5063496735..0000000000 --- a/.travis.yml +++ /dev/null @@ -1,19 +0,0 @@ -language: go -cache: - directories: - - $GOCACHE - - $GOPATH - - $GOPATH/pkg/mod - - $GOPATH/github.com/golang - - $GOPATH/gopkg.in/alecthomas -go: - - "1.13.x" -sudo: false -install: - - export PATH=$PATH:$PWD/linux-amd64/ - - GO111MODULE=on go install . ./cmd/... - - GO111MODULE=off go get -u gopkg.in/alecthomas/gometalinter.v2 - - GO111MODULE=off gometalinter.v2 --install -script: - - export PATH=$PATH:$HOME/gopath/bin - - ./goclean.sh diff --git a/CHANGES b/CHANGES index 6f7013e922..4e359222b8 100644 --- a/CHANGES +++ b/CHANGES @@ -3,6 +3,281 @@ User visible changes for btcd A full-node bitcoin implementation written in Go ============================================================================ +Changes in 0.22.0 (Tue Jun 01 2021) + - Protocol and network-related changes: + - Add support for witness tx and block in notfound msg (#1625) + - Add support for receiving sendaddrv2 messages from a peer (#1670) + - Fix bug in peer package causing last block height to go backwards + (#1606) + - Add chain parameters for connecting to the public Signet network + (#1692, #1718) + - Crypto changes: + - Fix bug causing panic due to bad R and S signature components in + btcec.RecoverCompact (#1691) + - Set the name (secp256k1) in the CurveParams of the S256 curve + (#1565) + - Notable developer-related package changes: + - Remove unknown block version warning in the blockchain package, + due to false positives triggered by AsicBoost (#1463) + - Add chaincfg.RegisterHDKeyID function to populate HD key ID pairs + (#1617) + - Add new method mining.AddWitnessCommitment to add the witness + commitment as an OP_RETURN output within the coinbase transaction. + (#1716) + - RPC changes: + - Support Batch JSON-RPC in rpcclient and server (#1583) + - Add rpcclient method to invoke getdescriptorinfo JSON-RPC command + (#1578) + - Update the rpcserver handler for validateaddress JSON-RPC command to + have parity with the bitcoind 0.20.0 interface (#1613) + - Add rpcclient method to invoke getblockfilter JSON-RPC command + (#1579) + - Add signmessagewithprivkey JSON-RPC command in rpcserver (#1585) + - Add rpcclient method to invoke importmulti JSON-RPC command (#1579) + - Add watchOnly argument in rpcclient method to invoke + listtransactions JSON-RPC command (#1628) + - Update btcjson.ListTransactionsResult for compatibility with Bitcoin + Core 0.20.0 (#1626) + - Support nullable optional JSON-RPC parameters (#1594) + - Add rpcclient and server method to invoke getnodeaddresses JSON-RPC + command (#1590) + - Add rpcclient methods to invoke PSBT JSON-RPC commands (#1596) + - Add rpcclient method to invoke listsinceblock with the + include_watchonly parameter enabled (#1451) + - Add rpcclient method to invoke deriveaddresses JSON-RPC command + (#1631) + - Add rpcclient method to invoke getblocktemplate JSON-RPC command + (#1629) + - Add rpcclient method to invoke getaddressinfo JSON-RPC command + (#1633) + - Add rpcclient method to invoke getwalletinfo JSON-RPC command + (#1638) + - Fix error message in rpcserver when an unknown RPC command is + encountered (#1695) + - Fix error message returned by estimatefee when the number of blocks + exceeds the max depth (#1678) + - Update btcjson.GetBlockChainInfoResult to include new fields in + Bitcoin Core (#1676) + - Add ExtraHeaders in rpcclient.ConnConfig struct (#1669) + - Fix bitcoind compatibility issue with the sendrawtransaction + JSON-RPC command (#1659) + - Add new JSON-RPC errors to btcjson package, and documented them + (#1648) + - Add rpcclient method to invoke createwallet JSON-RPC command + (#1650) + - Add rpcclient methods to invoke backupwallet, dumpwallet, loadwallet + and unloadwallet JSON-RPC commands (#1645) + - Fix unmarshalling error in getmininginfo JSON-RPC command, for valid + integers in scientific notation (#1644) + - Add rpcclient method to invoke gettxoutsetinfo JSON-RPC command + (#1641) + - Add rpcclient method to invoke signrawtransactionwithwallet JSON-RPC + command (#1642) + - Add txid to getblocktemplate response of rpcserver (#1639) + - Fix monetary unit used in createrawtransaction JSON-RPC command in + rpcserver (#1614) + - Add rawtx field to btcjson.GetBlockVerboseTxResult to provide + backwards compatibility with older versions of Bitcoin Core (#1677) + - Misc changes: + - Update btcutil dependency (#1704) + - Add Dockerfile to build and run btcd on Docker (#1465) + - Rework documentation and publish on https://btcd.readthedocs.io (#1468) + - Add support for Go 1.15 (#1619) + - Add Go 1.14 as the minimum supported version of Golang (#1621) + - Contributors (alphabetical order): + - 10gic + - Andrew Tugarinov + - Anirudha Bose + - Appelberg-s + - Armando Ochoa + - Aurèle Oulès + - Calvin Kim + - Christian Lehmann + - Conner Fromknecht + - Dan Cline + - David Mazary + - Elliott Minns + - Federico Bond + - Friedger Müffke + - Gustavo Chain + - Hanjun Kim + - Henry Fisher + - Iskander Sharipov + - Jake Sylvestre + - Johan T. Halseth + - John C. Vernaleo + - Liran Sharir + - Mikael Lindlof + - Olaoluwa Osuntokun + - Oliver Gugger + - Rjected + - Steven Kreuzer + - Torkel Rogstad + - Tristyn + - Victor Lavaud + - Vinayak Borkar + - Wilmer Paulino + - Yaacov Akiba Slama + - ebiiim + - ipriver + - wakiyamap + - yyforyongyu + +Changes in 0.21.0 (Thu Aug 27 2020) + - Network-related changes: + - Handle notfound messages from peers in netsync package (#1603) + - RPC changes: + - Add compatibility for getblock RPC changes in bitcoind 0.15.0 (#1529) + - Add new optional Params field to rpcclient.ConnConfig (#1467) + - Add new error code ErrRPCInWarmup in btcjson (#1541) + - Add compatibility for changes to getmempoolentry response in bitcoind + 0.19.0 (#1524) + - Add rpcclient methods for estimatesmartfee and generatetoaddress + commands (#1500) + - Add rpcclient method for getblockstats command (#1500) + - Parse serialized transaction from createrawtransaction command using + both segwit, and legacy format (#1502) + - Support cookie-based authentication in rpcclient (#1460) + - Add rpcclient method for getchaintxstats command (#1571) + - Add rpcclient method for fundrawtransaction command (#1553) + - Add rpcclient method for getbalances command (#1595) + - Add new method rpcclient.GetTransactionWatchOnly (#1592) + - Crypto changes: + - Fix panic in fieldVal.SetByteSlice when called with large values, and + improve the method to be 35% faster (#1602) + - btcctl changes: + - Add -regtest mode to btcctl (#1556) + - Misc changes: + - Fix a bug due to a deadlock in connmgr's dynamic ban scoring (#1509) + - Add blockchain.NewUtxoEntry() to directly create entries for + UtxoViewpoint (#1588) + - Replace LRU cache implementation in peer package with a generic one + from decred/dcrd (#1599) + - Contributors (alphabetical order): + - Anirudha Bose + - Antonin Hildebrand + - Dan Cline + - Daniel McNally + - David Hill + - Federico Bond + - George Tankersley + - Henry + - Henry Harder + - Iskander Sharipov + - Ivan Kuznetsov + - Jake Sylvestre + - Javed Khan + - JeremyRand + - Jin + - John C. Vernaleo + - Kulpreet Singh + - Mikael Lindlof + - Murray Nesbitt + - Nisen + - Olaoluwa Osuntokun + - Oliver Gugger + - Steven Roose + - Torkel Rogstad + - Tyler Chambers + - Wilmer Paulino + - Yash Bhutwala + - adiabat + - jalavosus + - mohanson + - qqjettkgjzhxmwj + - qshuai + - shuai.qi + - tpkeeper + +Changes in v0.20.1 (Wed Nov 13 2019) + - RPC changes: + - Add compatibility for bitcoind v0.19.0 in rpcclient and btcjson + packages (#1484) + - Contributors (alphabetical order): + - Eugene Zeigel + - Olaoluwa Osuntokun + - Wilmer Paulino + +Changes in v0.20.0 (Tue Oct 15 2019) + - Significant changes made since 0.12.0. See git log or refer to release + notes on GitHub for full details. + - Contributors (alphabetical order): + - Albert Puigsech Galicia + - Alex Akselrod + - Alex Bosworth + - Alex Manuskin + - Alok Menghrajani + - Anatoli Babenia + - Andy Weidenbaum + - Calvin McAnarney + - Chris Martin + - Chris Pacia + - Chris Shepherd + - Conner Fromknecht + - Craig Sturdy + - Cédric Félizard + - Daniel Krawisz + - Daniel Martí + - Daniel McNally + - Dario Nieuwenhuis + - Dave Collins + - David Hill + - David de Kloet + - GeertJohan + - Grace Noah + - Gregory Trubetskoy + - Hector Jusforgues + - Iskander (Alex) Sharipov + - Janus Troelsen + - Jasper + - Javed Khan + - Jeremiah Goyette + - Jim Posen + - Jimmy Song + - Johan T. Halseth + - John C. Vernaleo + - Jonathan Gillham + - Josh Rickmar + - Jon Underwood + - Jonathan Zeppettini + - Jouke Hofman + - Julian Meyer + - Kai + - Kamil Slowikowski + - Kefkius + - Leonardo Lazzaro + - Marco Peereboom + - Marko Bencun + - Mawueli Kofi Adzoe + - Michail Kargakis + - Mitchell Paull + - Nathan Bass + - Nicola 'tekNico' Larosa + - Olaoluwa Osuntokun + - Pedro Martelletto + - Ricardo Velhote + - Roei Erez + - Ruben de Vries + - Rune T. Aune + - Sad Pencil + - Shuai Qi + - Steven Roose + - Tadge Dryja + - Tibor Bősze + - Tomás Senart + - Tzu-Jung Lee + - Vadym Popov + - Waldir Pimenta + - Wilmer Paulino + - benma + - danda + - dskloet + - esemplastic + - jadeblaquiere + - nakagawa + - preminem + - qshuai + Changes in 0.12.0 (Fri Nov 20 2015) - Protocol and network related changes: - Add a new checkpoint at block height 382320 (#555) @@ -507,7 +782,7 @@ Changes in 0.8.0-beta (Sun May 25 2014) recent reference client changes (https://github.com/conformal/btcd/issues/100) - Raise the maximum signature script size to support standard 15-of-15 - multi-signature pay-to-sript-hash transactions with compressed pubkeys + multi-signature pay-to-script-hash transactions with compressed pubkeys to remain compatible with the reference client (https://github.com/conformal/btcd/issues/128) - Reduce max bytes allowed for a standard nulldata transaction to 40 for diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000..a715e89ba6 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,45 @@ +# This Dockerfile builds btcd from source and creates a small (55 MB) docker container based on alpine linux. +# +# Clone this repository and run the following command to build and tag a fresh btcd amd64 container: +# +# docker build . -t yourregistry/btcd +# +# You can use the following command to build an arm64v8 container: +# +# docker build . -t yourregistry/btcd --build-arg ARCH=arm64v8 +# +# For more information how to use this docker image visit: +# https://github.com/btcsuite/btcd/tree/master/docs +# +# 8333 Mainnet Bitcoin peer-to-peer port +# 8334 Mainet RPC port + +ARG ARCH=amd64 +# using the SHA256 instead of tags +# https://github.com/opencontainers/image-spec/blob/main/descriptor.md#digests +# https://cloud.google.com/architecture/using-container-images +# https://github.com/google/go-containerregistry/blob/main/cmd/crane/README.md +# ➜ ~ crane digest golang:1.17.13-alpine3.16 +# sha256:c80567372be0d486766593cc722d3401038e2f150a0f6c5c719caa63afb4026a +FROM golang@sha256:c80567372be0d486766593cc722d3401038e2f150a0f6c5c719caa63afb4026a AS build-container + +ARG ARCH + +ADD . /app +WORKDIR /app +RUN set -ex \ + && if [ "${ARCH}" = "amd64" ]; then export GOARCH=amd64; fi \ + && if [ "${ARCH}" = "arm32v7" ]; then export GOARCH=arm; fi \ + && if [ "${ARCH}" = "arm64v8" ]; then export GOARCH=arm64; fi \ + && echo "Compiling for $GOARCH" \ + && go install -v . ./cmd/... + +FROM $ARCH/alpine:3.16 + +COPY --from=build-container /go/bin /bin + +VOLUME ["/root/.btcd"] + +EXPOSE 8333 8334 + +ENTRYPOINT ["btcd"] diff --git a/LICENSE b/LICENSE index 53ba0c5608..8005b8652d 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ ISC License -Copyright (c) 2013-2017 The btcsuite developers +Copyright (c) 2013-2024 The btcsuite developers Copyright (c) 2015-2016 The Decred developers Permission to use, copy, modify, and distribute this software for any diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000..e17e6446d7 --- /dev/null +++ b/Makefile @@ -0,0 +1,171 @@ +PKG := github.com/btcsuite/btcd + +LINT_PKG := github.com/golangci/golangci-lint/cmd/golangci-lint +GOACC_PKG := github.com/ory/go-acc +GOIMPORTS_PKG := golang.org/x/tools/cmd/goimports + +GO_BIN := ${GOPATH}/bin +LINT_BIN := $(GO_BIN)/golangci-lint +GOACC_BIN := $(GO_BIN)/go-acc + +LINT_COMMIT := v1.18.0 +GOACC_COMMIT := 80342ae2e0fcf265e99e76bcc4efd022c7c3811b + +DEPGET := cd /tmp && go get -v +GOBUILD := go build -v +GOINSTALL := go install -v +DEV_TAGS := rpctest +GOTEST_DEV = go test -v -tags=$(DEV_TAGS) +GOTEST := go test -v + +GOFILES_NOVENDOR = $(shell find . -type f -name '*.go' -not -path "./vendor/*") + +RM := rm -f +CP := cp +MAKE := make +XARGS := xargs -L 1 + +# Linting uses a lot of memory, so keep it under control by limiting the number +# of workers if requested. +ifneq ($(workers),) +LINT_WORKERS = --concurrency=$(workers) +endif + +LINT = $(LINT_BIN) run -v $(LINT_WORKERS) + +GREEN := "\\033[0;32m" +NC := "\\033[0m" +define print + echo $(GREEN)$1$(NC) +endef + +#? default: Run `make build` +default: build + +#? all: Run `make build` and `make check` +all: build check + +# ============ +# DEPENDENCIES +# ============ + +$(LINT_BIN): + @$(call print, "Fetching linter") + $(DEPGET) $(LINT_PKG)@$(LINT_COMMIT) + +$(GOACC_BIN): + @$(call print, "Fetching go-acc") + $(DEPGET) $(GOACC_PKG)@$(GOACC_COMMIT) + +#? goimports: Install goimports +goimports: + @$(call print, "Installing goimports.") + $(DEPGET) $(GOIMPORTS_PKG) + +# ============ +# INSTALLATION +# ============ + +#? build: Build all binaries, place them in project directory +build: + @$(call print, "Building all binaries") + $(GOBUILD) $(PKG) + $(GOBUILD) $(PKG)/cmd/btcctl + $(GOBUILD) $(PKG)/cmd/gencerts + $(GOBUILD) $(PKG)/cmd/findcheckpoint + $(GOBUILD) $(PKG)/cmd/addblock + +#? install: Install all binaries, place them in $GOPATH/bin +install: + @$(call print, "Installing all binaries") + $(GOINSTALL) $(PKG) + $(GOINSTALL) $(PKG)/cmd/btcctl + $(GOINSTALL) $(PKG)/cmd/gencerts + $(GOINSTALL) $(PKG)/cmd/findcheckpoint + $(GOINSTALL) $(PKG)/cmd/addblock + +#? release-install: Install btcd and btcctl release binaries, place them in $GOPATH/bin +release-install: + @$(call print, "Installing btcd and btcctl release binaries") + env CGO_ENABLED=0 $(GOINSTALL) -trimpath -ldflags="-s -w -buildid=" $(PKG) + env CGO_ENABLED=0 $(GOINSTALL) -trimpath -ldflags="-s -w -buildid=" $(PKG)/cmd/btcctl + +# ======= +# TESTING +# ======= + +#? check: Run `make unit` +check: unit + +#? unit: Run unit tests +unit: + @$(call print, "Running unit tests.") + $(GOTEST_DEV) ./... -test.timeout=20m + cd btcec; $(GOTEST_DEV) ./... -test.timeout=20m + cd btcutil; $(GOTEST_DEV) ./... -test.timeout=20m + cd btcutil/psbt; $(GOTEST_DEV) ./... -test.timeout=20m + +#? unit-cover: Run unit coverage tests +unit-cover: $(GOACC_BIN) + @$(call print, "Running unit coverage tests.") + $(GOACC_BIN) ./... + + # We need to remove the /v2 pathing from the module to have it work + # nicely with the CI tool we use to render live code coverage. + cd btcec; $(GOACC_BIN) ./...; sed -i.bak 's/v2\///g' coverage.txt + + cd btcutil; $(GOACC_BIN) ./... + + cd btcutil/psbt; $(GOACC_BIN) ./... + +#? unit-race: Run unit race tests +unit-race: + @$(call print, "Running unit race tests.") + env CGO_ENABLED=1 GORACE="history_size=7 halt_on_errors=1" $(GOTEST) -race -test.timeout=20m ./... + cd btcec; env CGO_ENABLED=1 GORACE="history_size=7 halt_on_errors=1" $(GOTEST) -race -test.timeout=20m ./... + cd btcutil; env CGO_ENABLED=1 GORACE="history_size=7 halt_on_errors=1" $(GOTEST) -race -test.timeout=20m ./... + cd btcutil/psbt; env CGO_ENABLED=1 GORACE="history_size=7 halt_on_errors=1" $(GOTEST) -race -test.timeout=20m ./... + +# ========= +# UTILITIES +# ========= + +#? fmt: Fix imports and formatting source +fmt: goimports + @$(call print, "Fixing imports.") + goimports -w $(GOFILES_NOVENDOR) + @$(call print, "Formatting source.") + gofmt -l -w -s $(GOFILES_NOVENDOR) + +#? lint: Lint source +lint: $(LINT_BIN) + @$(call print, "Linting source.") + $(LINT) + +#? clean: Clean source +clean: + @$(call print, "Cleaning source.$(NC)") + $(RM) coverage.txt btcec/coverage.txt btcutil/coverage.txt btcutil/psbt/coverage.txt + +#? tidy-module: Run 'go mod tidy' for all modules +tidy-module: + echo "Running 'go mod tidy' for all modules" + scripts/tidy_modules.sh + +.PHONY: all \ + default \ + build \ + check \ + unit \ + unit-cover \ + unit-race \ + fmt \ + lint \ + clean + +#? help: Get more info on make commands +help: Makefile + @echo " Choose a command run in btcd:" + @sed -n 's/^#?//p' $< | column -t -s ':' | sort | sed -e 's/^/ /' + +.PHONY: help diff --git a/README.md b/README.md index a270fd2e97..f70f3f9145 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,10 @@ btcd ==== -[![Build Status](https://travis-ci.org/btcsuite/btcd.png?branch=master)](https://travis-ci.org/btcsuite/btcd) -[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) -[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/btcsuite/btcd) +[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions) +[![Coverage Status](https://coveralls.io/repos/github/btcsuite/btcd/badge.svg?branch=master)](https://coveralls.io/github/btcsuite/btcd?branch=master) +[![ISC License](https://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) +[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd) btcd is an alternative full node bitcoin implementation written in Go (golang). @@ -26,7 +27,7 @@ transactions based on miner requirements ("standard" transactions). One key difference between btcd and Bitcoin Core is that btcd does *NOT* include wallet functionality and this was a very intentional design decision. See the -blog entry [here](https://blog.conformal.com/btcd-not-your-moms-bitcoin-daemon) +blog entry [here](https://web.archive.org/web/20171125143919/https://blog.conformal.com/btcd-not-your-moms-bitcoin-daemon) for more details. This means you can't actually make or receive payments directly with btcd. That functionality is provided by the [btcwallet](https://github.com/btcsuite/btcwallet) and @@ -35,12 +36,10 @@ which are both under active development. ## Requirements -[Go](http://golang.org) 1.12 or newer. +[Go](http://golang.org) 1.17 or newer. ## Installation -#### Windows - MSI Available - https://github.com/btcsuite/btcd/releases #### Linux/BSD/MacOSX/POSIX - Build from Source @@ -64,7 +63,7 @@ recommended that `GOPATH` is set to a directory in your home directory such as ```bash $ cd $GOPATH/src/github.com/btcsuite/btcd -$ GO111MODULE=on go install -v . ./cmd/... +$ go install -v . ./cmd/... ``` - btcd (and utilities) will now be installed in ```$GOPATH/bin```. If you did @@ -73,10 +72,6 @@ $ GO111MODULE=on go install -v . ./cmd/... ## Updating -#### Windows - -Install a newer MSI - #### Linux/BSD/MacOSX/POSIX - Build from Source - Run the following commands to update btcd, all dependencies, and install it: @@ -84,7 +79,7 @@ Install a newer MSI ```bash $ cd $GOPATH/src/github.com/btcsuite/btcd $ git pull -$ GO111MODULE=on go install -v . ./cmd/... +$ go install -v . ./cmd/... ``` ## Getting Started @@ -93,10 +88,6 @@ btcd has several configuration options available to tweak how it runs, but all of the basic operations described in the intro section work with zero configuration. -#### Windows (Installed from MSI) - -Launch btcd from your Start menu. - #### Linux/BSD/POSIX/Source ```bash @@ -105,9 +96,9 @@ $ ./btcd ## IRC -- irc.freenode.net +- irc.libera.chat - channel #btcd -- [webchat](https://webchat.freenode.net/?channels=btcd) +- [webchat](https://web.libera.chat/gamja/?channels=btcd) ## Issue Tracker diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000000..e06625c87a --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,15 @@ +# Security Policy + +## Supported Versions + +The last major `btcd` release is to be considered the current support version. +Given an issue severe enough, a backport will be issued either to the prior +major release or the set of releases considered utilized enough. + +## Reporting a Vulnerability + +To report security issues, send an email to security@lightning.engineering +(this list isn't to be used for support). + +The following key can be used to communicate sensitive information: `91FE 464C +D751 01DA 6B6B AB60 555C 6465 E5BC B3AF`. diff --git a/addrmgr/addrmanager.go b/addrmgr/addrmanager.go index a8a8fb3338..bdfe9094ce 100644 --- a/addrmgr/addrmanager.go +++ b/addrmgr/addrmanager.go @@ -30,7 +30,7 @@ import ( // AddrManager provides a concurrency safe address manager for caching potential // peers on the bitcoin network. type AddrManager struct { - mtx sync.Mutex + mtx sync.RWMutex peersFile string lookupFunc func(string) ([]net.IP, error) rand *rand.Rand @@ -70,7 +70,7 @@ type serializedAddrManager struct { } type localAddress struct { - na *wire.NetAddress + na *wire.NetAddressV2 score AddressPriority } @@ -163,7 +163,7 @@ const ( // updateAddress is a helper function to either update an address already known // to the address manager, or to add the address if not already known. -func (a *AddrManager) updateAddress(netAddr, srcAddr *wire.NetAddress) { +func (a *AddrManager) updateAddress(netAddr, srcAddr *wire.NetAddressV2) { // Filter out non-routable addresses. Note that non-routable // also includes invalid and local addresses. if !IsRoutable(netAddr) { @@ -176,7 +176,7 @@ func (a *AddrManager) updateAddress(netAddr, srcAddr *wire.NetAddress) { // TODO: only update addresses periodically. // Update the last seen time and services. // note that to prevent causing excess garbage on getaddr - // messages the netaddresses in addrmaanger are *immutable*, + // messages the netaddresses in addrmanager are *immutable*, // if we need to change them then we replace the pointer with a // new copy so that we don't have to copy every na for getaddr. if netAddr.Timestamp.After(ka.na.Timestamp) || @@ -186,7 +186,9 @@ func (a *AddrManager) updateAddress(netAddr, srcAddr *wire.NetAddress) { naCopy := *ka.na naCopy.Timestamp = netAddr.Timestamp naCopy.AddService(netAddr.Services) + ka.mtx.Lock() ka.na = &naCopy + ka.mtx.Unlock() } // If already in tried, we have nothing to do here. @@ -294,7 +296,7 @@ func (a *AddrManager) pickTried(bucket int) *list.Element { return oldestElem } -func (a *AddrManager) getNewBucket(netAddr, srcAddr *wire.NetAddress) int { +func (a *AddrManager) getNewBucket(netAddr, srcAddr *wire.NetAddressV2) int { // bitcoind: // doublesha256(key + sourcegroup + int64(doublesha256(key + group + sourcegroup))%bucket_per_source_group) % num_new_buckets @@ -316,7 +318,7 @@ func (a *AddrManager) getNewBucket(netAddr, srcAddr *wire.NetAddress) int { return int(binary.LittleEndian.Uint64(hash2) % newBucketCount) } -func (a *AddrManager) getTriedBucket(netAddr *wire.NetAddress) int { +func (a *AddrManager) getTriedBucket(netAddr *wire.NetAddressV2) int { // bitcoind hashes this as: // doublesha256(key + group + truncate_to_64bits(doublesha256(key)) % buckets_per_group) % num_buckets data1 := []byte{} @@ -548,7 +550,7 @@ func (a *AddrManager) deserializePeers(filePath string) error { // DeserializeNetAddress converts a given address string to a *wire.NetAddress. func (a *AddrManager) DeserializeNetAddress(addr string, - services wire.ServiceFlag) (*wire.NetAddress, error) { + services wire.ServiceFlag) (*wire.NetAddressV2, error) { host, portStr, err := net.SplitHostPort(addr) if err != nil { @@ -597,7 +599,7 @@ func (a *AddrManager) Stop() error { // AddAddresses adds new addresses to the address manager. It enforces a max // number of addresses and silently ignores duplicate addresses. It is // safe for concurrent access. -func (a *AddrManager) AddAddresses(addrs []*wire.NetAddress, srcAddr *wire.NetAddress) { +func (a *AddrManager) AddAddresses(addrs []*wire.NetAddressV2, srcAddr *wire.NetAddressV2) { a.mtx.Lock() defer a.mtx.Unlock() @@ -609,7 +611,7 @@ func (a *AddrManager) AddAddresses(addrs []*wire.NetAddress, srcAddr *wire.NetAd // AddAddress adds a new address to the address manager. It enforces a max // number of addresses and silently ignores duplicate addresses. It is // safe for concurrent access. -func (a *AddrManager) AddAddress(addr, srcAddr *wire.NetAddress) { +func (a *AddrManager) AddAddress(addr, srcAddr *wire.NetAddressV2) { a.mtx.Lock() defer a.mtx.Unlock() @@ -633,7 +635,7 @@ func (a *AddrManager) AddAddressByIP(addrIP string) error { if err != nil { return fmt.Errorf("invalid port %s: %v", portStr, err) } - na := wire.NewNetAddressIPPort(ip, uint16(port), 0) + na := wire.NetAddressV2FromBytes(time.Now(), 0, ip, uint16(port)) a.AddAddress(na, na) // XXX use correct src address return nil } @@ -645,8 +647,8 @@ func (a *AddrManager) numAddresses() int { // NumAddresses returns the number of addresses known to the address manager. func (a *AddrManager) NumAddresses() int { - a.mtx.Lock() - defer a.mtx.Unlock() + a.mtx.RLock() + defer a.mtx.RUnlock() return a.numAddresses() } @@ -654,15 +656,15 @@ func (a *AddrManager) NumAddresses() int { // NeedMoreAddresses returns whether or not the address manager needs more // addresses. func (a *AddrManager) NeedMoreAddresses() bool { - a.mtx.Lock() - defer a.mtx.Unlock() + a.mtx.RLock() + defer a.mtx.RUnlock() return a.numAddresses() < needAddressThreshold } // AddressCache returns the current address cache. It must be treated as // read-only (but since it is a copy now, this is not as dangerous). -func (a *AddrManager) AddressCache() []*wire.NetAddress { +func (a *AddrManager) AddressCache() []*wire.NetAddressV2 { allAddr := a.getAddresses() numAddresses := len(allAddr) * getAddrPercent / 100 @@ -684,16 +686,16 @@ func (a *AddrManager) AddressCache() []*wire.NetAddress { // getAddresses returns all of the addresses currently found within the // manager's address cache. -func (a *AddrManager) getAddresses() []*wire.NetAddress { - a.mtx.Lock() - defer a.mtx.Unlock() +func (a *AddrManager) getAddresses() []*wire.NetAddressV2 { + a.mtx.RLock() + defer a.mtx.RUnlock() addrIndexLen := len(a.addrIndex) if addrIndexLen == 0 { return nil } - addrs := make([]*wire.NetAddress, 0, addrIndexLen) + addrs := make([]*wire.NetAddressV2, 0, addrIndexLen) for _, v := range a.addrIndex { addrs = append(addrs, v.na) } @@ -720,20 +722,43 @@ func (a *AddrManager) reset() { // HostToNetAddress returns a netaddress given a host address. If the address // is a Tor .onion address this will be taken care of. Else if the host is // not an IP address it will be resolved (via Tor if required). -func (a *AddrManager) HostToNetAddress(host string, port uint16, services wire.ServiceFlag) (*wire.NetAddress, error) { - // Tor address is 16 char base32 + ".onion" - var ip net.IP - if len(host) == 22 && host[16:] == ".onion" { +func (a *AddrManager) HostToNetAddress(host string, port uint16, + services wire.ServiceFlag) (*wire.NetAddressV2, error) { + + var ( + na *wire.NetAddressV2 + ip net.IP + ) + + // Tor v2 address is 16 char base32 + ".onion" + if len(host) == wire.TorV2EncodedSize && host[wire.TorV2EncodedSize-6:] == ".onion" { // go base32 encoding uses capitals (as does the rfc // but Tor and bitcoind tend to user lowercase, so we switch // case here. data, err := base32.StdEncoding.DecodeString( - strings.ToUpper(host[:16])) + strings.ToUpper(host[:wire.TorV2EncodedSize-6])) + if err != nil { + return nil, err + } + + na = wire.NetAddressV2FromBytes( + time.Now(), services, data, port, + ) + } else if len(host) == wire.TorV3EncodedSize && host[wire.TorV3EncodedSize-6:] == ".onion" { + // Tor v3 addresses are 56 base32 characters with the 6 byte + // onion suffix. + data, err := base32.StdEncoding.DecodeString( + strings.ToUpper(host[:wire.TorV3EncodedSize-6]), + ) if err != nil { return nil, err } - prefix := []byte{0xfd, 0x87, 0xd8, 0x7e, 0xeb, 0x43} - ip = net.IP(append(prefix, data...)) + + // The first 32 bytes is the ed25519 public key and is enough + // to reconstruct the .onion address. + na = wire.NetAddressV2FromBytes( + time.Now(), services, data[:wire.TorV3Size], port, + ) } else if ip = net.ParseIP(host); ip == nil { ips, err := a.lookupFunc(host) if err != nil { @@ -743,30 +768,23 @@ func (a *AddrManager) HostToNetAddress(host string, port uint16, services wire.S return nil, fmt.Errorf("no addresses found for %s", host) } ip = ips[0] - } - - return wire.NewNetAddressIPPort(ip, port, services), nil -} -// ipString returns a string for the ip from the provided NetAddress. If the -// ip is in the range used for Tor addresses then it will be transformed into -// the relevant .onion address. -func ipString(na *wire.NetAddress) string { - if IsOnionCatTor(na) { - // We know now that na.IP is long enough. - base32 := base32.StdEncoding.EncodeToString(na.IP[6:]) - return strings.ToLower(base32) + ".onion" + na = wire.NetAddressV2FromBytes(time.Now(), services, ip, port) + } else { + // This is an non-nil IP address that was parsed in the else if + // above. + na = wire.NetAddressV2FromBytes(time.Now(), services, ip, port) } - return na.IP.String() + return na, nil } // NetAddressKey returns a string key in the form of ip:port for IPv4 addresses -// or [ip]:port for IPv6 addresses. -func NetAddressKey(na *wire.NetAddress) string { +// or [ip]:port for IPv6 addresses. It also handles onion v2 and v3 addresses. +func NetAddressKey(na *wire.NetAddressV2) string { port := strconv.FormatUint(uint64(na.Port), 10) - return net.JoinHostPort(ipString(na), port) + return net.JoinHostPort(na.Addr.String(), port) } // GetAddress returns a single address that should be routable. It picks a @@ -840,13 +858,13 @@ func (a *AddrManager) GetAddress() *KnownAddress { } } -func (a *AddrManager) find(addr *wire.NetAddress) *KnownAddress { +func (a *AddrManager) find(addr *wire.NetAddressV2) *KnownAddress { return a.addrIndex[NetAddressKey(addr)] } // Attempt increases the given address' attempt counter and updates // the last attempt time. -func (a *AddrManager) Attempt(addr *wire.NetAddress) { +func (a *AddrManager) Attempt(addr *wire.NetAddressV2) { a.mtx.Lock() defer a.mtx.Unlock() @@ -857,14 +875,17 @@ func (a *AddrManager) Attempt(addr *wire.NetAddress) { return } // set last tried time to now + now := time.Now() + ka.mtx.Lock() ka.attempts++ - ka.lastattempt = time.Now() + ka.lastattempt = now + ka.mtx.Unlock() } // Connected Marks the given address as currently connected and working at the // current time. The address must already be known to AddrManager else it will // be ignored. -func (a *AddrManager) Connected(addr *wire.NetAddress) { +func (a *AddrManager) Connected(addr *wire.NetAddressV2) { a.mtx.Lock() defer a.mtx.Unlock() @@ -880,14 +901,16 @@ func (a *AddrManager) Connected(addr *wire.NetAddress) { // ka.na is immutable, so replace it. naCopy := *ka.na naCopy.Timestamp = time.Now() + ka.mtx.Lock() ka.na = &naCopy + ka.mtx.Unlock() } } // Good marks the given address as good. To be called after a successful // connection and version exchange. If the address is unknown to the address // manager it will be ignored. -func (a *AddrManager) Good(addr *wire.NetAddress) { +func (a *AddrManager) Good(addr *wire.NetAddressV2) { a.mtx.Lock() defer a.mtx.Unlock() @@ -899,11 +922,13 @@ func (a *AddrManager) Good(addr *wire.NetAddress) { // ka.Timestamp is not updated here to avoid leaking information // about currently connected peers. now := time.Now() + ka.mtx.Lock() ka.lastsuccess = now ka.lastattempt = now ka.attempts = 0 + ka.mtx.Unlock() // tried and refs synchronized via a.mtx - // move to tried set, optionally evicting other addresses if neeed. + // move to tried set, optionally evicting other addresses if need. if ka.tried { return } @@ -974,7 +999,7 @@ func (a *AddrManager) Good(addr *wire.NetAddress) { } // SetServices sets the services for the giiven address to the provided value. -func (a *AddrManager) SetServices(addr *wire.NetAddress, services wire.ServiceFlag) { +func (a *AddrManager) SetServices(addr *wire.NetAddressV2, services wire.ServiceFlag) { a.mtx.Lock() defer a.mtx.Unlock() @@ -988,15 +1013,19 @@ func (a *AddrManager) SetServices(addr *wire.NetAddress, services wire.ServiceFl // ka.na is immutable, so replace it. naCopy := *ka.na naCopy.Services = services + ka.mtx.Lock() ka.na = &naCopy + ka.mtx.Unlock() } } // AddLocalAddress adds na to the list of known local addresses to advertise // with the given priority. -func (a *AddrManager) AddLocalAddress(na *wire.NetAddress, priority AddressPriority) error { +func (a *AddrManager) AddLocalAddress(na *wire.NetAddressV2, priority AddressPriority) error { if !IsRoutable(na) { - return fmt.Errorf("address %s is not routable", na.IP) + return fmt.Errorf( + "address %s is not routable", na.Addr.String(), + ) } a.lamtx.Lock() @@ -1019,7 +1048,7 @@ func (a *AddrManager) AddLocalAddress(na *wire.NetAddress, priority AddressPrior // getReachabilityFrom returns the relative reachability of the provided local // address to the provided remote address. -func getReachabilityFrom(localAddr, remoteAddr *wire.NetAddress) int { +func getReachabilityFrom(localAddr, remoteAddr *wire.NetAddressV2) int { const ( Unreachable = 0 Default = iota @@ -1034,36 +1063,66 @@ func getReachabilityFrom(localAddr, remoteAddr *wire.NetAddress) int { return Unreachable } - if IsOnionCatTor(remoteAddr) { - if IsOnionCatTor(localAddr) { + if remoteAddr.IsTorV3() { + if localAddr.IsTorV3() { return Private } - if IsRoutable(localAddr) && IsIPv4(localAddr) { + lna := localAddr.ToLegacy() + if IsOnionCatTor(lna) { + // Modern v3 clients should not be able to connect to + // deprecated v2 hidden services. + return Unreachable + } + + if IsRoutable(localAddr) && IsIPv4(lna) { return Ipv4 } return Default } - if IsRFC4380(remoteAddr) { + // We can't be sure if the remote party can actually connect to this + // address or not. + if localAddr.IsTorV3() { + return Default + } + + // Convert the V2 addresses into legacy to access the network + // functions. + remoteLna := remoteAddr.ToLegacy() + localLna := localAddr.ToLegacy() + + if IsOnionCatTor(remoteLna) { + if IsOnionCatTor(localLna) { + return Private + } + + if IsRoutable(localAddr) && IsIPv4(localLna) { + return Ipv4 + } + + return Default + } + + if IsRFC4380(remoteLna) { if !IsRoutable(localAddr) { return Default } - if IsRFC4380(localAddr) { + if IsRFC4380(localLna) { return Teredo } - if IsIPv4(localAddr) { + if IsIPv4(localLna) { return Ipv4 } return Ipv6Weak } - if IsIPv4(remoteAddr) { - if IsRoutable(localAddr) && IsIPv4(localAddr) { + if IsIPv4(remoteLna) { + if IsRoutable(localAddr) && IsIPv4(localLna) { return Ipv4 } return Unreachable @@ -1072,7 +1131,7 @@ func getReachabilityFrom(localAddr, remoteAddr *wire.NetAddress) int { /* ipv6 */ var tunnelled bool // Is our v6 is tunnelled? - if IsRFC3964(localAddr) || IsRFC6052(localAddr) || IsRFC6145(localAddr) { + if IsRFC3964(localLna) || IsRFC6052(localLna) || IsRFC6145(localLna) { tunnelled = true } @@ -1080,11 +1139,11 @@ func getReachabilityFrom(localAddr, remoteAddr *wire.NetAddress) int { return Default } - if IsRFC4380(localAddr) { + if IsRFC4380(localLna) { return Teredo } - if IsIPv4(localAddr) { + if IsIPv4(localLna) { return Ipv4 } @@ -1098,13 +1157,13 @@ func getReachabilityFrom(localAddr, remoteAddr *wire.NetAddress) int { // GetBestLocalAddress returns the most appropriate local address to use // for the given remote address. -func (a *AddrManager) GetBestLocalAddress(remoteAddr *wire.NetAddress) *wire.NetAddress { +func (a *AddrManager) GetBestLocalAddress(remoteAddr *wire.NetAddressV2) *wire.NetAddressV2 { a.lamtx.Lock() defer a.lamtx.Unlock() bestreach := 0 var bestscore AddressPriority - var bestAddress *wire.NetAddress + var bestAddress *wire.NetAddressV2 for _, la := range a.localAddresses { reach := getReachabilityFrom(la.na, remoteAddr) if reach > bestreach || @@ -1115,21 +1174,29 @@ func (a *AddrManager) GetBestLocalAddress(remoteAddr *wire.NetAddress) *wire.Net } } if bestAddress != nil { - log.Debugf("Suggesting address %s:%d for %s:%d", bestAddress.IP, - bestAddress.Port, remoteAddr.IP, remoteAddr.Port) + log.Debugf("Suggesting address %s:%d for %s:%d", + bestAddress.Addr.String(), bestAddress.Port, + remoteAddr.Addr.String(), remoteAddr.Port) } else { - log.Debugf("No worthy address for %s:%d", remoteAddr.IP, - remoteAddr.Port) + log.Debugf("No worthy address for %s:%d", + remoteAddr.Addr.String(), remoteAddr.Port) // Send something unroutable if nothing suitable. var ip net.IP - if !IsIPv4(remoteAddr) && !IsOnionCatTor(remoteAddr) { - ip = net.IPv6zero - } else { + if remoteAddr.IsTorV3() { ip = net.IPv4zero + } else { + remoteLna := remoteAddr.ToLegacy() + if !IsIPv4(remoteLna) && !IsOnionCatTor(remoteLna) { + ip = net.IPv6zero + } else { + ip = net.IPv4zero + } } services := wire.SFNodeNetwork | wire.SFNodeWitness | wire.SFNodeBloom - bestAddress = wire.NewNetAddressIPPort(ip, 0, services) + bestAddress = wire.NetAddressV2FromBytes( + time.Now(), services, ip, 0, + ) } return bestAddress diff --git a/addrmgr/addrmanager_internal_test.go b/addrmgr/addrmanager_internal_test.go index 1c19dceb18..38218b15f7 100644 --- a/addrmgr/addrmanager_internal_test.go +++ b/addrmgr/addrmanager_internal_test.go @@ -1,17 +1,18 @@ package addrmgr import ( - "io/ioutil" "math/rand" "net" "os" "testing" + "time" "github.com/btcsuite/btcd/wire" ) -// randAddr generates a *wire.NetAddress backed by a random IPv4/IPv6 address. -func randAddr(t *testing.T) *wire.NetAddress { +// randAddr generates a *wire.NetAddressV2 backed by a random IPv4/IPv6 +// address. Some of the returned addresses may not be routable. +func randAddr(t *testing.T) *wire.NetAddressV2 { t.Helper() ipv4 := rand.Intn(2) == 0 @@ -30,22 +31,43 @@ func randAddr(t *testing.T) *wire.NetAddress { ip = b[:] } - return &wire.NetAddress{ - Services: wire.ServiceFlag(rand.Uint64()), - IP: ip, - Port: uint16(rand.Uint32()), + services := wire.ServiceFlag(rand.Uint64()) + port := uint16(rand.Uint32()) + + return wire.NetAddressV2FromBytes( + time.Now(), services, ip, port, + ) +} + +// routableRandAddr generates a *wire.NetAddressV2 backed by a random IPv4/IPv6 +// address that is always routable. +func routableRandAddr(t *testing.T) *wire.NetAddressV2 { + t.Helper() + + var addr *wire.NetAddressV2 + + // If the address is not routable, try again. + routable := false + for !routable { + addr = randAddr(t) + routable = IsRoutable(addr) } + + return addr } // assertAddr ensures that the two addresses match. The timestamp is not // checked as it does not affect uniquely identifying a specific address. -func assertAddr(t *testing.T, got, expected *wire.NetAddress) { +func assertAddr(t *testing.T, got, expected *wire.NetAddressV2) { if got.Services != expected.Services { t.Fatalf("expected address services %v, got %v", expected.Services, got.Services) } - if !got.IP.Equal(expected.IP) { - t.Fatalf("expected address IP %v, got %v", expected.IP, got.IP) + gotAddr := got.Addr.String() + expectedAddr := expected.Addr.String() + if gotAddr != expectedAddr { + t.Fatalf("expected address IP %v, got %v", expectedAddr, + gotAddr) } if got.Port != expected.Port { t.Fatalf("expected address port %d, got %d", expected.Port, @@ -56,7 +78,7 @@ func assertAddr(t *testing.T, got, expected *wire.NetAddress) { // assertAddrs ensures that the manager's address cache matches the given // expected addresses. func assertAddrs(t *testing.T, addrMgr *AddrManager, - expectedAddrs map[string]*wire.NetAddress) { + expectedAddrs map[string]*wire.NetAddressV2) { t.Helper() @@ -85,7 +107,7 @@ func TestAddrManagerSerialization(t *testing.T) { // We'll start by creating our address manager backed by a temporary // directory. - tempDir, err := ioutil.TempDir("", "addrmgr") + tempDir, err := os.MkdirTemp("", "addrmgr") if err != nil { t.Fatalf("unable to create temp dir: %v", err) } @@ -96,11 +118,11 @@ func TestAddrManagerSerialization(t *testing.T) { // We'll be adding 5 random addresses to the manager. const numAddrs = 5 - expectedAddrs := make(map[string]*wire.NetAddress, numAddrs) + expectedAddrs := make(map[string]*wire.NetAddressV2, numAddrs) for i := 0; i < numAddrs; i++ { - addr := randAddr(t) + addr := routableRandAddr(t) expectedAddrs[NetAddressKey(addr)] = addr - addrMgr.AddAddress(addr, randAddr(t)) + addrMgr.AddAddress(addr, routableRandAddr(t)) } // Now that the addresses have been added, we should be able to retrieve @@ -125,7 +147,7 @@ func TestAddrManagerV1ToV2(t *testing.T) { // We'll start by creating our address manager backed by a temporary // directory. - tempDir, err := ioutil.TempDir("", "addrmgr") + tempDir, err := os.MkdirTemp("", "addrmgr") if err != nil { t.Fatalf("unable to create temp dir: %v", err) } @@ -141,11 +163,11 @@ func TestAddrManagerV1ToV2(t *testing.T) { // each addresses' services will not be stored. const numAddrs = 5 - expectedAddrs := make(map[string]*wire.NetAddress, numAddrs) + expectedAddrs := make(map[string]*wire.NetAddressV2, numAddrs) for i := 0; i < numAddrs; i++ { - addr := randAddr(t) + addr := routableRandAddr(t) expectedAddrs[NetAddressKey(addr)] = addr - addrMgr.AddAddress(addr, randAddr(t)) + addrMgr.AddAddress(addr, routableRandAddr(t)) } // Then, we'll persist these addresses to disk and restart the address @@ -162,7 +184,7 @@ func TestAddrManagerV1ToV2(t *testing.T) { addrMgr.loadPeers() addrs := addrMgr.getAddresses() if len(addrs) != len(expectedAddrs) { - t.Fatalf("expected to find %d adddresses, found %d", + t.Fatalf("expected to find %d addresses, found %d", len(expectedAddrs), len(addrs)) } for _, addr := range addrs { diff --git a/addrmgr/addrmanager_test.go b/addrmgr/addrmanager_test.go index 676913e21e..4afe5fd601 100644 --- a/addrmgr/addrmanager_test.go +++ b/addrmgr/addrmanager_test.go @@ -19,7 +19,7 @@ import ( // naTest is used to describe a test to be performed against the NetAddressKey // method. type naTest struct { - in wire.NetAddress + in wire.NetAddressV2 want string } @@ -93,8 +93,10 @@ func addNaTests() { func addNaTest(ip string, port uint16, want string) { nip := net.ParseIP(ip) - na := *wire.NewNetAddressIPPort(nip, port, wire.SFNodeNetwork) - test := naTest{na, want} + na := wire.NetAddressV2FromBytes( + time.Now(), wire.SFNodeNetwork, nip, port, + ) + test := naTest{*na, want} naTests = append(naTests, test) } @@ -157,37 +159,49 @@ func TestAddAddressByIP(t *testing.T) { func TestAddLocalAddress(t *testing.T) { var tests = []struct { - address wire.NetAddress + address wire.NetAddressV2 priority addrmgr.AddressPriority valid bool }{ { - wire.NetAddress{IP: net.ParseIP("192.168.0.100")}, + *wire.NetAddressV2FromBytes( + time.Now(), 0, net.ParseIP("192.168.0.100"), 0, + ), addrmgr.InterfacePrio, false, }, { - wire.NetAddress{IP: net.ParseIP("204.124.1.1")}, + *wire.NetAddressV2FromBytes( + time.Now(), 0, net.ParseIP("204.124.1.1"), 0, + ), addrmgr.InterfacePrio, true, }, { - wire.NetAddress{IP: net.ParseIP("204.124.1.1")}, + *wire.NetAddressV2FromBytes( + time.Now(), 0, net.ParseIP("204.124.1.1"), 0, + ), addrmgr.BoundPrio, true, }, { - wire.NetAddress{IP: net.ParseIP("::1")}, + *wire.NetAddressV2FromBytes( + time.Now(), 0, net.ParseIP("::1"), 0, + ), addrmgr.InterfacePrio, false, }, { - wire.NetAddress{IP: net.ParseIP("fe80::1")}, + *wire.NetAddressV2FromBytes( + time.Now(), 0, net.ParseIP("fe80::1"), 0, + ), addrmgr.InterfacePrio, false, }, { - wire.NetAddress{IP: net.ParseIP("2620:100::1")}, + *wire.NetAddressV2FromBytes( + time.Now(), 0, net.ParseIP("2620:100::1"), 0, + ), addrmgr.InterfacePrio, true, }, @@ -197,12 +211,12 @@ func TestAddLocalAddress(t *testing.T) { result := amgr.AddLocalAddress(&test.address, test.priority) if result == nil && !test.valid { t.Errorf("TestAddLocalAddress test #%d failed: %s should have "+ - "been accepted", x, test.address.IP) + "been accepted", x, test.address.Addr.String()) continue } if result != nil && test.valid { t.Errorf("TestAddLocalAddress test #%d failed: %s should not have "+ - "been accepted", x, test.address.IP) + "been accepted", x, test.address.Addr.String()) continue } } @@ -257,7 +271,7 @@ func TestNeedMoreAddresses(t *testing.T) { if !b { t.Errorf("Expected that we need more addresses") } - addrs := make([]*wire.NetAddress, addrsToAdd) + addrs := make([]*wire.NetAddressV2, addrsToAdd) var err error for i := 0; i < addrsToAdd; i++ { @@ -268,7 +282,9 @@ func TestNeedMoreAddresses(t *testing.T) { } } - srcAddr := wire.NewNetAddressIPPort(net.IPv4(173, 144, 173, 111), 8333, 0) + srcAddr := wire.NetAddressV2FromBytes( + time.Now(), 0, net.IPv4(173, 144, 173, 111), 8333, + ) n.AddAddresses(addrs, srcAddr) numAddrs := n.NumAddresses() @@ -285,7 +301,7 @@ func TestNeedMoreAddresses(t *testing.T) { func TestGood(t *testing.T) { n := addrmgr.New("testgood", lookupFunc) addrsToAdd := 64 * 64 - addrs := make([]*wire.NetAddress, addrsToAdd) + addrs := make([]*wire.NetAddressV2, addrsToAdd) var err error for i := 0; i < addrsToAdd; i++ { @@ -296,7 +312,9 @@ func TestGood(t *testing.T) { } } - srcAddr := wire.NewNetAddressIPPort(net.IPv4(173, 144, 173, 111), 8333, 0) + srcAddr := wire.NetAddressV2FromBytes( + time.Now(), 0, net.IPv4(173, 144, 173, 111), 8333, + ) n.AddAddresses(addrs, srcAddr) for _, addr := range addrs { @@ -331,8 +349,8 @@ func TestGetAddress(t *testing.T) { if ka == nil { t.Fatalf("Did not get an address where there is one in the pool") } - if ka.NetAddress().IP.String() != someIP { - t.Errorf("Wrong IP: got %v, want %v", ka.NetAddress().IP.String(), someIP) + if ka.NetAddress().Addr.String() != someIP { + t.Errorf("Wrong IP: got %v, want %v", ka.NetAddress().Addr.String(), someIP) } // Mark this as a good address and get it @@ -341,8 +359,8 @@ func TestGetAddress(t *testing.T) { if ka == nil { t.Fatalf("Did not get an address where there is one in the pool") } - if ka.NetAddress().IP.String() != someIP { - t.Errorf("Wrong IP: got %v, want %v", ka.NetAddress().IP.String(), someIP) + if ka.NetAddress().Addr.String() != someIP { + t.Errorf("Wrong IP: got %v, want %v", ka.NetAddress().Addr.String(), someIP) } numAddrs := n.NumAddresses() @@ -352,43 +370,83 @@ func TestGetAddress(t *testing.T) { } func TestGetBestLocalAddress(t *testing.T) { - localAddrs := []wire.NetAddress{ - {IP: net.ParseIP("192.168.0.100")}, - {IP: net.ParseIP("::1")}, - {IP: net.ParseIP("fe80::1")}, - {IP: net.ParseIP("2001:470::1")}, + localAddrs := []wire.NetAddressV2{ + *wire.NetAddressV2FromBytes( + time.Now(), 0, net.ParseIP("192.168.0.100"), 0, + ), + *wire.NetAddressV2FromBytes( + time.Now(), 0, net.ParseIP("::1"), 0, + ), + *wire.NetAddressV2FromBytes( + time.Now(), 0, net.ParseIP("fe80::1"), 0, + ), + *wire.NetAddressV2FromBytes( + time.Now(), 0, net.ParseIP("2001:470::1"), 0, + ), } var tests = []struct { - remoteAddr wire.NetAddress - want0 wire.NetAddress - want1 wire.NetAddress - want2 wire.NetAddress - want3 wire.NetAddress + remoteAddr wire.NetAddressV2 + want0 wire.NetAddressV2 + want1 wire.NetAddressV2 + want2 wire.NetAddressV2 + want3 wire.NetAddressV2 }{ { // Remote connection from public IPv4 - wire.NetAddress{IP: net.ParseIP("204.124.8.1")}, - wire.NetAddress{IP: net.IPv4zero}, - wire.NetAddress{IP: net.IPv4zero}, - wire.NetAddress{IP: net.ParseIP("204.124.8.100")}, - wire.NetAddress{IP: net.ParseIP("fd87:d87e:eb43:25::1")}, + *wire.NetAddressV2FromBytes( + time.Now(), 0, net.ParseIP("204.124.8.1"), 0, + ), + *wire.NetAddressV2FromBytes( + time.Now(), 0, net.IPv4zero, 0, + ), + *wire.NetAddressV2FromBytes( + time.Now(), 0, net.IPv4zero, 0, + ), + *wire.NetAddressV2FromBytes( + time.Now(), 0, net.ParseIP("204.124.8.100"), 0, + ), + *wire.NetAddressV2FromBytes( + time.Now(), 0, + net.ParseIP("fd87:d87e:eb43:25::1"), 0, + ), }, { // Remote connection from private IPv4 - wire.NetAddress{IP: net.ParseIP("172.16.0.254")}, - wire.NetAddress{IP: net.IPv4zero}, - wire.NetAddress{IP: net.IPv4zero}, - wire.NetAddress{IP: net.IPv4zero}, - wire.NetAddress{IP: net.IPv4zero}, + *wire.NetAddressV2FromBytes( + time.Now(), 0, net.ParseIP("172.16.0.254"), 0, + ), + *wire.NetAddressV2FromBytes( + time.Now(), 0, net.IPv4zero, 0, + ), + *wire.NetAddressV2FromBytes( + time.Now(), 0, net.IPv4zero, 0, + ), + *wire.NetAddressV2FromBytes( + time.Now(), 0, net.IPv4zero, 0, + ), + *wire.NetAddressV2FromBytes( + time.Now(), 0, net.IPv4zero, 0, + ), }, { // Remote connection from public IPv6 - wire.NetAddress{IP: net.ParseIP("2602:100:abcd::102")}, - wire.NetAddress{IP: net.IPv6zero}, - wire.NetAddress{IP: net.ParseIP("2001:470::1")}, - wire.NetAddress{IP: net.ParseIP("2001:470::1")}, - wire.NetAddress{IP: net.ParseIP("2001:470::1")}, + *wire.NetAddressV2FromBytes( + time.Now(), 0, + net.ParseIP("2602:100:abcd::102"), 0, + ), + *wire.NetAddressV2FromBytes( + time.Now(), 0, net.IPv6zero, 0, + ), + *wire.NetAddressV2FromBytes( + time.Now(), 0, net.ParseIP("2001:470::1"), 0, + ), + *wire.NetAddressV2FromBytes( + time.Now(), 0, net.ParseIP("2001:470::1"), 0, + ), + *wire.NetAddressV2FromBytes( + time.Now(), 0, net.ParseIP("2001:470::1"), 0, + ), }, /* XXX { @@ -406,9 +464,12 @@ func TestGetBestLocalAddress(t *testing.T) { // Test against default when there's no address for x, test := range tests { got := amgr.GetBestLocalAddress(&test.remoteAddr) - if !test.want0.IP.Equal(got.IP) { + wantAddr := test.want0.Addr.String() + gotAddr := got.Addr.String() + if wantAddr != gotAddr { + remoteAddr := test.remoteAddr.Addr.String() t.Errorf("TestGetBestLocalAddress test1 #%d failed for remote address %s: want %s got %s", - x, test.remoteAddr.IP, test.want1.IP, got.IP) + x, remoteAddr, wantAddr, gotAddr) continue } } @@ -420,23 +481,31 @@ func TestGetBestLocalAddress(t *testing.T) { // Test against want1 for x, test := range tests { got := amgr.GetBestLocalAddress(&test.remoteAddr) - if !test.want1.IP.Equal(got.IP) { + wantAddr := test.want1.Addr.String() + gotAddr := got.Addr.String() + if wantAddr != gotAddr { + remoteAddr := test.remoteAddr.Addr.String() t.Errorf("TestGetBestLocalAddress test1 #%d failed for remote address %s: want %s got %s", - x, test.remoteAddr.IP, test.want1.IP, got.IP) + x, remoteAddr, wantAddr, gotAddr) continue } } // Add a public IP to the list of local addresses. - localAddr := wire.NetAddress{IP: net.ParseIP("204.124.8.100")} - amgr.AddLocalAddress(&localAddr, addrmgr.InterfacePrio) + localAddr := wire.NetAddressV2FromBytes( + time.Now(), 0, net.ParseIP("204.124.8.100"), 0, + ) + amgr.AddLocalAddress(localAddr, addrmgr.InterfacePrio) // Test against want2 for x, test := range tests { got := amgr.GetBestLocalAddress(&test.remoteAddr) - if !test.want2.IP.Equal(got.IP) { + wantAddr := test.want2.Addr.String() + gotAddr := got.Addr.String() + if wantAddr != gotAddr { + remoteAddr := test.remoteAddr.Addr.String() t.Errorf("TestGetBestLocalAddress test2 #%d failed for remote address %s: want %s got %s", - x, test.remoteAddr.IP, test.want2.IP, got.IP) + x, remoteAddr, wantAddr, gotAddr) continue } } diff --git a/addrmgr/doc.go b/addrmgr/doc.go index 8ddc8bfdfb..c500fbb5be 100644 --- a/addrmgr/doc.go +++ b/addrmgr/doc.go @@ -5,7 +5,7 @@ /* Package addrmgr implements concurrency safe Bitcoin address manager. -Address Manager Overview +# Address Manager Overview In order maintain the peer-to-peer Bitcoin network, there needs to be a source of addresses to connect to as nodes come and go. The Bitcoin protocol provides diff --git a/addrmgr/internal_test.go b/addrmgr/internal_test.go index e50e923cf7..ab7644b6ca 100644 --- a/addrmgr/internal_test.go +++ b/addrmgr/internal_test.go @@ -18,7 +18,7 @@ func TstKnownAddressChance(ka *KnownAddress) float64 { return ka.chance() } -func TstNewKnownAddress(na *wire.NetAddress, attempts int, +func TstNewKnownAddress(na *wire.NetAddressV2, attempts int, lastattempt, lastsuccess time.Time, tried bool, refs int) *KnownAddress { return &KnownAddress{na: na, attempts: attempts, lastattempt: lastattempt, lastsuccess: lastsuccess, tried: tried, refs: refs} diff --git a/addrmgr/knownaddress.go b/addrmgr/knownaddress.go index 15469f374e..b045365508 100644 --- a/addrmgr/knownaddress.go +++ b/addrmgr/knownaddress.go @@ -5,6 +5,7 @@ package addrmgr import ( + "sync" "time" "github.com/btcsuite/btcd/wire" @@ -13,8 +14,9 @@ import ( // KnownAddress tracks information about a known network address that is used // to determine how viable an address is. type KnownAddress struct { - na *wire.NetAddress - srcAddr *wire.NetAddress + mtx sync.RWMutex // na and lastattempt + na *wire.NetAddressV2 + srcAddr *wire.NetAddressV2 attempts int lastattempt time.Time lastsuccess time.Time @@ -22,22 +24,31 @@ type KnownAddress struct { refs int // reference count of new buckets } -// NetAddress returns the underlying wire.NetAddress associated with the +// NetAddress returns the underlying wire.NetAddressV2 associated with the // known address. -func (ka *KnownAddress) NetAddress() *wire.NetAddress { +func (ka *KnownAddress) NetAddress() *wire.NetAddressV2 { + ka.mtx.RLock() + defer ka.mtx.RUnlock() return ka.na } // LastAttempt returns the last time the known address was attempted. func (ka *KnownAddress) LastAttempt() time.Time { + ka.mtx.RLock() + defer ka.mtx.RUnlock() return ka.lastattempt } // Services returns the services supported by the peer with the known address. func (ka *KnownAddress) Services() wire.ServiceFlag { + ka.mtx.RLock() + defer ka.mtx.RUnlock() return ka.na.Services } +// The unexported methods, chance and isBad, are used from within AddrManager +// where KnownAddress field access is synchronized via it's own Mutex. + // chance returns the selection probability for a known address. The priority // depends upon how recently the address has been seen, how recently it was last // attempted and how often attempts to connect to it have failed. diff --git a/addrmgr/knownaddress_test.go b/addrmgr/knownaddress_test.go index a289d5a386..b4a2650140 100644 --- a/addrmgr/knownaddress_test.go +++ b/addrmgr/knownaddress_test.go @@ -21,27 +21,27 @@ func TestChance(t *testing.T) { }{ { //Test normal case - addrmgr.TstNewKnownAddress(&wire.NetAddress{Timestamp: now.Add(-35 * time.Second)}, + addrmgr.TstNewKnownAddress(&wire.NetAddressV2{Timestamp: now.Add(-35 * time.Second)}, 0, time.Now().Add(-30*time.Minute), time.Now(), false, 0), 1.0, }, { //Test case in which lastseen < 0 - addrmgr.TstNewKnownAddress(&wire.NetAddress{Timestamp: now.Add(20 * time.Second)}, + addrmgr.TstNewKnownAddress(&wire.NetAddressV2{Timestamp: now.Add(20 * time.Second)}, 0, time.Now().Add(-30*time.Minute), time.Now(), false, 0), 1.0, }, { //Test case in which lastattempt < 0 - addrmgr.TstNewKnownAddress(&wire.NetAddress{Timestamp: now.Add(-35 * time.Second)}, + addrmgr.TstNewKnownAddress(&wire.NetAddressV2{Timestamp: now.Add(-35 * time.Second)}, 0, time.Now().Add(30*time.Minute), time.Now(), false, 0), 1.0 * .01, }, { //Test case in which lastattempt < ten minutes - addrmgr.TstNewKnownAddress(&wire.NetAddress{Timestamp: now.Add(-35 * time.Second)}, + addrmgr.TstNewKnownAddress(&wire.NetAddressV2{Timestamp: now.Add(-35 * time.Second)}, 0, time.Now().Add(-5*time.Minute), time.Now(), false, 0), 1.0 * .01, }, { //Test case with several failed attempts. - addrmgr.TstNewKnownAddress(&wire.NetAddress{Timestamp: now.Add(-35 * time.Second)}, + addrmgr.TstNewKnownAddress(&wire.NetAddressV2{Timestamp: now.Add(-35 * time.Second)}, 2, time.Now().Add(-30*time.Minute), time.Now(), false, 0), 1 / 1.5 / 1.5, }, @@ -65,10 +65,10 @@ func TestIsBad(t *testing.T) { hoursOld := now.Add(-5 * time.Hour) zeroTime := time.Time{} - futureNa := &wire.NetAddress{Timestamp: future} - minutesOldNa := &wire.NetAddress{Timestamp: minutesOld} - monthOldNa := &wire.NetAddress{Timestamp: monthOld} - currentNa := &wire.NetAddress{Timestamp: secondsOld} + futureNa := &wire.NetAddressV2{Timestamp: future} + minutesOldNa := &wire.NetAddressV2{Timestamp: minutesOld} + monthOldNa := &wire.NetAddressV2{Timestamp: monthOld} + currentNa := &wire.NetAddressV2{Timestamp: secondsOld} //Test addresses that have been tried in the last minute. if addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(futureNa, 3, secondsOld, zeroTime, false, 0)) { diff --git a/addrmgr/network.go b/addrmgr/network.go index 51bfa3ed75..95555a69c5 100644 --- a/addrmgr/network.go +++ b/addrmgr/network.go @@ -20,7 +20,7 @@ var ( ipNet("192.168.0.0", 16, 32), } - // rfc2544Net specifies the the IPv4 block as defined by RFC2544 + // rfc2544Net specifies the IPv4 block as defined by RFC2544 // (198.18.0.0/15) rfc2544Net = ipNet("198.18.0.0", 15, 32) @@ -222,11 +222,20 @@ func IsValid(na *wire.NetAddress) bool { // IsRoutable returns whether or not the passed address is routable over // the public internet. This is true as long as the address is valid and is not // in any reserved ranges. -func IsRoutable(na *wire.NetAddress) bool { - return IsValid(na) && !(IsRFC1918(na) || IsRFC2544(na) || - IsRFC3927(na) || IsRFC4862(na) || IsRFC3849(na) || - IsRFC4843(na) || IsRFC5737(na) || IsRFC6598(na) || - IsLocal(na) || (IsRFC4193(na) && !IsOnionCatTor(na))) +func IsRoutable(na *wire.NetAddressV2) bool { + if na.IsTorV3() { + // na is a torv3 address, return true. + return true + } + + // Else na can be represented as a legacy NetAddress since i2p and + // cjdns are unsupported. + lna := na.ToLegacy() + return IsValid(lna) && !(IsRFC1918(lna) || IsRFC2544(lna) || + IsRFC3927(lna) || IsRFC4862(lna) || IsRFC3849(lna) || + IsRFC4843(lna) || IsRFC5737(lna) || IsRFC6598(lna) || + IsLocal(lna) || (IsRFC4193(lna) && + !IsOnionCatTor(lna))) } // GroupKey returns a string representing the network group an address is part @@ -234,48 +243,56 @@ func IsRoutable(na *wire.NetAddress) bool { // "local" for a local address, the string "tor:key" where key is the /4 of the // onion address for Tor address, and the string "unroutable" for an unroutable // address. -func GroupKey(na *wire.NetAddress) string { - if IsLocal(na) { +func GroupKey(na *wire.NetAddressV2) string { + if na.IsTorV3() { + // na is a torv3 address. Use the same network group keying as + // for torv2. + return fmt.Sprintf("tor:%d", na.TorV3Key()&((1<<4)-1)) + } + + lna := na.ToLegacy() + + if IsLocal(lna) { return "local" } if !IsRoutable(na) { return "unroutable" } - if IsIPv4(na) { - return na.IP.Mask(net.CIDRMask(16, 32)).String() + if IsIPv4(lna) { + return lna.IP.Mask(net.CIDRMask(16, 32)).String() } - if IsRFC6145(na) || IsRFC6052(na) { + if IsRFC6145(lna) || IsRFC6052(lna) { // last four bytes are the ip address - ip := na.IP[12:16] + ip := lna.IP[12:16] return ip.Mask(net.CIDRMask(16, 32)).String() } - if IsRFC3964(na) { - ip := na.IP[2:6] + if IsRFC3964(lna) { + ip := lna.IP[2:6] return ip.Mask(net.CIDRMask(16, 32)).String() } - if IsRFC4380(na) { + if IsRFC4380(lna) { // teredo tunnels have the last 4 bytes as the v4 address XOR // 0xff. ip := net.IP(make([]byte, 4)) - for i, byte := range na.IP[12:16] { + for i, byte := range lna.IP[12:16] { ip[i] = byte ^ 0xff } return ip.Mask(net.CIDRMask(16, 32)).String() } - if IsOnionCatTor(na) { + if IsOnionCatTor(lna) { // group is keyed off the first 4 bits of the actual onion key. - return fmt.Sprintf("tor:%d", na.IP[6]&((1<<4)-1)) + return fmt.Sprintf("tor:%d", lna.IP[6]&((1<<4)-1)) } // OK, so now we know ourselves to be a IPv6 address. // bitcoind uses /32 for everything, except for Hurricane Electric's // (he.net) IP range, which it uses /36 for. bits := 32 - if heNet.Contains(na.IP) { + if heNet.Contains(lna.IP) { bits = 36 } - return na.IP.Mask(net.CIDRMask(bits, 128)).String() + return lna.IP.Mask(net.CIDRMask(bits, 128)).String() } diff --git a/addrmgr/network_test.go b/addrmgr/network_test.go index 8af3369f56..f4bc5d88f7 100644 --- a/addrmgr/network_test.go +++ b/addrmgr/network_test.go @@ -7,6 +7,7 @@ package addrmgr_test import ( "net" "testing" + "time" "github.com/btcsuite/btcd/addrmgr" "github.com/btcsuite/btcd/wire" @@ -136,7 +137,10 @@ func TestIPTypes(t *testing.T) { t.Errorf("IsValid %s\n got: %v want: %v", test.in.IP, rv, test.valid) } - if rv := addrmgr.IsRoutable(&test.in); rv != test.routable { + currentNa := wire.NetAddressV2FromBytes( + time.Now(), test.in.Services, test.in.IP, test.in.Port, + ) + if rv := addrmgr.IsRoutable(currentNa); rv != test.routable { t.Errorf("IsRoutable %s\n got: %v want: %v", test.in.IP, rv, test.routable) } } @@ -192,8 +196,10 @@ func TestGroupKey(t *testing.T) { for i, test := range tests { nip := net.ParseIP(test.ip) - na := *wire.NewNetAddressIPPort(nip, 8333, wire.SFNodeNetwork) - if key := addrmgr.GroupKey(&na); key != test.expected { + na := wire.NetAddressV2FromBytes( + time.Now(), wire.SFNodeNetwork, nip, 8333, + ) + if key := addrmgr.GroupKey(na); key != test.expected { t.Errorf("TestGroupKey #%d (%s): unexpected group key "+ "- got '%s', want '%s'", i, test.name, key, test.expected) diff --git a/blockchain/README.md b/blockchain/README.md index de5611bcae..2237780c10 100644 --- a/blockchain/README.md +++ b/blockchain/README.md @@ -1,9 +1,9 @@ blockchain ========== -[![Build Status](http://img.shields.io/travis/btcsuite/btcd.svg)](https://travis-ci.org/btcsuite/btcd) +[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions) [![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) -[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/btcsuite/btcd/blockchain) +[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/blockchain) Package blockchain implements bitcoin block handling and chain selection rules. The test coverage is currently only around 60%, but will be increasing over @@ -61,18 +61,18 @@ is by no means exhaustive: ## Examples -* [ProcessBlock Example](http://godoc.org/github.com/btcsuite/btcd/blockchain#example-BlockChain-ProcessBlock) +* [ProcessBlock Example](https://pkg.go.dev/github.com/btcsuite/btcd/blockchain#example-BlockChain-ProcessBlock) Demonstrates how to create a new chain instance and use ProcessBlock to attempt to add a block to the chain. This example intentionally attempts to insert a duplicate genesis block to illustrate how an invalid block is handled. -* [CompactToBig Example](http://godoc.org/github.com/btcsuite/btcd/blockchain#example-CompactToBig) +* [CompactToBig Example](https://pkg.go.dev/github.com/btcsuite/btcd/blockchain#example-CompactToBig) Demonstrates how to convert the compact "bits" in a block header which represent the target difficulty to a big integer and display it using the typical hex notation. -* [BigToCompact Example](http://godoc.org/github.com/btcsuite/btcd/blockchain#example-BigToCompact) +* [BigToCompact Example](https://pkg.go.dev/github.com/btcsuite/btcd/blockchain#example-BigToCompact) Demonstrates how to convert a target difficulty into the compact "bits" in a block header which represent that target difficulty. diff --git a/blockchain/accept.go b/blockchain/accept.go index f85d6558e8..4adc2f6127 100644 --- a/blockchain/accept.go +++ b/blockchain/accept.go @@ -7,8 +7,8 @@ package blockchain import ( "fmt" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/database" - "github.com/btcsuite/btcutil" ) // maybeAcceptBlock potentially accepts a block into the block chain and, if @@ -84,9 +84,11 @@ func (b *BlockChain) maybeAcceptBlock(block *btcutil.Block, flags BehaviorFlags) // Notify the caller that the new block was accepted into the block // chain. The caller would typically want to react by relaying the // inventory to other peers. - b.chainLock.Unlock() - b.sendNotification(NTBlockAccepted, block) - b.chainLock.Lock() + func() { + b.chainLock.Unlock() + defer b.chainLock.Lock() + b.sendNotification(NTBlockAccepted, block) + }() return isMainChain, nil } diff --git a/blockchain/bench_test.go b/blockchain/bench_test.go index 43d3152b37..db6f415013 100644 --- a/blockchain/bench_test.go +++ b/blockchain/bench_test.go @@ -7,7 +7,8 @@ package blockchain import ( "testing" - "github.com/btcsuite/btcutil" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/wire" ) // BenchmarkIsCoinBase performs a simple benchmark against the IsCoinBase @@ -29,3 +30,46 @@ func BenchmarkIsCoinBaseTx(b *testing.B) { IsCoinBaseTx(tx) } } + +func BenchmarkUtxoFetchMap(b *testing.B) { + block := Block100000 + transactions := block.Transactions + b.ResetTimer() + + for i := 0; i < b.N; i++ { + needed := make(map[wire.OutPoint]struct{}, len(transactions)) + for _, tx := range transactions[1:] { + for _, txIn := range tx.TxIn { + needed[txIn.PreviousOutPoint] = struct{}{} + } + } + } +} + +func BenchmarkUtxoFetchSlices(b *testing.B) { + block := Block100000 + transactions := block.Transactions + b.ResetTimer() + + for i := 0; i < b.N; i++ { + needed := make([]wire.OutPoint, 0, len(transactions)) + for _, tx := range transactions[1:] { + for _, txIn := range tx.TxIn { + needed = append(needed, txIn.PreviousOutPoint) + } + } + } +} + +func BenchmarkAncestor(b *testing.B) { + height := 1 << 19 + blockNodes := chainedNodes(nil, height) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + blockNodes[len(blockNodes)-1].Ancestor(0) + for j := 0; j <= 19; j++ { + blockNodes[len(blockNodes)-1].Ancestor(1 << j) + } + } +} diff --git a/blockchain/blockindex.go b/blockchain/blockindex.go index 2ff2fa27c4..5273cb488b 100644 --- a/blockchain/blockindex.go +++ b/blockchain/blockindex.go @@ -74,6 +74,9 @@ type blockNode struct { // parent is the parent block for this node. parent *blockNode + // ancestor is a block that is more than one block back from this node. + ancestor *blockNode + // hash is the double sha 256 of the block. hash chainhash.Hash @@ -119,6 +122,7 @@ func initBlockNode(node *blockNode, blockHeader *wire.BlockHeader, parent *block node.parent = parent node.height = parent.height + 1 node.workSum = node.workSum.Add(parent.workSum, node.workSum) + node.buildAncestor() } } @@ -131,6 +135,20 @@ func newBlockNode(blockHeader *wire.BlockHeader, parent *blockNode) *blockNode { return &node } +// Equals compares all the fields of the block node except for the parent and +// ancestor and returns true if they're equal. +func (node *blockNode) Equals(other *blockNode) bool { + return node.hash == other.hash && + node.workSum.Cmp(other.workSum) == 0 && + node.height == other.height && + node.version == other.version && + node.bits == other.bits && + node.nonce == other.nonce && + node.timestamp == other.timestamp && + node.merkleRoot == other.merkleRoot && + node.status == other.status +} + // Header constructs a block header from the node and returns it. // // This function is safe for concurrent access. @@ -150,6 +168,26 @@ func (node *blockNode) Header() wire.BlockHeader { } } +// invertLowestOne turns the lowest 1 bit in the binary representation of a number into a 0. +func invertLowestOne(n int32) int32 { + return n & (n - 1) +} + +// getAncestorHeight returns a suitable ancestor for the node at the given height. +func getAncestorHeight(height int32) int32 { + // We pop off two 1 bits of the height. + // This results in a maximum of 330 steps to go back to an ancestor + // from height 1<<29. + return invertLowestOne(invertLowestOne(height)) +} + +// buildAncestor sets an ancestor for the given blocknode. +func (node *blockNode) buildAncestor() { + if node.parent != nil { + node.ancestor = node.parent.Ancestor(getAncestorHeight(node.height)) + } +} + // Ancestor returns the ancestor block node at the provided height by following // the chain backwards from this node. The returned block will be nil when a // height is requested that is after the height of the passed node or is less @@ -161,14 +199,103 @@ func (node *blockNode) Ancestor(height int32) *blockNode { return nil } + // Traverse back until we find the desired node. n := node - for ; n != nil && n.height != height; n = n.parent { - // Intentionally left blank + for n != nil && n.height != height { + // If there's an ancestor available, use it. Otherwise, just + // follow the parent. + if n.ancestor != nil { + // Calculate the height for this ancestor and + // check if we can take the ancestor skip. + if getAncestorHeight(n.height) >= height { + n = n.ancestor + continue + } + } + + // We couldn't take the ancestor skip so traverse back to the parent. + n = n.parent } return n } +// Height returns the blockNode's height in the chain. +// +// NOTE: Part of the HeaderCtx interface. +func (node *blockNode) Height() int32 { + return node.height +} + +// Bits returns the blockNode's nBits. +// +// NOTE: Part of the HeaderCtx interface. +func (node *blockNode) Bits() uint32 { + return node.bits +} + +// Timestamp returns the blockNode's timestamp. +// +// NOTE: Part of the HeaderCtx interface. +func (node *blockNode) Timestamp() int64 { + return node.timestamp +} + +// Parent returns the blockNode's parent. +// +// NOTE: Part of the HeaderCtx interface. +func (node *blockNode) Parent() HeaderCtx { + if node.parent == nil { + // This is required since node.parent is a *blockNode and if we + // do not explicitly return nil here, the caller may fail when + // nil-checking this. + return nil + } + + return node.parent +} + +// RelativeAncestorCtx returns the blockNode's ancestor that is distance blocks +// before it in the chain. This is equivalent to the RelativeAncestor function +// below except that the return type is different. +// +// This function is safe for concurrent access. +// +// NOTE: Part of the HeaderCtx interface. +func (node *blockNode) RelativeAncestorCtx(distance int32) HeaderCtx { + ancestor := node.RelativeAncestor(distance) + if ancestor == nil { + // This is required since RelativeAncestor returns a *blockNode + // and if we do not explicitly return nil here, the caller may + // fail when nil-checking this. + return nil + } + + return ancestor +} + +// IsAncestor returns if the other node is an ancestor of this block node. +func (node *blockNode) IsAncestor(otherNode *blockNode) bool { + // Return early as false if the otherNode is nil. + if otherNode == nil { + return false + } + + ancestor := node.Ancestor(otherNode.height) + if ancestor == nil { + return false + } + + // If the otherNode has the same height as me, then the returned + // ancestor will be me. Return false since I'm not an ancestor of me. + if node.height == ancestor.height { + return false + } + + // Return true if the fetched ancestor is other node. + return ancestor.Equals(otherNode) +} + // RelativeAncestor returns the ancestor block node a relative 'distance' blocks // before this node. This is equivalent to calling Ancestor with the node's // height minus provided distance. @@ -182,17 +309,17 @@ func (node *blockNode) RelativeAncestor(distance int32) *blockNode { // prior to, and including, the block node. // // This function is safe for concurrent access. -func (node *blockNode) CalcPastMedianTime() time.Time { +func CalcPastMedianTime(node HeaderCtx) time.Time { // Create a slice of the previous few block timestamps used to calculate // the median per the number defined by the constant medianTimeBlocks. timestamps := make([]int64, medianTimeBlocks) numNodes := 0 iterNode := node for i := 0; i < medianTimeBlocks && iterNode != nil; i++ { - timestamps[i] = iterNode.timestamp + timestamps[i] = iterNode.Timestamp() numNodes++ - iterNode = iterNode.parent + iterNode = iterNode.Parent() } // Prune the slice to the actual number of available timestamps which @@ -217,6 +344,10 @@ func (node *blockNode) CalcPastMedianTime() time.Time { return time.Unix(medianTimestamp, 0) } +// A compile-time assertion to ensure blockNode implements the HeaderCtx +// interface. +var _ HeaderCtx = (*blockNode)(nil) + // blockIndex provides facilities for keeping track of an in-memory index of the // block chain. Although the name block chain suggests a single chain of // blocks, it is actually a tree-shaped structure where any node can have @@ -319,6 +450,44 @@ func (bi *blockIndex) UnsetStatusFlags(node *blockNode, flags blockStatus) { bi.Unlock() } +// InactiveTips returns all the block nodes that aren't in the best chain. +// +// This function is safe for concurrent access. +func (bi *blockIndex) InactiveTips(bestChain *chainView) []*blockNode { + bi.RLock() + defer bi.RUnlock() + + // Look through the entire blockindex and look for nodes that aren't in + // the best chain. We're gonna keep track of all the orphans and the parents + // of the orphans. + orphans := make(map[chainhash.Hash]*blockNode) + orphanParent := make(map[chainhash.Hash]*blockNode) + for hash, node := range bi.index { + found := bestChain.Contains(node) + if !found { + orphans[hash] = node + orphanParent[node.parent.hash] = node.parent + } + } + + // If an orphan isn't pointed to by another orphan, it is a chain tip. + // + // We can check this by looking for the orphan in the orphan parent map. + // If the orphan exists in the orphan parent map, it means that another + // orphan is pointing to it. + tips := make([]*blockNode, 0, len(orphans)) + for hash, orphan := range orphans { + _, found := orphanParent[hash] + if !found { + tips = append(tips, orphan) + } + + delete(orphanParent, hash) + } + + return tips +} + // flushToDB writes all dirty block nodes to the database. If all writes // succeed, this clears the dirty set. func (bi *blockIndex) flushToDB() error { diff --git a/blockchain/blockindex_test.go b/blockchain/blockindex_test.go new file mode 100644 index 0000000000..cd08969f14 --- /dev/null +++ b/blockchain/blockindex_test.go @@ -0,0 +1,42 @@ +// Copyright (c) 2023 The utreexo developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package blockchain + +import ( + "math/rand" + "testing" +) + +func TestAncestor(t *testing.T) { + height := 500_000 + blockNodes := chainedNodes(nil, height) + + for i, blockNode := range blockNodes { + // Grab a random node that's a child of this node + // and try to fetch the current blockNode with Ancestor. + randNode := blockNodes[rand.Intn(height-i)+i] + got := randNode.Ancestor(blockNode.height) + + // See if we got the right one. + if got.hash != blockNode.hash { + t.Fatalf("expected ancestor at height %d "+ + "but got a node at height %d", + blockNode.height, got.height) + } + + // Gensis doesn't have ancestors so skip the check below. + if blockNode.height == 0 { + continue + } + + // The ancestors are deterministic so check that this node's + // ancestor is the correct one. + if blockNode.ancestor.height != getAncestorHeight(blockNode.height) { + t.Fatalf("expected anestor at height %d, but it was at %d", + getAncestorHeight(blockNode.height), + blockNode.ancestor.height) + } + } +} diff --git a/blockchain/chain.go b/blockchain/chain.go index 71c1b2ee77..952d0bc279 100644 --- a/blockchain/chain.go +++ b/blockchain/chain.go @@ -11,12 +11,12 @@ import ( "sync" "time" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/database" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) const ( @@ -34,8 +34,9 @@ const ( // from the block being located. // // For example, assume a block chain with a side chain as depicted below: -// genesis -> 1 -> 2 -> ... -> 15 -> 16 -> 17 -> 18 -// \-> 16a -> 17a +// +// genesis -> 1 -> 2 -> ... -> 15 -> 16 -> 17 -> 18 +// \-> 16a -> 17a // // The block locator for block 17a would be the hashes of blocks: // [17a 16a 15 14 13 12 11 10 9 8 7 6 4 genesis] @@ -114,6 +115,10 @@ type BlockChain struct { // fields in this struct below this point. chainLock sync.RWMutex + // pruneTarget is the size in bytes the database targets for when the node + // is pruned. + pruneTarget uint64 + // These fields are related to the memory block index. They both have // their own locks, however they are often also protected by the chain // lock to help prevent logic races when blocks are being processed. @@ -126,6 +131,10 @@ type BlockChain struct { index *blockIndex bestChain *chainView + // The UTXO state holds a cached view of the UTXO state of the chain. + // It is protected by the chain lock. + utxoCache *utxoCache + // These fields are related to handling of orphan blocks. They are // protected by a combination of the chain lock and the orphan lock. orphanLock sync.RWMutex @@ -174,11 +183,7 @@ type BlockChain struct { // // unknownRulesWarned refers to warnings due to unknown rules being // activated. - // - // unknownVersionsWarned refers to warnings due to unknown versions - // being mined. - unknownRulesWarned bool - unknownVersionsWarned bool + unknownRulesWarned bool // The notifications field stores a slice of callbacks to be executed on // certain blockchain events. @@ -390,7 +395,7 @@ func (b *BlockChain) calcSequenceLock(node *blockNode, tx *btcutil.Tx, utxoView // return sequence lock values of -1 indicating that this transaction // can be included within a block at any given height or time. mTx := tx.MsgTx() - sequenceLockActive := mTx.Version >= 2 && csvSoftforkActive + sequenceLockActive := uint32(mTx.Version) >= 2 && csvSoftforkActive if !sequenceLockActive || IsCoinBase(tx) { return sequenceLock, nil } @@ -440,7 +445,7 @@ func (b *BlockChain) calcSequenceLock(node *blockNode, tx *btcutil.Tx, utxoView prevInputHeight = 0 } blockNode := node.Ancestor(prevInputHeight) - medianTime := blockNode.CalcPastMedianTime() + medianTime := CalcPastMedianTime(blockNode) // Time based relative time-locks as defined by BIP 68 // have a time granularity of RelativeLockSeconds, so @@ -472,7 +477,7 @@ func (b *BlockChain) calcSequenceLock(node *blockNode, tx *btcutil.Tx, utxoView // LockTimeToSequence converts the passed relative locktime to a sequence // number in accordance to BIP-68. // See: https://github.com/bitcoin/bips/blob/master/bip-0068.mediawiki -// * (Compatibility) +// - (Compatibility) func LockTimeToSequence(isSeconds bool, locktime uint32) uint32 { // If we're expressing the relative lock time in blocks, then the // corresponding sequence number is simply the desired input age. @@ -550,16 +555,21 @@ func (b *BlockChain) getReorganizeNodes(node *blockNode) (*list.List, *list.List // connectBlock handles connecting the passed node/block to the end of the main // (best) chain. // -// This passed utxo view must have all referenced txos the block spends marked -// as spent and all of the new txos the block creates added to it. In addition, -// the passed stxos slice must be populated with all of the information for the +// Passing in a utxo view is optional. If the passed in utxo view is nil, +// connectBlock will assume that the utxo cache has already connected all the +// txs in the block being connected. +// If a utxo view is passed in, this passed utxo view must have all referenced +// txos the block spends marked as spent and all of the new txos the block creates +// added to it. +// +// The passed stxos slice must be populated with all of the information for the // spent txos. This approach is used because the connection validation that // must happen prior to calling this function requires the same details, so // it would be inefficient to repeat it. // // This function MUST be called with the chain state lock held (for writes). func (b *BlockChain) connectBlock(node *blockNode, block *btcutil.Block, - view *UtxoViewpoint, stxos []SpentTxOut) error { + stxos []SpentTxOut) error { // Make sure it's extending the end of the best chain. prevHash := &block.MsgBlock().Header.PrevBlock @@ -574,20 +584,13 @@ func (b *BlockChain) connectBlock(node *blockNode, block *btcutil.Block, "spent transaction out information") } - // No warnings about unknown rules or versions until the chain is - // current. + // No warnings about unknown rules until the chain is current. if b.isCurrent() { // Warn if any unknown new rules are either about to activate or // have already been activated. if err := b.warnUnknownRuleActivations(node); err != nil { return err } - - // Warn if a high enough percentage of the last blocks have - // unexpected versions. - if err := b.warnUnknownVersions(node); err != nil { - return err - } } // Write any block status changes to DB before updating best state. @@ -605,10 +608,49 @@ func (b *BlockChain) connectBlock(node *blockNode, block *btcutil.Block, blockSize := uint64(block.MsgBlock().SerializeSize()) blockWeight := uint64(GetBlockWeight(block)) state := newBestState(node, blockSize, blockWeight, numTxns, - curTotalTxns+numTxns, node.CalcPastMedianTime()) + curTotalTxns+numTxns, CalcPastMedianTime(node), + ) // Atomically insert info into the database. err = b.db.Update(func(dbTx database.Tx) error { + // If the pruneTarget isn't 0, we should attempt to delete older blocks + // from the database. + if b.pruneTarget != 0 { + // When the total block size is under the prune target, prune blocks is + // a no-op and the deleted hashes are nil. + deletedHashes, err := dbTx.PruneBlocks(b.pruneTarget) + if err != nil { + return err + } + + // Only attempt to delete if we have any deleted blocks. + if len(deletedHashes) != 0 { + // Delete the spend journals of the pruned blocks. + err = dbPruneSpendJournalEntry(dbTx, deletedHashes) + if err != nil { + return err + } + + // We may need to flush if the prune will delete blocks that + // are past our last flush block. + // + // NOTE: the database will never be inconsistent here as the + // actual blocks are not deleted until the db.Update returns. + needsFlush, err := b.flushNeededAfterPrune(deletedHashes) + if err != nil { + return err + } + if needsFlush { + // Since the deleted hashes are past our last + // flush block, flush the utxo cache now. + err = b.utxoCache.flush(dbTx, FlushRequired, state) + if err != nil { + return err + } + } + } + } + // Update best block state. err := dbPutBestState(dbTx, state, node.workSum) if err != nil { @@ -622,14 +664,6 @@ func (b *BlockChain) connectBlock(node *blockNode, block *btcutil.Block, return err } - // Update the utxo set using the state of the utxo view. This - // entails removing all of the utxos spent and adding the new - // ones created by the block. - err = dbPutUtxoView(dbTx, view) - if err != nil { - return err - } - // Update the transaction spend journal by adding a record for // the block that contains all txos spent by it. err = dbPutSpendJournalEntry(dbTx, block.Hash(), stxos) @@ -653,10 +687,6 @@ func (b *BlockChain) connectBlock(node *blockNode, block *btcutil.Block, return err } - // Prune fully spent entries and mark all entries in the view unmodified - // now that the modifications have been committed to the database. - view.commit() - // This node is now the end of the best chain. b.bestChain.SetTip(node) @@ -672,11 +702,17 @@ func (b *BlockChain) connectBlock(node *blockNode, block *btcutil.Block, // Notify the caller that the block was connected to the main chain. // The caller would typically want to react with actions such as // updating wallets. - b.chainLock.Unlock() - b.sendNotification(NTBlockConnected, block) - b.chainLock.Lock() - - return nil + func() { + b.chainLock.Unlock() + defer b.chainLock.Lock() + b.sendNotification(NTBlockConnected, block) + }() + + // Since we may have changed the UTXO cache, we make sure it didn't exceed its + // maximum size. If we're pruned and have flushed already, this will be a no-op. + return b.db.Update(func(dbTx database.Tx) error { + return b.utxoCache.flush(dbTx, FlushIfNeeded, state) + }) } // disconnectBlock handles disconnecting the passed node/block from the end of @@ -718,7 +754,7 @@ func (b *BlockChain) disconnectBlock(node *blockNode, block *btcutil.Block, view blockWeight := uint64(GetBlockWeight(prevBlock)) newTotalTxns := curTotalTxns - uint64(len(block.MsgBlock().Transactions)) state := newBestState(prevNode, blockSize, blockWeight, numTxns, - newTotalTxns, prevNode.CalcPastMedianTime()) + newTotalTxns, CalcPastMedianTime(prevNode)) err = b.db.Update(func(dbTx database.Tx) error { // Update best block state. @@ -734,6 +770,15 @@ func (b *BlockChain) disconnectBlock(node *blockNode, block *btcutil.Block, view return err } + // Flush the cache on every disconnect. Since the code for + // reorganization modifies the database directly, the cache + // will be left in an inconsistent state if we don't flush it + // prior to the dbPutUtxoView that happens below. + err = b.utxoCache.flush(dbTx, FlushRequired, state) + if err != nil { + return err + } + // Update the utxo set using the state of the utxo view. This // entails restoring all of the utxos spent and removing the new // ones created by the block. @@ -791,9 +836,11 @@ func (b *BlockChain) disconnectBlock(node *blockNode, block *btcutil.Block, view // Notify the caller that the block was disconnected from the main // chain. The caller would typically want to react with actions such as // updating wallets. - b.chainLock.Unlock() - b.sendNotification(NTBlockDisconnected, block) - b.chainLock.Lock() + func() { + b.chainLock.Unlock() + defer b.chainLock.Lock() + b.sendNotification(NTBlockDisconnected, block) + }() return nil } @@ -818,11 +865,123 @@ func countSpentOutputs(block *btcutil.Block) int { // // This function may modify node statuses in the block index without flushing. // +// This function never leaves the utxo set in an inconsistent state for block +// disconnects. +// // This function MUST be called with the chain state lock held (for writes). func (b *BlockChain) reorganizeChain(detachNodes, attachNodes *list.List) error { + // Check first that the detach and the attach nodes are valid and they + // pass verification. + detachBlocks, attachBlocks, detachSpentTxOuts, + err := b.verifyReorganizationValidity(detachNodes, attachNodes) + if err != nil { + return err + } + + // Track the old and new best chains heads. + tip := b.bestChain.Tip() + oldBest := tip + newBest := tip + + // Reset the view for the actual connection code below. This is + // required because the view was previously modified when checking if + // the reorg would be successful and the connection code requires the + // view to be valid from the viewpoint of each block being disconnected. + view := NewUtxoViewpoint() + view.SetBestHash(&b.bestChain.Tip().hash) + + // Disconnect blocks from the main chain. + for i, e := 0, detachNodes.Front(); e != nil; i, e = i+1, e.Next() { + n := e.Value.(*blockNode) + block := detachBlocks[i] + + // Load all of the utxos referenced by the block that aren't + // already in the view. + err := view.fetchInputUtxos(b.utxoCache, block) + if err != nil { + return err + } + + // Update the view to unspend all of the spent txos and remove + // the utxos created by the block. + err = view.disconnectTransactions( + b.db, block, detachSpentTxOuts[i], + ) + if err != nil { + return err + } + + // Update the database and chain state. The cache will be flushed + // here before the utxoview modifications happen to the database. + err = b.disconnectBlock(n, block, view) + if err != nil { + return err + } + + newBest = n.parent + } + + // Set the fork point only if there are nodes to attach since otherwise + // blocks are only being disconnected and thus there is no fork point. + var forkNode *blockNode + if attachNodes.Len() > 0 { + forkNode = newBest + } + + // Connect the new best chain blocks using the utxocache directly. It's more + // efficient and since we already checked that the blocks are correct and that + // the transactions connect properly, it's ok to access the cache. If we suddenly + // crash here, we are able to recover as well. + for i, e := 0, attachNodes.Front(); e != nil; i, e = i+1, e.Next() { + n := e.Value.(*blockNode) + block := attachBlocks[i] + + // Update the cache to mark all utxos referenced by the block + // as spent and add all transactions being created by this block + // to it. Also, provide an stxo slice so the spent txout + // details are generated. + stxos := make([]SpentTxOut, 0, countSpentOutputs(block)) + err = b.utxoCache.connectTransactions(block, &stxos) + if err != nil { + return err + } + + // Update the database and chain state. + err = b.connectBlock(n, block, stxos) + if err != nil { + return err + } + + newBest = n + } + + // Log the point where the chain forked and old and new best chain + // heads. + if forkNode != nil { + log.Infof("REORGANIZE: Chain forks at %v (height %v)", forkNode.hash, + forkNode.height) + } + log.Infof("REORGANIZE: Old best chain head was %v (height %v)", + &oldBest.hash, oldBest.height) + log.Infof("REORGANIZE: New best chain head is %v (height %v)", + newBest.hash, newBest.height) + + return nil +} + +// verifyReorganizationValidity will verify that the disconnects and the connects +// that are in the list are able to be processed without mutating the chain. +// +// For the attach nodes, it'll check that each of the blocks are valid and will +// change the status of the block node in the list to invalid if the block fails +// to pass verification. For the detach nodes, it'll check that the blocks being +// detached and their spend journals are present on the database. +func (b *BlockChain) verifyReorganizationValidity(detachNodes, attachNodes *list.List) ( + []*btcutil.Block, []*btcutil.Block, [][]SpentTxOut, error) { + // Nothing to do if no reorganize nodes were provided. if detachNodes.Len() == 0 && attachNodes.Len() == 0 { - return nil + return nil, nil, nil, nil } // Ensure the provided nodes match the current best chain. @@ -830,9 +989,10 @@ func (b *BlockChain) reorganizeChain(detachNodes, attachNodes *list.List) error if detachNodes.Len() != 0 { firstDetachNode := detachNodes.Front().Value.(*blockNode) if firstDetachNode.hash != tip.hash { - return AssertError(fmt.Sprintf("reorganize nodes to detach are "+ - "not for the current best chain -- first detach node %v, "+ - "current chain %v", &firstDetachNode.hash, &tip.hash)) + return nil, nil, nil, + AssertError(fmt.Sprintf("reorganize nodes to detach are "+ + "not for the current best chain -- first detach node %v, "+ + "current chain %v", &firstDetachNode.hash, &tip.hash)) } } @@ -841,17 +1001,14 @@ func (b *BlockChain) reorganizeChain(detachNodes, attachNodes *list.List) error firstAttachNode := attachNodes.Front().Value.(*blockNode) lastDetachNode := detachNodes.Back().Value.(*blockNode) if firstAttachNode.parent.hash != lastDetachNode.parent.hash { - return AssertError(fmt.Sprintf("reorganize nodes do not have the "+ - "same fork point -- first attach parent %v, last detach "+ - "parent %v", &firstAttachNode.parent.hash, - &lastDetachNode.parent.hash)) + return nil, nil, nil, + AssertError(fmt.Sprintf("reorganize nodes do not have the "+ + "same fork point -- first attach parent %v, last detach "+ + "parent %v", &firstAttachNode.parent.hash, + &lastDetachNode.parent.hash)) } } - // Track the old and new best chains heads. - oldBest := tip - newBest := tip - // All of the blocks to detach and related spend journal entries needed // to unspend transaction outputs in the blocks being disconnected must // be loaded from the database during the reorg check phase below and @@ -866,7 +1023,7 @@ func (b *BlockChain) reorganizeChain(detachNodes, attachNodes *list.List) error // database and using that information to unspend all of the spent txos // and remove the utxos created by the blocks. view := NewUtxoViewpoint() - view.SetBestHash(&oldBest.hash) + view.SetBestHash(&tip.hash) for e := detachNodes.Front(); e != nil; e = e.Next() { n := e.Value.(*blockNode) var block *btcutil.Block @@ -876,19 +1033,20 @@ func (b *BlockChain) reorganizeChain(detachNodes, attachNodes *list.List) error return err }) if err != nil { - return err + return nil, nil, nil, err } if n.hash != *block.Hash() { - return AssertError(fmt.Sprintf("detach block node hash %v (height "+ - "%v) does not match previous parent block hash %v", &n.hash, - n.height, block.Hash())) + return nil, nil, nil, AssertError( + fmt.Sprintf("detach block node hash %v (height "+ + "%v) does not match previous parent block hash %v", + &n.hash, n.height, block.Hash())) } // Load all of the utxos referenced by the block that aren't // already in the view. - err = view.fetchInputUtxos(b.db, block) + err = view.fetchInputUtxos(b.utxoCache, block) if err != nil { - return err + return nil, nil, nil, err } // Load all of the spent txos for the block from the spend @@ -899,7 +1057,7 @@ func (b *BlockChain) reorganizeChain(detachNodes, attachNodes *list.List) error return err }) if err != nil { - return err + return nil, nil, nil, err } // Store the loaded block and spend journal entry for later. @@ -908,17 +1066,8 @@ func (b *BlockChain) reorganizeChain(detachNodes, attachNodes *list.List) error err = view.disconnectTransactions(b.db, block, stxos) if err != nil { - return err + return nil, nil, nil, err } - - newBest = n.parent - } - - // Set the fork point only if there are nodes to attach since otherwise - // blocks are only being disconnected and thus there is no fork point. - var forkNode *blockNode - if attachNodes.Len() > 0 { - forkNode = newBest } // Perform several checks to verify each block that needs to be attached @@ -943,7 +1092,7 @@ func (b *BlockChain) reorganizeChain(detachNodes, attachNodes *list.List) error return err }) if err != nil { - return err + return nil, nil, nil, err } // Store the loaded block for later. @@ -953,16 +1102,15 @@ func (b *BlockChain) reorganizeChain(detachNodes, attachNodes *list.List) error // checkConnectBlock gets skipped, we still need to update the UTXO // view. if b.index.NodeStatus(n).KnownValid() { - err = view.fetchInputUtxos(b.db, block) + err = view.fetchInputUtxos(b.utxoCache, block) if err != nil { - return err + return nil, nil, nil, err } err = view.connectTransactions(block, nil) if err != nil { - return err + return nil, nil, nil, err } - newBest = n continue } @@ -983,89 +1131,12 @@ func (b *BlockChain) reorganizeChain(detachNodes, attachNodes *list.List) error b.index.SetStatusFlags(dn, statusInvalidAncestor) } } - return err + return nil, nil, nil, err } b.index.SetStatusFlags(n, statusValid) - - newBest = n - } - - // Reset the view for the actual connection code below. This is - // required because the view was previously modified when checking if - // the reorg would be successful and the connection code requires the - // view to be valid from the viewpoint of each block being connected or - // disconnected. - view = NewUtxoViewpoint() - view.SetBestHash(&b.bestChain.Tip().hash) - - // Disconnect blocks from the main chain. - for i, e := 0, detachNodes.Front(); e != nil; i, e = i+1, e.Next() { - n := e.Value.(*blockNode) - block := detachBlocks[i] - - // Load all of the utxos referenced by the block that aren't - // already in the view. - err := view.fetchInputUtxos(b.db, block) - if err != nil { - return err - } - - // Update the view to unspend all of the spent txos and remove - // the utxos created by the block. - err = view.disconnectTransactions(b.db, block, - detachSpentTxOuts[i]) - if err != nil { - return err - } - - // Update the database and chain state. - err = b.disconnectBlock(n, block, view) - if err != nil { - return err - } - } - - // Connect the new best chain blocks. - for i, e := 0, attachNodes.Front(); e != nil; i, e = i+1, e.Next() { - n := e.Value.(*blockNode) - block := attachBlocks[i] - - // Load all of the utxos referenced by the block that aren't - // already in the view. - err := view.fetchInputUtxos(b.db, block) - if err != nil { - return err - } - - // Update the view to mark all utxos referenced by the block - // as spent and add all transactions being created by this block - // to it. Also, provide an stxo slice so the spent txout - // details are generated. - stxos := make([]SpentTxOut, 0, countSpentOutputs(block)) - err = view.connectTransactions(block, &stxos) - if err != nil { - return err - } - - // Update the database and chain state. - err = b.connectBlock(n, block, view, stxos) - if err != nil { - return err - } - } - - // Log the point where the chain forked and old and new best chain - // heads. - if forkNode != nil { - log.Infof("REORGANIZE: Chain forks at %v (height %v)", forkNode.hash, - forkNode.height) } - log.Infof("REORGANIZE: Old best chain head was %v (height %v)", - &oldBest.hash, oldBest.height) - log.Infof("REORGANIZE: New best chain head is %v (height %v)", - newBest.hash, newBest.height) - return nil + return detachBlocks, attachBlocks, detachSpentTxOuts, nil } // connectBestChain handles connecting the passed block to the chain while @@ -1078,8 +1149,8 @@ func (b *BlockChain) reorganizeChain(detachNodes, attachNodes *list.List) error // a reorganization to become the main chain). // // The flags modify the behavior of this function as follows: -// - BFFastAdd: Avoids several expensive transaction validation operations. -// This is useful when using checkpoints. +// - BFFastAdd: Avoids several expensive transaction validation operations. +// This is useful when using checkpoints. // // This function MUST be called with the chain state lock held (for writes). func (b *BlockChain) connectBestChain(node *blockNode, block *btcutil.Block, flags BehaviorFlags) (bool, error) { @@ -1106,11 +1177,21 @@ func (b *BlockChain) connectBestChain(node *blockNode, block *btcutil.Block, fla // Perform several checks to verify the block can be connected // to the main chain without violating any rules and without // actually connecting the block. - view := NewUtxoViewpoint() - view.SetBestHash(parentHash) - stxos := make([]SpentTxOut, 0, countSpentOutputs(block)) if !fastAdd { - err := b.checkConnectBlock(node, block, view, &stxos) + // We create a viewpoint here to avoid spending or adding new + // coins to the utxo cache. + // + // checkConnectBlock spends and adds utxos before doing the + // signature validation and if the signature validation fails, + // we would be forced to undo the utxo cache. + // + // TODO (kcalvinalvin): Doing all of the validation before connecting + // the tx inside check connect block would allow us to pass the utxo + // cache directly to the check connect block. This would save on the + // expensive memory allocation done by fetch input utxos. + view := NewUtxoViewpoint() + view.SetBestHash(parentHash) + err := b.checkConnectBlock(node, block, view, nil) if err == nil { b.index.SetStatusFlags(node, statusValid) } else if _, ok := err.(RuleError); ok { @@ -1126,23 +1207,16 @@ func (b *BlockChain) connectBestChain(node *blockNode, block *btcutil.Block, fla } } - // In the fast add case the code to check the block connection - // was skipped, so the utxo view needs to load the referenced - // utxos, spend them, and add the new utxos being created by - // this block. - if fastAdd { - err := view.fetchInputUtxos(b.db, block) - if err != nil { - return false, err - } - err = view.connectTransactions(block, &stxos) - if err != nil { - return false, err - } + // Connect the transactions to the cache. All the txs are considered valid + // at this point as they have passed validation or was considered valid already. + stxos := make([]SpentTxOut, 0, countSpentOutputs(block)) + err := b.utxoCache.connectTransactions(block, &stxos) + if err != nil { + return false, err } // Connect the block to the main chain. - err := b.connectBlock(node, block, view, stxos) + err = b.connectBlock(node, block, stxos) if err != nil { // If we got hit with a rule error, then we'll mark // that status of the block as invalid and flush the @@ -1218,8 +1292,8 @@ func (b *BlockChain) connectBestChain(node *blockNode, block *btcutil.Block, fla // isCurrent returns whether or not the chain believes it is current. Several // factors are used to guess, but the key factors that allow the chain to // believe it is current are: -// - Latest block height is after the latest checkpoint (if enabled) -// - Latest block has a timestamp newer than 24 hours ago +// - Latest block height is after the latest checkpoint (if enabled) +// - Latest block has a timestamp newer than 24 hours ago // // This function MUST be called with the chain state lock held (for reads). func (b *BlockChain) isCurrent() bool { @@ -1242,8 +1316,8 @@ func (b *BlockChain) isCurrent() bool { // IsCurrent returns whether or not the chain believes it is current. Several // factors are used to guess, but the key factors that allow the chain to // believe it is current are: -// - Latest block height is after the latest checkpoint (if enabled) -// - Latest block has a timestamp newer than 24 hours ago +// - Latest block height is after the latest checkpoint (if enabled) +// - Latest block has a timestamp newer than 24 hours ago // // This function is safe for concurrent access. func (b *BlockChain) IsCurrent() bool { @@ -1265,6 +1339,119 @@ func (b *BlockChain) BestSnapshot() *BestState { return snapshot } +// TipStatus is the status of a chain tip. +type TipStatus byte + +const ( + // StatusUnknown indicates that the tip status isn't any of the defined + // statuses. + StatusUnknown TipStatus = iota + + // StatusActive indicates that the tip is considered active and is in + // the best chain. + StatusActive + + // StatusInvalid indicates that this tip or any of the ancestors of this + // tip are invalid. + StatusInvalid + + // StatusValidFork is given if: + // 1: Not a part of the best chain. + // 2: Is not invalid. + // 3: Has the block data stored to disk. + StatusValidFork +) + +// String returns the status flags as string. +func (ts TipStatus) String() string { + switch ts { + case StatusActive: + return "active" + case StatusInvalid: + return "invalid" + case StatusValidFork: + return "valid-fork" + } + return fmt.Sprintf("unknown: %b", ts) +} + +// ChainTip represents the last block in a branch of the block tree. +type ChainTip struct { + // Height of the tip. + Height int32 + + // BlockHash hash of the tip. + BlockHash chainhash.Hash + + // BranchLen is length of the fork point of this chain from the main chain. + // Returns 0 if the chain tip is a part of the best chain. + BranchLen int32 + + // Status is the validity status of the branch this tip is in. + Status TipStatus +} + +// ChainTips returns all the chain tips the node itself is aware of. Each tip is +// represented by its height, block hash, branch length, and status. +// +// This function is safe for concurrent access. +func (b *BlockChain) ChainTips() []ChainTip { + b.chainLock.RLock() + defer b.chainLock.RUnlock() + + // Grab all the inactive tips. + tips := b.index.InactiveTips(b.bestChain) + + // Add the current tip. + tips = append(tips, b.bestChain.Tip()) + + chainTips := make([]ChainTip, 0, len(tips)) + + // Go through all the tips and grab the height, hash, branch length, and the block + // status. + for _, tip := range tips { + var status TipStatus + switch { + // The tip is considered active if it's in the best chain. + case b.bestChain.Contains(tip): + status = StatusActive + + // This block or any of the ancestors of this block are invalid. + case tip.status.KnownInvalid(): + status = StatusInvalid + + // If the tip meets the following criteria: + // 1: Not a part of the best chain. + // 2: Is not invalid. + // 3: Has the block data stored to disk. + // + // The tip is considered a valid fork. + // + // We can check if a tip is a valid-fork by checking that + // its data is available. Since the behavior is to give a + // block node the statusDataStored status once it passes + // the proof of work checks and basic chain validity checks. + // + // We can't use the KnownValid status since it's only given + // to blocks that passed the validation AND were a part of + // the bestChain. + case tip.status.HaveData(): + status = StatusValidFork + } + + chainTip := ChainTip{ + Height: tip.height, + BlockHash: tip.hash, + BranchLen: tip.height - b.bestChain.FindFork(tip).height, + Status: status, + } + + chainTips = append(chainTips, chainTip) + } + + return chainTips +} + // HeaderByHash returns the block header identified by the given hash or an // error if it doesn't exist. Note that this will return headers from both the // main and side chains. @@ -1478,11 +1665,11 @@ func (b *BlockChain) IntervalBlockHashes(endHash *chainhash.Hash, interval int, // // In addition, there are two special cases: // -// - When no locators are provided, the stop hash is treated as a request for -// that block, so it will either return the node associated with the stop hash -// if it is known, or nil if it is unknown -// - When locators are provided, but none of them are known, nodes starting -// after the genesis block will be returned +// - When no locators are provided, the stop hash is treated as a request for +// that block, so it will either return the node associated with the stop hash +// if it is known, or nil if it is unknown +// - When locators are provided, but none of them are known, nodes starting +// after the genesis block will be returned // // This is primarily a helper function for the locateBlocks and locateHeaders // functions. @@ -1566,11 +1753,11 @@ func (b *BlockChain) locateBlocks(locator BlockLocator, hashStop *chainhash.Hash // // In addition, there are two special cases: // -// - When no locators are provided, the stop hash is treated as a request for -// that block, so it will either return the stop hash itself if it is known, -// or nil if it is unknown -// - When locators are provided, but none of them are known, hashes starting -// after the genesis block will be returned +// - When no locators are provided, the stop hash is treated as a request for +// that block, so it will either return the stop hash itself if it is known, +// or nil if it is unknown +// - When locators are provided, but none of them are known, hashes starting +// after the genesis block will be returned // // This function is safe for concurrent access. func (b *BlockChain) LocateBlocks(locator BlockLocator, hashStop *chainhash.Hash, maxHashes uint32) []chainhash.Hash { @@ -1611,11 +1798,11 @@ func (b *BlockChain) locateHeaders(locator BlockLocator, hashStop *chainhash.Has // // In addition, there are two special cases: // -// - When no locators are provided, the stop hash is treated as a request for -// that header, so it will either return the header for the stop hash itself -// if it is known, or nil if it is unknown -// - When locators are provided, but none of them are known, headers starting -// after the genesis block will be returned +// - When no locators are provided, the stop hash is treated as a request for +// that header, so it will either return the header for the stop hash itself +// if it is known, or nil if it is unknown +// - When locators are provided, but none of them are known, headers starting +// after the genesis block will be returned // // This function is safe for concurrent access. func (b *BlockChain) LocateHeaders(locator BlockLocator, hashStop *chainhash.Hash) []wire.BlockHeader { @@ -1625,6 +1812,234 @@ func (b *BlockChain) LocateHeaders(locator BlockLocator, hashStop *chainhash.Has return headers } +// InvalidateBlock invalidates the requested block and all its descedents. If a block +// in the best chain is invalidated, the active chain tip will be the parent of the +// invalidated block. +// +// This function is safe for concurrent access. +func (b *BlockChain) InvalidateBlock(hash *chainhash.Hash) error { + b.chainLock.Lock() + defer b.chainLock.Unlock() + + node := b.index.LookupNode(hash) + if node == nil { + // Return an error if the block doesn't exist. + return fmt.Errorf("Requested block hash of %s is not found "+ + "and thus cannot be invalidated.", hash) + } + if node.height == 0 { + return fmt.Errorf("Requested block hash of %s is a at height 0 "+ + "and is thus a genesis block and cannot be invalidated.", + node.hash) + } + + // Nothing to do if the given block is already invalid. + if node.status.KnownInvalid() { + return nil + } + + // Set the status of the block being invalidated. + b.index.SetStatusFlags(node, statusValidateFailed) + b.index.UnsetStatusFlags(node, statusValid) + + // If the block we're invalidating is not on the best chain, we simply + // mark the block and all its descendants as invalid and return. + if !b.bestChain.Contains(node) { + // Grab all the tips excluding the active tip. + tips := b.index.InactiveTips(b.bestChain) + for _, tip := range tips { + // Continue if the given inactive tip is not a descendant of the block + // being invalidated. + if !tip.IsAncestor(node) { + continue + } + + // Keep going back until we get to the block being invalidated. + // For each of the parent, we'll unset valid status and set invalid + // ancestor status. + for n := tip; n != nil && n != node; n = n.parent { + // Continue if it's already invalid. + if n.status.KnownInvalid() { + continue + } + b.index.SetStatusFlags(n, statusInvalidAncestor) + b.index.UnsetStatusFlags(n, statusValid) + } + } + + if writeErr := b.index.flushToDB(); writeErr != nil { + return fmt.Errorf("Error flushing block index "+ + "changes to disk: %v", writeErr) + } + + // Return since the block being invalidated is on a side branch. + // Nothing else left to do. + return nil + } + + // If we're here, it means a block from the active chain tip is getting + // invalidated. + // + // Grab all the nodes to detach from the active chain. + detachNodes := list.New() + for n := b.bestChain.Tip(); n != nil && n != node; n = n.parent { + // Continue if it's already invalid. + if n.status.KnownInvalid() { + continue + } + + // Change the status of the block node. + b.index.SetStatusFlags(n, statusInvalidAncestor) + b.index.UnsetStatusFlags(n, statusValid) + detachNodes.PushBack(n) + } + + // Push back the block node being invalidated. + detachNodes.PushBack(node) + + // Reorg back to the parent of the block being invalidated. + // Nothing to attach so just pass an empty list. + err := b.reorganizeChain(detachNodes, list.New()) + if err != nil { + return err + } + + if writeErr := b.index.flushToDB(); writeErr != nil { + log.Warnf("Error flushing block index changes to disk: %v", writeErr) + } + + // Grab all the tips. + tips := b.index.InactiveTips(b.bestChain) + tips = append(tips, b.bestChain.Tip()) + + // Here we'll check if the invalidation of the block in the active tip + // changes the status of the chain tips. If a side branch now has more + // worksum, it becomes the active chain tip. + var bestTip *blockNode + for _, tip := range tips { + // Skip invalid tips as they cannot become the active tip. + if tip.status.KnownInvalid() { + continue + } + + // If we have no best tips, then set this tip as the best tip. + if bestTip == nil { + bestTip = tip + } else { + // If there is an existing best tip, then compare it + // against the current tip. + if tip.workSum.Cmp(bestTip.workSum) == 1 { + bestTip = tip + } + } + } + + // Return if the best tip is the current tip. + if bestTip == b.bestChain.Tip() { + return nil + } + + // Reorganize to the best tip if a side branch is now the most work tip. + detachNodes, attachNodes := b.getReorganizeNodes(bestTip) + err = b.reorganizeChain(detachNodes, attachNodes) + + if writeErr := b.index.flushToDB(); writeErr != nil { + log.Warnf("Error flushing block index changes to disk: %v", writeErr) + } + + return err +} + +// ReconsiderBlock reconsiders the validity of the block with the given hash. +// +// This function is safe for concurrent access. +func (b *BlockChain) ReconsiderBlock(hash *chainhash.Hash) error { + b.chainLock.Lock() + defer b.chainLock.Unlock() + + log.Infof("Reconsidering block_hash=%v", hash[:]) + + reconsiderNode := b.index.LookupNode(hash) + if reconsiderNode == nil { + // Return an error if the block doesn't exist. + return fmt.Errorf("requested block hash of %s is not found "+ + "and thus cannot be reconsidered", hash) + } + + // Nothing to do if the given block is already valid. + if reconsiderNode.status.KnownValid() { + log.Infof("block_hash=%x is valid, nothing to reconsider", hash[:]) + return nil + } + + // Clear the status of the block being reconsidered. + b.index.UnsetStatusFlags(reconsiderNode, statusInvalidAncestor) + b.index.UnsetStatusFlags(reconsiderNode, statusValidateFailed) + + // Grab all the tips. + tips := b.index.InactiveTips(b.bestChain) + tips = append(tips, b.bestChain.Tip()) + + log.Debugf("Examining %v inactive chain tips for reconsideration") + + // Go through all the tips and unset the status for all the descendents of the + // block being reconsidered. + var reconsiderTip *blockNode + for _, tip := range tips { + // Continue if the given inactive tip is not a descendant of the block + // being invalidated. + if !tip.IsAncestor(reconsiderNode) { + // Set as the reconsider tip if the block node being reconsidered + // is a tip. + if tip == reconsiderNode { + reconsiderTip = reconsiderNode + } + continue + } + + // Mark the current tip as the tip being reconsidered. + reconsiderTip = tip + + // Unset the status of all the parents up until it reaches the block + // being reconsidered. + for n := tip; n != nil && n != reconsiderNode; n = n.parent { + b.index.UnsetStatusFlags(n, statusInvalidAncestor) + } + } + + // Compare the cumulative work for the branch being reconsidered. + bestTipWork := b.bestChain.Tip().workSum + if reconsiderTip.workSum.Cmp(bestTipWork) <= 0 { + log.Debugf("Tip to reconsider has less cumulative work than current "+ + "chain tip: %v vs %v", reconsiderTip.workSum, bestTipWork) + return nil + } + + // If the reconsider tip has a higher cumulative work, then reorganize + // to it after checking the validity of the nodes. + detachNodes, attachNodes := b.getReorganizeNodes(reconsiderTip) + + // We're checking if the reorganization that'll happen is actually valid. + // While this is called in reorganizeChain, we call it beforehand as the error + // returned from reorganizeChain doesn't differentiate between actual disconnect/ + // connect errors or whether the branch we're trying to fork to is invalid. + // + // The block status changes here without being flushed so we immediately flush + // the blockindex after we call this function. + _, _, _, err := b.verifyReorganizationValidity(detachNodes, attachNodes) + if writeErr := b.index.flushToDB(); writeErr != nil { + log.Warnf("Error flushing block index changes to disk: %v", writeErr) + } + if err != nil { + // If we errored out during the verification of the reorg branch, + // it's ok to return nil as we reconsidered the block and determined + // that it's invalid. + return nil + } + + return b.reorganizeChain(detachNodes, attachNodes) +} + // IndexManager provides a generic interface that the is called when blocks are // connected and disconnected to and from the tip of the main chain for the // purpose of supporting optional indexes. @@ -1657,6 +2072,11 @@ type Config struct { // This field is required. DB database.DB + // The maximum size in bytes of the UTXO cache. + // + // This field is required. + UtxoCacheMaxSize uint64 + // Interrupt specifies a channel the caller can close to signal that // long running operations, such as catching up indexes or performing // database migrations, should be interrupted. @@ -1711,6 +2131,11 @@ type Config struct { // This field can be nil if the caller is not interested in using a // signature cache. HashCache *txscript.HashCache + + // Prune specifies the target database usage (in bytes) the database + // will target for with block files. Prune at 0 specifies that no + // blocks will be deleted. + Prune uint64 } // New returns a BlockChain instance using the provided configuration details. @@ -1760,12 +2185,28 @@ func New(config *Config) (*BlockChain, error) { maxRetargetTimespan: targetTimespan * adjustmentFactor, blocksPerRetarget: int32(targetTimespan / targetTimePerBlock), index: newBlockIndex(config.DB, params), + utxoCache: newUtxoCache(config.DB, config.UtxoCacheMaxSize), hashCache: config.HashCache, bestChain: newChainView(nil), orphans: make(map[chainhash.Hash]*orphanBlock), prevOrphans: make(map[chainhash.Hash][]*orphanBlock), warningCaches: newThresholdCaches(vbNumBits), deploymentCaches: newThresholdCaches(chaincfg.DefinedDeployments), + pruneTarget: config.Prune, + } + + // Ensure all the deployments are synchronized with our clock if + // needed. + for _, deployment := range b.chainParams.Deployments { + deploymentStarter := deployment.DeploymentStarter + if clockStarter, ok := deploymentStarter.(chaincfg.ClockConsensusDeploymentStarter); ok { + clockStarter.SynchronizeClock(&b) + } + + deploymentEnder := deployment.DeploymentEnder + if clockEnder, ok := deploymentEnder.(chaincfg.ClockConsensusDeploymentEnder); ok { + clockEnder.SynchronizeClock(&b) + } } // Initialize the chain state from the passed database. When the db @@ -1794,10 +2235,23 @@ func New(config *Config) (*BlockChain, error) { return nil, err } + // Make sure the utxo state is catched up if it was left in an inconsistent + // state. bestNode := b.bestChain.Tip() + if err := b.InitConsistentState(bestNode, config.Interrupt); err != nil { + return nil, err + } log.Infof("Chain state (height %d, hash %v, totaltx %d, work %v)", bestNode.height, bestNode.hash, b.stateSnapshot.TotalTxns, bestNode.workSum) return &b, nil } + +// CachedStateSize returns the total size of the cached state of the blockchain +// in bytes. +func (b *BlockChain) CachedStateSize() uint64 { + b.chainLock.Lock() + defer b.chainLock.Unlock() + return b.utxoCache.totalMemoryUsage() +} diff --git a/blockchain/chain_test.go b/blockchain/chain_test.go index 7de323bc8d..b3bccf56f7 100644 --- a/blockchain/chain_test.go +++ b/blockchain/chain_test.go @@ -5,14 +5,17 @@ package blockchain import ( + "fmt" + "math/rand" "reflect" "testing" "time" + "github.com/btcsuite/btcd/blockchain/internal/testhelper" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) // TestHaveBlock tests the HaveBlock API to ensure proper functionality. @@ -163,13 +166,13 @@ func TestCalcSequenceLock(t *testing.T) { // Obtain the median time past from the PoV of the input created above. // The MTP for the input is the MTP from the PoV of the block *prior* // to the one that included it. - medianTime := node.RelativeAncestor(5).CalcPastMedianTime().Unix() + medianTime := CalcPastMedianTime(node.RelativeAncestor(5)).Unix() // The median time calculated from the PoV of the best block in the // test chain. For unconfirmed inputs, this value will be used since // the MTP will be calculated from the PoV of the yet-to-be-mined // block. - nextMedianTime := node.CalcPastMedianTime().Unix() + nextMedianTime := CalcPastMedianTime(node).Unix() nextBlockHeight := int32(numBlocksToActivate) + 1 // Add an additional transaction which will serve as our unconfirmed @@ -781,7 +784,7 @@ func TestLocateInventory(t *testing.T) { &test.hashStop) } if !reflect.DeepEqual(headers, test.headers) { - t.Errorf("%s: unxpected headers -- got %v, want %v", + t.Errorf("%s: unexpected headers -- got %v, want %v", test.name, headers, test.headers) continue } @@ -794,7 +797,7 @@ func TestLocateInventory(t *testing.T) { hashes := chain.LocateBlocks(test.locator, &test.hashStop, maxAllowed) if !reflect.DeepEqual(hashes, test.hashes) { - t.Errorf("%s: unxpected hashes -- got %v, want %v", + t.Errorf("%s: unexpected hashes -- got %v, want %v", test.name, hashes, test.hashes) continue } @@ -887,7 +890,7 @@ func TestHeightToHashRange(t *testing.T) { } if !reflect.DeepEqual(hashes, test.hashes) { - t.Errorf("%s: unxpected hashes -- got %v, want %v", + t.Errorf("%s: unexpected hashes -- got %v, want %v", test.name, hashes, test.hashes) } } @@ -959,8 +962,889 @@ func TestIntervalBlockHashes(t *testing.T) { } if !reflect.DeepEqual(hashes, test.hashes) { - t.Errorf("%s: unxpected hashes -- got %v, want %v", + t.Errorf("%s: unexpected hashes -- got %v, want %v", test.name, hashes, test.hashes) } } } + +func TestChainTips(t *testing.T) { + tests := []struct { + name string + chainTipGen func() (*BlockChain, map[chainhash.Hash]ChainTip) + }{ + { + name: "one active chain tip", + chainTipGen: func() (*BlockChain, map[chainhash.Hash]ChainTip) { + // Construct a synthetic block chain with a block index consisting of + // the following structure. + // genesis -> 1 -> 2 -> 3 + tip := tstTip + chain := newFakeChain(&chaincfg.MainNetParams) + branch0Nodes := chainedNodes(chain.bestChain.Genesis(), 3) + for _, node := range branch0Nodes { + chain.index.SetStatusFlags(node, statusDataStored) + chain.index.SetStatusFlags(node, statusValid) + chain.index.AddNode(node) + } + chain.bestChain.SetTip(tip(branch0Nodes)) + + activeTip := ChainTip{ + Height: 3, + BlockHash: (tip(branch0Nodes)).hash, + BranchLen: 0, + Status: StatusActive, + } + chainTips := make(map[chainhash.Hash]ChainTip) + chainTips[activeTip.BlockHash] = activeTip + + return chain, chainTips + }, + }, + { + name: "one active chain tip, one unknown chain tip", + chainTipGen: func() (*BlockChain, map[chainhash.Hash]ChainTip) { + // Construct a synthetic block chain with a block index consisting of + // the following structure. + // genesis -> 1 -> 2 -> 3 ... -> 10 -> 11 -> 12 -> 13 (active) + // \-> 11a -> 12a (unknown) + tip := tstTip + chain := newFakeChain(&chaincfg.MainNetParams) + branch0Nodes := chainedNodes(chain.bestChain.Genesis(), 13) + for _, node := range branch0Nodes { + chain.index.SetStatusFlags(node, statusDataStored) + chain.index.SetStatusFlags(node, statusValid) + chain.index.AddNode(node) + } + chain.bestChain.SetTip(tip(branch0Nodes)) + + branch1Nodes := chainedNodes(branch0Nodes[9], 2) + for _, node := range branch1Nodes { + chain.index.AddNode(node) + } + + activeTip := ChainTip{ + Height: 13, + BlockHash: (tip(branch0Nodes)).hash, + BranchLen: 0, + Status: StatusActive, + } + unknownTip := ChainTip{ + Height: 12, + BlockHash: (tip(branch1Nodes)).hash, + BranchLen: 2, + Status: StatusUnknown, + } + chainTips := make(map[chainhash.Hash]ChainTip) + chainTips[activeTip.BlockHash] = activeTip + chainTips[unknownTip.BlockHash] = unknownTip + + return chain, chainTips + }, + }, + { + name: "1 inactive tip, 1 invalid tip, 1 active tip", + chainTipGen: func() (*BlockChain, map[chainhash.Hash]ChainTip) { + // Construct a synthetic block chain with a block index consisting of + // the following structure. + // genesis -> 1 -> 2 -> 3 (active) + // \ -> 1a (valid-fork) + // \ -> 1b (invalid) + tip := tstTip + chain := newFakeChain(&chaincfg.MainNetParams) + branch0Nodes := chainedNodes(chain.bestChain.Genesis(), 3) + for _, node := range branch0Nodes { + chain.index.SetStatusFlags(node, statusDataStored) + chain.index.SetStatusFlags(node, statusValid) + chain.index.AddNode(node) + } + chain.bestChain.SetTip(tip(branch0Nodes)) + + branch1Nodes := chainedNodes(chain.bestChain.Genesis(), 1) + for _, node := range branch1Nodes { + chain.index.SetStatusFlags(node, statusDataStored) + chain.index.SetStatusFlags(node, statusValid) + chain.index.AddNode(node) + } + + branch2Nodes := chainedNodes(chain.bestChain.Genesis(), 1) + for _, node := range branch2Nodes { + chain.index.SetStatusFlags(node, statusDataStored) + chain.index.SetStatusFlags(node, statusValidateFailed) + chain.index.AddNode(node) + } + + activeTip := ChainTip{ + Height: tip(branch0Nodes).height, + BlockHash: (tip(branch0Nodes)).hash, + BranchLen: 0, + Status: StatusActive, + } + + inactiveTip := ChainTip{ + Height: tip(branch1Nodes).height, + BlockHash: (tip(branch1Nodes)).hash, + BranchLen: 1, + Status: StatusValidFork, + } + + invalidTip := ChainTip{ + Height: tip(branch2Nodes).height, + BlockHash: (tip(branch2Nodes)).hash, + BranchLen: 1, + Status: StatusInvalid, + } + + chainTips := make(map[chainhash.Hash]ChainTip) + chainTips[activeTip.BlockHash] = activeTip + chainTips[inactiveTip.BlockHash] = inactiveTip + chainTips[invalidTip.BlockHash] = invalidTip + + return chain, chainTips + }, + }, + } + + for _, test := range tests { + chain, expectedChainTips := test.chainTipGen() + gotChainTips := chain.ChainTips() + if len(gotChainTips) != len(expectedChainTips) { + t.Errorf("TestChainTips Failed test %s. Expected %d "+ + "chain tips, got %d", test.name, len(expectedChainTips), len(gotChainTips)) + } + + for _, gotChainTip := range gotChainTips { + testChainTip, found := expectedChainTips[gotChainTip.BlockHash] + if !found { + t.Errorf("TestChainTips Failed test %s. Couldn't find an expected "+ + "chain tip with height %d, hash %s, branchlen %d, status \"%s\"", + test.name, testChainTip.Height, testChainTip.BlockHash.String(), + testChainTip.BranchLen, testChainTip.Status.String()) + } + + if !reflect.DeepEqual(testChainTip, gotChainTip) { + t.Errorf("TestChainTips Failed test %s. Expected chain tip with "+ + "height %d, hash %s, branchlen %d, status \"%s\" but got "+ + "height %d, hash %s, branchlen %d, status \"%s\"", test.name, + testChainTip.Height, testChainTip.BlockHash.String(), + testChainTip.BranchLen, testChainTip.Status.String(), + gotChainTip.Height, gotChainTip.BlockHash.String(), + gotChainTip.BranchLen, gotChainTip.Status.String()) + } + + switch testChainTip.Status { + case StatusActive: + if testChainTip.Status.String() != "active" { + t.Errorf("TestChainTips Fail: Expected string of \"active\", got \"%s\"", + testChainTip.Status.String()) + } + case StatusInvalid: + if testChainTip.Status.String() != "invalid" { + t.Errorf("TestChainTips Fail: Expected string of \"invalid\", got \"%s\"", + testChainTip.Status.String()) + } + case StatusValidFork: + if testChainTip.Status.String() != "valid-fork" { + t.Errorf("TestChainTips Fail: Expected string of \"valid-fork\", got \"%s\"", + testChainTip.Status.String()) + } + case StatusUnknown: + if testChainTip.Status.String() != fmt.Sprintf("unknown: %b", testChainTip.Status) { + t.Errorf("TestChainTips Fail: Expected string of \"unknown\", got \"%s\"", + testChainTip.Status.String()) + } + } + } + } +} + +func TestIsAncestor(t *testing.T) { + // Construct a synthetic block chain with a block index consisting of + // the following structure. + // genesis -> 1 -> 2 -> 3 (active) + // \ -> 1a (valid-fork) + // \ -> 1b (invalid) + tip := tstTip + chain := newFakeChain(&chaincfg.MainNetParams) + branch0Nodes := chainedNodes(chain.bestChain.Genesis(), 3) + for _, node := range branch0Nodes { + chain.index.SetStatusFlags(node, statusDataStored) + chain.index.SetStatusFlags(node, statusValid) + chain.index.AddNode(node) + } + chain.bestChain.SetTip(tip(branch0Nodes)) + + branch1Nodes := chainedNodes(chain.bestChain.Genesis(), 1) + for _, node := range branch1Nodes { + chain.index.SetStatusFlags(node, statusDataStored) + chain.index.SetStatusFlags(node, statusValid) + chain.index.AddNode(node) + } + + branch2Nodes := chainedNodes(chain.bestChain.Genesis(), 1) + for _, node := range branch2Nodes { + chain.index.SetStatusFlags(node, statusDataStored) + chain.index.SetStatusFlags(node, statusValidateFailed) + chain.index.AddNode(node) + } + + // Is 1 an ancestor of 3? + // + // genesis -> 1 -> 2 -> 3 (active) + // \ -> 1a (valid-fork) + // \ -> 1b (invalid) + shouldBeTrue := branch0Nodes[2].IsAncestor(branch0Nodes[0]) + if !shouldBeTrue { + t.Errorf("TestIsAncestor fail. Node %s is an ancestor of node %s but got false", + branch0Nodes[0].hash.String(), branch0Nodes[2].hash.String()) + } + + // Is 1 an ancestor of 2? + // + // genesis -> 1 -> 2 -> 3 (active) + // \ -> 1a (valid-fork) + // \ -> 1b (invalid) + shouldBeTrue = branch0Nodes[1].IsAncestor(branch0Nodes[0]) + if !shouldBeTrue { + t.Errorf("TestIsAncestor fail. Node %s is an ancestor of node %s but got false", + branch0Nodes[0].hash.String(), branch0Nodes[1].hash.String()) + } + + // Is the genesis an ancestor of 1? + // + // genesis -> 1 -> 2 -> 3 (active) + // \ -> 1a (valid-fork) + // \ -> 1b (invalid) + shouldBeTrue = branch0Nodes[0].IsAncestor(chain.bestChain.Genesis()) + if !shouldBeTrue { + t.Errorf("TestIsAncestor fail. The genesis block is an ancestor of all blocks "+ + "but got false for node %s", + branch0Nodes[0].hash.String()) + } + + // Is the genesis an ancestor of 1a? + // + // genesis -> 1 -> 2 -> 3 (active) + // \ -> 1a (valid-fork) + // \ -> 1b (invalid) + shouldBeTrue = branch1Nodes[0].IsAncestor(chain.bestChain.Genesis()) + if !shouldBeTrue { + t.Errorf("TestIsAncestor fail. The genesis block is an ancestor of all blocks "+ + "but got false for node %s", + branch1Nodes[0].hash.String()) + } + + // Is the genesis an ancestor of 1b? + // + // genesis -> 1 -> 2 -> 3 (active) + // \ -> 1a (valid-fork) + // \ -> 1b (invalid) + shouldBeTrue = branch2Nodes[0].IsAncestor(chain.bestChain.Genesis()) + if !shouldBeTrue { + t.Errorf("TestIsAncestor fail. The genesis block is an ancestor of all blocks "+ + "but got false for node %s", + branch2Nodes[0].hash.String()) + } + + // Is 1 an ancestor of 1a? + // + // genesis -> 1 -> 2 -> 3 (active) + // \ -> 1a (valid-fork) + // \ -> 1b (invalid) + shouldBeFalse := branch1Nodes[0].IsAncestor(branch0Nodes[0]) + if shouldBeFalse { + t.Errorf("TestIsAncestor fail. Node %s is in a different branch than "+ + "node %s but got true", branch1Nodes[0].hash.String(), + branch0Nodes[0].hash.String()) + } + + // Is 1 an ancestor of 1b? + // + // genesis -> 1 -> 2 -> 3 (active) + // \ -> 1a (valid-fork) + // \ -> 1b (invalid) + shouldBeFalse = branch2Nodes[0].IsAncestor(branch0Nodes[0]) + if shouldBeFalse { + t.Errorf("TestIsAncestor fail. Node %s is in a different branch than "+ + "node %s but got true", branch2Nodes[0].hash.String(), + branch0Nodes[0].hash.String()) + } + + // Is 1a an ancestor of 1b? + // + // genesis -> 1 -> 2 -> 3 (active) + // \ -> 1a (valid-fork) + // \ -> 1b (invalid) + shouldBeFalse = branch2Nodes[0].IsAncestor(branch1Nodes[0]) + if shouldBeFalse { + t.Errorf("TestIsAncestor fail. Node %s is in a different branch than "+ + "node %s but got true", branch2Nodes[0].hash.String(), + branch1Nodes[0].hash.String()) + } + + // Is 1 an ancestor of 1? + // + // genesis -> 1 -> 2 -> 3 (active) + // \ -> 1a (valid-fork) + // \ -> 1b (invalid) + shouldBeFalse = branch0Nodes[0].IsAncestor(branch0Nodes[0]) + if shouldBeFalse { + t.Errorf("TestIsAncestor fail. Node is not an ancestor of itself but got true for node %s", + branch0Nodes[0].hash.String()) + } + + // Is the geneis an ancestor of genesis? + // + // genesis -> 1 -> 2 -> 3 (active) + // \ -> 1a (valid-fork) + // \ -> 1b (invalid) + shouldBeFalse = chain.bestChain.Genesis().IsAncestor(chain.bestChain.Genesis()) + if shouldBeFalse { + t.Errorf("TestIsAncestor fail. Node is not an ancestor of itself but got true for node %s", + chain.bestChain.Genesis().hash.String()) + } + + // Is a block from another chain an ancestor of 1b? + fakeChain := newFakeChain(&chaincfg.TestNet3Params) + shouldBeFalse = branch2Nodes[0].IsAncestor(fakeChain.bestChain.Genesis()) + if shouldBeFalse { + t.Errorf("TestIsAncestor fail. Node %s is in a different chain than "+ + "node %s but got true", fakeChain.bestChain.Genesis().hash.String(), + branch2Nodes[0].hash.String()) + } +} + +// randomSelect selects random amount of random elements from a slice and returns a +// new slice. The selected elements are removed. +func randomSelect(input []*testhelper.SpendableOut) ( + []*testhelper.SpendableOut, []*testhelper.SpendableOut) { + + selected := []*testhelper.SpendableOut{} + + // Select random elements from the input slice + amount := rand.Intn(len(input)) + for i := 0; i < amount; i++ { + // Generate a random index + randIdx := rand.Intn(len(input)) + + // Append the selected element to the new slice + selected = append(selected, input[randIdx]) + + // Remove the selected element from the input slice. + // This ensures that each selected element is unique. + input = append(input[:randIdx], input[randIdx+1:]...) + } + + return input, selected +} + +// addBlocks generates new blocks and adds them to the chain. The newly generated +// blocks will spend from the spendable outputs passed in. The returned hases are +// the hashes of the newly generated blocks. +func addBlocks(count int, chain *BlockChain, prevBlock *btcutil.Block, + allSpendableOutputs []*testhelper.SpendableOut) ( + []*chainhash.Hash, [][]*testhelper.SpendableOut, error) { + + blockHashes := make([]*chainhash.Hash, 0, count) + spendablesOuts := make([][]*testhelper.SpendableOut, 0, count) + + // Always spend everything on the first block. This ensures we get unique blocks + // every time. The random select may choose not to spend any and that results + // in getting the same block. + nextSpends := allSpendableOutputs + allSpendableOutputs = allSpendableOutputs[:0] + for b := 0; b < count; b++ { + newBlock, newSpendableOuts, err := addBlock(chain, prevBlock, nextSpends) + if err != nil { + return nil, nil, err + } + prevBlock = newBlock + + blockHashes = append(blockHashes, newBlock.Hash()) + spendablesOuts = append(spendablesOuts, newSpendableOuts) + allSpendableOutputs = append(allSpendableOutputs, newSpendableOuts...) + + // Grab utxos to be spent in the next block. + allSpendableOutputs, nextSpends = randomSelect(allSpendableOutputs) + } + + return blockHashes, spendablesOuts, nil +} + +func TestInvalidateBlock(t *testing.T) { + tests := []struct { + name string + chainGen func() (*BlockChain, []*chainhash.Hash, func()) + }{ + { + name: "one branch, invalidate once", + chainGen: func() (*BlockChain, []*chainhash.Hash, func()) { + chain, params, tearDown := utxoCacheTestChain( + "TestInvalidateBlock-one-branch-" + + "invalidate-once") + // Grab the tip of the chain. + tip := btcutil.NewBlock(params.GenesisBlock) + + // Create a chain with 11 blocks. + _, _, err := addBlocks(11, chain, tip, []*testhelper.SpendableOut{}) + if err != nil { + t.Fatal(err) + } + + // Invalidate block 5. + block, err := chain.BlockByHeight(5) + if err != nil { + t.Fatal(err) + } + invalidateHash := block.Hash() + + return chain, []*chainhash.Hash{invalidateHash}, tearDown + }, + }, + { + name: "invalidate twice", + chainGen: func() (*BlockChain, []*chainhash.Hash, func()) { + chain, params, tearDown := utxoCacheTestChain("TestInvalidateBlock-invalidate-twice") + // Grab the tip of the chain. + tip := btcutil.NewBlock(params.GenesisBlock) + + // Create a chain with 11 blocks. + _, spendableOuts, err := addBlocks(11, chain, tip, []*testhelper.SpendableOut{}) + //_, _, err := addBlocks(11, chain, tip, []*testhelper.SpendableOut{}) + if err != nil { + t.Fatal(err) + } + + // Set invalidateHash as block 5. + block, err := chain.BlockByHeight(5) + if err != nil { + t.Fatal(err) + } + invalidateHash := block.Hash() + + // Create a side chain with 7 blocks that builds on block 1. + b1, err := chain.BlockByHeight(1) + if err != nil { + t.Fatal(err) + } + altBlockHashes, _, err := addBlocks(6, chain, b1, spendableOuts[0]) + if err != nil { + t.Fatal(err) + } + + // Grab block at height 5: + // + // b2, b3, b4, b5 + // 0, 1, 2, 3 + invalidateHash2 := altBlockHashes[3] + + // Sanity checking that we grabbed the correct hash. + node := chain.index.LookupNode(invalidateHash) + if node == nil || node.height != 5 { + t.Fatalf("wanted to grab block at height 5 but got height %v", + node.height) + } + + return chain, []*chainhash.Hash{invalidateHash, invalidateHash2}, tearDown + }, + }, + { + name: "invalidate a side branch", + chainGen: func() (*BlockChain, []*chainhash.Hash, func()) { + chain, params, tearDown := utxoCacheTestChain("TestInvalidateBlock-invalidate-side-branch") + tip := btcutil.NewBlock(params.GenesisBlock) + + // Grab the tip of the chain. + tip, err := chain.BlockByHash(&chain.bestChain.Tip().hash) + if err != nil { + t.Fatal(err) + } + + // Create a chain with 11 blocks. + _, spendableOuts, err := addBlocks(11, chain, tip, []*testhelper.SpendableOut{}) + if err != nil { + t.Fatal(err) + } + + // Create a side chain with 7 blocks that builds on block 1. + b1, err := chain.BlockByHeight(1) + if err != nil { + t.Fatal(err) + } + altBlockHashes, _, err := addBlocks(6, chain, b1, spendableOuts[0]) + if err != nil { + t.Fatal(err) + } + + // Grab block at height 4: + // + // b2, b3, b4 + // 0, 1, 2 + invalidateHash := altBlockHashes[2] + + // Sanity checking that we grabbed the correct hash. + node := chain.index.LookupNode(invalidateHash) + if node == nil || node.height != 4 { + t.Fatalf("wanted to grab block at height 4 but got height %v", + node.height) + } + + return chain, []*chainhash.Hash{invalidateHash}, tearDown + }, + }, + } + + for _, test := range tests { + chain, invalidateHashes, tearDown := test.chainGen() + func() { + defer tearDown() + for _, invalidateHash := range invalidateHashes { + chainTipsBefore := chain.ChainTips() + + // Mark if we're invalidating a block that's a part of the best chain. + var bestChainBlock bool + node := chain.index.LookupNode(invalidateHash) + if chain.bestChain.Contains(node) { + bestChainBlock = true + } + + // Actual invalidation. + err := chain.InvalidateBlock(invalidateHash) + if err != nil { + t.Fatal(err) + } + + chainTipsAfter := chain.ChainTips() + + // Create a map for easy lookup. + chainTipMap := make(map[chainhash.Hash]ChainTip, len(chainTipsAfter)) + activeTipCount := 0 + for _, chainTip := range chainTipsAfter { + chainTipMap[chainTip.BlockHash] = chainTip + + if chainTip.Status == StatusActive { + activeTipCount++ + } + } + if activeTipCount != 1 { + t.Fatalf("TestInvalidateBlock fail. Expected "+ + "1 active chain tip but got %d", activeTipCount) + } + + bestTip := chain.bestChain.Tip() + + validForkCount := 0 + for _, tip := range chainTipsBefore { + // If the chaintip was an active tip and we invalidated a block + // in the active tip, assert that it's invalid now. + if bestChainBlock && tip.Status == StatusActive { + gotTip, found := chainTipMap[tip.BlockHash] + if !found { + t.Fatalf("TestInvalidateBlock fail. Expected "+ + "block %s not found in chaintips after "+ + "invalidateblock", tip.BlockHash.String()) + } + + if gotTip.Status != StatusInvalid { + t.Fatalf("TestInvalidateBlock fail. "+ + "Expected block %s to be invalid, got status: %s", + gotTip.BlockHash.String(), gotTip.Status) + } + } + + if !bestChainBlock && tip.Status != StatusActive { + gotTip, found := chainTipMap[tip.BlockHash] + if !found { + t.Fatalf("TestInvalidateBlock fail. Expected "+ + "block %s not found in chaintips after "+ + "invalidateblock", tip.BlockHash.String()) + } + + if gotTip.BlockHash == *invalidateHash && gotTip.Status != StatusInvalid { + t.Fatalf("TestInvalidateBlock fail. "+ + "Expected block %s to be invalid, got status: %s", + gotTip.BlockHash.String(), gotTip.Status) + } + } + + // If we're not invalidating the branch with an active tip, + // we expect the active tip to remain the same. + if !bestChainBlock && tip.Status == StatusActive && tip.BlockHash != bestTip.hash { + t.Fatalf("TestInvalidateBlock fail. Expected block %s as the tip but got %s", + tip.BlockHash.String(), bestTip.hash.String()) + } + + // If this tip is not invalid and not active, it should be + // lighter than the current best tip. + if tip.Status != StatusActive && tip.Status != StatusInvalid && + tip.Height > bestTip.height { + + tipNode := chain.index.LookupNode(&tip.BlockHash) + if bestTip.workSum.Cmp(tipNode.workSum) == -1 { + t.Fatalf("TestInvalidateBlock fail. Expected "+ + "block %s to be the active tip but block %s "+ + "was", tipNode.hash.String(), bestTip.hash.String()) + } + } + + if tip.Status == StatusValidFork { + validForkCount++ + } + } + + // If there are no other valid chain tips besides the active chaintip, + // we expect to have one more chain tip after the invalidate. + if validForkCount == 0 && len(chainTipsAfter) != len(chainTipsBefore)+1 { + t.Fatalf("TestInvalidateBlock fail. Expected %d chaintips but got %d", + len(chainTipsBefore)+1, len(chainTipsAfter)) + } + } + + // Try to invaliate the already invalidated hash. + err := chain.InvalidateBlock(invalidateHashes[0]) + if err != nil { + t.Fatal(err) + } + + // Try to invaliate a genesis block + err = chain.InvalidateBlock(chain.chainParams.GenesisHash) + if err == nil { + t.Fatalf("TestInvalidateBlock fail. Expected to err when trying to" + + "invalidate a genesis block.") + } + + // Try to invaliate a block that doesn't exist. + err = chain.InvalidateBlock(chaincfg.MainNetParams.GenesisHash) + if err == nil { + t.Fatalf("TestInvalidateBlock fail. Expected to err when trying to" + + "invalidate a block that doesn't exist.") + } + }() + } +} + +func TestReconsiderBlock(t *testing.T) { + tests := []struct { + name string + chainGen func() (*BlockChain, []*chainhash.Hash, func()) + }{ + { + name: "one branch, invalidate once and revalidate", + chainGen: func() (*BlockChain, []*chainhash.Hash, func()) { + chain, params, tearDown := utxoCacheTestChain("TestInvalidateBlock-one-branch-invalidate-once") + + // Create a chain with 101 blocks. + tip := btcutil.NewBlock(params.GenesisBlock) + _, _, err := addBlocks(101, chain, tip, []*testhelper.SpendableOut{}) + if err != nil { + t.Fatal(err) + } + + // Invalidate block 5. + block, err := chain.BlockByHeight(5) + if err != nil { + t.Fatal(err) + } + invalidateHash := block.Hash() + + return chain, []*chainhash.Hash{invalidateHash}, tearDown + }, + }, + { + name: "invalidate the active branch with a side branch present and revalidate", + chainGen: func() (*BlockChain, []*chainhash.Hash, func()) { + chain, params, tearDown := utxoCacheTestChain("TestReconsiderBlock-invalidate-with-side-branch") + + // Create a chain with 101 blocks. + tip := btcutil.NewBlock(params.GenesisBlock) + _, spendableOuts, err := addBlocks(101, chain, tip, []*testhelper.SpendableOut{}) + if err != nil { + t.Fatal(err) + } + + // Invalidate block 5. + block, err := chain.BlockByHeight(5) + if err != nil { + t.Fatal(err) + } + invalidateHash := block.Hash() + + // Create a side chain with 7 blocks that builds on block 1. + b1, err := chain.BlockByHeight(1) + if err != nil { + t.Fatal(err) + } + _, _, err = addBlocks(6, chain, b1, spendableOuts[0]) + if err != nil { + t.Fatal(err) + } + + return chain, []*chainhash.Hash{invalidateHash}, tearDown + }, + }, + { + name: "invalidate a side branch and revalidate it", + chainGen: func() (*BlockChain, []*chainhash.Hash, func()) { + chain, params, tearDown := utxoCacheTestChain("TestReconsiderBlock-invalidate-a-side-branch") + + // Create a chain with 101 blocks. + tip := btcutil.NewBlock(params.GenesisBlock) + _, spendableOuts, err := addBlocks(101, chain, tip, []*testhelper.SpendableOut{}) + if err != nil { + t.Fatal(err) + } + + // Create a side chain with 7 blocks that builds on block 1. + b1, err := chain.BlockByHeight(1) + if err != nil { + t.Fatal(err) + } + altBlockHashes, _, err := addBlocks(6, chain, b1, spendableOuts[0]) + if err != nil { + t.Fatal(err) + } + // Grab block at height 4: + // + // b2, b3, b4, b5 + // 0, 1, 2, 3 + invalidateHash := altBlockHashes[2] + + return chain, []*chainhash.Hash{invalidateHash}, tearDown + }, + }, + { + name: "reconsider an invalid side branch with a higher work", + chainGen: func() (*BlockChain, []*chainhash.Hash, func()) { + chain, params, tearDown := utxoCacheTestChain("TestReconsiderBlock-reconsider-an-invalid-side-branch-higher") + + tip := btcutil.NewBlock(params.GenesisBlock) + _, spendableOuts, err := addBlocks(6, chain, tip, []*testhelper.SpendableOut{}) + if err != nil { + t.Fatal(err) + } + + // Select utxos to be spent from the best block and + // modify the amount so that the block will be invalid. + nextSpends, _ := randomSelect(spendableOuts[len(spendableOuts)-1]) + nextSpends[0].Amount += testhelper.LowFee + + // Make an invalid block that best on top of the current tip. + bestBlock, err := chain.BlockByHash(&chain.BestSnapshot().Hash) + if err != nil { + t.Fatal(err) + } + invalidBlock, _, _ := newBlock(chain, bestBlock, nextSpends) + invalidateHash := invalidBlock.Hash() + + // The block validation will fail here and we'll mark the + // block as invalid in the block index. + chain.ProcessBlock(invalidBlock, BFNone) + + // Modify the amount again so it's valid. + nextSpends[0].Amount -= testhelper.LowFee + + return chain, []*chainhash.Hash{invalidateHash}, tearDown + }, + }, + { + name: "reconsider an invalid side branch with a lower work", + chainGen: func() (*BlockChain, []*chainhash.Hash, func()) { + chain, params, tearDown := utxoCacheTestChain("TestReconsiderBlock-reconsider-an-invalid-side-branch-lower") + + tip := btcutil.NewBlock(params.GenesisBlock) + _, spendableOuts, err := addBlocks(6, chain, tip, []*testhelper.SpendableOut{}) + if err != nil { + t.Fatal(err) + } + + // Select utxos to be spent from the best block and + // modify the amount so that the block will be invalid. + nextSpends, _ := randomSelect(spendableOuts[len(spendableOuts)-1]) + nextSpends[0].Amount += testhelper.LowFee + + // Make an invalid block that best on top of the current tip. + bestBlock, err := chain.BlockByHash(&chain.BestSnapshot().Hash) + if err != nil { + t.Fatal(err) + } + invalidBlock, _, _ := newBlock(chain, bestBlock, nextSpends) + invalidateHash := invalidBlock.Hash() + + // The block validation will fail here and we'll mark the + // block as invalid in the block index. + chain.ProcessBlock(invalidBlock, BFNone) + + // Modify the amount again so it's valid. + nextSpends[0].Amount -= testhelper.LowFee + + // Add more blocks to make the invalid block a + // side chain and not the most pow. + _, _, err = addBlocks(3, chain, bestBlock, []*testhelper.SpendableOut{}) + if err != nil { + t.Fatal(err) + } + + return chain, []*chainhash.Hash{invalidateHash}, tearDown + }, + }, + } + + for _, test := range tests { + chain, invalidateHashes, tearDown := test.chainGen() + func() { + defer tearDown() + for _, invalidateHash := range invalidateHashes { + // Cache the chain tips before the invalidate. Since we'll reconsider + // the invalidated block, we should come back to these tips in the end. + tips := chain.ChainTips() + expectedChainTips := make(map[chainhash.Hash]ChainTip, len(tips)) + for _, tip := range tips { + expectedChainTips[tip.BlockHash] = tip + } + + // Invalidation. + err := chain.InvalidateBlock(invalidateHash) + if err != nil { + t.Fatal(err) + } + + // Reconsideration. + err = chain.ReconsiderBlock(invalidateHash) + if err != nil { + t.Fatal(err) + } + + // Compare the tips aginst the tips we've cached. + gotChainTips := chain.ChainTips() + for _, gotChainTip := range gotChainTips { + testChainTip, found := expectedChainTips[gotChainTip.BlockHash] + if !found { + t.Errorf("TestReconsiderBlock Failed test \"%s\". Couldn't find an expected "+ + "chain tip with height %d, hash %s, branchlen %d, status \"%s\"", + test.name, testChainTip.Height, testChainTip.BlockHash.String(), + testChainTip.BranchLen, testChainTip.Status.String()) + } + + // If the invalid side branch is a lower work, we'll never + // actually process the block again until the branch becomes + // a greater work chain so it'll show up as valid-fork. + if test.name == "reconsider an invalid side branch with a lower work" && + testChainTip.BlockHash == *invalidateHash { + + testChainTip.Status = StatusValidFork + } + + if !reflect.DeepEqual(testChainTip, gotChainTip) { + t.Errorf("TestReconsiderBlock Failed test \"%s\". Expected chain tip with "+ + "height %d, hash %s, branchlen %d, status \"%s\" but got "+ + "height %d, hash %s, branchlen %d, status \"%s\"", test.name, + testChainTip.Height, testChainTip.BlockHash.String(), + testChainTip.BranchLen, testChainTip.Status.String(), + gotChainTip.Height, gotChainTip.BlockHash.String(), + gotChainTip.BranchLen, gotChainTip.Status.String()) + } + } + } + }() + } +} diff --git a/blockchain/chainio.go b/blockchain/chainio.go index 8d76d3ca94..27028eac90 100644 --- a/blockchain/chainio.go +++ b/blockchain/chainio.go @@ -12,10 +12,10 @@ import ( "sync" "time" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/database" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) const ( @@ -51,6 +51,10 @@ var ( // chain state. chainStateKeyName = []byte("chainstate") + // utxoStateConsistencyKeyName is the name of the db key used to store the + // consistency status of the utxo state. + utxoStateConsistencyKeyName = []byte("utxostateconsistency") + // spendJournalVersionKeyName is the name of the db key used to store // the version of the spend journal currently in the database. spendJournalVersionKeyName = []byte("spendjournalversion") @@ -120,7 +124,7 @@ func dbFetchVersion(dbTx database.Tx, key []byte) uint32 { return 0 } - return byteOrder.Uint32(serialized[:]) + return byteOrder.Uint32(serialized) } // dbPutVersion uses an existing database transaction to update the provided @@ -243,10 +247,10 @@ type SpentTxOut struct { // Amount is the amount of the output. Amount int64 - // PkScipt is the the public key script for the output. + // PkScript is the public key script for the output. PkScript []byte - // Height is the height of the the block containing the creating tx. + // Height is the height of the block containing the creating tx. Height int32 // Denotes if the creating tx is a coinbase. @@ -494,6 +498,21 @@ func dbRemoveSpendJournalEntry(dbTx database.Tx, blockHash *chainhash.Hash) erro return spendBucket.Delete(blockHash[:]) } +// dbPruneSpendJournalEntry uses an existing database transaction to remove all +// the spend journal entries for the pruned blocks. +func dbPruneSpendJournalEntry(dbTx database.Tx, blockHashes []chainhash.Hash) error { + spendBucket := dbTx.Metadata().Bucket(spendJournalBucketName) + + for _, blockHash := range blockHashes { + err := spendBucket.Delete(blockHash[:]) + if err != nil { + return err + } + } + + return nil +} + // ----------------------------------------------------------------------------- // The unspent transaction output (utxo) set consists of an entry for each // unspent output using a format that is optimized to reduce space using domain @@ -729,11 +748,12 @@ func dbFetchUtxoEntryByHash(dbTx database.Tx, hash *chainhash.Hash) (*UtxoEntry, // // When there is no entry for the provided output, nil will be returned for both // the entry and the error. -func dbFetchUtxoEntry(dbTx database.Tx, outpoint wire.OutPoint) (*UtxoEntry, error) { +func dbFetchUtxoEntry(dbTx database.Tx, utxoBucket database.Bucket, + outpoint wire.OutPoint) (*UtxoEntry, error) { + // Fetch the unspent transaction output information for the passed // transaction output. Return now when there is no entry. key := outpointKey(outpoint) - utxoBucket := dbTx.Metadata().Bucket(utxoSetBucketName) serializedUtxo := utxoBucket.Get(*key) recycleOutpointKey(key) if serializedUtxo == nil { @@ -771,6 +791,11 @@ func dbFetchUtxoEntry(dbTx database.Tx, outpoint wire.OutPoint) (*UtxoEntry, err // particular, only the entries that have been marked as modified are written // to the database. func dbPutUtxoView(dbTx database.Tx, view *UtxoViewpoint) error { + // Return early if the view is nil. + if view == nil { + return nil + } + utxoBucket := dbTx.Metadata().Bucket(utxoSetBucketName) for outpoint, entry := range view.entries { // No need to update the database if the entry was not modified. @@ -780,32 +805,54 @@ func dbPutUtxoView(dbTx database.Tx, view *UtxoViewpoint) error { // Remove the utxo entry if it is spent. if entry.IsSpent() { - key := outpointKey(outpoint) - err := utxoBucket.Delete(*key) - recycleOutpointKey(key) + err := dbDeleteUtxoEntry(utxoBucket, outpoint) + if err != nil { + return err + } + } else { + err := dbPutUtxoEntry(utxoBucket, outpoint, entry) if err != nil { return err } - - continue } + } - // Serialize and store the utxo entry. - serialized, err := serializeUtxoEntry(entry) - if err != nil { - return err - } - key := outpointKey(outpoint) - err = utxoBucket.Put(*key, serialized) - // NOTE: The key is intentionally not recycled here since the - // database interface contract prohibits modifications. It will - // be garbage collected normally when the database is done with - // it. - if err != nil { - return err - } + return nil +} + +// dbDeleteUtxoEntry uses an existing database transaction to delete the utxo +// entry from the database. +func dbDeleteUtxoEntry(utxoBucket database.Bucket, outpoint wire.OutPoint) error { + key := outpointKey(outpoint) + err := utxoBucket.Delete(*key) + recycleOutpointKey(key) + return err +} + +// dbPutUtxoEntry uses an existing database transaction to update the utxo entry +// in the database. +func dbPutUtxoEntry(utxoBucket database.Bucket, outpoint wire.OutPoint, + entry *UtxoEntry) error { + + if entry == nil || entry.IsSpent() { + return AssertError("trying to store nil or spent entry") + } + + // Serialize and store the utxo entry. + serialized, err := serializeUtxoEntry(entry) + if err != nil { + return err + } + key := outpointKey(outpoint) + err = utxoBucket.Put(*key, serialized) + if err != nil { + return err } + // NOTE: The key is intentionally not recycled here since the + // database interface contract prohibits modifications. It will + // be garbage collected normally when the database is done with + // it. return nil } @@ -943,7 +990,7 @@ func serializeBestChainState(state bestChainState) []byte { byteOrder.PutUint32(serializedData[offset:], workSumBytesLen) offset += 4 copy(serializedData[offset:], workSumBytes) - return serializedData[:] + return serializedData } // deserializeBestChainState deserializes the passed serialized best chain @@ -999,6 +1046,28 @@ func dbPutBestState(dbTx database.Tx, snapshot *BestState, workSum *big.Int) err return dbTx.Metadata().Put(chainStateKeyName, serializedData) } +// dbPutUtxoStateConsistency uses an existing database transaction to +// update the utxo state consistency status with the given parameters. +func dbPutUtxoStateConsistency(dbTx database.Tx, hash *chainhash.Hash) error { + // Store the utxo state consistency status into the database. + return dbTx.Metadata().Put(utxoStateConsistencyKeyName, hash[:]) +} + +// dbFetchUtxoStateConsistency uses an existing database transaction to retrieve +// the utxo state consistency status from the database. The code is 0 when +// nothing was found. +func dbFetchUtxoStateConsistency(dbTx database.Tx) []byte { + // Fetch the serialized data from the database. + statusBytes := dbTx.Metadata().Get(utxoStateConsistencyKeyName) + if statusBytes != nil { + result := make([]byte, len(statusBytes)) + copy(result, statusBytes) + return result + } + + return nil +} + // createChainState initializes both the database and the chain state to the // genesis block. This includes creating the necessary buckets and inserting // the genesis block, so it must only be called on an uninitialized database. @@ -1149,18 +1218,9 @@ func (b *BlockChain) initChainState() error { blockIndexBucket := dbTx.Metadata().Bucket(blockIndexBucketName) - // Determine how many blocks will be loaded into the index so we can - // allocate the right amount. - var blockCount int32 - cursor := blockIndexBucket.Cursor() - for ok := cursor.First(); ok; ok = cursor.Next() { - blockCount++ - } - blockNodes := make([]blockNode, blockCount) - var i int32 var lastNode *blockNode - cursor = blockIndexBucket.Cursor() + cursor := blockIndexBucket.Cursor() for ok := cursor.First(); ok; ok = cursor.Next() { header, status, err := deserializeBlockRow(cursor.Value()) if err != nil { @@ -1193,7 +1253,7 @@ func (b *BlockChain) initChainState() error { // Initialize the block node for the block, connect it, // and add it to the block index. - node := &blockNodes[i] + node := new(blockNode) initBlockNode(node, header, parent) node.status = status b.index.addNode(node) @@ -1245,7 +1305,7 @@ func (b *BlockChain) initChainState() error { blockWeight := uint64(GetBlockWeight(btcutil.NewBlock(&block))) numTxns := uint64(len(block.Transactions)) b.stateSnapshot = newBestState(tip, blockSize, blockWeight, - numTxns, state.totalTxns, tip.CalcPastMedianTime()) + numTxns, state.totalTxns, CalcPastMedianTime(tip)) return nil }) diff --git a/blockchain/chainio_test.go b/blockchain/chainio_test.go index 630af14e1c..e9e2c0b616 100644 --- a/blockchain/chainio_test.go +++ b/blockchain/chainio_test.go @@ -23,7 +23,7 @@ func TestErrNotInMainChain(t *testing.T) { // Ensure the stringized output for the error is as expected. if err.Error() != errStr { - t.Fatalf("errNotInMainChain retuned unexpected error string - "+ + t.Fatalf("errNotInMainChain returned unexpected error string - "+ "got %q, want %q", err.Error(), errStr) } @@ -403,7 +403,7 @@ func TestSpendJournalErrors(t *testing.T) { } // TestUtxoSerialization ensures serializing and deserializing unspent -// trasaction output entries works as expected. +// transaction output entries works as expected. func TestUtxoSerialization(t *testing.T) { t.Parallel() diff --git a/blockchain/chainview.go b/blockchain/chainview.go index a4c3692cd6..dd70ab2d01 100644 --- a/blockchain/chainview.go +++ b/blockchain/chainview.go @@ -36,11 +36,13 @@ func fastLog2Floor(n uint32) uint8 { // for comparing chains. // // For example, assume a block chain with a side chain as depicted below: -// genesis -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -// \-> 4a -> 5a -> 6a +// +// genesis -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 +// \-> 4a -> 5a -> 6a // // The chain view for the branch ending in 6a consists of: -// genesis -> 1 -> 2 -> 3 -> 4a -> 5a -> 6a +// +// genesis -> 1 -> 2 -> 3 -> 4a -> 5a -> 6a type chainView struct { mtx sync.Mutex nodes []*blockNode @@ -258,12 +260,14 @@ func (c *chainView) next(node *blockNode) *blockNode { // view. // // For example, assume a block chain with a side chain as depicted below: -// genesis -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -// \-> 4a -> 5a -> 6a +// +// genesis -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 +// \-> 4a -> 5a -> 6a // // Further, assume the view is for the longer chain depicted above. That is to // say it consists of: -// genesis -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 +// +// genesis -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 // // Invoking this function with block node 5 would return block node 6 while // invoking it with block node 5a would return nil since that node is not part @@ -321,12 +325,14 @@ func (c *chainView) findFork(node *blockNode) *blockNode { // the chain view. It will return nil if there is no common block. // // For example, assume a block chain with a side chain as depicted below: -// genesis -> 1 -> 2 -> ... -> 5 -> 6 -> 7 -> 8 -// \-> 6a -> 7a +// +// genesis -> 1 -> 2 -> ... -> 5 -> 6 -> 7 -> 8 +// \-> 6a -> 7a // // Further, assume the view is for the longer chain depicted above. That is to // say it consists of: -// genesis -> 1 -> 2 -> ... -> 5 -> 6 -> 7 -> 8. +// +// genesis -> 1 -> 2 -> ... -> 5 -> 6 -> 7 -> 8. // // Invoking this function with block node 7a would return block node 5 while // invoking it with block node 7 would return itself since it is already part of diff --git a/blockchain/checkpoints.go b/blockchain/checkpoints.go index af3b6d924e..74fc23bacb 100644 --- a/blockchain/checkpoints.go +++ b/blockchain/checkpoints.go @@ -8,10 +8,10 @@ import ( "fmt" "time" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/txscript" - "github.com/btcsuite/btcutil" ) // CheckpointConfirmations is the number of blocks before the end of the current @@ -184,14 +184,14 @@ func isNonstandardTransaction(tx *btcutil.Tx) bool { // checkpoint candidate. // // The factors used to determine a good checkpoint are: -// - The block must be in the main chain -// - The block must be at least 'CheckpointConfirmations' blocks prior to the -// current end of the main chain -// - The timestamps for the blocks before and after the checkpoint must have -// timestamps which are also before and after the checkpoint, respectively -// (due to the median time allowance this is not always the case) -// - The block must not contain any strange transaction such as those with -// nonstandard scripts +// - The block must be in the main chain +// - The block must be at least 'CheckpointConfirmations' blocks prior to the +// current end of the main chain +// - The timestamps for the blocks before and after the checkpoint must have +// timestamps which are also before and after the checkpoint, respectively +// (due to the median time allowance this is not always the case) +// - The block must not contain any strange transaction such as those with +// nonstandard scripts // // The intent is that candidates are reviewed by a developer to make the final // decision and then manually added to the list of checkpoints for a network. diff --git a/blockchain/common_test.go b/blockchain/common_test.go index dd392a6669..12badd3ec0 100644 --- a/blockchain/common_test.go +++ b/blockchain/common_test.go @@ -14,13 +14,14 @@ import ( "strings" "time" + "github.com/btcsuite/btcd/blockchain/internal/testhelper" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/database" _ "github.com/btcsuite/btcd/database/ffldb" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) const ( @@ -343,7 +344,7 @@ func (b *BlockChain) TstSetCoinbaseMaturity(maturity uint16) { b.chainParams.CoinbaseMaturity = maturity } -// newFakeChain returns a chain that is usable for syntetic tests. It is +// newFakeChain returns a chain that is usable for synthetic tests. It is // important to note that this chain has no database associated with it, so // it is not usable with all functions and the tests must take care when making // use of it. @@ -357,7 +358,7 @@ func newFakeChain(params *chaincfg.Params) *BlockChain { targetTimespan := int64(params.TargetTimespan / time.Second) targetTimePerBlock := int64(params.TargetTimePerBlock / time.Second) adjustmentFactor := params.RetargetAdjustmentFactor - return &BlockChain{ + b := &BlockChain{ chainParams: params, timeSource: NewMedianTime(), minRetargetTimespan: targetTimespan / adjustmentFactor, @@ -368,6 +369,20 @@ func newFakeChain(params *chaincfg.Params) *BlockChain { warningCaches: newThresholdCaches(vbNumBits), deploymentCaches: newThresholdCaches(chaincfg.DefinedDeployments), } + + for _, deployment := range params.Deployments { + deploymentStarter := deployment.DeploymentStarter + if clockStarter, ok := deploymentStarter.(chaincfg.ClockConsensusDeploymentStarter); ok { + clockStarter.SynchronizeClock(b) + } + + deploymentEnder := deployment.DeploymentEnder + if clockEnder, ok := deploymentEnder.(chaincfg.ClockConsensusDeploymentEnder); ok { + clockEnder.SynchronizeClock(b) + } + } + + return b } // newFakeNode creates a block node connected to the passed parent with the @@ -382,3 +397,96 @@ func newFakeNode(parent *blockNode, blockVersion int32, bits uint32, timestamp t } return newBlockNode(header, parent) } + +// addBlock adds a block to the blockchain that succeeds the previous block. +// The blocks spends all the provided spendable outputs. The new block and +// the new spendable outputs created in the block are returned. +func addBlock(chain *BlockChain, prev *btcutil.Block, spends []*testhelper.SpendableOut) ( + *btcutil.Block, []*testhelper.SpendableOut, error) { + + block, outs, err := newBlock(chain, prev, spends) + if err != nil { + return nil, nil, err + } + + _, _, err = chain.ProcessBlock(block, BFNone) + if err != nil { + return nil, nil, err + } + + return block, outs, nil +} + +// calcMerkleRoot creates a merkle tree from the slice of transactions and +// returns the root of the tree. +func calcMerkleRoot(txns []*wire.MsgTx) chainhash.Hash { + if len(txns) == 0 { + return chainhash.Hash{} + } + + utilTxns := make([]*btcutil.Tx, 0, len(txns)) + for _, tx := range txns { + utilTxns = append(utilTxns, btcutil.NewTx(tx)) + } + return CalcMerkleRoot(utilTxns, false) +} + +// newBlock creates a block to the blockchain that succeeds the previous block. +// The blocks spends all the provided spendable outputs. The new block and the +// newly spendable outputs created in the block are returned. +func newBlock(chain *BlockChain, prev *btcutil.Block, + spends []*testhelper.SpendableOut) (*btcutil.Block, []*testhelper.SpendableOut, error) { + + blockHeight := prev.Height() + 1 + txns := make([]*wire.MsgTx, 0, 1+len(spends)) + + // Create and add coinbase tx. + cb := testhelper.CreateCoinbaseTx(blockHeight, CalcBlockSubsidy(blockHeight, chain.chainParams)) + txns = append(txns, cb) + + // Spend all txs to be spent. + for _, spend := range spends { + cb.TxOut[0].Value += int64(testhelper.LowFee) + + spendTx := testhelper.CreateSpendTx(spend, testhelper.LowFee) + txns = append(txns, spendTx) + } + + // Use a timestamp that is one second after the previous block unless + // this is the first block in which case the current time is used. + var ts time.Time + if blockHeight == 1 { + ts = time.Unix(time.Now().Unix(), 0) + } else { + ts = prev.MsgBlock().Header.Timestamp.Add(time.Second) + } + + // Create the block. The nonce will be solved in the below code in + // SolveBlock. + block := btcutil.NewBlock(&wire.MsgBlock{ + Header: wire.BlockHeader{ + Version: 1, + PrevBlock: *prev.Hash(), + MerkleRoot: calcMerkleRoot(txns), + Bits: chain.chainParams.PowLimitBits, + Timestamp: ts, + Nonce: 0, // To be solved. + }, + Transactions: txns, + }) + block.SetHeight(blockHeight) + + // Solve the block. + if !testhelper.SolveBlock(&block.MsgBlock().Header) { + return nil, nil, fmt.Errorf("Unable to solve block at height %d", blockHeight) + } + + // Create spendable outs to return. + outs := make([]*testhelper.SpendableOut, len(txns)) + for i, tx := range txns { + out := testhelper.MakeSpendableOutForTx(tx, 0) + outs[i] = &out + } + + return block, outs, nil +} diff --git a/blockchain/compress.go b/blockchain/compress.go index 611b9f0992..4495918558 100644 --- a/blockchain/compress.go +++ b/blockchain/compress.go @@ -5,7 +5,7 @@ package blockchain import ( - "github.com/btcsuite/btcd/btcec" + "github.com/btcsuite/btcd/btcec/v2" "github.com/btcsuite/btcd/txscript" ) @@ -218,7 +218,7 @@ func isPubKey(script []byte) (bool, []byte) { // Ensure the public key is valid. serializedPubKey := script[1:34] - _, err := btcec.ParsePubKey(serializedPubKey, btcec.S256()) + _, err := btcec.ParsePubKey(serializedPubKey) if err == nil { return true, serializedPubKey } @@ -230,7 +230,7 @@ func isPubKey(script []byte) (bool, []byte) { // Ensure the public key is valid. serializedPubKey := script[1:66] - _, err := btcec.ParsePubKey(serializedPubKey, btcec.S256()) + _, err := btcec.ParsePubKey(serializedPubKey) if err == nil { return true, serializedPubKey } @@ -399,7 +399,7 @@ func decompressScript(compressedPkScript []byte) []byte { compressedKey := make([]byte, 33) compressedKey[0] = byte(encodedScriptSize - 2) copy(compressedKey[1:], compressedPkScript[1:]) - key, err := btcec.ParsePubKey(compressedKey, btcec.S256()) + key, err := btcec.ParsePubKey(compressedKey) if err != nil { return nil } diff --git a/blockchain/difficulty.go b/blockchain/difficulty.go index 05f78a3ed1..b1e39b9d62 100644 --- a/blockchain/difficulty.go +++ b/blockchain/difficulty.go @@ -8,31 +8,14 @@ import ( "math/big" "time" + "github.com/btcsuite/btcd/blockchain/internal/workmath" "github.com/btcsuite/btcd/chaincfg/chainhash" ) -var ( - // bigOne is 1 represented as a big.Int. It is defined here to avoid - // the overhead of creating it multiple times. - bigOne = big.NewInt(1) - - // oneLsh256 is 1 shifted left 256 bits. It is defined here to avoid - // the overhead of creating it multiple times. - oneLsh256 = new(big.Int).Lsh(bigOne, 256) -) - // HashToBig converts a chainhash.Hash into a big.Int that can be used to // perform math comparisons. func HashToBig(hash *chainhash.Hash) *big.Int { - // A Hash is in little-endian, but the big package wants the bytes in - // big-endian, so reverse them. - buf := *hash - blen := len(buf) - for i := 0; i < blen/2; i++ { - buf[i], buf[blen-1-i] = buf[blen-1-i], buf[i] - } - - return new(big.Int).SetBytes(buf[:]) + return workmath.HashToBig(hash) } // CompactToBig converts a compact representation of a whole number N to an @@ -42,9 +25,9 @@ func HashToBig(hash *chainhash.Hash) *big.Int { // Like IEEE754 floating point, there are three basic components: the sign, // the exponent, and the mantissa. They are broken out as follows: // -// * the most significant 8 bits represent the unsigned base 256 exponent -// * bit 23 (the 24th bit) represents the sign bit -// * the least significant 23 bits represent the mantissa +// - the most significant 8 bits represent the unsigned base 256 exponent +// - bit 23 (the 24th bit) represents the sign bit +// - the least significant 23 bits represent the mantissa // // ------------------------------------------------- // | Exponent | Sign | Mantissa | @@ -53,37 +36,14 @@ func HashToBig(hash *chainhash.Hash) *big.Int { // ------------------------------------------------- // // The formula to calculate N is: -// N = (-1^sign) * mantissa * 256^(exponent-3) +// +// N = (-1^sign) * mantissa * 256^(exponent-3) // // This compact form is only used in bitcoin to encode unsigned 256-bit numbers // which represent difficulty targets, thus there really is not a need for a // sign bit, but it is implemented here to stay consistent with bitcoind. func CompactToBig(compact uint32) *big.Int { - // Extract the mantissa, sign bit, and exponent. - mantissa := compact & 0x007fffff - isNegative := compact&0x00800000 != 0 - exponent := uint(compact >> 24) - - // Since the base for the exponent is 256, the exponent can be treated - // as the number of bytes to represent the full 256-bit number. So, - // treat the exponent as the number of bytes and shift the mantissa - // right or left accordingly. This is equivalent to: - // N = mantissa * 256^(exponent-3) - var bn *big.Int - if exponent <= 3 { - mantissa >>= 8 * (3 - exponent) - bn = big.NewInt(int64(mantissa)) - } else { - bn = big.NewInt(int64(mantissa)) - bn.Lsh(bn, 8*(exponent-3)) - } - - // Make it negative if the sign bit is set. - if isNegative { - bn = bn.Neg(bn) - } - - return bn + return workmath.CompactToBig(compact) } // BigToCompact converts a whole number N to a compact representation using @@ -91,41 +51,7 @@ func CompactToBig(compact uint32) *big.Int { // of precision, so values larger than (2^23 - 1) only encode the most // significant digits of the number. See CompactToBig for details. func BigToCompact(n *big.Int) uint32 { - // No need to do any work if it's zero. - if n.Sign() == 0 { - return 0 - } - - // Since the base for the exponent is 256, the exponent can be treated - // as the number of bytes. So, shift the number right or left - // accordingly. This is equivalent to: - // mantissa = mantissa / 256^(exponent-3) - var mantissa uint32 - exponent := uint(len(n.Bytes())) - if exponent <= 3 { - mantissa = uint32(n.Bits()[0]) - mantissa <<= 8 * (3 - exponent) - } else { - // Use a copy to avoid modifying the caller's original number. - tn := new(big.Int).Set(n) - mantissa = uint32(tn.Rsh(tn, 8*(exponent-3)).Bits()[0]) - } - - // When the mantissa already has the sign bit set, the number is too - // large to fit into the available 23-bits, so divide the number by 256 - // and increment the exponent accordingly. - if mantissa&0x00800000 != 0 { - mantissa >>= 8 - exponent++ - } - - // Pack the exponent, sign bit, and mantissa into an unsigned 32-bit - // int and return it. - compact := uint32(exponent<<24) | mantissa - if n.Sign() < 0 { - compact |= 0x00800000 - } - return compact + return workmath.BigToCompact(n) } // CalcWork calculates a work value from difficulty bits. Bitcoin increases @@ -139,17 +65,7 @@ func BigToCompact(n *big.Int) uint32 { // potential division by zero and really small floating point numbers, the // result adds 1 to the denominator and multiplies the numerator by 2^256. func CalcWork(bits uint32) *big.Int { - // Return a work value of zero if the passed difficulty bits represent - // a negative number. Note this should not happen in practice with valid - // blocks, but an invalid block could trigger it. - difficultyNum := CompactToBig(bits) - if difficultyNum.Sign() <= 0 { - return big.NewInt(0) - } - - // (1 << 256) / (difficultyNum + 1) - denominator := new(big.Int).Add(difficultyNum, bigOne) - return new(big.Int).Div(oneLsh256, denominator) + return workmath.CalcWork(bits) } // calcEasiestDifficulty calculates the easiest possible difficulty that a block @@ -192,80 +108,87 @@ func (b *BlockChain) calcEasiestDifficulty(bits uint32, duration time.Duration) // findPrevTestNetDifficulty returns the difficulty of the previous block which // did not have the special testnet minimum difficulty rule applied. -// -// This function MUST be called with the chain state lock held (for writes). -func (b *BlockChain) findPrevTestNetDifficulty(startNode *blockNode) uint32 { +func findPrevTestNetDifficulty(startNode HeaderCtx, c ChainCtx) uint32 { // Search backwards through the chain for the last block without // the special rule applied. iterNode := startNode - for iterNode != nil && iterNode.height%b.blocksPerRetarget != 0 && - iterNode.bits == b.chainParams.PowLimitBits { + for iterNode != nil && iterNode.Height()%c.BlocksPerRetarget() != 0 && + iterNode.Bits() == c.ChainParams().PowLimitBits { - iterNode = iterNode.parent + iterNode = iterNode.Parent() } // Return the found difficulty or the minimum difficulty if no // appropriate block was found. - lastBits := b.chainParams.PowLimitBits + lastBits := c.ChainParams().PowLimitBits if iterNode != nil { - lastBits = iterNode.bits + lastBits = iterNode.Bits() } return lastBits } // calcNextRequiredDifficulty calculates the required difficulty for the block -// after the passed previous block node based on the difficulty retarget rules. +// after the passed previous HeaderCtx based on the difficulty retarget rules. // This function differs from the exported CalcNextRequiredDifficulty in that -// the exported version uses the current best chain as the previous block node -// while this function accepts any block node. -func (b *BlockChain) calcNextRequiredDifficulty(lastNode *blockNode, newBlockTime time.Time) (uint32, error) { +// the exported version uses the current best chain as the previous HeaderCtx +// while this function accepts any block node. This function accepts a ChainCtx +// parameter that gives the necessary difficulty context variables. +func calcNextRequiredDifficulty(lastNode HeaderCtx, newBlockTime time.Time, + c ChainCtx) (uint32, error) { + + // Emulate the same behavior as Bitcoin Core that for regtest there is + // no difficulty retargeting. + if c.ChainParams().PoWNoRetargeting { + return c.ChainParams().PowLimitBits, nil + } + // Genesis block. if lastNode == nil { - return b.chainParams.PowLimitBits, nil + return c.ChainParams().PowLimitBits, nil } // Return the previous block's difficulty requirements if this block // is not at a difficulty retarget interval. - if (lastNode.height+1)%b.blocksPerRetarget != 0 { + if (lastNode.Height()+1)%c.BlocksPerRetarget() != 0 { // For networks that support it, allow special reduction of the // required difficulty once too much time has elapsed without // mining a block. - if b.chainParams.ReduceMinDifficulty { + if c.ChainParams().ReduceMinDifficulty { // Return minimum difficulty when more than the desired // amount of time has elapsed without mining a block. - reductionTime := int64(b.chainParams.MinDiffReductionTime / + reductionTime := int64(c.ChainParams().MinDiffReductionTime / time.Second) - allowMinTime := lastNode.timestamp + reductionTime + allowMinTime := lastNode.Timestamp() + reductionTime if newBlockTime.Unix() > allowMinTime { - return b.chainParams.PowLimitBits, nil + return c.ChainParams().PowLimitBits, nil } // The block was mined within the desired timeframe, so // return the difficulty for the last block which did // not have the special minimum difficulty rule applied. - return b.findPrevTestNetDifficulty(lastNode), nil + return findPrevTestNetDifficulty(lastNode, c), nil } // For the main network (or any unrecognized networks), simply // return the previous block's difficulty requirements. - return lastNode.bits, nil + return lastNode.Bits(), nil } // Get the block node at the previous retarget (targetTimespan days // worth of blocks). - firstNode := lastNode.RelativeAncestor(b.blocksPerRetarget - 1) + firstNode := lastNode.RelativeAncestorCtx(c.BlocksPerRetarget() - 1) if firstNode == nil { return 0, AssertError("unable to obtain previous retarget block") } // Limit the amount of adjustment that can occur to the previous // difficulty. - actualTimespan := lastNode.timestamp - firstNode.timestamp + actualTimespan := lastNode.Timestamp() - firstNode.Timestamp() adjustedTimespan := actualTimespan - if actualTimespan < b.minRetargetTimespan { - adjustedTimespan = b.minRetargetTimespan - } else if actualTimespan > b.maxRetargetTimespan { - adjustedTimespan = b.maxRetargetTimespan + if actualTimespan < c.MinRetargetTimespan() { + adjustedTimespan = c.MinRetargetTimespan() + } else if actualTimespan > c.MaxRetargetTimespan() { + adjustedTimespan = c.MaxRetargetTimespan() } // Calculate new target difficulty as: @@ -273,14 +196,14 @@ func (b *BlockChain) calcNextRequiredDifficulty(lastNode *blockNode, newBlockTim // The result uses integer division which means it will be slightly // rounded down. Bitcoind also uses integer division to calculate this // result. - oldTarget := CompactToBig(lastNode.bits) + oldTarget := CompactToBig(lastNode.Bits()) newTarget := new(big.Int).Mul(oldTarget, big.NewInt(adjustedTimespan)) - targetTimeSpan := int64(b.chainParams.TargetTimespan / time.Second) + targetTimeSpan := int64(c.ChainParams().TargetTimespan / time.Second) newTarget.Div(newTarget, big.NewInt(targetTimeSpan)) // Limit new value to the proof of work limit. - if newTarget.Cmp(b.chainParams.PowLimit) > 0 { - newTarget.Set(b.chainParams.PowLimit) + if newTarget.Cmp(c.ChainParams().PowLimit) > 0 { + newTarget.Set(c.ChainParams().PowLimit) } // Log new target difficulty and return it. The new target logging is @@ -288,13 +211,13 @@ func (b *BlockChain) calcNextRequiredDifficulty(lastNode *blockNode, newBlockTim // newTarget since conversion to the compact representation loses // precision. newTargetBits := BigToCompact(newTarget) - log.Debugf("Difficulty retarget at block height %d", lastNode.height+1) - log.Debugf("Old target %08x (%064x)", lastNode.bits, oldTarget) + log.Debugf("Difficulty retarget at block height %d", lastNode.Height()+1) + log.Debugf("Old target %08x (%064x)", lastNode.Bits(), oldTarget) log.Debugf("New target %08x (%064x)", newTargetBits, CompactToBig(newTargetBits)) log.Debugf("Actual timespan %v, adjusted timespan %v, target timespan %v", time.Duration(actualTimespan)*time.Second, time.Duration(adjustedTimespan)*time.Second, - b.chainParams.TargetTimespan) + c.ChainParams().TargetTimespan) return newTargetBits, nil } @@ -306,7 +229,7 @@ func (b *BlockChain) calcNextRequiredDifficulty(lastNode *blockNode, newBlockTim // This function is safe for concurrent access. func (b *BlockChain) CalcNextRequiredDifficulty(timestamp time.Time) (uint32, error) { b.chainLock.Lock() - difficulty, err := b.calcNextRequiredDifficulty(b.bestChain.Tip(), timestamp) + difficulty, err := calcNextRequiredDifficulty(b.bestChain.Tip(), timestamp, b) b.chainLock.Unlock() return difficulty, err } diff --git a/blockchain/doc.go b/blockchain/doc.go index 244175414a..d57acc29c9 100644 --- a/blockchain/doc.go +++ b/blockchain/doc.go @@ -26,42 +26,42 @@ caller a high level of flexibility in how they want to react to certain events such as orphan blocks which need their parents requested and newly connected main chain blocks which might result in wallet updates. -Bitcoin Chain Processing Overview +# Bitcoin Chain Processing Overview Before a block is allowed into the block chain, it must go through an intensive series of validation rules. The following list serves as a general outline of those rules to provide some intuition into what is going on under the hood, but is by no means exhaustive: - - Reject duplicate blocks - - Perform a series of sanity checks on the block and its transactions such as - verifying proof of work, timestamps, number and character of transactions, - transaction amounts, script complexity, and merkle root calculations - - Compare the block against predetermined checkpoints for expected timestamps - and difficulty based on elapsed time since the checkpoint - - Save the most recent orphan blocks for a limited time in case their parent - blocks become available - - Stop processing if the block is an orphan as the rest of the processing - depends on the block's position within the block chain - - Perform a series of more thorough checks that depend on the block's position - within the block chain such as verifying block difficulties adhere to - difficulty retarget rules, timestamps are after the median of the last - several blocks, all transactions are finalized, checkpoint blocks match, and - block versions are in line with the previous blocks - - Determine how the block fits into the chain and perform different actions - accordingly in order to ensure any side chains which have higher difficulty - than the main chain become the new main chain - - When a block is being connected to the main chain (either through - reorganization of a side chain to the main chain or just extending the - main chain), perform further checks on the block's transactions such as - verifying transaction duplicates, script complexity for the combination of - connected scripts, coinbase maturity, double spends, and connected - transaction values - - Run the transaction scripts to verify the spender is allowed to spend the - coins - - Insert the block into the block database + - Reject duplicate blocks + - Perform a series of sanity checks on the block and its transactions such as + verifying proof of work, timestamps, number and character of transactions, + transaction amounts, script complexity, and merkle root calculations + - Compare the block against predetermined checkpoints for expected timestamps + and difficulty based on elapsed time since the checkpoint + - Save the most recent orphan blocks for a limited time in case their parent + blocks become available + - Stop processing if the block is an orphan as the rest of the processing + depends on the block's position within the block chain + - Perform a series of more thorough checks that depend on the block's position + within the block chain such as verifying block difficulties adhere to + difficulty retarget rules, timestamps are after the median of the last + several blocks, all transactions are finalized, checkpoint blocks match, and + block versions are in line with the previous blocks + - Determine how the block fits into the chain and perform different actions + accordingly in order to ensure any side chains which have higher difficulty + than the main chain become the new main chain + - When a block is being connected to the main chain (either through + reorganization of a side chain to the main chain or just extending the + main chain), perform further checks on the block's transactions such as + verifying transaction duplicates, script complexity for the combination of + connected scripts, coinbase maturity, double spends, and connected + transaction values + - Run the transaction scripts to verify the spender is allowed to spend the + coins + - Insert the block into the block database -Errors +# Errors Errors returned by this package are either the raw errors provided by underlying calls or of type blockchain.RuleError. This allows the caller to differentiate @@ -70,12 +70,12 @@ violations through type assertions. In addition, callers can programmatically determine the specific rule violation by examining the ErrorCode field of the type asserted blockchain.RuleError. -Bitcoin Improvement Proposals +# Bitcoin Improvement Proposals This package includes spec changes outlined by the following BIPs: - BIP0016 (https://en.bitcoin.it/wiki/BIP_0016) - BIP0030 (https://en.bitcoin.it/wiki/BIP_0030) - BIP0034 (https://en.bitcoin.it/wiki/BIP_0034) + BIP0016 (https://en.bitcoin.it/wiki/BIP_0016) + BIP0030 (https://en.bitcoin.it/wiki/BIP_0030) + BIP0034 (https://en.bitcoin.it/wiki/BIP_0034) */ package blockchain diff --git a/blockchain/error.go b/blockchain/error.go index 1e7c879ba0..dc40222235 100644 --- a/blockchain/error.go +++ b/blockchain/error.go @@ -70,7 +70,7 @@ const ( // ErrUnexpectedDifficulty indicates specified bits do not align with // the expected value either because it doesn't match the calculated - // valued based on difficulty regarted rules or it is out of the valid + // valued based on difficulty regarded rules or it is out of the valid // range. ErrUnexpectedDifficulty diff --git a/blockchain/example_test.go b/blockchain/example_test.go index 691d0927f2..8db570273d 100644 --- a/blockchain/example_test.go +++ b/blockchain/example_test.go @@ -11,10 +11,10 @@ import ( "path/filepath" "github.com/btcsuite/btcd/blockchain" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/database" _ "github.com/btcsuite/btcd/database/ffldb" - "github.com/btcsuite/btcutil" ) // This example demonstrates how to create a new chain instance and use diff --git a/blockchain/fullblocks_test.go b/blockchain/fullblocks_test.go index 3ae0d0eb51..591414d1d0 100644 --- a/blockchain/fullblocks_test.go +++ b/blockchain/fullblocks_test.go @@ -14,13 +14,13 @@ import ( "github.com/btcsuite/btcd/blockchain" "github.com/btcsuite/btcd/blockchain/fullblocktests" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/database" _ "github.com/btcsuite/btcd/database/ffldb" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) const ( @@ -146,6 +146,70 @@ func TestFullBlocks(t *testing.T) { } defer teardownFunc() + testBlockDisconnectExpectUTXO := func(item fullblocktests.BlockDisconnectExpectUTXO) { + expectedCallBack := func(notification *blockchain.Notification) { + switch notification.Type { + + case blockchain.NTBlockDisconnected: + block, ok := notification.Data.(*btcutil.Block) + if !ok { + t.Fatalf("expected a block") + } + + // Return early if the block we get isn't the relevant + // block. + if !block.Hash().IsEqual(&item.BlockHash) { + return + } + + entry, err := chain.FetchUtxoEntry(item.OutPoint) + if err != nil { + t.Fatal(err) + } + + if entry == nil || entry.IsSpent() { + t.Logf("expected utxo %v to exist but it's "+ + "nil or spent\n", item.OutPoint.String()) + t.Fatalf("expected utxo %v to exist but it's "+ + "nil or spent", item.OutPoint.String()) + } + } + } + unexpectedCallBack := func(notification *blockchain.Notification) { + switch notification.Type { + case blockchain.NTBlockDisconnected: + block, ok := notification.Data.(*btcutil.Block) + if !ok { + t.Fatalf("expected a block") + } + + // Return early if the block we get isn't the relevant + // block. + if !block.Hash().IsEqual(&item.BlockHash) { + return + } + + entry, err := chain.FetchUtxoEntry(item.OutPoint) + if err != nil { + t.Fatal(err) + } + + if entry != nil && !entry.IsSpent() { + t.Logf("unexpected utxo %v to exist but it's "+ + "not nil and not spent", item.OutPoint.String()) + t.Fatalf("unexpected utxo %v exists but it's "+ + "not nil and not spent\n", item.OutPoint.String()) + } + } + } + + if item.Expected { + chain.Subscribe(expectedCallBack) + } else { + chain.Subscribe(unexpectedCallBack) + } + } + // testAcceptedBlock attempts to process the block in the provided test // instance and ensures that it was accepted according to the flags // specified in the test. @@ -300,6 +364,8 @@ func TestFullBlocks(t *testing.T) { testOrphanOrRejectedBlock(item) case fullblocktests.ExpectedTip: testExpectedTip(item) + case fullblocktests.BlockDisconnectExpectUTXO: + testBlockDisconnectExpectUTXO(item) default: t.Fatalf("test #%d, item #%d is not one of "+ "the supported test instance types -- "+ diff --git a/blockchain/fullblocktests/README.md b/blockchain/fullblocktests/README.md index 41f4b934e9..943989be35 100644 --- a/blockchain/fullblocktests/README.md +++ b/blockchain/fullblocktests/README.md @@ -1,9 +1,9 @@ fullblocktests ============== -[![Build Status](http://img.shields.io/travis/btcsuite/btcd.svg)](https://travis-ci.org/btcsuite/btcd) +[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions) [![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) -[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/btcsuite/btcd/blockchain/fullblocktests) +[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/blockchain/fullblocktests) Package fullblocktests provides a set of full block tests to be used for testing the consensus validation rules. The tests are intended to be flexible enough to diff --git a/blockchain/fullblocktests/generate.go b/blockchain/fullblocktests/generate.go index 82d3a036e9..2b499c4e8c 100644 --- a/blockchain/fullblocktests/generate.go +++ b/blockchain/fullblocktests/generate.go @@ -14,17 +14,17 @@ import ( "encoding/binary" "errors" "fmt" - "math" "runtime" "time" "github.com/btcsuite/btcd/blockchain" - "github.com/btcsuite/btcd/btcec" + "github.com/btcsuite/btcd/blockchain/internal/testhelper" + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) const ( @@ -43,16 +43,6 @@ const ( numLargeReorgBlocks = 1088 ) -var ( - // opTrueScript is simply a public key script that contains the OP_TRUE - // opcode. It is defined here to reduce garbage creation. - opTrueScript = []byte{txscript.OP_TRUE} - - // lowFee is a single satoshi and exists to make the test code more - // readable. - lowFee = btcutil.Amount(1) -) - // TestInstance is an interface that describes a specific test instance returned // by the tests generated in this package. It should be type asserted to one // of the concrete test instance types in order to test accordingly. @@ -150,30 +140,20 @@ type RejectedNonCanonicalBlock struct { // This implements the TestInstance interface. func (b RejectedNonCanonicalBlock) FullBlockTestInstance() {} -// spendableOut represents a transaction output that is spendable along with -// additional metadata such as the block its in and how much it pays. -type spendableOut struct { - prevOut wire.OutPoint - amount btcutil.Amount -} - -// makeSpendableOutForTx returns a spendable output for the given transaction -// and transaction output index within the transaction. -func makeSpendableOutForTx(tx *wire.MsgTx, txOutIndex uint32) spendableOut { - return spendableOut{ - prevOut: wire.OutPoint{ - Hash: tx.TxHash(), - Index: txOutIndex, - }, - amount: btcutil.Amount(tx.TxOut[txOutIndex].Value), - } +// BlockDisconnectExpectUTXO defines a test instance that tests an utxo to exist or not +// exist after a specified block has been disconnected. +type BlockDisconnectExpectUTXO struct { + Name string + Expected bool + BlockHash chainhash.Hash + OutPoint wire.OutPoint } -// makeSpendableOut returns a spendable output for the given block, transaction -// index within the block, and transaction output index within the transaction. -func makeSpendableOut(block *wire.MsgBlock, txIndex, txOutIndex uint32) spendableOut { - return makeSpendableOutForTx(block.Transactions[txIndex], txOutIndex) -} +// FullBlockTestInstance only exists to allow BlockDisconnectExpectUTXO to be treated as +// a TestInstance. +// +// This implements the TestInstance interface. +func (b BlockDisconnectExpectUTXO) FullBlockTestInstance() {} // testGenerator houses state used to easy the process of generating test blocks // that build from one another along with housing other useful things such as @@ -188,7 +168,7 @@ type testGenerator struct { blockHeights map[string]int32 // Used for tracking spendable coinbase outputs. - spendableOuts []spendableOut + spendableOuts []testhelper.SpendableOut prevCollectedHash chainhash.Hash // Common key for any tests which require signed transactions. @@ -198,7 +178,7 @@ type testGenerator struct { // makeTestGenerator returns a test generator instance initialized with the // genesis block as the tip. func makeTestGenerator(params *chaincfg.Params) (testGenerator, error) { - privKey, _ := btcec.PrivKeyFromBytes(btcec.S256(), []byte{0x01}) + privKey, _ := btcec.PrivKeyFromBytes([]byte{0x01}) genesis := params.GenesisBlock genesisHash := genesis.BlockHash() return testGenerator{ @@ -240,62 +220,12 @@ func pushDataScript(items ...[]byte) []byte { return script } -// standardCoinbaseScript returns a standard script suitable for use as the -// signature script of the coinbase transaction of a new block. In particular, -// it starts with the block height that is required by version 2 blocks. -func standardCoinbaseScript(blockHeight int32, extraNonce uint64) ([]byte, error) { - return txscript.NewScriptBuilder().AddInt64(int64(blockHeight)). - AddInt64(int64(extraNonce)).Script() -} - -// opReturnScript returns a provably-pruneable OP_RETURN script with the -// provided data. -func opReturnScript(data []byte) []byte { - builder := txscript.NewScriptBuilder() - script, err := builder.AddOp(txscript.OP_RETURN).AddData(data).Script() - if err != nil { - panic(err) - } - return script -} - -// uniqueOpReturnScript returns a standard provably-pruneable OP_RETURN script -// with a random uint64 encoded as the data. -func uniqueOpReturnScript() []byte { - rand, err := wire.RandomUint64() - if err != nil { - panic(err) - } - - data := make([]byte, 8) - binary.LittleEndian.PutUint64(data[0:8], rand) - return opReturnScript(data) -} - // createCoinbaseTx returns a coinbase transaction paying an appropriate // subsidy based on the passed block height. The coinbase signature script // conforms to the requirements of version 2 blocks. func (g *testGenerator) createCoinbaseTx(blockHeight int32) *wire.MsgTx { - extraNonce := uint64(0) - coinbaseScript, err := standardCoinbaseScript(blockHeight, extraNonce) - if err != nil { - panic(err) - } - - tx := wire.NewMsgTx(1) - tx.AddTxIn(&wire.TxIn{ - // Coinbase transactions have no inputs, so previous outpoint is - // zero hash and max index. - PreviousOutPoint: *wire.NewOutPoint(&chainhash.Hash{}, - wire.MaxPrevOutIndex), - Sequence: wire.MaxTxInSequenceNum, - SignatureScript: coinbaseScript, - }) - tx.AddTxOut(&wire.TxOut{ - Value: blockchain.CalcBlockSubsidy(blockHeight, g.params), - PkScript: opTrueScript, - }) - return tx + return testhelper.CreateCoinbaseTx( + blockHeight, blockchain.CalcBlockSubsidy(blockHeight, g.params)) } // calcMerkleRoot creates a merkle tree from the slice of transactions and @@ -309,73 +239,7 @@ func calcMerkleRoot(txns []*wire.MsgTx) chainhash.Hash { for _, tx := range txns { utilTxns = append(utilTxns, btcutil.NewTx(tx)) } - merkles := blockchain.BuildMerkleTreeStore(utilTxns, false) - return *merkles[len(merkles)-1] -} - -// solveBlock attempts to find a nonce which makes the passed block header hash -// to a value less than the target difficulty. When a successful solution is -// found true is returned and the nonce field of the passed header is updated -// with the solution. False is returned if no solution exists. -// -// NOTE: This function will never solve blocks with a nonce of 0. This is done -// so the 'nextBlock' function can properly detect when a nonce was modified by -// a munge function. -func solveBlock(header *wire.BlockHeader) bool { - // sbResult is used by the solver goroutines to send results. - type sbResult struct { - found bool - nonce uint32 - } - - // solver accepts a block header and a nonce range to test. It is - // intended to be run as a goroutine. - targetDifficulty := blockchain.CompactToBig(header.Bits) - quit := make(chan bool) - results := make(chan sbResult) - solver := func(hdr wire.BlockHeader, startNonce, stopNonce uint32) { - // We need to modify the nonce field of the header, so make sure - // we work with a copy of the original header. - for i := startNonce; i >= startNonce && i <= stopNonce; i++ { - select { - case <-quit: - return - default: - hdr.Nonce = i - hash := hdr.BlockHash() - if blockchain.HashToBig(&hash).Cmp( - targetDifficulty) <= 0 { - - results <- sbResult{true, i} - return - } - } - } - results <- sbResult{false, 0} - } - - startNonce := uint32(1) - stopNonce := uint32(math.MaxUint32) - numCores := uint32(runtime.NumCPU()) - noncesPerCore := (stopNonce - startNonce) / numCores - for i := uint32(0); i < numCores; i++ { - rangeStart := startNonce + (noncesPerCore * i) - rangeStop := startNonce + (noncesPerCore * (i + 1)) - 1 - if i == numCores-1 { - rangeStop = stopNonce - } - go solver(*header, rangeStart, rangeStop) - } - for i := uint32(0); i < numCores; i++ { - result := <-results - if result.found { - close(quit) - header.Nonce = result.nonce - return true - } - } - - return false + return blockchain.CalcMerkleRoot(utilTxns, false) } // additionalCoinbase returns a function that itself takes a block and @@ -423,40 +287,21 @@ func replaceCoinbaseSigScript(script []byte) func(*wire.MsgBlock) { } // additionalTx returns a function that itself takes a block and modifies it by -// adding the the provided transaction. +// adding the provided transaction. func additionalTx(tx *wire.MsgTx) func(*wire.MsgBlock) { return func(b *wire.MsgBlock) { b.AddTransaction(tx) } } -// createSpendTx creates a transaction that spends from the provided spendable -// output and includes an additional unique OP_RETURN output to ensure the -// transaction ends up with a unique hash. The script is a simple OP_TRUE -// script which avoids the need to track addresses and signature scripts in the -// tests. -func createSpendTx(spend *spendableOut, fee btcutil.Amount) *wire.MsgTx { - spendTx := wire.NewMsgTx(1) - spendTx.AddTxIn(&wire.TxIn{ - PreviousOutPoint: spend.prevOut, - Sequence: wire.MaxTxInSequenceNum, - SignatureScript: nil, - }) - spendTx.AddTxOut(wire.NewTxOut(int64(spend.amount-fee), - opTrueScript)) - spendTx.AddTxOut(wire.NewTxOut(0, uniqueOpReturnScript())) - - return spendTx -} - // createSpendTxForTx creates a transaction that spends from the first output of // the provided transaction and includes an additional unique OP_RETURN output // to ensure the transaction ends up with a unique hash. The public key script // is a simple OP_TRUE script which avoids the need to track addresses and // signature scripts in the tests. The signature script is nil. func createSpendTxForTx(tx *wire.MsgTx, fee btcutil.Amount) *wire.MsgTx { - spend := makeSpendableOutForTx(tx, 0) - return createSpendTx(&spend, fee) + spend := testhelper.MakeSpendableOutForTx(tx, 0) + return testhelper.CreateSpendTx(&spend, fee) } // nextBlock builds a new block that extends the current tip associated with the @@ -466,9 +311,9 @@ func createSpendTxForTx(tx *wire.MsgTx, fee btcutil.Amount) *wire.MsgTx { // - A coinbase that pays the required subsidy to an OP_TRUE script // - When a spendable output is provided: // - A transaction that spends from the provided output the following outputs: -// - One that pays the inputs amount minus 1 atom to an OP_TRUE script -// - One that contains an OP_RETURN output with a random uint64 in order to -// ensure the transaction has a unique hash +// - One that pays the inputs amount minus 1 atom to an OP_TRUE script +// - One that contains an OP_RETURN output with a random uint64 in order to +// ensure the transaction has a unique hash // // Additionally, if one or more munge functions are specified, they will be // invoked with the block prior to solving it. This provides callers with the @@ -478,7 +323,7 @@ func createSpendTxForTx(tx *wire.MsgTx, fee btcutil.Amount) *wire.MsgTx { // applied after all munge functions have been invoked: // - The merkle root will be recalculated unless it was manually changed // - The block will be solved unless the nonce was changed -func (g *testGenerator) nextBlock(blockName string, spend *spendableOut, mungers ...func(*wire.MsgBlock)) *wire.MsgBlock { +func (g *testGenerator) nextBlock(blockName string, spend *testhelper.SpendableOut, mungers ...func(*wire.MsgBlock)) *wire.MsgBlock { // Create coinbase transaction for the block using any additional // subsidy if specified. nextHeight := g.tipHeight + 1 @@ -496,7 +341,7 @@ func (g *testGenerator) nextBlock(blockName string, spend *spendableOut, mungers // add it to the list of transactions to include in the block. // The script is a simple OP_TRUE script in order to avoid the // need to track addresses and signature scripts in the tests. - txns = append(txns, createSpendTx(spend, fee)) + txns = append(txns, testhelper.CreateSpendTx(spend, fee)) } // Use a timestamp that is one second after the previous block unless @@ -533,7 +378,7 @@ func (g *testGenerator) nextBlock(blockName string, spend *spendableOut, mungers // Only solve the block if the nonce wasn't manually changed by a munge // function. - if block.Header.Nonce == curNonce && !solveBlock(&block.Header) { + if block.Header.Nonce == curNonce && !testhelper.SolveBlock(&block.Header) { panic(fmt.Sprintf("Unable to solve block at height %d", nextHeight)) } @@ -580,7 +425,7 @@ func (g *testGenerator) setTip(blockName string) { // oldestCoinbaseOuts removes the oldest coinbase output that was previously // saved to the generator and returns the set as a slice. -func (g *testGenerator) oldestCoinbaseOut() spendableOut { +func (g *testGenerator) oldestCoinbaseOut() testhelper.SpendableOut { op := g.spendableOuts[0] g.spendableOuts = g.spendableOuts[1:] return op @@ -589,12 +434,12 @@ func (g *testGenerator) oldestCoinbaseOut() spendableOut { // saveTipCoinbaseOut adds the coinbase tx output in the current tip block to // the list of spendable outputs. func (g *testGenerator) saveTipCoinbaseOut() { - g.spendableOuts = append(g.spendableOuts, makeSpendableOut(g.tip, 0, 0)) + g.spendableOuts = append(g.spendableOuts, testhelper.MakeSpendableOut(g.tip, 0, 0)) g.prevCollectedHash = g.tip.BlockHash() } // saveSpendableCoinbaseOuts adds all coinbase outputs from the last block that -// had its coinbase tx output colleted to the current tip. This is useful to +// had its coinbase tx output collected to the current tip. This is useful to // batch the collection of coinbase outputs once the tests reach a stable point // so they don't have to manually add them for the right tests which will // ultimately end up being the best chain. @@ -879,6 +724,9 @@ func Generate(includeLargeReorg bool) (tests [][]TestInstance, err error) { // // orphanedOrRejected creates and appends a single orphanOrRejectBlock // test instance for the current tip. + // + // blockDisconnectExpectUTXO creates and appends a BlockDisconnectExpectUTXO test + // instance with the passed in values. accepted := func() { tests = append(tests, []TestInstance{ acceptBlock(g.tipName, g.tip, true, false), @@ -905,6 +753,12 @@ func Generate(includeLargeReorg bool) (tests [][]TestInstance, err error) { orphanOrRejectBlock(g.tipName, g.tip), }) } + blockDisconnectExpectUTXO := func(name string, expected bool, op wire.OutPoint, + hash chainhash.Hash) { + tests = append(tests, []TestInstance{ + BlockDisconnectExpectUTXO{name, expected, hash, op}, + }) + } // --------------------------------------------------------------------- // Generate enough blocks to have mature coinbase outputs to work with. @@ -924,7 +778,7 @@ func Generate(includeLargeReorg bool) (tests [][]TestInstance, err error) { tests = append(tests, testInstances) // Collect spendable outputs. This simplifies the code below. - var outs []*spendableOut + var outs []*testhelper.SpendableOut for i := uint16(0); i < coinbaseMaturity; i++ { op := g.oldestCoinbaseOut() outs = append(outs, &op) @@ -937,7 +791,7 @@ func Generate(includeLargeReorg bool) (tests [][]TestInstance, err error) { // --------------------------------------------------------------------- // The comments below identify the structure of the chain being built. // - // The values in parenthesis repesent which outputs are being spent. + // The values in parenthesis represent which outputs are being spent. // // For example, b1(0) indicates the first collected spendable output // which, due to the code above to create the correct number of blocks, @@ -962,7 +816,7 @@ func Generate(includeLargeReorg bool) (tests [][]TestInstance, err error) { // \-> b3(1) g.setTip("b1") g.nextBlock("b3", outs[1]) - b3Tx1Out := makeSpendableOut(g.tip, 1, 0) + b3Tx1Out := testhelper.MakeSpendableOut(g.tip, 1, 0) acceptedToSideChainWithExpectedTip("b2") // Extend b3 fork to make the alternative chain longer and force reorg. @@ -1195,7 +1049,7 @@ func Generate(includeLargeReorg bool) (tests [][]TestInstance, err error) { accepted() // --------------------------------------------------------------------- - // Multisig[Verify]/ChecksigVerifiy signature operation count tests. + // Multisig[Verify]/ChecksigVerify signature operation count tests. // --------------------------------------------------------------------- // Create block with max signature operations as OP_CHECKMULTISIG. @@ -1275,9 +1129,9 @@ func Generate(includeLargeReorg bool) (tests [][]TestInstance, err error) { // \-> b38(b37.tx[1]) // g.setTip("b35") - doubleSpendTx := createSpendTx(outs[11], lowFee) + doubleSpendTx := testhelper.CreateSpendTx(outs[11], testhelper.LowFee) g.nextBlock("b37", outs[11], additionalTx(doubleSpendTx)) - b37Tx1Out := makeSpendableOut(g.tip, 1, 0) + b37Tx1Out := testhelper.MakeSpendableOut(g.tip, 1, 0) rejected(blockchain.ErrMissingTxOut) g.setTip("b35") @@ -1313,7 +1167,7 @@ func Generate(includeLargeReorg bool) (tests [][]TestInstance, err error) { txnsNeeded := (maxBlockSigOps / redeemScriptSigOps) + 1 prevTx := b.Transactions[1] for i := 0; i < txnsNeeded; i++ { - prevTx = createSpendTxForTx(prevTx, lowFee) + prevTx = createSpendTxForTx(prevTx, testhelper.LowFee) prevTx.TxOut[0].Value -= 2 prevTx.AddTxOut(wire.NewTxOut(2, p2shScript)) b.AddTransaction(prevTx) @@ -1333,8 +1187,8 @@ func Generate(includeLargeReorg bool) (tests [][]TestInstance, err error) { for i := 0; i < txnsNeeded; i++ { // Create a signed transaction that spends from the // associated p2sh output in b39. - spend := makeSpendableOutForTx(b39.Transactions[i+2], 2) - tx := createSpendTx(&spend, lowFee) + spend := testhelper.MakeSpendableOutForTx(b39.Transactions[i+2], 2) + tx := testhelper.CreateSpendTx(&spend, testhelper.LowFee) sig, err := txscript.RawTxInSignature(tx, 0, redeemScript, txscript.SigHashAll, g.privKey) if err != nil { @@ -1350,7 +1204,7 @@ func Generate(includeLargeReorg bool) (tests [][]TestInstance, err error) { // the block one over the max allowed. fill := maxBlockSigOps - (txnsNeeded * redeemScriptSigOps) + 1 finalTx := b.Transactions[len(b.Transactions)-1] - tx := createSpendTxForTx(finalTx, lowFee) + tx := createSpendTxForTx(finalTx, testhelper.LowFee) tx.TxOut[0].PkScript = repeatOpcode(txscript.OP_CHECKSIG, fill) b.AddTransaction(tx) }) @@ -1364,8 +1218,8 @@ func Generate(includeLargeReorg bool) (tests [][]TestInstance, err error) { g.nextBlock("b41", outs[12], func(b *wire.MsgBlock) { txnsNeeded := (maxBlockSigOps / redeemScriptSigOps) for i := 0; i < txnsNeeded; i++ { - spend := makeSpendableOutForTx(b39.Transactions[i+2], 2) - tx := createSpendTx(&spend, lowFee) + spend := testhelper.MakeSpendableOutForTx(b39.Transactions[i+2], 2) + tx := testhelper.CreateSpendTx(&spend, testhelper.LowFee) sig, err := txscript.RawTxInSignature(tx, 0, redeemScript, txscript.SigHashAll, g.privKey) if err != nil { @@ -1384,7 +1238,7 @@ func Generate(includeLargeReorg bool) (tests [][]TestInstance, err error) { return } finalTx := b.Transactions[len(b.Transactions)-1] - tx := createSpendTxForTx(finalTx, lowFee) + tx := createSpendTxForTx(finalTx, testhelper.LowFee) tx.TxOut[0].PkScript = repeatOpcode(txscript.OP_CHECKSIG, fill) b.AddTransaction(tx) }) @@ -1414,7 +1268,7 @@ func Generate(includeLargeReorg bool) (tests [][]TestInstance, err error) { // ... -> b43(13) // \-> b44(14) g.nextBlock("b44", nil, func(b *wire.MsgBlock) { - nonCoinbaseTx := createSpendTx(outs[14], lowFee) + nonCoinbaseTx := testhelper.CreateSpendTx(outs[14], testhelper.LowFee) b.Transactions[0] = nonCoinbaseTx }) rejected(blockchain.ErrFirstTxNotCoinbase) @@ -1619,7 +1473,7 @@ func Generate(includeLargeReorg bool) (tests [][]TestInstance, err error) { g.setTip("b55") b57 := g.nextBlock("b57", outs[16], func(b *wire.MsgBlock) { tx2 := b.Transactions[1] - tx3 := createSpendTxForTx(tx2, lowFee) + tx3 := createSpendTxForTx(tx2, testhelper.LowFee) b.AddTransaction(tx3) }) g.assertTipBlockNumTxns(3) @@ -1664,7 +1518,7 @@ func Generate(includeLargeReorg bool) (tests [][]TestInstance, err error) { // in the block. spendTx := b.Transactions[1] for i := 0; i < 4; i++ { - spendTx = createSpendTxForTx(spendTx, lowFee) + spendTx = createSpendTxForTx(spendTx, testhelper.LowFee) b.AddTransaction(spendTx) } @@ -1696,7 +1550,7 @@ func Generate(includeLargeReorg bool) (tests [][]TestInstance, err error) { // \-> b59(17) g.setTip("b57") g.nextBlock("b59", outs[17], func(b *wire.MsgBlock) { - b.Transactions[1].TxOut[0].Value = int64(outs[17].amount) + 1 + b.Transactions[1].TxOut[0].Value = int64(outs[17].Amount) + 1 }) rejected(blockchain.ErrSpendTooHigh) @@ -1801,7 +1655,7 @@ func Generate(includeLargeReorg bool) (tests [][]TestInstance, err error) { // ... b64(18) -> b65(19) g.setTip("b64") g.nextBlock("b65", outs[19], func(b *wire.MsgBlock) { - tx3 := createSpendTxForTx(b.Transactions[1], lowFee) + tx3 := createSpendTxForTx(b.Transactions[1], testhelper.LowFee) b.AddTransaction(tx3) }) accepted() @@ -1811,8 +1665,8 @@ func Generate(includeLargeReorg bool) (tests [][]TestInstance, err error) { // ... -> b65(19) // \-> b66(20) g.nextBlock("b66", nil, func(b *wire.MsgBlock) { - tx2 := createSpendTx(outs[20], lowFee) - tx3 := createSpendTxForTx(tx2, lowFee) + tx2 := testhelper.CreateSpendTx(outs[20], testhelper.LowFee) + tx3 := createSpendTxForTx(tx2, testhelper.LowFee) b.AddTransaction(tx3) b.AddTransaction(tx2) }) @@ -1826,8 +1680,8 @@ func Generate(includeLargeReorg bool) (tests [][]TestInstance, err error) { g.setTip("b65") g.nextBlock("b67", outs[20], func(b *wire.MsgBlock) { tx2 := b.Transactions[1] - tx3 := createSpendTxForTx(tx2, lowFee) - tx4 := createSpendTxForTx(tx2, lowFee) + tx3 := createSpendTxForTx(tx2, testhelper.LowFee) + tx4 := createSpendTxForTx(tx2, testhelper.LowFee) b.AddTransaction(tx3) b.AddTransaction(tx4) }) @@ -1950,7 +1804,7 @@ func Generate(includeLargeReorg bool) (tests [][]TestInstance, err error) { txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF} g.nextBlock("b74", outs[23], replaceSpendScript(script), func(b *wire.MsgBlock) { tx2 := b.Transactions[1] - tx3 := createSpendTxForTx(tx2, lowFee) + tx3 := createSpendTxForTx(tx2, testhelper.LowFee) tx3.TxIn[0].SignatureScript = []byte{txscript.OP_FALSE} b.AddTransaction(tx3) }) @@ -1971,7 +1825,7 @@ func Generate(includeLargeReorg bool) (tests [][]TestInstance, err error) { const zeroCoin = int64(0) spendTx := b.Transactions[1] for i := 0; i < numAdditionalOutputs; i++ { - spendTx.AddTxOut(wire.NewTxOut(zeroCoin, opTrueScript)) + spendTx.AddTxOut(wire.NewTxOut(zeroCoin, testhelper.OpTrueScript)) } // Add transactions spending from the outputs added above that @@ -1980,14 +1834,14 @@ func Generate(includeLargeReorg bool) (tests [][]TestInstance, err error) { // NOTE: The createSpendTx func adds the OP_RETURN output. zeroFee := btcutil.Amount(0) for i := uint32(0); i < numAdditionalOutputs; i++ { - spend := makeSpendableOut(b, 1, i+2) - tx := createSpendTx(&spend, zeroFee) + spend := testhelper.MakeSpendableOut(b, 1, i+2) + tx := testhelper.CreateSpendTx(&spend, zeroFee) b.AddTransaction(tx) } }) g.assertTipBlockNumTxns(6) g.assertTipBlockTxOutOpReturn(5, 1) - b75OpReturnOut := makeSpendableOut(g.tip, 5, 1) + b75OpReturnOut := testhelper.MakeSpendableOut(g.tip, 5, 1) accepted() // Reorg to a side chain that does not contain the OP_RETURNs. @@ -2020,7 +1874,7 @@ func Generate(includeLargeReorg bool) (tests [][]TestInstance, err error) { // An OP_RETURN output doesn't have any value and the default behavior // of nextBlock is to assign a fee of one, so increment the amount here // to effective negate that behavior. - b75OpReturnOut.amount++ + b75OpReturnOut.Amount++ g.nextBlock("b80", &b75OpReturnOut) rejected(blockchain.ErrMissingTxOut) @@ -2036,7 +1890,10 @@ func Generate(includeLargeReorg bool) (tests [][]TestInstance, err error) { const zeroCoin = int64(0) spendTx := b.Transactions[1] for i := 0; i < numAdditionalOutputs; i++ { - opRetScript := uniqueOpReturnScript() + opRetScript, err := testhelper.UniqueOpReturnScript() + if err != nil { + panic(err) + } spendTx.AddTxOut(wire.NewTxOut(zeroCoin, opRetScript)) } }) @@ -2045,6 +1902,55 @@ func Generate(includeLargeReorg bool) (tests [][]TestInstance, err error) { } accepted() + // Create a chain where the utxo created in b82a is spent in b83a. + // + // b81() -> b82a(28) -> b83a(b82.tx[1].out[0]) + // + g.nextBlock("b82a", outs[28]) + accepted() + + b82aTx1Out0 := testhelper.MakeSpendableOut(g.tip, 1, 0) + g.nextBlock("b83a", &b82aTx1Out0) + accepted() + + // Now we'll build a side-chain where we don't spend any of the outputs. + // + // b81() -> b82a(28) -> b83a(b82.tx[1].out[0]) + // \-> b82() -> b83() + // + g.setTip("b81") + g.nextBlock("b82", nil) + acceptedToSideChainWithExpectedTip("b83a") + + g.nextBlock("b83", nil) + acceptedToSideChainWithExpectedTip("b83a") + + // At this point b83a is still the tip. When we add block 84, the tip + // will change. Pre-load up the expected utxos test before the reorganization. + // + // We expect b82a output to now be a utxo since b83a was spending it and it was + // removed from the main chain. + blockDisconnectExpectUTXO("b82aTx1Out0", + true, b82aTx1Out0.PrevOut, g.blocksByName["b83a"].BlockHash()) + + // We expect the output from b82 to not exist once b82a itself has been removed + // from the main chain. + blockDisconnectExpectUTXO("b82aTx1Out0", + false, b82aTx1Out0.PrevOut, g.blocksByName["b82a"].BlockHash()) + + // The output that was being spent in b82a should exist after the removal of + // b82a. + blockDisconnectExpectUTXO("outs[28]", + true, outs[28].PrevOut, g.blocksByName["b82a"].BlockHash()) + + // Create block 84 and reorg out the sidechain with b83a as the tip. + // + // b81() -> b82a(28) -> b83a(b82.tx[1].out[0]) + // \-> b82() -> b83() -> b84() + // + g.nextBlock("b84", nil) + accepted() + // --------------------------------------------------------------------- // Large block re-org test. // --------------------------------------------------------------------- @@ -2055,8 +1961,8 @@ func Generate(includeLargeReorg bool) (tests [][]TestInstance, err error) { // Ensure the tip the re-org test builds on is the best chain tip. // - // ... -> b81(27) -> ... - g.setTip("b81") + // ... -> b84() -> ... + g.setTip("b84") // Collect all of the spendable coinbase outputs from the previous // collection point up to the current tip. diff --git a/blockchain/indexers/README.md b/blockchain/indexers/README.md index 20a721f3f2..f48491520a 100644 --- a/blockchain/indexers/README.md +++ b/blockchain/indexers/README.md @@ -1,9 +1,9 @@ indexers ======== -[![Build Status](https://travis-ci.org/btcsuite/btcd.png?branch=master)](https://travis-ci.org/btcsuite/btcd) +[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions) [![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) -[![GoDoc](https://godoc.org/github.com/btcsuite/btcd/blockchain/indexers?status.png)](http://godoc.org/github.com/btcsuite/btcd/blockchain/indexers) +[![GoDoc](https://pkg.go.dev/github.com/btcsuite/btcd/blockchain/indexers?status.png)](https://pkg.go.dev/github.com/btcsuite/btcd/blockchain/indexers) Package indexers implements optional block chain indexes. diff --git a/blockchain/indexers/addrindex.go b/blockchain/indexers/addrindex.go index 29d9030a2c..2a56574acd 100644 --- a/blockchain/indexers/addrindex.go +++ b/blockchain/indexers/addrindex.go @@ -10,12 +10,12 @@ import ( "sync" "github.com/btcsuite/btcd/blockchain" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/database" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) const ( @@ -36,7 +36,7 @@ const ( // consumes. It consists of the address key + 1 byte for the level. levelKeySize = addrKeySize + 1 - // levelOffset is the offset in the level key which identifes the level. + // levelOffset is the offset in the level key which identifies the level. levelOffset = levelKeySize - 1 // addrKeyTypePubKeyHash is the address type in an address key which @@ -63,6 +63,11 @@ const ( // script template, as well as a 32-byte data push. addrKeyTypeWitnessScriptHash = 3 + // addrKeyTypeTaprootPubKey is the address type in an address key that + // represents a pay-to-taproot address. We use this to denote addresses + // related to the segwit v1 that are encoded in the bech32m format. + addrKeyTypeTaprootPubKey = 4 + // Size of a transaction entry. It consists of 4 bytes block id + 4 // bytes offset + 4 bytes length. txEntrySize = 4 + 4 + 4 @@ -153,9 +158,11 @@ func serializeAddrIndexEntry(blockID uint32, txLoc wire.TxLoc) []byte { // deserializeAddrIndexEntry decodes the passed serialized byte slice into the // provided region struct according to the format described in detail above and -// uses the passed block hash fetching function in order to conver the block ID +// uses the passed block hash fetching function in order to convert the block ID // to the associated block hash. -func deserializeAddrIndexEntry(serialized []byte, region *database.BlockRegion, fetchBlockHash fetchBlockHashFunc) error { +func deserializeAddrIndexEntry(serialized []byte, region *database.BlockRegion, + fetchBlockHash fetchBlockHashFunc) error { + // Ensure there are enough bytes to decode. if len(serialized) < txEntrySize { return errDeserialize("unexpected end of data") @@ -182,7 +189,9 @@ func keyForLevel(addrKey [addrKeySize]byte, level uint8) [levelKeySize]byte { // dbPutAddrIndexEntry updates the address index to include the provided entry // according to the level-based scheme described in detail above. -func dbPutAddrIndexEntry(bucket internalBucket, addrKey [addrKeySize]byte, blockID uint32, txLoc wire.TxLoc) error { +func dbPutAddrIndexEntry(bucket internalBucket, addrKey [addrKeySize]byte, + blockID uint32, txLoc wire.TxLoc) error { + // Start with level 0 and its initial max number of entries. curLevel := uint8(0) maxLevelBytes := level0MaxEntries * txEntrySize @@ -253,7 +262,10 @@ func dbPutAddrIndexEntry(bucket internalBucket, addrKey [addrKeySize]byte, block // the given address key and the number of entries skipped since it could have // been less in the case where there are less total entries than the requested // number of entries to skip. -func dbFetchAddrIndexEntries(bucket internalBucket, addrKey [addrKeySize]byte, numToSkip, numRequested uint32, reverse bool, fetchBlockHash fetchBlockHashFunc) ([]database.BlockRegion, uint32, error) { +func dbFetchAddrIndexEntries(bucket internalBucket, addrKey [addrKeySize]byte, + numToSkip, numRequested uint32, reverse bool, + fetchBlockHash fetchBlockHashFunc) ([]database.BlockRegion, uint32, error) { + // When the reverse flag is not set, all levels need to be fetched // because numToSkip and numRequested are counted from the oldest // transactions (highest level) and thus the total count is needed. @@ -356,7 +368,9 @@ func maxEntriesForLevel(level uint8) int { // dbRemoveAddrIndexEntries removes the specified number of entries from from // the address index for the provided key. An assertion error will be returned // if the count exceeds the total number of entries in the index. -func dbRemoveAddrIndexEntries(bucket internalBucket, addrKey [addrKeySize]byte, count int) error { +func dbRemoveAddrIndexEntries(bucket internalBucket, addrKey [addrKeySize]byte, + count int) error { + // Nothing to do if no entries are being deleted. if count <= 0 { return nil @@ -564,6 +578,16 @@ func addrToKey(addr btcutil.Address) ([addrKeySize]byte, error) { result[0] = addrKeyTypeWitnessPubKeyHash copy(result[1:], addr.Hash160()[:]) return result, nil + + case *btcutil.AddressTaproot: + var result [addrKeySize]byte + result[0] = addrKeyTypeTaprootPubKey + + // Taproot outputs are actually just the 32-byte public key. + // Similar to the P2WSH outputs, we'll map these to 20-bytes + // via the hash160. + copy(result[1:], btcutil.Hash160(addr.ScriptAddress())) + return result, nil } return [addrKeySize]byte{}, errUnsupportedAddressType @@ -710,7 +734,7 @@ func (idx *AddrIndex) indexBlock(data writeIndexData, block *btcutil.Block, idx.indexPkScript(data, pkScript, txIdx) // With an input indexed, we'll advance the - // stxo coutner. + // stxo counter. stxoIndex++ } } @@ -796,7 +820,9 @@ func (idx *AddrIndex) DisconnectBlock(dbTx database.Tx, block *btcutil.Block, // that involve a given address. // // This function is safe for concurrent access. -func (idx *AddrIndex) TxRegionsForAddress(dbTx database.Tx, addr btcutil.Address, numToSkip, numRequested uint32, reverse bool) ([]database.BlockRegion, uint32, error) { +func (idx *AddrIndex) TxRegionsForAddress(dbTx database.Tx, addr btcutil.Address, + numToSkip, numRequested uint32, reverse bool) ([]database.BlockRegion, uint32, error) { + addrKey, err := addrToKey(addr) if err != nil { return nil, 0, err @@ -965,3 +991,15 @@ func NewAddrIndex(db database.DB, chainParams *chaincfg.Params) *AddrIndex { func DropAddrIndex(db database.DB, interrupt <-chan struct{}) error { return dropIndex(db, addrIndexKey, addrIndexName, interrupt) } + +// AddrIndexInitialized returns true if the address index has been created previously. +func AddrIndexInitialized(db database.DB) bool { + var exists bool + db.View(func(dbTx database.Tx) error { + bucket := dbTx.Metadata().Bucket(addrIndexKey) + exists = bucket != nil + return nil + }) + + return exists +} diff --git a/blockchain/indexers/addrindex_test.go b/blockchain/indexers/addrindex_test.go index 135ef19196..e545887f8b 100644 --- a/blockchain/indexers/addrindex_test.go +++ b/blockchain/indexers/addrindex_test.go @@ -68,7 +68,7 @@ func (b *addrIndexBucket) printLevels(addrKey [addrKeySize]byte) string { if !bytes.Equal(k[:levelOffset], addrKey[:]) { continue } - level := uint8(k[levelOffset]) + level := k[levelOffset] if level > highestLevel { highestLevel = level } @@ -105,7 +105,7 @@ func (b *addrIndexBucket) sanityCheck(addrKey [addrKeySize]byte, expectedTotal i if !bytes.Equal(k[:levelOffset], addrKey[:]) { continue } - level := uint8(k[levelOffset]) + level := k[levelOffset] if level > highestLevel { highestLevel = level } diff --git a/blockchain/indexers/blocklogger.go b/blockchain/indexers/blocklogger.go index 88d6f26998..960a51d2c1 100644 --- a/blockchain/indexers/blocklogger.go +++ b/blockchain/indexers/blocklogger.go @@ -8,8 +8,8 @@ import ( "sync" "time" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btclog" - "github.com/btcsuite/btcutil" ) // blockProgressLogger provides periodic logging for other services in order @@ -27,8 +27,9 @@ type blockProgressLogger struct { // newBlockProgressLogger returns a new block progress logger. // The progress message is templated as follows: -// {progressAction} {numProcessed} {blocks|block} in the last {timePeriod} -// ({numTxs}, height {lastBlockHeight}, {lastBlockTimeStamp}) +// +// {progressAction} {numProcessed} {blocks|block} in the last {timePeriod} +// ({numTxs}, height {lastBlockHeight}, {lastBlockTimeStamp}) func newBlockProgressLogger(progressMessage string, logger btclog.Logger) *blockProgressLogger { return &blockProgressLogger{ lastBlockLogTime: time.Now(), diff --git a/blockchain/indexers/cfindex.go b/blockchain/indexers/cfindex.go index 8ea147282b..1af1d0a421 100644 --- a/blockchain/indexers/cfindex.go +++ b/blockchain/indexers/cfindex.go @@ -8,13 +8,13 @@ import ( "errors" "github.com/btcsuite/btcd/blockchain" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/btcutil/gcs" + "github.com/btcsuite/btcd/btcutil/gcs/builder" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/database" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" - "github.com/btcsuite/btcutil/gcs" - "github.com/btcsuite/btcutil/gcs/builder" ) const ( @@ -355,3 +355,15 @@ func NewCfIndex(db database.DB, chainParams *chaincfg.Params) *CfIndex { func DropCfIndex(db database.DB, interrupt <-chan struct{}) error { return dropIndex(db, cfIndexParentBucketKey, cfIndexName, interrupt) } + +// CfIndexInitialized returns true if the cfindex has been created previously. +func CfIndexInitialized(db database.DB) bool { + var exists bool + db.View(func(dbTx database.Tx) error { + bucket := dbTx.Metadata().Bucket(cfIndexParentBucketKey) + exists = bucket != nil + return nil + }) + + return exists +} diff --git a/blockchain/indexers/common.go b/blockchain/indexers/common.go index a912bb4c70..89ce6720b5 100644 --- a/blockchain/indexers/common.go +++ b/blockchain/indexers/common.go @@ -12,8 +12,8 @@ import ( "errors" "github.com/btcsuite/btcd/blockchain" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/database" - "github.com/btcsuite/btcutil" ) var ( diff --git a/blockchain/indexers/manager.go b/blockchain/indexers/manager.go index bc0804f8bd..b4487e60fd 100644 --- a/blockchain/indexers/manager.go +++ b/blockchain/indexers/manager.go @@ -9,10 +9,10 @@ import ( "fmt" "github.com/btcsuite/btcd/blockchain" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/database" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) var ( diff --git a/blockchain/indexers/txindex.go b/blockchain/indexers/txindex.go index 00cfd00621..3d4e914677 100644 --- a/blockchain/indexers/txindex.go +++ b/blockchain/indexers/txindex.go @@ -9,10 +9,10 @@ import ( "fmt" "github.com/btcsuite/btcd/blockchain" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/database" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) const ( @@ -481,3 +481,15 @@ func DropTxIndex(db database.DB, interrupt <-chan struct{}) error { return dropIndex(db, txIndexKey, txIndexName, interrupt) } + +// TxIndexInitialized returns true if the tx index has been created previously. +func TxIndexInitialized(db database.DB) bool { + var exists bool + db.View(func(dbTx database.Tx) error { + bucket := dbTx.Metadata().Bucket(txIndexKey) + exists = bucket != nil + return nil + }) + + return exists +} diff --git a/blockchain/interfaces.go b/blockchain/interfaces.go new file mode 100644 index 0000000000..cae9b3b9f0 --- /dev/null +++ b/blockchain/interfaces.go @@ -0,0 +1,55 @@ +package blockchain + +import ( + "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/chaincfg/chainhash" +) + +// ChainCtx is an interface that abstracts away blockchain parameters. +type ChainCtx interface { + // ChainParams returns the chain's configured chaincfg.Params. + ChainParams() *chaincfg.Params + + // BlocksPerRetarget returns the number of blocks before retargeting + // occurs. + BlocksPerRetarget() int32 + + // MinRetargetTimespan returns the minimum amount of time to use in the + // difficulty calculation. + MinRetargetTimespan() int64 + + // MaxRetargetTimespan returns the maximum amount of time to use in the + // difficulty calculation. + MaxRetargetTimespan() int64 + + // VerifyCheckpoint returns whether the passed height and hash match + // the checkpoint data. Not all instances of VerifyCheckpoint will use + // this function for validation. + VerifyCheckpoint(height int32, hash *chainhash.Hash) bool + + // FindPreviousCheckpoint returns the most recent checkpoint that we + // have validated. Not all instances of FindPreviousCheckpoint will use + // this function for validation. + FindPreviousCheckpoint() (HeaderCtx, error) +} + +// HeaderCtx is an interface that describes information about a block. This is +// used so that external libraries can provide their own context (the header's +// parent, bits, etc.) when attempting to contextually validate a header. +type HeaderCtx interface { + // Height returns the header's height. + Height() int32 + + // Bits returns the header's bits. + Bits() uint32 + + // Timestamp returns the header's timestamp. + Timestamp() int64 + + // Parent returns the header's parent. + Parent() HeaderCtx + + // RelativeAncestorCtx returns the header's ancestor that is distance + // blocks before it in the chain. + RelativeAncestorCtx(distance int32) HeaderCtx +} diff --git a/blockchain/internal/testhelper/README.md b/blockchain/internal/testhelper/README.md new file mode 100644 index 0000000000..40b339bf79 --- /dev/null +++ b/blockchain/internal/testhelper/README.md @@ -0,0 +1,16 @@ +testhelper +========== + +[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions) +[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) +[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/blockchain/testhelper) + +Package testhelper provides functions that are used internally in the +btcd/blockchain and btcd/blockchain/fullblocktests package to test consensus +validation rules. Mainly provided to avoid dependency cycles internally among +the different packages in btcd. + +## License + +Package testhelper is licensed under the [copyfree](http://copyfree.org) ISC +License. diff --git a/blockchain/internal/testhelper/common.go b/blockchain/internal/testhelper/common.go new file mode 100644 index 0000000000..681097480c --- /dev/null +++ b/blockchain/internal/testhelper/common.go @@ -0,0 +1,194 @@ +package testhelper + +import ( + "encoding/binary" + "math" + "runtime" + + "github.com/btcsuite/btcd/blockchain/internal/workmath" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/txscript" + "github.com/btcsuite/btcd/wire" +) + +var ( + // OpTrueScript is simply a public key script that contains the OP_TRUE + // opcode. It is defined here to reduce garbage creation. + OpTrueScript = []byte{txscript.OP_TRUE} + + // LowFee is a single satoshi and exists to make the test code more + // readable. + LowFee = btcutil.Amount(1) +) + +// CreateSpendTx creates a transaction that spends from the provided spendable +// output and includes an additional unique OP_RETURN output to ensure the +// transaction ends up with a unique hash. The script is a simple OP_TRUE +// script which avoids the need to track addresses and signature scripts in the +// tests. +func CreateSpendTx(spend *SpendableOut, fee btcutil.Amount) *wire.MsgTx { + spendTx := wire.NewMsgTx(1) + spendTx.AddTxIn(&wire.TxIn{ + PreviousOutPoint: spend.PrevOut, + Sequence: wire.MaxTxInSequenceNum, + SignatureScript: nil, + }) + spendTx.AddTxOut(wire.NewTxOut(int64(spend.Amount-fee), + OpTrueScript)) + opRetScript, err := UniqueOpReturnScript() + if err != nil { + panic(err) + } + spendTx.AddTxOut(wire.NewTxOut(0, opRetScript)) + + return spendTx +} + +// CreateCoinbaseTx returns a coinbase transaction paying an appropriate +// subsidy based on the passed block height and the block subsidy. The +// coinbase signature script conforms to the requirements of version 2 blocks. +func CreateCoinbaseTx(blockHeight int32, blockSubsidy int64) *wire.MsgTx { + extraNonce := uint64(0) + coinbaseScript, err := StandardCoinbaseScript(blockHeight, extraNonce) + if err != nil { + panic(err) + } + + tx := wire.NewMsgTx(1) + tx.AddTxIn(&wire.TxIn{ + // Coinbase transactions have no inputs, so previous outpoint is + // zero hash and max index. + PreviousOutPoint: *wire.NewOutPoint(&chainhash.Hash{}, + wire.MaxPrevOutIndex), + Sequence: wire.MaxTxInSequenceNum, + SignatureScript: coinbaseScript, + }) + tx.AddTxOut(&wire.TxOut{ + Value: blockSubsidy, + PkScript: OpTrueScript, + }) + return tx +} + +// StandardCoinbaseScript returns a standard script suitable for use as the +// signature script of the coinbase transaction of a new block. In particular, +// it starts with the block height that is required by version 2 blocks. +func StandardCoinbaseScript(blockHeight int32, extraNonce uint64) ([]byte, error) { + return txscript.NewScriptBuilder().AddInt64(int64(blockHeight)). + AddInt64(int64(extraNonce)).Script() +} + +// OpReturnScript returns a provably-pruneable OP_RETURN script with the +// provided data. +func OpReturnScript(data []byte) ([]byte, error) { + builder := txscript.NewScriptBuilder() + script, err := builder.AddOp(txscript.OP_RETURN).AddData(data).Script() + if err != nil { + return nil, err + } + return script, nil +} + +// UniqueOpReturnScript returns a standard provably-pruneable OP_RETURN script +// with a random uint64 encoded as the data. +func UniqueOpReturnScript() ([]byte, error) { + rand, err := wire.RandomUint64() + if err != nil { + return nil, err + } + + data := make([]byte, 8) + binary.LittleEndian.PutUint64(data[0:8], rand) + return OpReturnScript(data) +} + +// SpendableOut represents a transaction output that is spendable along with +// additional metadata such as the block its in and how much it pays. +type SpendableOut struct { + PrevOut wire.OutPoint + Amount btcutil.Amount +} + +// MakeSpendableOutForTx returns a spendable output for the given transaction +// and transaction output index within the transaction. +func MakeSpendableOutForTx(tx *wire.MsgTx, txOutIndex uint32) SpendableOut { + return SpendableOut{ + PrevOut: wire.OutPoint{ + Hash: tx.TxHash(), + Index: txOutIndex, + }, + Amount: btcutil.Amount(tx.TxOut[txOutIndex].Value), + } +} + +// MakeSpendableOut returns a spendable output for the given block, transaction +// index within the block, and transaction output index within the transaction. +func MakeSpendableOut(block *wire.MsgBlock, txIndex, txOutIndex uint32) SpendableOut { + return MakeSpendableOutForTx(block.Transactions[txIndex], txOutIndex) +} + +// SolveBlock attempts to find a nonce which makes the passed block header hash +// to a value less than the target difficulty. When a successful solution is +// found true is returned and the nonce field of the passed header is updated +// with the solution. False is returned if no solution exists. +// +// NOTE: This function will never solve blocks with a nonce of 0. This is done +// so the 'nextBlock' function can properly detect when a nonce was modified by +// a munge function. +func SolveBlock(header *wire.BlockHeader) bool { + // sbResult is used by the solver goroutines to send results. + type sbResult struct { + found bool + nonce uint32 + } + + // solver accepts a block header and a nonce range to test. It is + // intended to be run as a goroutine. + targetDifficulty := workmath.CompactToBig(header.Bits) + quit := make(chan bool) + results := make(chan sbResult) + solver := func(hdr wire.BlockHeader, startNonce, stopNonce uint32) { + // We need to modify the nonce field of the header, so make sure + // we work with a copy of the original header. + for i := startNonce; i >= startNonce && i <= stopNonce; i++ { + select { + case <-quit: + return + default: + hdr.Nonce = i + hash := hdr.BlockHash() + if workmath.HashToBig(&hash).Cmp( + targetDifficulty) <= 0 { + + results <- sbResult{true, i} + return + } + } + } + results <- sbResult{false, 0} + } + + startNonce := uint32(1) + stopNonce := uint32(math.MaxUint32) + numCores := uint32(runtime.NumCPU()) + noncesPerCore := (stopNonce - startNonce) / numCores + for i := uint32(0); i < numCores; i++ { + rangeStart := startNonce + (noncesPerCore * i) + rangeStop := startNonce + (noncesPerCore * (i + 1)) - 1 + if i == numCores-1 { + rangeStop = stopNonce + } + go solver(*header, rangeStart, rangeStop) + } + for i := uint32(0); i < numCores; i++ { + result := <-results + if result.found { + close(quit) + header.Nonce = result.nonce + return true + } + } + + return false +} diff --git a/blockchain/internal/workmath/README.md b/blockchain/internal/workmath/README.md new file mode 100644 index 0000000000..879b2dcfd7 --- /dev/null +++ b/blockchain/internal/workmath/README.md @@ -0,0 +1,15 @@ +workmath +========== + +[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions) +[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) +[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/workmath) + +Package workmath provides utility functions that are related with calculating +the work from difficulty bits. This package was introduced to avoid import +cycles in btcd. + +## License + +Package workmath is licensed under the [copyfree](http://copyfree.org) ISC +License. diff --git a/blockchain/internal/workmath/difficulty.go b/blockchain/internal/workmath/difficulty.go new file mode 100644 index 0000000000..8ff7adad1c --- /dev/null +++ b/blockchain/internal/workmath/difficulty.go @@ -0,0 +1,153 @@ +// Copyright (c) 2013-2017 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package workmath + +import ( + "math/big" + + "github.com/btcsuite/btcd/chaincfg/chainhash" +) + +var ( + // bigOne is 1 represented as a big.Int. It is defined here to avoid + // the overhead of creating it multiple times. + bigOne = big.NewInt(1) + + // oneLsh256 is 1 shifted left 256 bits. It is defined here to avoid + // the overhead of creating it multiple times. + oneLsh256 = new(big.Int).Lsh(bigOne, 256) +) + +// HashToBig converts a chainhash.Hash into a big.Int that can be used to +// perform math comparisons. +func HashToBig(hash *chainhash.Hash) *big.Int { + // A Hash is in little-endian, but the big package wants the bytes in + // big-endian, so reverse them. + buf := *hash + blen := len(buf) + for i := 0; i < blen/2; i++ { + buf[i], buf[blen-1-i] = buf[blen-1-i], buf[i] + } + + return new(big.Int).SetBytes(buf[:]) +} + +// CompactToBig converts a compact representation of a whole number N to an +// unsigned 32-bit number. The representation is similar to IEEE754 floating +// point numbers. +// +// Like IEEE754 floating point, there are three basic components: the sign, +// the exponent, and the mantissa. They are broken out as follows: +// +// - the most significant 8 bits represent the unsigned base 256 exponent +// - bit 23 (the 24th bit) represents the sign bit +// - the least significant 23 bits represent the mantissa +// +// ------------------------------------------------- +// | Exponent | Sign | Mantissa | +// ------------------------------------------------- +// | 8 bits [31-24] | 1 bit [23] | 23 bits [22-00] | +// ------------------------------------------------- +// +// The formula to calculate N is: +// +// N = (-1^sign) * mantissa * 256^(exponent-3) +// +// This compact form is only used in bitcoin to encode unsigned 256-bit numbers +// which represent difficulty targets, thus there really is not a need for a +// sign bit, but it is implemented here to stay consistent with bitcoind. +func CompactToBig(compact uint32) *big.Int { + // Extract the mantissa, sign bit, and exponent. + mantissa := compact & 0x007fffff + isNegative := compact&0x00800000 != 0 + exponent := uint(compact >> 24) + + // Since the base for the exponent is 256, the exponent can be treated + // as the number of bytes to represent the full 256-bit number. So, + // treat the exponent as the number of bytes and shift the mantissa + // right or left accordingly. This is equivalent to: + // N = mantissa * 256^(exponent-3) + var bn *big.Int + if exponent <= 3 { + mantissa >>= 8 * (3 - exponent) + bn = big.NewInt(int64(mantissa)) + } else { + bn = big.NewInt(int64(mantissa)) + bn.Lsh(bn, 8*(exponent-3)) + } + + // Make it negative if the sign bit is set. + if isNegative { + bn = bn.Neg(bn) + } + + return bn +} + +// BigToCompact converts a whole number N to a compact representation using +// an unsigned 32-bit number. The compact representation only provides 23 bits +// of precision, so values larger than (2^23 - 1) only encode the most +// significant digits of the number. See CompactToBig for details. +func BigToCompact(n *big.Int) uint32 { + // No need to do any work if it's zero. + if n.Sign() == 0 { + return 0 + } + + // Since the base for the exponent is 256, the exponent can be treated + // as the number of bytes. So, shift the number right or left + // accordingly. This is equivalent to: + // mantissa = mantissa / 256^(exponent-3) + var mantissa uint32 + exponent := uint(len(n.Bytes())) + if exponent <= 3 { + mantissa = uint32(n.Bits()[0]) + mantissa <<= 8 * (3 - exponent) + } else { + // Use a copy to avoid modifying the caller's original number. + tn := new(big.Int).Set(n) + mantissa = uint32(tn.Rsh(tn, 8*(exponent-3)).Bits()[0]) + } + + // When the mantissa already has the sign bit set, the number is too + // large to fit into the available 23-bits, so divide the number by 256 + // and increment the exponent accordingly. + if mantissa&0x00800000 != 0 { + mantissa >>= 8 + exponent++ + } + + // Pack the exponent, sign bit, and mantissa into an unsigned 32-bit + // int and return it. + compact := uint32(exponent<<24) | mantissa + if n.Sign() < 0 { + compact |= 0x00800000 + } + return compact +} + +// CalcWork calculates a work value from difficulty bits. Bitcoin increases +// the difficulty for generating a block by decreasing the value which the +// generated hash must be less than. This difficulty target is stored in each +// block header using a compact representation as described in the documentation +// for CompactToBig. The main chain is selected by choosing the chain that has +// the most proof of work (highest difficulty). Since a lower target difficulty +// value equates to higher actual difficulty, the work value which will be +// accumulated must be the inverse of the difficulty. Also, in order to avoid +// potential division by zero and really small floating point numbers, the +// result adds 1 to the denominator and multiplies the numerator by 2^256. +func CalcWork(bits uint32) *big.Int { + // Return a work value of zero if the passed difficulty bits represent + // a negative number. Note this should not happen in practice with valid + // blocks, but an invalid block could trigger it. + difficultyNum := CompactToBig(bits) + if difficultyNum.Sign() <= 0 { + return big.NewInt(0) + } + + // (1 << 256) / (difficultyNum + 1) + denominator := new(big.Int).Add(difficultyNum, bigOne) + return new(big.Int).Div(oneLsh256, denominator) +} diff --git a/blockchain/difficulty_test.go b/blockchain/internal/workmath/difficulty_test.go similarity index 93% rename from blockchain/difficulty_test.go rename to blockchain/internal/workmath/difficulty_test.go index b42b7c730d..bed4d1f13f 100644 --- a/blockchain/difficulty_test.go +++ b/blockchain/internal/workmath/difficulty_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. -package blockchain +package workmath import ( "math/big" @@ -32,7 +32,7 @@ func TestBigToCompact(t *testing.T) { } // TestCompactToBig ensures CompactToBig converts numbers using the compact -// representation to the expected big intergers. +// representation to the expected big integers. func TestCompactToBig(t *testing.T) { tests := []struct { in uint32 @@ -63,7 +63,7 @@ func TestCalcWork(t *testing.T) { } for x, test := range tests { - bits := uint32(test.in) + bits := test.in r := CalcWork(bits) if r.Int64() != test.out { diff --git a/blockchain/merkle.go b/blockchain/merkle.go index 8f3f6b97ea..086c3643f6 100644 --- a/blockchain/merkle.go +++ b/blockchain/merkle.go @@ -7,11 +7,12 @@ package blockchain import ( "bytes" "fmt" + "io" "math" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/txscript" - "github.com/btcsuite/btcutil" ) const ( @@ -58,14 +59,16 @@ func nextPowerOfTwo(n int) int { // HashMerkleBranches takes two hashes, treated as the left and right tree // nodes, and returns the hash of their concatenation. This is a helper // function used to aid in the generation of a merkle tree. -func HashMerkleBranches(left *chainhash.Hash, right *chainhash.Hash) *chainhash.Hash { +func HashMerkleBranches(left, right *chainhash.Hash) chainhash.Hash { // Concatenate the left and right nodes. var hash [chainhash.HashSize * 2]byte copy(hash[:chainhash.HashSize], left[:]) copy(hash[chainhash.HashSize:], right[:]) - newHash := chainhash.DoubleHashH(hash[:]) - return &newHash + return chainhash.DoubleHashRaw(func(w io.Writer) error { + _, err := w.Write(hash[:]) + return err + }) } // BuildMerkleTreeStore creates a merkle tree from a slice of transactions, @@ -86,7 +89,7 @@ func HashMerkleBranches(left *chainhash.Hash, right *chainhash.Hash) *chainhash. // // The above stored as a linear array is as follows: // -// [h1 h2 h3 h4 h12 h34 root] +// [h1 h2 h3 h4 h12 h34 root] // // As the above shows, the merkle root is always the last element in the array. // @@ -140,13 +143,13 @@ func BuildMerkleTreeStore(transactions []*btcutil.Tx, witness bool) []*chainhash // hashing the concatenation of the left child with itself. case merkles[i+1] == nil: newHash := HashMerkleBranches(merkles[i], merkles[i]) - merkles[offset] = newHash + merkles[offset] = &newHash // The normal case sets the parent node to the double sha256 - // of the concatentation of the left and right children. + // of the concatenation of the left and right children. default: newHash := HashMerkleBranches(merkles[i], merkles[i+1]) - merkles[offset] = newHash + merkles[offset] = &newHash } offset++ } @@ -154,6 +157,36 @@ func BuildMerkleTreeStore(transactions []*btcutil.Tx, witness bool) []*chainhash return merkles } +// CalcMerkleRoot computes the merkle root over a set of hashed leaves. The +// interior nodes are computed opportunistically as the leaves are added to the +// abstract tree to reduce the total number of allocations. Throughout the +// computation, this computation only requires storing O(log n) interior +// nodes. +// +// This method differs from BuildMerkleTreeStore in that the interior nodes are +// discarded instead of being returned along with the root. CalcMerkleRoot is +// slightly faster than BuildMerkleTreeStore and requires significantly less +// memory and fewer allocations. +// +// A merkle tree is a tree in which every non-leaf node is the hash of its +// children nodes. A diagram depicting how this works for bitcoin transactions +// where h(x) is a double sha256 follows: +// +// root = h1234 = h(h12 + h34) +// / \ +// h12 = h(h1 + h2) h34 = h(h3 + h4) +// / \ / \ +// h1 = h(tx1) h2 = h(tx2) h3 = h(tx3) h4 = h(tx4) +// +// The additional bool parameter indicates if we are generating the merkle tree +// using witness transaction id's rather than regular transaction id's. This +// also presents an additional case wherein the wtxid of the coinbase transaction +// is the zeroHash. +func CalcMerkleRoot(transactions []*btcutil.Tx, witness bool) chainhash.Hash { + s := newRollingMerkleTreeStore(uint64(len(transactions))) + return s.calcMerkleRoot(transactions, witness) +} + // ExtractWitnessCommitment attempts to locate, and return the witness // commitment for a block. The witness commitment is of the form: // SHA256(witness root || witness nonce). The function additionally returns a @@ -246,8 +279,7 @@ func ValidateWitnessCommitment(blk *btcutil.Block) error { // the extracted witnessCommitment is equal to: // SHA256(witnessMerkleRoot || witnessNonce). Where witnessNonce is the // coinbase transaction's only witness item. - witnessMerkleTree := BuildMerkleTreeStore(blk.Transactions(), true) - witnessMerkleRoot := witnessMerkleTree[len(witnessMerkleTree)-1] + witnessMerkleRoot := CalcMerkleRoot(blk.Transactions(), true) var witnessPreimage [chainhash.HashSize * 2]byte copy(witnessPreimage[:], witnessMerkleRoot[:]) diff --git a/blockchain/merkle_test.go b/blockchain/merkle_test.go index 275ffef37d..06eb7012a2 100644 --- a/blockchain/merkle_test.go +++ b/blockchain/merkle_test.go @@ -5,19 +5,105 @@ package blockchain import ( + "fmt" "testing" - "github.com/btcsuite/btcutil" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/wire" + "github.com/stretchr/testify/require" ) // TestMerkle tests the BuildMerkleTreeStore API. func TestMerkle(t *testing.T) { block := btcutil.NewBlock(&Block100000) - merkles := BuildMerkleTreeStore(block.Transactions(), false) - calculatedMerkleRoot := merkles[len(merkles)-1] + calcMerkleRoot := CalcMerkleRoot(block.Transactions(), false) + merkleStoreTree := BuildMerkleTreeStore(block.Transactions(), false) + merkleStoreRoot := merkleStoreTree[len(merkleStoreTree)-1] + + require.Equal(t, *merkleStoreRoot, calcMerkleRoot) + wantMerkle := &Block100000.Header.MerkleRoot - if !wantMerkle.IsEqual(calculatedMerkleRoot) { + if !wantMerkle.IsEqual(&calcMerkleRoot) { t.Errorf("BuildMerkleTreeStore: merkle root mismatch - "+ - "got %v, want %v", calculatedMerkleRoot, wantMerkle) + "got %v, want %v", calcMerkleRoot, wantMerkle) + } +} + +func makeHashes(size int) []*chainhash.Hash { + var hashes = make([]*chainhash.Hash, size) + for i := range hashes { + hashes[i] = new(chainhash.Hash) + } + return hashes +} + +func makeTxs(size int) []*btcutil.Tx { + var txs = make([]*btcutil.Tx, size) + for i := range txs { + tx := btcutil.NewTx(wire.NewMsgTx(2)) + tx.Hash() + txs[i] = tx + } + return txs +} + +// BenchmarkRollingMerkle benches the RollingMerkleTree while varying the number +// of leaves pushed to the tree. +func BenchmarkRollingMerkle(b *testing.B) { + sizes := []int{ + 1000, + 2000, + 4000, + 8000, + 16000, + 32000, + } + + for _, size := range sizes { + txs := makeTxs(size) + name := fmt.Sprintf("%d", size) + b.Run(name, func(b *testing.B) { + benchmarkRollingMerkle(b, txs) + }) + } +} + +// BenchmarkMerkle benches the BuildMerkleTreeStore while varying the number +// of leaves pushed to the tree. +func BenchmarkMerkle(b *testing.B) { + sizes := []int{ + 1000, + 2000, + 4000, + 8000, + 16000, + 32000, + } + + for _, size := range sizes { + txs := makeTxs(size) + name := fmt.Sprintf("%d", size) + b.Run(name, func(b *testing.B) { + benchmarkMerkle(b, txs) + }) + } +} + +func benchmarkRollingMerkle(b *testing.B, txs []*btcutil.Tx) { + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + CalcMerkleRoot(txs, false) + } +} + +func benchmarkMerkle(b *testing.B, txs []*btcutil.Tx) { + b.ResetTimer() + b.ReportAllocs() + + for i := 0; i < b.N; i++ { + BuildMerkleTreeStore(txs, false) } } diff --git a/blockchain/notifications.go b/blockchain/notifications.go index 25cc4f1f03..5139e89edf 100644 --- a/blockchain/notifications.go +++ b/blockchain/notifications.go @@ -50,9 +50,9 @@ func (n NotificationType) String() string { // Notification defines notification that is sent to the caller via the callback // function provided during the call to New and consists of a notification type // as well as associated data that depends on the type as follows: -// - NTBlockAccepted: *btcutil.Block -// - NTBlockConnected: *btcutil.Block -// - NTBlockDisconnected: *btcutil.Block +// - NTBlockAccepted: *btcutil.Block +// - NTBlockConnected: *btcutil.Block +// - NTBlockDisconnected: *btcutil.Block type Notification struct { Type NotificationType Data interface{} diff --git a/blockchain/process.go b/blockchain/process.go index 6d2161bb95..64d5c1e14f 100644 --- a/blockchain/process.go +++ b/blockchain/process.go @@ -8,9 +8,9 @@ import ( "fmt" "time" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/database" - "github.com/btcsuite/btcutil" ) // BehaviorFlags is a bitmask defining tweaks to the normal behavior when diff --git a/blockchain/rolling_merkle.go b/blockchain/rolling_merkle.go new file mode 100644 index 0000000000..cd2c2ec7e6 --- /dev/null +++ b/blockchain/rolling_merkle.go @@ -0,0 +1,136 @@ +package blockchain + +import ( + "math/bits" + + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg/chainhash" +) + +// rollingMerkleTreeStore calculates the merkle root by only allocating O(logN) +// memory where N is the total amount of leaves being included in the tree. +type rollingMerkleTreeStore struct { + // roots are where the temporary merkle roots get stored while the + // merkle root is being calculated. + roots []chainhash.Hash + + // numLeaves is the total leaves the store has processed. numLeaves + // is required for the root calculation algorithm to work. + numLeaves uint64 +} + +// newRollingMerkleTreeStore returns a rollingMerkleTreeStore with the roots +// allocated based on the passed in size. +// +// NOTE: If more elements are added in than the passed in size, there will be +// additional allocations which in turn hurts performance. +func newRollingMerkleTreeStore(size uint64) rollingMerkleTreeStore { + var alloc int + if size != 0 { + alloc = bits.Len64(size - 1) + } + return rollingMerkleTreeStore{roots: make([]chainhash.Hash, 0, alloc)} +} + +// add adds a single hash to the merkle tree store. Refer to algorithm 1 "AddOne" in +// the utreexo paper (https://eprint.iacr.org/2019/611.pdf) for the exact algorithm. +func (s *rollingMerkleTreeStore) add(add chainhash.Hash) { + // We can tell where the roots are by looking at the binary representation + // of the numLeaves. Wherever there's a 1, there's a root. + // + // numLeaves of 8 will be '1000' in binary, so there will be one root at + // row 3. numLeaves of 3 will be '11' in binary, so there's two roots. One at + // row 0 and one at row 1. Row 0 is the leaf row. + // + // In this loop below, we're looking for these roots by checking if there's + // a '1', starting from the LSB. If there is a '1', we'll hash the root being + // added with that root until we hit a '0'. + newRoot := add + for h := uint8(0); (s.numLeaves>>h)&1 == 1; h++ { + // Pop off the last root. + var root chainhash.Hash + root, s.roots = s.roots[len(s.roots)-1], s.roots[:len(s.roots)-1] + + // Calculate the hash of the new root and append it. + newRoot = HashMerkleBranches(&root, &newRoot) + } + s.roots = append(s.roots, newRoot) + s.numLeaves++ +} + +// calcMerkleRoot returns the merkle root for the passed in transactions. +func (s *rollingMerkleTreeStore) calcMerkleRoot(adds []*btcutil.Tx, witness bool) chainhash.Hash { + for i := range adds { + // If we're computing a witness merkle root, instead of the + // regular txid, we use the modified wtxid which includes a + // transaction's witness data within the digest. Additionally, + // the coinbase's wtxid is all zeroes. + switch { + case witness && i == 0: + var zeroHash chainhash.Hash + s.add(zeroHash) + case witness: + s.add(*adds[i].WitnessHash()) + default: + s.add(*adds[i].Hash()) + } + } + + // If we only have one leaf, then the hash of that tx is the merkle root. + if s.numLeaves == 1 { + return s.roots[0] + } + + // Add on the last tx again if there's an odd number of txs. + if len(adds) > 0 && len(adds)%2 != 0 { + switch { + case witness: + s.add(*adds[len(adds)-1].WitnessHash()) + default: + s.add(*adds[len(adds)-1].Hash()) + } + } + + // If we still have more than 1 root after adding on the last tx again, + // we need to do the same for the upper rows. + // + // For example, the below tree has 6 leaves. For row 1, you'll need to + // hash 'F' with itself to create 'C' so you have something to hash with + // 'B'. For bigger trees we may need to do the same in rows 2 or 3 as + // well. + // + // row :3 A + // / \ + // row :2 B C + // / \ / \ + // row :1 D E F F + // / \ / \ / \ + // row :0 1 2 3 4 5 6 + for len(s.roots) > 1 { + // If we have to keep adding the last node in the set, bitshift + // the num leaves right by 1. This effectively moves the row up + // for calculation. We do this until we reach a row where there's + // an odd number of leaves. + // + // row :3 A + // / \ + // row :2 B C D + // / \ / \ / \ + // row :1 E F G H I J + // / \ / \ / \ / \ / \ / \ + // row :0 1 2 3 4 5 6 7 8 9 10 11 12 + // + // In the above tree, 12 leaves were added and there's an odd amount + // of leaves at row 2. Because of this, we'll bitshift right twice. + currentLeaves := s.numLeaves + for h := uint8(0); (currentLeaves>>h)&1 == 0; h++ { + s.numLeaves >>= 1 + } + + // Add the last root again so that it'll get hashed with itself. + h := s.roots[len(s.roots)-1] + s.add(h) + } + + return s.roots[0] +} diff --git a/blockchain/rolling_merkle_test.go b/blockchain/rolling_merkle_test.go new file mode 100644 index 0000000000..e425278bdd --- /dev/null +++ b/blockchain/rolling_merkle_test.go @@ -0,0 +1,174 @@ +package blockchain + +import ( + "testing" + + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/stretchr/testify/require" +) + +func TestRollingMerkleAdd(t *testing.T) { + tests := []struct { + leaves []chainhash.Hash + expectedRoots []chainhash.Hash + expectedNumLeaves uint64 + }{ + // 00 (00 is also a root) + { + leaves: []chainhash.Hash{ + {0x00}, + }, + expectedRoots: []chainhash.Hash{ + {0x00}, + }, + expectedNumLeaves: 1, + }, + + // root + // |---\ + // 00 01 + { + leaves: []chainhash.Hash{ + {0x00}, + {0x01}, + }, + expectedRoots: []chainhash.Hash{ + func() chainhash.Hash { + hash, err := chainhash.NewHashFromStr( + "c2bf026e62af95cd" + + "7b785e2cd5a5f1ec" + + "01fafda85886a8eb" + + "d34482c0b05dc2c2") + require.NoError(t, err) + return *hash + }(), + }, + expectedNumLeaves: 2, + }, + + // root + // |---\ + // 00 01 02 + { + leaves: []chainhash.Hash{ + {0x00}, + {0x01}, + {0x02}, + }, + expectedRoots: []chainhash.Hash{ + func() chainhash.Hash { + hash, err := chainhash.NewHashFromStr( + "c2bf026e62af95cd" + + "7b785e2cd5a5f1ec" + + "01fafda85886a8eb" + + "d34482c0b05dc2c2") + require.NoError(t, err) + return *hash + }(), + {0x02}, + }, + expectedNumLeaves: 3, + }, + + // root + // |-------\ + // br br + // |---\ |---\ + // 00 01 02 03 + { + leaves: []chainhash.Hash{ + {0x00}, + {0x01}, + {0x02}, + {0x03}, + }, + expectedRoots: []chainhash.Hash{ + func() chainhash.Hash { + hash, err := chainhash.NewHashFromStr( + "270714425ea73eb8" + + "5942f0f705788f25" + + "1fefa3f533410a3f" + + "338de46e641082c4") + require.NoError(t, err) + return *hash + }(), + }, + expectedNumLeaves: 4, + }, + + // root + // |-------\ + // br br + // |---\ |---\ + // 00 01 02 03 04 + { + leaves: []chainhash.Hash{ + {0x00}, + {0x01}, + {0x02}, + {0x03}, + {0x04}, + }, + expectedRoots: []chainhash.Hash{ + func() chainhash.Hash { + hash, err := chainhash.NewHashFromStr( + "270714425ea73eb8" + + "5942f0f705788f25" + + "1fefa3f533410a3f" + + "338de46e641082c4") + require.NoError(t, err) + return *hash + }(), + {0x04}, + }, + expectedNumLeaves: 5, + }, + + // root + // |-------\ + // br br root + // |---\ |---\ |---\ + // 00 01 02 03 04 05 + { + leaves: []chainhash.Hash{ + {0x00}, + {0x01}, + {0x02}, + {0x03}, + {0x04}, + {0x05}, + }, + expectedRoots: []chainhash.Hash{ + func() chainhash.Hash { + hash, err := chainhash.NewHashFromStr( + "270714425ea73eb8" + + "5942f0f705788f25" + + "1fefa3f533410a3f" + + "338de46e641082c4") + require.NoError(t, err) + return *hash + }(), + func() chainhash.Hash { + hash, err := chainhash.NewHashFromStr( + "e5c2407ba454ffeb" + + "28cf0c50c5c293a8" + + "4c9a75788f8a8f35" + + "ccb974e606280377") + require.NoError(t, err) + return *hash + }(), + }, + expectedNumLeaves: 6, + }, + } + + for _, test := range tests { + s := newRollingMerkleTreeStore(uint64(len(test.leaves))) + for _, leaf := range test.leaves { + s.add(leaf) + } + + require.Equal(t, s.roots, test.expectedRoots) + require.Equal(t, s.numLeaves, test.expectedNumLeaves) + } +} diff --git a/blockchain/scriptval.go b/blockchain/scriptval.go index 8ba59a4214..614e030c86 100644 --- a/blockchain/scriptval.go +++ b/blockchain/scriptval.go @@ -10,9 +10,9 @@ import ( "runtime" "time" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) // txValidateItem holds a transaction along with which input to validate. @@ -74,9 +74,11 @@ out: witness := txIn.Witness pkScript := utxo.PkScript() inputAmount := utxo.Amount() - vm, err := txscript.NewEngine(pkScript, txVI.tx.MsgTx(), - txVI.txInIndex, v.flags, v.sigCache, txVI.sigHashes, - inputAmount) + vm, err := txscript.NewEngine( + pkScript, txVI.tx.MsgTx(), txVI.txInIndex, + v.flags, v.sigCache, txVI.sigHashes, + inputAmount, v.utxoView, + ) if err != nil { str := fmt.Sprintf("failed to parse input "+ "%s:%d which references output %v - "+ @@ -201,7 +203,7 @@ func ValidateTransactionScripts(tx *btcutil.Tx, utxoView *UtxoViewpoint, // amongst all worker validation goroutines. if segwitActive && tx.MsgTx().HasWitness() && !hashCache.ContainsHashes(tx.Hash()) { - hashCache.AddSigHashes(tx.MsgTx()) + hashCache.AddSigHashes(tx.MsgTx(), utxoView) } var cachedHashes *txscript.TxSigHashes @@ -266,7 +268,7 @@ func checkBlockScripts(block *btcutil.Block, utxoView *UtxoViewpoint, if segwitActive && tx.HasWitness() && hashCache != nil && !hashCache.ContainsHashes(hash) { - hashCache.AddSigHashes(tx.MsgTx()) + hashCache.AddSigHashes(tx.MsgTx(), utxoView) } var cachedHashes *txscript.TxSigHashes @@ -274,7 +276,9 @@ func checkBlockScripts(block *btcutil.Block, utxoView *UtxoViewpoint, if hashCache != nil { cachedHashes, _ = hashCache.GetSigHashes(hash) } else { - cachedHashes = txscript.NewTxSigHashes(tx.MsgTx()) + cachedHashes = txscript.NewTxSigHashes( + tx.MsgTx(), utxoView, + ) } } diff --git a/blockchain/scriptval_test.go b/blockchain/scriptval_test.go index 56450b7a03..031f04801f 100644 --- a/blockchain/scriptval_test.go +++ b/blockchain/scriptval_test.go @@ -6,7 +6,6 @@ package blockchain import ( "fmt" - "runtime" "testing" "github.com/btcsuite/btcd/txscript" @@ -15,8 +14,6 @@ import ( // TestCheckBlockScripts ensures that validating the all of the scripts in a // known-good block doesn't return an error. func TestCheckBlockScripts(t *testing.T) { - runtime.GOMAXPROCS(runtime.NumCPU()) - testBlockNum := 277647 blockDataFile := fmt.Sprintf("%d.dat.bz2", testBlockNum) blocks, err := loadBlocks(blockDataFile) diff --git a/blockchain/sizehelper.go b/blockchain/sizehelper.go new file mode 100644 index 0000000000..8330549dd6 --- /dev/null +++ b/blockchain/sizehelper.go @@ -0,0 +1,239 @@ +// Copyright (c) 2023 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. +package blockchain + +import ( + "math" +) + +// These constants are related to bitcoin. +const ( + // outpointSize is the size of an outpoint. + // + // This value is calculated by running the following: + // unsafe.Sizeof(wire.OutPoint{}) + outpointSize = 36 + + // uint64Size is the size of an uint64 allocated in memory. + uint64Size = 8 + + // bucketSize is the size of the bucket in the cache map. Exact + // calculation is (16 + keysize*8 + valuesize*8) where for the map of: + // map[wire.OutPoint]*UtxoEntry would have a keysize=36 and valuesize=8. + // + // https://github.com/golang/go/issues/34561#issuecomment-536115805 + bucketSize = 16 + uint64Size*outpointSize + uint64Size*uint64Size + + // This value is calculated by running the following on a 64-bit system: + // unsafe.Sizeof(UtxoEntry{}) + baseEntrySize = 40 + + // pubKeyHashLen is the length of a P2PKH script. + pubKeyHashLen = 25 + + // avgEntrySize is how much each entry we expect it to be. Since most + // txs are p2pkh, we can assume the entry to be more or less the size + // of a p2pkh tx. We add on 7 to make it 32 since 64 bit systems will + // align by 8 bytes. + avgEntrySize = baseEntrySize + (pubKeyHashLen + 7) +) + +// The code here is shamelessly taken from the go runtime package. All the relevant +// code and variables are copied to here. These values are only correct for a 64 bit +// system. + +const ( + _MaxSmallSize = 32768 + smallSizeDiv = 8 + smallSizeMax = 1024 + largeSizeDiv = 128 + _NumSizeClasses = 68 + _PageShift = 13 + _PageSize = 1 << _PageShift + + MaxUintptr = ^uintptr(0) + + // Maximum number of key/elem pairs a bucket can hold. + bucketCntBits = 3 + bucketCnt = 1 << bucketCntBits + + // Maximum average load of a bucket that triggers growth is 6.5. + // Represent as loadFactorNum/loadFactorDen, to allow integer math. + loadFactorNum = 13 + loadFactorDen = 2 + + // _64bit = 1 on 64-bit systems, 0 on 32-bit systems + _64bit = 1 << (^uintptr(0) >> 63) / 2 + + // PtrSize is the size of a pointer in bytes - unsafe.Sizeof(uintptr(0)) + // but as an ideal constant. It is also the size of the machine's native + // word size (that is, 4 on 32-bit systems, 8 on 64-bit). + PtrSize = 4 << (^uintptr(0) >> 63) + + // heapAddrBits is the number of bits in a heap address that's actually + // available for memory allocation. + // + // NOTE (guggero): For 64-bit systems, we just assume 40 bits of address + // space available, as that seems to be the lowest common denominator. + // See heapAddrBits in runtime/malloc.go of the standard library for + // more details + heapAddrBits = 32 + (_64bit * 8) + + // maxAlloc is the maximum size of an allocation on the heap. + // + // NOTE(guggero): With the somewhat simplified heapAddrBits calculation + // above, this will currently limit the maximum allocation size of the + // UTXO cache to around 300GiB on 64-bit systems. This should be more + // than enough for the foreseeable future, but if we ever need to + // increase it, we should probably use the same calculation as the + // standard library. + maxAlloc = (1 << heapAddrBits) - (1-_64bit)*1 +) + +var 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} +var 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} +var 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} + +// calculateRoughMapSize returns a close enough estimate of the +// total memory allocated by a map. +// hint should be the same value as the number you give when +// making a map with the following syntax: make(map[k]v, hint) +// +// bucketsize is (16 + keysize*8 + valuesize*8). For a map of: +// map[int64]int64, keysize=8 and valuesize=8. There are edge cases +// where the bucket size is different that I can't find the source code +// for. https://github.com/golang/go/issues/34561#issuecomment-536115805 +// +// I suspect it's because of alignment and how the compiler handles it but +// when compared with how much the compiler allocates, it's a couple hundred +// bytes off. +func calculateRoughMapSize(hint int, bucketSize uintptr) int { + // This code is copied from makemap() in runtime/map.go. + // + // TODO check once in a while to see if this algorithm gets + // changed. + mem, overflow := mulUintptr(uintptr(hint), uintptr(bucketSize)) + if overflow || mem > maxAlloc { + hint = 0 + } + + // Find the size parameter B which will hold the requested # of elements. + // For hint < 0 overLoadFactor returns false since hint < bucketCnt. + B := uint8(0) + for overLoadFactor(hint, B) { + B++ + } + + // This code is copied from makeBucketArray() in runtime/map.go. + // + // TODO check once in a while to see if this algorithm gets + // changed. + // + // For small b, overflow buckets are unlikely. + // Avoid the overhead of the calculation. + base := bucketShift(B) + numBuckets := base + if B >= 4 { + // Add on the estimated number of overflow buckets + // required to insert the median number of elements + // used with this value of b. + numBuckets += bucketShift(B - 4) + sz := bucketSize * numBuckets + up := roundupsize(sz) + if up != sz { + numBuckets = up / bucketSize + } + } + total, _ := mulUintptr(bucketSize, numBuckets) + + if base != numBuckets { + // Add 24 for mapextra struct overhead. Refer to + // runtime/map.go in the std library for the struct. + total += 24 + } + + // 48 is the number of bytes needed for the map header in a + // 64 bit system. Refer to hmap in runtime/map.go in the go + // standard library. + total += 48 + return int(total) +} + +// calculateMinEntries returns the minimum number of entries that will make the +// map allocate the given total bytes. -1 on the returned entry count will +// make the map allocate half as much total bytes (for returned entry count that's +// greater than 0). +func calculateMinEntries(totalBytes int, bucketSize int) int { + // 48 is the number of bytes needed for the map header in a + // 64 bit system. Refer to hmap in runtime/map.go in the go + // standard library. + totalBytes -= 48 + + numBuckets := totalBytes / bucketSize + B := uint8(math.Log2(float64(numBuckets))) + if B < 4 { + switch B { + case 0: + return 0 + case 1: + return 9 + case 2: + return 14 + default: + return 27 + } + } + + B -= 1 + + return (int(loadFactorNum * (bucketShift(B) / loadFactorDen))) + 1 +} + +// mulUintptr returns a * b and whether the multiplication overflowed. +// On supported platforms this is an intrinsic lowered by the compiler. +func mulUintptr(a, b uintptr) (uintptr, bool) { + if a|b < 1<<(4*PtrSize) || a == 0 { + return a * b, false + } + overflow := b > MaxUintptr/a + return a * b, overflow +} + +// divRoundUp returns ceil(n / a). +func divRoundUp(n, a uintptr) uintptr { + // a is generally a power of two. This will get inlined and + // the compiler will optimize the division. + return (n + a - 1) / a +} + +// alignUp rounds n up to a multiple of a. a must be a power of 2. +func alignUp(n, a uintptr) uintptr { + return (n + a - 1) &^ (a - 1) +} + +// Returns size of the memory block that mallocgc will allocate if you ask for the size. +func roundupsize(size uintptr) uintptr { + if size < _MaxSmallSize { + if size <= smallSizeMax-8 { + return uintptr(class_to_size[size_to_class8[divRoundUp(size, smallSizeDiv)]]) + } else { + return uintptr(class_to_size[size_to_class128[divRoundUp(size-smallSizeMax, largeSizeDiv)]]) + } + } + if size+_PageSize < size { + return size + } + return alignUp(size, _PageSize) +} + +// overLoadFactor reports whether count items placed in 1< bucketCnt && uintptr(count) > loadFactorNum*(bucketShift(B)/loadFactorDen) +} + +// bucketShift returns 1< 0 { + gotMinRoughMapSizeWrong := calculateRoughMapSize(minEntries-1, bucketSize) + if gotMinRoughMapSize == gotMinRoughMapSizeWrong { + t.Errorf("For hint %d decremented by 1, expected %v, got %v\n", + i, gotRoughMapSizeWrong/2, gotRoughMapSizeWrong) + } + } + } +} diff --git a/blockchain/testdata/blk_0_to_14131.dat b/blockchain/testdata/blk_0_to_14131.dat new file mode 100644 index 0000000000..cc1a789e40 Binary files /dev/null and b/blockchain/testdata/blk_0_to_14131.dat differ diff --git a/blockchain/thresholdstate.go b/blockchain/thresholdstate.go index 35a762552a..d62c2de3c2 100644 --- a/blockchain/thresholdstate.go +++ b/blockchain/thresholdstate.go @@ -6,8 +6,10 @@ package blockchain import ( "fmt" + "time" "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/wire" ) // ThresholdState define the various threshold states used when voting on @@ -66,14 +68,13 @@ func (t ThresholdState) String() string { // thresholdConditionChecker provides a generic interface that is invoked to // determine when a consensus rule change threshold should be changed. type thresholdConditionChecker interface { - // BeginTime returns the unix timestamp for the median block time after - // which voting on a rule change starts (at the next window). - BeginTime() uint64 + // HasStarted returns true if based on the passed block blockNode the + // consensus is eligible for deployment. + HasStarted(*blockNode) bool - // EndTime returns the unix timestamp for the median block time after - // which an attempted rule change fails if it has not already been - // locked in or activated. - EndTime() uint64 + // HasEnded returns true if the target consensus rule change has + // expired or timed out. + HasEnded(*blockNode) bool // RuleChangeActivationThreshold is the number of blocks for which the // condition must be true in order to lock in a rule change. @@ -83,10 +84,23 @@ type thresholdConditionChecker interface { // state retarget window. MinerConfirmationWindow() uint32 - // Condition returns whether or not the rule change activation condition - // has been met. This typically involves checking whether or not the - // bit associated with the condition is set, but can be more complex as - // needed. + // EligibleToActivate returns true if a custom deployment can + // transition from the LockedIn to the Active state. For normal + // deployments, this always returns true. However, some deployments add + // extra rules like a minimum activation height, which can be + // abstracted into a generic arbitrary check at the final state via + // this method. + EligibleToActivate(*blockNode) bool + + // IsSpeedy returns true if this is to be a "speedy" deployment. A + // speedy deployment differs from a regular one in that only after a + // miner block confirmation window can the deployment expire. + IsSpeedy() bool + + // Condition returns whether or not the rule change activation + // condition has been met. This typically involves checking whether or + // not the bit associated with the condition is set, but can be more + // complex as needed. Condition(*blockNode) (bool, error) } @@ -121,6 +135,145 @@ func newThresholdCaches(numCaches uint32) []thresholdStateCache { return caches } +// PastMedianTime returns the past median time from the PoV of the passed block +// header. The past median time is the median time of the 11 blocks prior to +// the passed block header. +// +// NOTE: This is part of the chainfg.BlockClock interface +func (b *BlockChain) PastMedianTime(blockHeader *wire.BlockHeader) (time.Time, error) { + prevHash := blockHeader.PrevBlock + prevNode := b.index.LookupNode(&prevHash) + + // If we can't find the previous node, then we can't compute the block + // time since it requires us to walk backwards from this node. + if prevNode == nil { + return time.Time{}, fmt.Errorf("blockHeader(%v) has no "+ + "previous node", blockHeader.BlockHash()) + } + + blockNode := newBlockNode(blockHeader, prevNode) + + return CalcPastMedianTime(blockNode), nil +} + +// thresholdStateTransition given a state, a previous node, and a toeholds +// checker, this function transitions to the next state as defined by BIP 009. +// This state transition function is also aware of the "speedy trial" +// modifications made to BIP 0009 as part of the taproot softfork activation. +func thresholdStateTransition(state ThresholdState, prevNode *blockNode, + checker thresholdConditionChecker, + confirmationWindow int32) (ThresholdState, error) { + + switch state { + case ThresholdDefined: + // The deployment of the rule change fails if it + // expires before it is accepted and locked in. However + // speed deployments can only transition to failed + // after a confirmation window. + if !checker.IsSpeedy() && checker.HasEnded(prevNode) { + log.Debugf("Moving from state=%v, to state=%v", state, + ThresholdFailed) + + state = ThresholdFailed + break + } + + // The state for the rule moves to the started state + // once its start time has been reached (and it hasn't + // already expired per the above). + if checker.HasStarted(prevNode) { + log.Debugf("Moving from state=%v, to state=%v", state, + ThresholdStarted) + + state = ThresholdStarted + } + + case ThresholdStarted: + // The deployment of the rule change fails if it + // expires before it is accepted and locked in, but + // only if this deployment isn't speedy. + if !checker.IsSpeedy() && checker.HasEnded(prevNode) { + log.Debugf("Moving from state=%v, to state=%v", state, + ThresholdFailed) + + state = ThresholdFailed + break + } + + // At this point, the rule change is still being voted + // on by the miners, so iterate backwards through the + // confirmation window to count all of the votes in it. + var count uint32 + countNode := prevNode + for i := int32(0); i < confirmationWindow; i++ { + condition, err := checker.Condition(countNode) + if err != nil { + return ThresholdFailed, err + } + if condition { + count++ + } + + // Get the previous block node. + countNode = countNode.parent + } + + switch { + // The state is locked in if the number of blocks in the + // period that voted for the rule change meets the + // activation threshold. + case count >= checker.RuleChangeActivationThreshold(): + log.Debugf("Moving from state=%v, to state=%v", state, + ThresholdLockedIn) + + state = ThresholdLockedIn + + // If this is a speedy deployment, we didn't meet the + // threshold above, and the deployment has expired, then + // we transition to failed. + case checker.IsSpeedy() && checker.HasEnded(prevNode): + log.Debugf("Moving from state=%v, to state=%v", state, + ThresholdFailed) + + state = ThresholdFailed + + default: + log.Tracef("Still at state=%v, threshold=%v", state, + float64(count)/float64(checker.RuleChangeActivationThreshold())) + } + + case ThresholdLockedIn: + // At this point, we'll consult the deployment see if a + // custom deployment has any other arbitrary conditions + // that need to pass before execution. This might be a + // minimum activation height or another policy. + // + // If we aren't eligible to active yet, then we'll just + // stay in the locked in position. + if !checker.EligibleToActivate(prevNode) { + log.Debugf("Moving from state=%v, to state=%v", state, + ThresholdLockedIn) + + state = ThresholdLockedIn + } else { + log.Debugf("Moving from state=%v, to state=%v", state, + ThresholdActive) + + // The new rule becomes active when its + // previous state was locked in assuming it's + // now eligible to activate. + state = ThresholdActive + } + + // Nothing to do if the previous state is active or failed since + // they are both terminal states. + case ThresholdActive: + case ThresholdFailed: + } + + return state, nil +} + // thresholdState returns the current rule change threshold state for the block // AFTER the given node and deployment ID. The cache is used to ensure the // threshold states for previous windows are only calculated once. @@ -150,13 +303,9 @@ func (b *BlockChain) thresholdState(prevNode *blockNode, checker thresholdCondit break } - // The start and expiration times are based on the median block - // time, so calculate it now. - medianTime := prevNode.CalcPastMedianTime() - // The state is simply defined if the start time hasn't been // been reached yet. - if uint64(medianTime.Unix()) < checker.BeginTime() { + if !checker.HasStarted(prevNode) { cache.Update(&prevNode.hash, ThresholdDefined) break } @@ -185,70 +334,17 @@ func (b *BlockChain) thresholdState(prevNode *blockNode, checker thresholdCondit // Since each threshold state depends on the state of the previous // window, iterate starting from the oldest unknown window. + var err error for neededNum := len(neededStates) - 1; neededNum >= 0; neededNum-- { prevNode := neededStates[neededNum] - switch state { - case ThresholdDefined: - // The deployment of the rule change fails if it expires - // before it is accepted and locked in. - medianTime := prevNode.CalcPastMedianTime() - medianTimeUnix := uint64(medianTime.Unix()) - if medianTimeUnix >= checker.EndTime() { - state = ThresholdFailed - break - } - - // The state for the rule moves to the started state - // once its start time has been reached (and it hasn't - // already expired per the above). - if medianTimeUnix >= checker.BeginTime() { - state = ThresholdStarted - } - - case ThresholdStarted: - // The deployment of the rule change fails if it expires - // before it is accepted and locked in. - medianTime := prevNode.CalcPastMedianTime() - if uint64(medianTime.Unix()) >= checker.EndTime() { - state = ThresholdFailed - break - } - - // At this point, the rule change is still being voted - // on by the miners, so iterate backwards through the - // confirmation window to count all of the votes in it. - var count uint32 - countNode := prevNode - for i := int32(0); i < confirmationWindow; i++ { - condition, err := checker.Condition(countNode) - if err != nil { - return ThresholdFailed, err - } - if condition { - count++ - } - - // Get the previous block node. - countNode = countNode.parent - } - - // The state is locked in if the number of blocks in the - // period that voted for the rule change meets the - // activation threshold. - if count >= checker.RuleChangeActivationThreshold() { - state = ThresholdLockedIn - } - - case ThresholdLockedIn: - // The new rule becomes active when its previous state - // was locked in. - state = ThresholdActive - - // Nothing to do if the previous state is active or failed since - // they are both terminal states. - case ThresholdActive: - case ThresholdFailed: + // Based on the current state, the previous node, and the + // condition checker, transition to the next threshold state. + state, err = thresholdStateTransition( + state, prevNode, checker, confirmationWindow, + ) + if err != nil { + return state, err } // Update the cache to avoid recalculating the state in the @@ -310,7 +406,7 @@ func (b *BlockChain) deploymentState(prevNode *blockNode, deploymentID uint32) ( // initThresholdCaches initializes the threshold state caches for each warning // bit and defined deployment and provides warnings if the chain is current per -// the warnUnknownVersions and warnUnknownRuleActivations functions. +// the warnUnknownRuleActivations function. func (b *BlockChain) initThresholdCaches() error { // Initialize the warning and deployment caches by calculating the // threshold state for each of them. This will ensure the caches are @@ -335,15 +431,9 @@ func (b *BlockChain) initThresholdCaches() error { } } - // No warnings about unknown rules or versions until the chain is - // current. + // No warnings about unknown rules until the chain is current. if b.isCurrent() { - // Warn if a high enough percentage of the last blocks have - // unexpected versions. bestNode := b.bestChain.Tip() - if err := b.warnUnknownVersions(bestNode); err != nil { - return err - } // Warn if any unknown new rules are either about to activate or // have already been activated. diff --git a/blockchain/thresholdstate_test.go b/blockchain/thresholdstate_test.go index c65f5a4465..8d527137e3 100644 --- a/blockchain/thresholdstate_test.go +++ b/blockchain/thresholdstate_test.go @@ -132,3 +132,187 @@ nextTest: } } } + +type customDeploymentChecker struct { + started bool + ended bool + + eligible bool + + isSpeedy bool + + conditionTrue bool + + activationThreshold uint32 + minerWindow uint32 +} + +func (c customDeploymentChecker) HasStarted(_ *blockNode) bool { + return c.started +} + +func (c customDeploymentChecker) HasEnded(_ *blockNode) bool { + return c.ended +} + +func (c customDeploymentChecker) RuleChangeActivationThreshold() uint32 { + return c.activationThreshold +} + +func (c customDeploymentChecker) MinerConfirmationWindow() uint32 { + return c.minerWindow +} + +func (c customDeploymentChecker) EligibleToActivate(_ *blockNode) bool { + return c.eligible +} + +func (c customDeploymentChecker) IsSpeedy() bool { + return c.isSpeedy +} + +func (c customDeploymentChecker) Condition(_ *blockNode) (bool, error) { + return c.conditionTrue, nil +} + +// TestThresholdStateTransition tests that the thresholdStateTransition +// properly implements the BIP 009 state machine, along with the speedy trial +// augments. +func TestThresholdStateTransition(t *testing.T) { + t.Parallel() + + // Prev node always points back to itself, effectively creating an + // infinite chain for the purposes of this test. + prevNode := &blockNode{} + prevNode.parent = prevNode + + window := int32(2016) + + testCases := []struct { + currentState ThresholdState + nextState ThresholdState + + checker thresholdConditionChecker + }{ + // From defined, we stay there if we haven't started the + // window, and the window hasn't ended. + { + currentState: ThresholdDefined, + nextState: ThresholdDefined, + + checker: &customDeploymentChecker{}, + }, + + // From defined, we go to failed if the window has ended, and + // this isn't a speedy trial. + { + currentState: ThresholdDefined, + nextState: ThresholdFailed, + + checker: &customDeploymentChecker{ + ended: true, + }, + }, + + // From defined, even if the window has ended, we go to started + // if this isn't a speedy trial. + { + currentState: ThresholdDefined, + nextState: ThresholdStarted, + + checker: &customDeploymentChecker{ + started: true, + }, + }, + + // From started, we go to failed if this isn't speed, and the + // deployment has ended. + { + currentState: ThresholdStarted, + nextState: ThresholdFailed, + + checker: &customDeploymentChecker{ + ended: true, + }, + }, + + // From started, we go to locked in if the window passed the + // condition. + { + currentState: ThresholdStarted, + nextState: ThresholdLockedIn, + + checker: &customDeploymentChecker{ + started: true, + conditionTrue: true, + }, + }, + + // From started, we go to failed if this is a speedy trial, and + // the condition wasn't met in the window. + { + currentState: ThresholdStarted, + nextState: ThresholdFailed, + + checker: &customDeploymentChecker{ + started: true, + ended: true, + isSpeedy: true, + conditionTrue: false, + activationThreshold: 1815, + }, + }, + + // From locked in, we go straight to active is this isn't a + // speedy trial. + { + currentState: ThresholdLockedIn, + nextState: ThresholdActive, + + checker: &customDeploymentChecker{ + eligible: true, + }, + }, + + // From locked in, we remain in locked in if we're not yet + // eligible to activate. + { + currentState: ThresholdLockedIn, + nextState: ThresholdLockedIn, + + checker: &customDeploymentChecker{}, + }, + + // From active, we always stay here. + { + currentState: ThresholdActive, + nextState: ThresholdActive, + + checker: &customDeploymentChecker{}, + }, + + // From failed, we always stay here. + { + currentState: ThresholdFailed, + nextState: ThresholdFailed, + + checker: &customDeploymentChecker{}, + }, + } + for i, testCase := range testCases { + nextState, err := thresholdStateTransition( + testCase.currentState, prevNode, testCase.checker, + window, + ) + if err != nil { + t.Fatalf("#%v: unable to transition to next "+ + "state: %v", i, err) + } + + if nextState != testCase.nextState { + t.Fatalf("#%v: incorrect state transition: "+ + "expected %v got %v", i, testCase.nextState, + nextState) + } + } +} diff --git a/blockchain/timesorter.go b/blockchain/timesorter.go index d0288e1d30..4a5498b258 100644 --- a/blockchain/timesorter.go +++ b/blockchain/timesorter.go @@ -20,7 +20,7 @@ func (s timeSorter) Swap(i, j int) { s[i], s[j] = s[j], s[i] } -// Less returns whether the timstamp with index i should sort before the +// Less returns whether the timestamp with index i should sort before the // timestamp with index j. It is part of the sort.Interface implementation. func (s timeSorter) Less(i, j int) bool { return s[i] < s[j] diff --git a/blockchain/upgrade.go b/blockchain/upgrade.go index 253ca62e1e..34149e44a8 100644 --- a/blockchain/upgrade.go +++ b/blockchain/upgrade.go @@ -232,24 +232,25 @@ func determineMainChainBlocks(blocksMap map[chainhash.Hash]*blockChainContext, t // // The legacy format is as follows: // -//
[,...] +//
[,...] // -// Field Type Size -// version VLQ variable -// block height VLQ variable -// header code VLQ variable -// unspentness bitmap []byte variable -// compressed txouts -// compressed amount VLQ variable -// compressed script []byte variable +// Field Type Size +// version VLQ variable +// block height VLQ variable +// header code VLQ variable +// unspentness bitmap []byte variable +// compressed txouts +// compressed amount VLQ variable +// compressed script []byte variable // // The serialized header code format is: -// bit 0 - containing transaction is a coinbase -// bit 1 - output zero is unspent -// bit 2 - output one is unspent -// bits 3-x - number of bytes in unspentness bitmap. When both bits 1 and 2 -// are unset, it encodes N-1 since there must be at least one unspent -// output. +// +// bit 0 - containing transaction is a coinbase +// bit 1 - output zero is unspent +// bit 2 - output one is unspent +// bits 3-x - number of bytes in unspentness bitmap. When both bits 1 and 2 +// are unset, it encodes N-1 since there must be at least one unspent +// output. // // The rationale for the header code scheme is as follows: // - Transactions which only pay to a single output and a change output are @@ -269,65 +270,65 @@ func determineMainChainBlocks(blocksMap map[chainhash.Hash]*blockChainContext, t // From tx in main blockchain: // Blk 1, 0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098 // -// 010103320496b538e853519c726a2c91e61ec11600ae1390813a627c66fb8be7947be63c52 -// <><><><------------------------------------------------------------------> -// | | \--------\ | -// | height | compressed txout 0 -// version header code +// 010103320496b538e853519c726a2c91e61ec11600ae1390813a627c66fb8be7947be63c52 +// <><><><------------------------------------------------------------------> +// | | \--------\ | +// | height | compressed txout 0 +// version header code // -// - version: 1 -// - height: 1 -// - header code: 0x03 (coinbase, output zero unspent, 0 bytes of unspentness) -// - unspentness: Nothing since it is zero bytes -// - compressed txout 0: -// - 0x32: VLQ-encoded compressed amount for 5000000000 (50 BTC) -// - 0x04: special script type pay-to-pubkey -// - 0x96...52: x-coordinate of the pubkey +// - version: 1 +// - height: 1 +// - header code: 0x03 (coinbase, output zero unspent, 0 bytes of unspentness) +// - unspentness: Nothing since it is zero bytes +// - compressed txout 0: +// - 0x32: VLQ-encoded compressed amount for 5000000000 (50 BTC) +// - 0x04: special script type pay-to-pubkey +// - 0x96...52: x-coordinate of the pubkey // // Example 2: // From tx in main blockchain: // Blk 113931, 4a16969aa4764dd7507fc1de7f0baa4850a246de90c45e59a3207f9a26b5036f // -// 0185f90b0a011200e2ccd6ec7c6e2e581349c77e067385fa8236bf8a800900b8025be1b3efc63b0ad48e7f9f10e87544528d58 -// <><----><><><------------------------------------------><--------------------------------------------> -// | | | \-------------------\ | | -// version | \--------\ unspentness | compressed txout 2 -// height header code compressed txout 0 +// 0185f90b0a011200e2ccd6ec7c6e2e581349c77e067385fa8236bf8a800900b8025be1b3efc63b0ad48e7f9f10e87544528d58 +// <><----><><><------------------------------------------><--------------------------------------------> +// | | | \-------------------\ | | +// version | \--------\ unspentness | compressed txout 2 +// height header code compressed txout 0 // -// - version: 1 -// - height: 113931 -// - header code: 0x0a (output zero unspent, 1 byte in unspentness bitmap) -// - unspentness: [0x01] (bit 0 is set, so output 0+2 = 2 is unspent) -// NOTE: It's +2 since the first two outputs are encoded in the header code -// - compressed txout 0: -// - 0x12: VLQ-encoded compressed amount for 20000000 (0.2 BTC) -// - 0x00: special script type pay-to-pubkey-hash -// - 0xe2...8a: pubkey hash -// - compressed txout 2: -// - 0x8009: VLQ-encoded compressed amount for 15000000 (0.15 BTC) -// - 0x00: special script type pay-to-pubkey-hash -// - 0xb8...58: pubkey hash +// - version: 1 +// - height: 113931 +// - header code: 0x0a (output zero unspent, 1 byte in unspentness bitmap) +// - unspentness: [0x01] (bit 0 is set, so output 0+2 = 2 is unspent) +// NOTE: It's +2 since the first two outputs are encoded in the header code +// - compressed txout 0: +// - 0x12: VLQ-encoded compressed amount for 20000000 (0.2 BTC) +// - 0x00: special script type pay-to-pubkey-hash +// - 0xe2...8a: pubkey hash +// - compressed txout 2: +// - 0x8009: VLQ-encoded compressed amount for 15000000 (0.15 BTC) +// - 0x00: special script type pay-to-pubkey-hash +// - 0xb8...58: pubkey hash // // Example 3: // From tx in main blockchain: // Blk 338156, 1b02d1c8cfef60a189017b9a420c682cf4a0028175f2f563209e4ff61c8c3620 // -// 0193d06c100000108ba5b9e763011dd46a006572d820e448e12d2bbb38640bc718e6 -// <><----><><----><--------------------------------------------------> -// | | | \-----------------\ | -// version | \--------\ unspentness | -// height header code compressed txout 22 +// 0193d06c100000108ba5b9e763011dd46a006572d820e448e12d2bbb38640bc718e6 +// <><----><><----><--------------------------------------------------> +// | | | \-----------------\ | +// version | \--------\ unspentness | +// height header code compressed txout 22 // -// - version: 1 -// - height: 338156 -// - header code: 0x10 (2+1 = 3 bytes in unspentness bitmap) -// NOTE: It's +1 since neither bit 1 nor 2 are set, so N-1 is encoded. -// - unspentness: [0x00 0x00 0x10] (bit 20 is set, so output 20+2 = 22 is unspent) -// NOTE: It's +2 since the first two outputs are encoded in the header code -// - compressed txout 22: -// - 0x8ba5b9e763: VLQ-encoded compressed amount for 366875659 (3.66875659 BTC) -// - 0x01: special script type pay-to-script-hash -// - 0x1d...e6: script hash +// - version: 1 +// - height: 338156 +// - header code: 0x10 (2+1 = 3 bytes in unspentness bitmap) +// NOTE: It's +1 since neither bit 1 nor 2 are set, so N-1 is encoded. +// - unspentness: [0x00 0x00 0x10] (bit 20 is set, so output 20+2 = 22 is unspent) +// NOTE: It's +2 since the first two outputs are encoded in the header code +// - compressed txout 22: +// - 0x8ba5b9e763: VLQ-encoded compressed amount for 366875659 (3.66875659 BTC) +// - 0x01: special script type pay-to-script-hash +// - 0x1d...e6: script hash func deserializeUtxoEntryV0(serialized []byte) (map[uint32]*UtxoEntry, error) { // Deserialize the version. // diff --git a/blockchain/upgrade_test.go b/blockchain/upgrade_test.go index 97e7f55c35..9a060b3e8e 100644 --- a/blockchain/upgrade_test.go +++ b/blockchain/upgrade_test.go @@ -9,7 +9,7 @@ import ( "testing" ) -// TestDeserializeUtxoEntryV0 ensures deserializing unspent trasaction output +// TestDeserializeUtxoEntryV0 ensures deserializing unspent transaction output // entries from the legacy version 0 format works as expected. func TestDeserializeUtxoEntryV0(t *testing.T) { tests := []struct { diff --git a/blockchain/utxocache.go b/blockchain/utxocache.go new file mode 100644 index 0000000000..550d8c5602 --- /dev/null +++ b/blockchain/utxocache.go @@ -0,0 +1,767 @@ +// Copyright (c) 2023 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package blockchain + +import ( + "container/list" + "fmt" + "sync" + "time" + + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/database" + "github.com/btcsuite/btcd/txscript" + "github.com/btcsuite/btcd/wire" +) + +// mapSlice is a slice of maps for utxo entries. The slice of maps are needed to +// guarantee that the map will only take up N amount of bytes. As of v1.20, the +// go runtime will allocate 2^N + few extra buckets, meaning that for large N, we'll +// allocate a lot of extra memory if the amount of entries goes over the previously +// allocated buckets. A slice of maps allows us to have a better control of how much +// total memory gets allocated by all the maps. +type mapSlice struct { + // mtx protects against concurrent access for the map slice. + mtx sync.Mutex + + // maps are the underlying maps in the slice of maps. + maps []map[wire.OutPoint]*UtxoEntry + + // maxEntries is the maximum amount of elements that the map is allocated for. + maxEntries []int + + // maxTotalMemoryUsage is the maximum memory usage in bytes that the state + // should contain in normal circumstances. + maxTotalMemoryUsage uint64 +} + +// length returns the length of all the maps in the map slice added together. +// +// This function is safe for concurrent access. +func (ms *mapSlice) length() int { + ms.mtx.Lock() + defer ms.mtx.Unlock() + + var l int + for _, m := range ms.maps { + l += len(m) + } + + return l +} + +// size returns the size of all the maps in the map slice added together. +// +// This function is safe for concurrent access. +func (ms *mapSlice) size() int { + ms.mtx.Lock() + defer ms.mtx.Unlock() + + var size int + for _, num := range ms.maxEntries { + size += calculateRoughMapSize(num, bucketSize) + } + + return size +} + +// get looks for the outpoint in all the maps in the map slice and returns +// the entry. nil and false is returned if the outpoint is not found. +// +// This function is safe for concurrent access. +func (ms *mapSlice) get(op wire.OutPoint) (*UtxoEntry, bool) { + ms.mtx.Lock() + defer ms.mtx.Unlock() + + var entry *UtxoEntry + var found bool + + for _, m := range ms.maps { + entry, found = m[op] + if found { + return entry, found + } + } + + return nil, false +} + +// put puts the outpoint and the entry into one of the maps in the map slice. If the +// existing maps are all full, it will allocate a new map based on how much memory we +// have left over. Leftover memory is calculated as: +// maxTotalMemoryUsage - (totalEntryMemory + mapSlice.size()) +// +// This function is safe for concurrent access. +func (ms *mapSlice) put(op wire.OutPoint, entry *UtxoEntry, totalEntryMemory uint64) { + ms.mtx.Lock() + defer ms.mtx.Unlock() + + // Look for the key in the maps. + for i := range ms.maxEntries { + m := ms.maps[i] + _, found := m[op] + if found { + // If the key is found, overwrite it. + m[op] = entry + return // Return as we were successful in adding the entry. + } + } + + for i, maxNum := range ms.maxEntries { + m := ms.maps[i] + if len(m) >= maxNum { + // Don't try to insert if the map already at max since + // that'll force the map to allocate double the memory it's + // currently taking up. + continue + } + + m[op] = entry + return // Return as we were successful in adding the entry. + } + + // We only reach this code if we've failed to insert into the map above as + // all the current maps were full. We thus make a new map and insert into + // it. + m := ms.makeNewMap(totalEntryMemory) + m[op] = entry +} + +// delete attempts to delete the given outpoint in all of the maps. No-op if the +// outpoint doesn't exist. +// +// This function is safe for concurrent access. +func (ms *mapSlice) delete(op wire.OutPoint) { + ms.mtx.Lock() + defer ms.mtx.Unlock() + + for i := 0; i < len(ms.maps); i++ { + delete(ms.maps[i], op) + } +} + +// makeNewMap makes and appends the new map into the map slice. +// +// This function is NOT safe for concurrent access and must be called with the +// lock held. +func (ms *mapSlice) makeNewMap(totalEntryMemory uint64) map[wire.OutPoint]*UtxoEntry { + // Get the size of the leftover memory. + memSize := ms.maxTotalMemoryUsage - totalEntryMemory + for _, maxNum := range ms.maxEntries { + memSize -= uint64(calculateRoughMapSize(maxNum, bucketSize)) + } + + // Get a new map that's sized to house inside the leftover memory. + // -1 on the returned value will make the map allocate half as much total + // bytes. This is done to make sure there's still room left for utxo + // entries to take up. + numMaxElements := calculateMinEntries(int(memSize), bucketSize+avgEntrySize) + numMaxElements -= 1 + ms.maxEntries = append(ms.maxEntries, numMaxElements) + ms.maps = append(ms.maps, make(map[wire.OutPoint]*UtxoEntry, numMaxElements)) + + return ms.maps[len(ms.maps)-1] +} + +// deleteMaps deletes all maps except for the first one which should be the biggest. +// +// This function is safe for concurrent access. +func (ms *mapSlice) deleteMaps() { + ms.mtx.Lock() + defer ms.mtx.Unlock() + + size := ms.maxEntries[0] + ms.maxEntries = []int{size} + ms.maps = ms.maps[:1] +} + +const ( + // utxoFlushPeriodicInterval is the interval at which a flush is performed + // when the flush mode FlushPeriodic is used. This is used when the initial + // block download is complete and it's useful to flush periodically in case + // of unforeseen shutdowns. + utxoFlushPeriodicInterval = time.Minute * 5 +) + +// FlushMode is used to indicate the different urgency types for a flush. +type FlushMode uint8 + +const ( + // FlushRequired is the flush mode that means a flush must be performed + // regardless of the cache state. For example right before shutting down. + FlushRequired FlushMode = iota + + // FlushPeriodic is the flush mode that means a flush can be performed + // when it would be almost needed. This is used to periodically signal when + // no I/O heavy operations are expected soon, so there is time to flush. + FlushPeriodic + + // FlushIfNeeded is the flush mode that means a flush must be performed only + // if the cache is exceeding a safety threshold very close to its maximum + // size. This is used mostly internally in between operations that can + // increase the cache size. + FlushIfNeeded +) + +// utxoCache is a cached utxo view in the chainstate of a BlockChain. +type utxoCache struct { + db database.DB + + // maxTotalMemoryUsage is the maximum memory usage in bytes that the state + // should contain in normal circumstances. + maxTotalMemoryUsage uint64 + + // cachedEntries keeps the internal cache of the utxo state. The tfModified + // flag indicates that the state of the entry (potentially) deviates from the + // state in the database. Explicit nil values in the map are used to + // indicate that the database does not contain the entry. + cachedEntries mapSlice + totalEntryMemory uint64 // Total memory usage in bytes. + + // Below fields are used to indicate when the last flush happened. + lastFlushHash chainhash.Hash + lastFlushTime time.Time +} + +// newUtxoCache initiates a new utxo cache instance with its memory usage limited +// to the given maximum. +func newUtxoCache(db database.DB, maxTotalMemoryUsage uint64) *utxoCache { + // While the entry isn't included in the map size, add the average size to the + // bucket size so we get some leftover space for entries to take up. + numMaxElements := calculateMinEntries(int(maxTotalMemoryUsage), bucketSize+avgEntrySize) + numMaxElements -= 1 + + log.Infof("Pre-alloacting for %d MiB", maxTotalMemoryUsage/(1024*1024)+1) + + m := make(map[wire.OutPoint]*UtxoEntry, numMaxElements) + + return &utxoCache{ + db: db, + maxTotalMemoryUsage: maxTotalMemoryUsage, + cachedEntries: mapSlice{ + maps: []map[wire.OutPoint]*UtxoEntry{m}, + maxEntries: []int{numMaxElements}, + maxTotalMemoryUsage: maxTotalMemoryUsage, + }, + } +} + +// totalMemoryUsage returns the total memory usage in bytes of the UTXO cache. +func (s *utxoCache) totalMemoryUsage() uint64 { + // Total memory is the map size + the size that the utxo entries are + // taking up. + size := uint64(s.cachedEntries.size()) + size += s.totalEntryMemory + + return size +} + +// fetchEntries returns the UTXO entries for the given outpoints. The function always +// returns as many entries as there are outpoints and the returns entries are in the +// same order as the outpoints. It returns nil if there is no entry for the outpoint +// in the UTXO set. +// +// The returned entries are NOT safe for concurrent access. +func (s *utxoCache) fetchEntries(outpoints []wire.OutPoint) ([]*UtxoEntry, error) { + entries := make([]*UtxoEntry, len(outpoints)) + var ( + missingOps []wire.OutPoint + missingOpsIdx []int + ) + for i := range outpoints { + if entry, ok := s.cachedEntries.get(outpoints[i]); ok { + entries[i] = entry + continue + } + + // At this point, we have missing outpoints. Allocate them now + // so that we never allocate if the cache never misses. + if len(missingOps) == 0 { + missingOps = make([]wire.OutPoint, 0, len(outpoints)) + missingOpsIdx = make([]int, 0, len(outpoints)) + } + + missingOpsIdx = append(missingOpsIdx, i) + missingOps = append(missingOps, outpoints[i]) + } + + // Return early and don't attempt access the database if we don't have any + // missing outpoints. + if len(missingOps) == 0 { + return entries, nil + } + + // Fetch the missing outpoints in the cache from the database. + dbEntries := make([]*UtxoEntry, len(missingOps)) + err := s.db.View(func(dbTx database.Tx) error { + utxoBucket := dbTx.Metadata().Bucket(utxoSetBucketName) + + for i := range missingOps { + entry, err := dbFetchUtxoEntry(dbTx, utxoBucket, missingOps[i]) + if err != nil { + return err + } + + dbEntries[i] = entry + } + + return nil + }) + if err != nil { + return nil, err + } + + // Add each of the entries to the UTXO cache and update their memory + // usage. + // + // NOTE: When the fetched entry is nil, it is still added to the cache + // as a miss; this prevents future lookups to perform the same database + // fetch. + for i := range dbEntries { + s.cachedEntries.put(missingOps[i], dbEntries[i], s.totalEntryMemory) + s.totalEntryMemory += dbEntries[i].memoryUsage() + } + + // Fill in the entries with the ones fetched from the database. + for i := range missingOpsIdx { + entries[missingOpsIdx[i]] = dbEntries[i] + } + + return entries, nil +} + +// addTxOut adds the specified output to the cache if it is not provably +// unspendable. When the cache already has an entry for the output, it will be +// overwritten with the given output. All fields will be updated for existing +// entries since it's possible it has changed during a reorg. +func (s *utxoCache) addTxOut(outpoint wire.OutPoint, txOut *wire.TxOut, isCoinBase bool, + blockHeight int32) error { + + // Don't add provably unspendable outputs. + if txscript.IsUnspendable(txOut.PkScript) { + return nil + } + + entry := new(UtxoEntry) + entry.amount = txOut.Value + + // Deep copy the script when the script in the entry differs from the one in + // the txout. This is required since the txout script is a subslice of the + // overall contiguous buffer that the msg tx houses for all scripts within + // the tx. It is deep copied here since this entry may be added to the utxo + // cache, and we don't want the utxo cache holding the entry to prevent all + // of the other tx scripts from getting garbage collected. + entry.pkScript = make([]byte, len(txOut.PkScript)) + copy(entry.pkScript, txOut.PkScript) + + entry.blockHeight = blockHeight + entry.packedFlags = tfFresh | tfModified + if isCoinBase { + entry.packedFlags |= tfCoinBase + } + + s.cachedEntries.put(outpoint, entry, s.totalEntryMemory) + s.totalEntryMemory += entry.memoryUsage() + + return nil +} + +// addTxOuts adds all outputs in the passed transaction which are not provably +// unspendable to the view. When the view already has entries for any of the +// outputs, they are simply marked unspent. All fields will be updated for +// existing entries since it's possible it has changed during a reorg. +func (s *utxoCache) addTxOuts(tx *btcutil.Tx, blockHeight int32) error { + // Loop all of the transaction outputs and add those which are not + // provably unspendable. + isCoinBase := IsCoinBase(tx) + prevOut := wire.OutPoint{Hash: *tx.Hash()} + for txOutIdx, txOut := range tx.MsgTx().TxOut { + // Update existing entries. All fields are updated because it's + // possible (although extremely unlikely) that the existing + // entry is being replaced by a different transaction with the + // same hash. This is allowed so long as the previous + // transaction is fully spent. + prevOut.Index = uint32(txOutIdx) + err := s.addTxOut(prevOut, txOut, isCoinBase, blockHeight) + if err != nil { + return err + } + } + + return nil +} + +// addTxIn will add the given input to the cache if the previous outpoint the txin +// is pointing to exists in the utxo set. The utxo that is being spent by the input +// will be marked as spent and if the utxo is fresh (meaning that the database on disk +// never saw it), it will be removed from the cache. +func (s *utxoCache) addTxIn(txIn *wire.TxIn, stxos *[]SpentTxOut) error { + // Ensure the referenced utxo exists in the view. This should + // never happen unless there is a bug is introduced in the code. + entries, err := s.fetchEntries([]wire.OutPoint{txIn.PreviousOutPoint}) + if err != nil { + return err + } + if len(entries) != 1 || entries[0] == nil { + return AssertError(fmt.Sprintf("missing input %v", + txIn.PreviousOutPoint)) + } + + // Only create the stxo details if requested. + entry := entries[0] + if stxos != nil { + // Populate the stxo details using the utxo entry. + stxo := SpentTxOut{ + Amount: entry.Amount(), + PkScript: entry.PkScript(), + Height: entry.BlockHeight(), + IsCoinBase: entry.IsCoinBase(), + } + + *stxos = append(*stxos, stxo) + } + + // Mark the entry as spent. + entry.Spend() + + // If an entry is fresh it indicates that this entry was spent before it could be + // flushed to the database. Because of this, we can just delete it from the map of + // cached entries. + if entry.isFresh() { + // If the entry is fresh, we will always have it in the cache. + s.cachedEntries.delete(txIn.PreviousOutPoint) + s.totalEntryMemory -= entry.memoryUsage() + } else { + // Can leave the entry to be garbage collected as the only purpose + // of this entry now is so that the entry on disk can be deleted. + entry = nil + s.totalEntryMemory -= entry.memoryUsage() + } + + return nil +} + +// addTxIns will add the given inputs of the tx if it's not a coinbase tx and if +// the previous output that the input is pointing to exists in the utxo set. The +// utxo that is being spent by the input will be marked as spent and if the utxo +// is fresh (meaning that the database on disk never saw it), it will be removed +// from the cache. +func (s *utxoCache) addTxIns(tx *btcutil.Tx, stxos *[]SpentTxOut) error { + // Coinbase transactions don't have any inputs to spend. + if IsCoinBase(tx) { + return nil + } + + for _, txIn := range tx.MsgTx().TxIn { + err := s.addTxIn(txIn, stxos) + if err != nil { + return err + } + } + + return nil +} + +// connectTransaction updates the cache by adding all new utxos created by the +// passed transaction and marking and/or removing all utxos that the transactions +// spend as spent. In addition, when the 'stxos' argument is not nil, it will +// be updated to append an entry for each spent txout. An error will be returned +// if the cache and the database does not contain the required utxos. +func (s *utxoCache) connectTransaction( + tx *btcutil.Tx, blockHeight int32, stxos *[]SpentTxOut) error { + + err := s.addTxIns(tx, stxos) + if err != nil { + return err + } + + // Add the transaction's outputs as available utxos. + return s.addTxOuts(tx, blockHeight) +} + +// connectTransactions updates the cache by adding all new utxos created by all +// of the transactions in the passed block, marking and/or removing all utxos +// the transactions spend as spent, and setting the best hash for the view to +// the passed block. In addition, when the 'stxos' argument is not nil, it will +// be updated to append an entry for each spent txout. +func (s *utxoCache) connectTransactions(block *btcutil.Block, stxos *[]SpentTxOut) error { + for _, tx := range block.Transactions() { + err := s.connectTransaction(tx, block.Height(), stxos) + if err != nil { + return err + } + } + + return nil +} + +// writeCache writes all the entries that are cached in memory to the database atomically. +func (s *utxoCache) writeCache(dbTx database.Tx, bestState *BestState) error { + // Update commits and flushes the cache to the database. + // NOTE: The database has its own cache which gets atomically written + // to leveldb. + utxoBucket := dbTx.Metadata().Bucket(utxoSetBucketName) + for i := range s.cachedEntries.maps { + for outpoint, entry := range s.cachedEntries.maps[i] { + switch { + // If the entry is nil or spent, remove the entry from the database + // and the cache. + case entry == nil || entry.IsSpent(): + err := dbDeleteUtxoEntry(utxoBucket, outpoint) + if err != nil { + return err + } + + // No need to update the cache if the entry was not modified. + case !entry.isModified(): + default: + // Entry is fresh and needs to be put into the database. + err := dbPutUtxoEntry(utxoBucket, outpoint, entry) + if err != nil { + return err + } + } + + delete(s.cachedEntries.maps[i], outpoint) + } + } + s.cachedEntries.deleteMaps() + s.totalEntryMemory = 0 + + // When done, store the best state hash in the database to indicate the state + // is consistent until that hash. + err := dbPutUtxoStateConsistency(dbTx, &bestState.Hash) + if err != nil { + return err + } + + // The best state is the new last flush hash. + s.lastFlushHash = bestState.Hash + s.lastFlushTime = time.Now() + + return nil +} + +// flush flushes the UTXO state to the database if a flush is needed with the given flush mode. +// +// This function MUST be called with the chain state lock held (for writes). +func (s *utxoCache) flush(dbTx database.Tx, mode FlushMode, bestState *BestState) error { + var threshold uint64 + switch mode { + case FlushRequired: + threshold = 0 + + case FlushIfNeeded: + // If we performed a flush in the current best state, we have nothing to do. + if bestState.Hash == s.lastFlushHash { + return nil + } + + threshold = s.maxTotalMemoryUsage + + case FlushPeriodic: + // If the time since the last flush is over the periodic interval, + // force a flush. Otherwise just flush when the cache is full. + if time.Since(s.lastFlushTime) > utxoFlushPeriodicInterval { + threshold = 0 + } else { + threshold = s.maxTotalMemoryUsage + } + } + + if s.totalMemoryUsage() >= threshold { + // Add one to round up the integer division. + totalMiB := s.totalMemoryUsage() / ((1024 * 1024) + 1) + log.Infof("Flushing UTXO cache of %d MiB with %d entries to disk. For large sizes, "+ + "this can take up to several minutes...", totalMiB, s.cachedEntries.length()) + + return s.writeCache(dbTx, bestState) + } + + return nil +} + +// FlushUtxoCache flushes the UTXO state to the database if a flush is needed with the +// given flush mode. +// +// This function is safe for concurrent access. +func (b *BlockChain) FlushUtxoCache(mode FlushMode) error { + b.chainLock.Lock() + defer b.chainLock.Unlock() + + return b.db.Update(func(dbTx database.Tx) error { + return b.utxoCache.flush(dbTx, mode, b.BestSnapshot()) + }) +} + +// InitConsistentState checks the consistency status of the utxo state and +// replays blocks if it lags behind the best state of the blockchain. +// +// It needs to be ensured that the chainView passed to this method does not +// get changed during the execution of this method. +func (b *BlockChain) InitConsistentState(tip *blockNode, interrupt <-chan struct{}) error { + s := b.utxoCache + + // Load the consistency status from the database. + var statusBytes []byte + s.db.View(func(dbTx database.Tx) error { + statusBytes = dbFetchUtxoStateConsistency(dbTx) + return nil + }) + + // If no status was found, the database is old and didn't have a cached utxo + // state yet. In that case, we set the status to the best state and write + // this to the database. + if statusBytes == nil { + err := s.db.Update(func(dbTx database.Tx) error { + return dbPutUtxoStateConsistency(dbTx, &tip.hash) + }) + + // Set the last flush hash as it's the default value of 0s. + s.lastFlushHash = tip.hash + s.lastFlushTime = time.Now() + + return err + } + + statusHash, err := chainhash.NewHash(statusBytes) + if err != nil { + return err + } + + // If state is consistent, we are done. + if statusHash.IsEqual(&tip.hash) { + log.Debugf("UTXO state consistent at (%d:%v)", tip.height, tip.hash) + + // The last flush hash is set to the default value of all 0s. Set + // it to the tip since we checked it's consistent. + s.lastFlushHash = tip.hash + + // Set the last flush time as now since we know the state is consistent + // at this time. + s.lastFlushTime = time.Now() + + return nil + } + + lastFlushNode := b.index.LookupNode(statusHash) + log.Infof("Reconstructing UTXO state after an unclean shutdown. The UTXO state is "+ + "consistent at block %s (%d) but the chainstate is at block %s (%d), This may "+ + "take a long time...", statusHash.String(), lastFlushNode.height, + tip.hash.String(), tip.height) + + // Even though this should always be true, make sure the fetched hash is in + // the best chain. + fork := b.bestChain.FindFork(lastFlushNode) + if fork == nil { + return AssertError(fmt.Sprintf("last utxo consistency status contains "+ + "hash that is not in best chain: %v", statusHash)) + } + + // We never disconnect blocks as they cannot be inconsistent during a reorganization. + // This is because The cache is flushed before the reorganization begins and the utxo + // set at each block disconnect is written atomically to the database. + node := lastFlushNode + + // We replay the blocks from the last consistent state up to the best + // state. Iterate forward from the consistent node to the tip of the best + // chain. + attachNodes := list.New() + for n := tip; n.height >= 0; n = n.parent { + if n == fork { + break + } + attachNodes.PushFront(n) + } + + for e := attachNodes.Front(); e != nil; e = e.Next() { + node = e.Value.(*blockNode) + + var block *btcutil.Block + err := s.db.View(func(dbTx database.Tx) error { + block, err = dbFetchBlockByNode(dbTx, node) + if err != nil { + return err + } + + return err + }) + if err != nil { + return err + } + + err = b.utxoCache.connectTransactions(block, nil) + if err != nil { + return err + } + + // Flush the utxo cache if needed. This will in turn update the + // consistent state to this block. + err = s.db.Update(func(dbTx database.Tx) error { + return s.flush(dbTx, FlushIfNeeded, &BestState{Hash: node.hash, Height: node.height}) + }) + if err != nil { + return err + } + + if interruptRequested(interrupt) { + log.Warn("UTXO state reconstruction interrupted") + + return errInterruptRequested + } + } + log.Debug("UTXO state reconstruction done") + + // Set the last flush hash as it's the default value of 0s. + s.lastFlushHash = tip.hash + s.lastFlushTime = time.Now() + + return nil +} + +// flushNeededAfterPrune returns true if the utxo cache needs to be flushed after a prune +// of the block storage. In the case of an unexpected shutdown, the utxo cache needs +// to be reconstructed from where the utxo cache was last flushed. In order for the +// utxo cache to be reconstructed, we always need to have the blocks since the utxo cache +// flush last happened. +// +// Example: if the last flush hash was at height 100 and one of the deleted blocks was at +// height 98, this function will return true. +func (b *BlockChain) flushNeededAfterPrune(deletedBlockHashes []chainhash.Hash) (bool, error) { + node := b.index.LookupNode(&b.utxoCache.lastFlushHash) + if node == nil { + // If we couldn't find the node where we last flushed at, have the utxo cache + // flush to be safe and that will set the last flush hash again. + // + // This realistically should never happen as nodes are never deleted from + // the block index. This happening likely means that there's a hardware + // error which is something we can't recover from. The best that we can + // do here is to just force a flush and hope that the newly set + // lastFlushHash doesn't error. + return true, nil + } + + lastFlushHeight := node.Height() + + // Loop through all the block hashes and find out what the highest block height + // among the deleted hashes is. + highestDeletedHeight := int32(-1) + for _, deletedBlockHash := range deletedBlockHashes { + node := b.index.LookupNode(&deletedBlockHash) + if node == nil { + // If we couldn't find this node, just skip it and try the next + // deleted hash. This might be a corruption in the database + // but there's nothing we can do here to address it except for + // moving onto the next block. + continue + } + if node.height > highestDeletedHeight { + highestDeletedHeight = node.height + } + } + + return highestDeletedHeight >= lastFlushHeight, nil +} diff --git a/blockchain/utxocache_test.go b/blockchain/utxocache_test.go new file mode 100644 index 0000000000..0f410cc99e --- /dev/null +++ b/blockchain/utxocache_test.go @@ -0,0 +1,962 @@ +// Copyright (c) 2023 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. +package blockchain + +import ( + "crypto/sha256" + "encoding/binary" + "fmt" + "path/filepath" + "reflect" + "sync" + "testing" + "time" + + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/database" + "github.com/btcsuite/btcd/database/ffldb" + "github.com/btcsuite/btcd/wire" +) + +func TestMapSlice(t *testing.T) { + tests := []struct { + keys []wire.OutPoint + }{ + { + keys: func() []wire.OutPoint { + outPoints := make([]wire.OutPoint, 1000) + for i := uint32(0); i < uint32(len(outPoints)); i++ { + var buf [4]byte + binary.BigEndian.PutUint32(buf[:], i) + hash := sha256.Sum256(buf[:]) + + op := wire.OutPoint{Hash: hash, Index: i} + outPoints[i] = op + } + return outPoints + }(), + }, + } + + for _, test := range tests { + m := make(map[wire.OutPoint]*UtxoEntry) + + maxSize := calculateRoughMapSize(1000, bucketSize) + + maxEntriesFirstMap := 500 + ms1 := make(map[wire.OutPoint]*UtxoEntry, maxEntriesFirstMap) + ms := mapSlice{ + maps: []map[wire.OutPoint]*UtxoEntry{ms1}, + maxEntries: []int{maxEntriesFirstMap}, + maxTotalMemoryUsage: uint64(maxSize), + } + + for _, key := range test.keys { + m[key] = nil + ms.put(key, nil, 0) + } + + // Put in the same elements twice to test that the map slice won't hold duplicates. + for _, key := range test.keys { + m[key] = nil + ms.put(key, nil, 0) + } + + if len(m) != ms.length() { + t.Fatalf("expected len of %d, got %d", len(m), ms.length()) + } + + // Delete the first element in the first map. + ms.delete(test.keys[0]) + delete(m, test.keys[0]) + + // Try to insert the last element in the mapslice again. + ms.put(test.keys[len(test.keys)-1], &UtxoEntry{}, 0) + m[test.keys[len(test.keys)-1]] = &UtxoEntry{} + + // Check that the duplicate didn't make it in. + if len(m) != ms.length() { + t.Fatalf("expected len of %d, got %d", len(m), ms.length()) + } + + ms.put(test.keys[0], &UtxoEntry{}, 0) + m[test.keys[0]] = &UtxoEntry{} + + if len(m) != ms.length() { + t.Fatalf("expected len of %d, got %d", len(m), ms.length()) + } + + for _, key := range test.keys { + expected, found := m[key] + if !found { + t.Fatalf("expected key %s to exist in the go map", key.String()) + } + + got, found := ms.get(key) + if !found { + t.Fatalf("expected key %s to exist in the map slice", key.String()) + } + + if !reflect.DeepEqual(got, expected) { + t.Fatalf("expected value of %v, got %v", expected, got) + } + } + } +} + +// TestMapsliceConcurrency just tests that the mapslice won't result in a panic +// on concurrent access. +func TestMapsliceConcurrency(t *testing.T) { + tests := []struct { + keys []wire.OutPoint + }{ + { + keys: func() []wire.OutPoint { + outPoints := make([]wire.OutPoint, 10000) + for i := uint32(0); i < uint32(len(outPoints)); i++ { + var buf [4]byte + binary.BigEndian.PutUint32(buf[:], i) + hash := sha256.Sum256(buf[:]) + + op := wire.OutPoint{Hash: hash, Index: i} + outPoints[i] = op + } + return outPoints + }(), + }, + } + + for _, test := range tests { + maxSize := calculateRoughMapSize(1000, bucketSize) + + maxEntriesFirstMap := 500 + ms1 := make(map[wire.OutPoint]*UtxoEntry, maxEntriesFirstMap) + ms := mapSlice{ + maps: []map[wire.OutPoint]*UtxoEntry{ms1}, + maxEntries: []int{maxEntriesFirstMap}, + maxTotalMemoryUsage: uint64(maxSize), + } + + var wg sync.WaitGroup + + wg.Add(1) + go func(m *mapSlice, keys []wire.OutPoint) { + defer wg.Done() + for i := 0; i < 5000; i++ { + m.put(keys[i], nil, 0) + } + }(&ms, test.keys) + + wg.Add(1) + go func(m *mapSlice, keys []wire.OutPoint) { + defer wg.Done() + for i := 5000; i < 10000; i++ { + m.put(keys[i], nil, 0) + } + }(&ms, test.keys) + + wg.Add(1) + go func(m *mapSlice) { + defer wg.Done() + for i := 0; i < 10000; i++ { + m.size() + } + }(&ms) + + wg.Add(1) + go func(m *mapSlice) { + defer wg.Done() + for i := 0; i < 10000; i++ { + m.length() + } + }(&ms) + + wg.Add(1) + go func(m *mapSlice, keys []wire.OutPoint) { + defer wg.Done() + for i := 0; i < 10000; i++ { + m.get(keys[i]) + } + }(&ms, test.keys) + + wg.Add(1) + go func(m *mapSlice, keys []wire.OutPoint) { + defer wg.Done() + for i := 0; i < 5000; i++ { + m.delete(keys[i]) + } + }(&ms, test.keys) + + wg.Wait() + } +} + +// getValidP2PKHScript returns a valid P2PKH script. Useful as unspendables cannot be +// added to the cache. +func getValidP2PKHScript() []byte { + validP2PKHScript := []byte{ + // OP_DUP + 0x76, + // OP_HASH160 + 0xa9, + // OP_DATA_20 + 0x14, + // <20-byte pubkey hash> + 0xf0, 0x7a, 0xb8, 0xce, 0x72, 0xda, 0x4e, 0x76, + 0x0b, 0x74, 0x7d, 0x48, 0xd6, 0x65, 0xec, 0x96, + 0xad, 0xf0, 0x24, 0xf5, + // OP_EQUALVERIFY + 0x88, + // OP_CHECKSIG + 0xac, + } + return validP2PKHScript +} + +// outpointFromInt generates an outpoint from an int by hashing the int and making +// the given int the index. +func outpointFromInt(i int) wire.OutPoint { + // Boilerplate to create an outpoint. + var buf [4]byte + binary.BigEndian.PutUint32(buf[:], uint32(i)) + hash := sha256.Sum256(buf[:]) + return wire.OutPoint{Hash: hash, Index: uint32(i)} +} + +func TestUtxoCacheEntrySize(t *testing.T) { + type block struct { + txOuts []*wire.TxOut + outOps []wire.OutPoint + txIns []*wire.TxIn + } + tests := []struct { + name string + blocks []block + expectedSize uint64 + }{ + { + name: "one entry", + blocks: func() []block { + return []block{ + { + txOuts: []*wire.TxOut{ + {Value: 10000, PkScript: getValidP2PKHScript()}, + }, + outOps: []wire.OutPoint{ + outpointFromInt(0), + }, + }, + } + }(), + expectedSize: pubKeyHashLen + baseEntrySize, + }, + { + name: "10 entries, 4 spend", + blocks: func() []block { + blocks := make([]block, 0, 10) + for i := 0; i < 10; i++ { + op := outpointFromInt(i) + + block := block{ + txOuts: []*wire.TxOut{ + {Value: 10000, PkScript: getValidP2PKHScript()}, + }, + outOps: []wire.OutPoint{ + op, + }, + } + + // Spend all outs in blocks less than 4. + if i < 4 { + block.txIns = []*wire.TxIn{ + {PreviousOutPoint: op}, + } + } + + blocks = append(blocks, block) + } + return blocks + }(), + // Multiplied by 6 since we'll have 6 entries left. + expectedSize: (pubKeyHashLen + baseEntrySize) * 6, + }, + { + name: "spend everything", + blocks: func() []block { + blocks := make([]block, 0, 500) + for i := 0; i < 500; i++ { + op := outpointFromInt(i) + + block := block{ + txOuts: []*wire.TxOut{ + {Value: 1000, PkScript: getValidP2PKHScript()}, + }, + outOps: []wire.OutPoint{ + op, + }, + } + + // Spend all outs in blocks less than 4. + block.txIns = []*wire.TxIn{ + {PreviousOutPoint: op}, + } + + blocks = append(blocks, block) + } + return blocks + }(), + expectedSize: 0, + }, + } + + for _, test := range tests { + // Size is just something big enough so that the mapslice doesn't + // run out of memory. + s := newUtxoCache(nil, 1*1024*1024) + + for height, block := range test.blocks { + for i, out := range block.txOuts { + s.addTxOut(block.outOps[i], out, true, int32(height)) + } + + for _, in := range block.txIns { + s.addTxIn(in, nil) + } + } + + if s.totalEntryMemory != test.expectedSize { + t.Errorf("Failed test %s. Expected size of %d, got %d", + test.name, test.expectedSize, s.totalEntryMemory) + } + } +} + +// assertConsistencyState asserts the utxo consistency states of the blockchain. +func assertConsistencyState(chain *BlockChain, hash *chainhash.Hash) error { + var bytes []byte + err := chain.db.View(func(dbTx database.Tx) (err error) { + bytes = dbFetchUtxoStateConsistency(dbTx) + return + }) + if err != nil { + return fmt.Errorf("Error fetching utxo state consistency: %v", err) + } + actualHash, err := chainhash.NewHash(bytes) + if err != nil { + return err + } + if !actualHash.IsEqual(hash) { + return fmt.Errorf("Unexpected consistency hash: %v instead of %v", + actualHash, hash) + } + + return nil +} + +// assertNbEntriesOnDisk asserts that the total number of utxo entries on the +// disk is equal to the given expected number. +func assertNbEntriesOnDisk(chain *BlockChain, expectedNumber int) error { + var nb int + err := chain.db.View(func(dbTx database.Tx) error { + cursor := dbTx.Metadata().Bucket(utxoSetBucketName).Cursor() + nb = 0 + for b := cursor.First(); b; b = cursor.Next() { + nb++ + _, err := deserializeUtxoEntry(cursor.Value()) + if err != nil { + return fmt.Errorf("Failed to deserialize entry: %v", err) + } + } + return nil + }) + if err != nil { + return fmt.Errorf("Error fetching utxo entries: %v", err) + } + if nb != expectedNumber { + return fmt.Errorf("Expected %d elements in the UTXO set, but found %d", + expectedNumber, nb) + } + + return nil +} + +// utxoCacheTestChain creates a test BlockChain to be used for utxo cache tests. +// It uses the regression test parameters, a coin matutiry of 1 block and sets +// the cache size limit to 10 MiB. +func utxoCacheTestChain(testName string) (*BlockChain, *chaincfg.Params, func()) { + params := chaincfg.RegressionNetParams + chain, tearDown, err := chainSetup(testName, ¶ms) + if err != nil { + panic(fmt.Sprintf("error loading blockchain with database: %v", err)) + } + + chain.TstSetCoinbaseMaturity(1) + chain.utxoCache.maxTotalMemoryUsage = 10 * 1024 * 1024 + chain.utxoCache.cachedEntries.maxTotalMemoryUsage = chain.utxoCache.maxTotalMemoryUsage + + return chain, ¶ms, tearDown +} + +func TestUtxoCacheFlush(t *testing.T) { + chain, params, tearDown := utxoCacheTestChain("TestUtxoCacheFlush") + defer tearDown() + cache := chain.utxoCache + tip := btcutil.NewBlock(params.GenesisBlock) + + // The chainSetup init triggers the consistency status write. + err := assertConsistencyState(chain, params.GenesisHash) + if err != nil { + t.Fatal(err) + } + + err = assertNbEntriesOnDisk(chain, 0) + if err != nil { + t.Fatal(err) + } + + // LastFlushHash starts with genesis. + if cache.lastFlushHash != *params.GenesisHash { + t.Fatalf("lastFlushHash before first flush expected to be "+ + "genesis block hash, instead was %v", cache.lastFlushHash) + } + + // First, add 10 utxos without flushing. + outPoints := make([]wire.OutPoint, 10) + for i := range outPoints { + op := outpointFromInt(i) + outPoints[i] = op + + // Add the txout. + txOut := wire.TxOut{Value: 10000, PkScript: getValidP2PKHScript()} + cache.addTxOut(op, &txOut, true, int32(i)) + } + + if cache.cachedEntries.length() != len(outPoints) { + t.Fatalf("Expected 10 entries, has %d instead", cache.cachedEntries.length()) + } + + // All entries should be fresh and modified. + for _, m := range cache.cachedEntries.maps { + for outpoint, entry := range m { + if entry == nil { + t.Fatalf("Unexpected nil entry found for %v", outpoint) + } + if !entry.isModified() { + t.Fatal("Entry should be marked modified") + } + if !entry.isFresh() { + t.Fatal("Entry should be marked fresh") + } + } + } + + // Spend the last outpoint and pop it off from the outpoints slice. + var spendOp wire.OutPoint + spendOp, outPoints = outPoints[len(outPoints)-1], outPoints[:len(outPoints)-1] + cache.addTxIn(&wire.TxIn{PreviousOutPoint: spendOp}, nil) + + if cache.cachedEntries.length() != len(outPoints) { + t.Fatalf("Expected %d entries, has %d instead", + len(outPoints), cache.cachedEntries.length()) + } + + // Not flushed yet. + err = assertConsistencyState(chain, params.GenesisHash) + if err != nil { + t.Fatal(err) + } + + err = assertNbEntriesOnDisk(chain, 0) + if err != nil { + t.Fatal(err) + } + + // Flush. + err = chain.db.Update(func(dbTx database.Tx) error { + return cache.flush(dbTx, FlushRequired, chain.stateSnapshot) + }) + if err != nil { + t.Fatalf("unexpected error while flushing cache: %v", err) + } + if cache.cachedEntries.length() != 0 { + t.Fatalf("Expected 0 entries, has %d instead", cache.cachedEntries.length()) + } + + err = assertConsistencyState(chain, tip.Hash()) + if err != nil { + t.Fatal(err) + } + err = assertNbEntriesOnDisk(chain, len(outPoints)) + if err != nil { + t.Fatal(err) + } + + // Fetch the flushed utxos. + entries, err := cache.fetchEntries(outPoints) + if err != nil { + t.Fatal(err) + } + + // Check that the returned entries are not marked fresh and modified. + for _, entry := range entries { + if entry.isFresh() { + t.Fatal("Entry should not be marked fresh") + } + if entry.isModified() { + t.Fatal("Entry should not be marked modified") + } + } + + // Check that the fetched entries in the cache are not marked fresh and modified. + for _, m := range cache.cachedEntries.maps { + for outpoint, elem := range m { + if elem == nil { + t.Fatalf("Unexpected nil entry found for %v", outpoint) + } + if elem.isFresh() { + t.Fatal("Entry should not be marked fresh") + } + if elem.isModified() { + t.Fatal("Entry should not be marked modified") + } + } + } + + // Spend 5 utxos. + prevLen := len(outPoints) + for i := 0; i < 5; i++ { + spendOp, outPoints = outPoints[len(outPoints)-1], outPoints[:len(outPoints)-1] + cache.addTxIn(&wire.TxIn{PreviousOutPoint: spendOp}, nil) + } + + // Should still have the entries in cache so they can be flushed to disk. + if cache.cachedEntries.length() != prevLen { + t.Fatalf("Expected 10 entries, has %d instead", cache.cachedEntries.length()) + } + + // Flush. + err = chain.db.Update(func(dbTx database.Tx) error { + return cache.flush(dbTx, FlushRequired, chain.stateSnapshot) + }) + if err != nil { + t.Fatalf("unexpected error while flushing cache: %v", err) + } + if cache.cachedEntries.length() != 0 { + t.Fatalf("Expected 0 entries, has %d instead", cache.cachedEntries.length()) + } + + err = assertConsistencyState(chain, tip.Hash()) + if err != nil { + t.Fatal(err) + } + err = assertNbEntriesOnDisk(chain, len(outPoints)) + if err != nil { + t.Fatal(err) + } + + // Add 5 utxos without flushing and test for periodic flushes. + outPoints1 := make([]wire.OutPoint, 5) + for i := range outPoints1 { + // i + prevLen here to avoid collision since we're just hashing + // the int. + op := outpointFromInt(i + prevLen) + outPoints1[i] = op + + // Add the txout. + txOut := wire.TxOut{Value: 10000, PkScript: getValidP2PKHScript()} + cache.addTxOut(op, &txOut, true, int32(i+prevLen)) + } + if cache.cachedEntries.length() != len(outPoints1) { + t.Fatalf("Expected %d entries, has %d instead", + len(outPoints1), cache.cachedEntries.length()) + } + + // Attempt to flush with flush periodic. Shouldn't flush. + err = chain.db.Update(func(dbTx database.Tx) error { + return cache.flush(dbTx, FlushPeriodic, chain.stateSnapshot) + }) + if err != nil { + t.Fatalf("unexpected error while flushing cache: %v", err) + } + if cache.cachedEntries.length() == 0 { + t.Fatalf("Expected %d entries, has %d instead", + len(outPoints1), cache.cachedEntries.length()) + } + + // Arbitrarily set the last flush time to 6 minutes ago. + cache.lastFlushTime = time.Now().Add(-time.Minute * 6) + + // Attempt to flush with flush periodic. Should flush now. + err = chain.db.Update(func(dbTx database.Tx) error { + return cache.flush(dbTx, FlushPeriodic, chain.stateSnapshot) + }) + if err != nil { + t.Fatalf("unexpected error while flushing cache: %v", err) + } + if cache.cachedEntries.length() != 0 { + t.Fatalf("Expected 0 entries, has %d instead", cache.cachedEntries.length()) + } + + err = assertConsistencyState(chain, tip.Hash()) + if err != nil { + t.Fatal(err) + } + err = assertNbEntriesOnDisk(chain, len(outPoints)+len(outPoints1)) + if err != nil { + t.Fatal(err) + } +} + +func TestFlushNeededAfterPrune(t *testing.T) { + // Construct a synthetic block chain with a block index consisting of + // the following structure. + // genesis -> 1 -> 2 -> ... -> 15 -> 16 -> 17 -> 18 + tip := tstTip + chain := newFakeChain(&chaincfg.MainNetParams) + chain.utxoCache = newUtxoCache(nil, 0) + branchNodes := chainedNodes(chain.bestChain.Genesis(), 18) + for _, node := range branchNodes { + chain.index.SetStatusFlags(node, statusValid) + chain.index.AddNode(node) + } + chain.bestChain.SetTip(tip(branchNodes)) + + tests := []struct { + name string + lastFlushHash chainhash.Hash + delHashes []chainhash.Hash + expected bool + }{ + { + name: "deleted block up to height 9, last flush hash at block 10", + delHashes: func() []chainhash.Hash { + delBlockHashes := make([]chainhash.Hash, 0, 9) + for i := range branchNodes { + if branchNodes[i].height < 10 { + delBlockHashes = append(delBlockHashes, branchNodes[i].hash) + } + } + + return delBlockHashes + }(), + lastFlushHash: func() chainhash.Hash { + // Just some sanity checking to make sure the height is 10. + if branchNodes[9].height != 10 { + panic("was looking for height 10") + } + return branchNodes[9].hash + }(), + expected: false, + }, + { + name: "deleted blocks up to height 10, last flush hash at block 10", + delHashes: func() []chainhash.Hash { + delBlockHashes := make([]chainhash.Hash, 0, 10) + for i := range branchNodes { + if branchNodes[i].height < 11 { + delBlockHashes = append(delBlockHashes, branchNodes[i].hash) + } + } + return delBlockHashes + }(), + lastFlushHash: func() chainhash.Hash { + // Just some sanity checking to make sure the height is 10. + if branchNodes[9].height != 10 { + panic("was looking for height 10") + } + return branchNodes[9].hash + }(), + expected: true, + }, + { + name: "deleted block height 17, last flush hash at block 5", + delHashes: func() []chainhash.Hash { + delBlockHashes := make([]chainhash.Hash, 1) + delBlockHashes[0] = branchNodes[16].hash + // Just some sanity checking to make sure the height is 10. + if branchNodes[16].height != 17 { + panic("was looking for height 17") + } + return delBlockHashes + }(), + lastFlushHash: func() chainhash.Hash { + // Just some sanity checking to make sure the height is 10. + if branchNodes[4].height != 5 { + panic("was looking for height 5") + } + return branchNodes[4].hash + }(), + expected: true, + }, + { + name: "deleted block height 3, last flush hash at block 4", + delHashes: func() []chainhash.Hash { + delBlockHashes := make([]chainhash.Hash, 1) + delBlockHashes[0] = branchNodes[2].hash + // Just some sanity checking to make sure the height is 10. + if branchNodes[2].height != 3 { + panic("was looking for height 3") + } + return delBlockHashes + }(), + lastFlushHash: func() chainhash.Hash { + // Just some sanity checking to make sure the height is 10. + if branchNodes[3].height != 4 { + panic("was looking for height 4") + } + return branchNodes[3].hash + }(), + expected: false, + }, + } + + for _, test := range tests { + chain.utxoCache.lastFlushHash = test.lastFlushHash + got, err := chain.flushNeededAfterPrune(test.delHashes) + if err != nil { + t.Fatal(err) + } + + if got != test.expected { + t.Fatalf("for test %s, expected need flush to return %v but got %v", + test.name, test.expected, got) + } + } +} + +func TestFlushOnPrune(t *testing.T) { + chain, tearDown, err := chainSetup("TestFlushOnPrune", &chaincfg.MainNetParams) + if err != nil { + panic(fmt.Sprintf("error loading blockchain with database: %v", err)) + } + defer tearDown() + + chain.utxoCache.maxTotalMemoryUsage = 10 * 1024 * 1024 + chain.utxoCache.cachedEntries.maxTotalMemoryUsage = chain.utxoCache.maxTotalMemoryUsage + + // Set the maxBlockFileSize and the prune target small so that we can trigger a + // prune to happen. + maxBlockFileSize := uint32(8192) + chain.pruneTarget = uint64(maxBlockFileSize) * 2 + + // Read blocks from the file. + blocks, err := loadBlocks("blk_0_to_14131.dat") + if err != nil { + t.Fatalf("failed to read block from file. %v", err) + } + + syncBlocks := func() { + // Modify block 1 to be a different hash. This is to artificially + // create a stale branch in the chain. + staleMsgBlock := blocks[1].MsgBlock().Copy() + staleMsgBlock.Header.Nonce = 0 + staleBlock := btcutil.NewBlock(staleMsgBlock) + + // Add the stale block here to create a chain view like so. The + // block will be the main chain at first but become stale as we + // keep adding blocks. BFNoPoWCheck is given as the pow check will + // fail. + // + // (genesis block) -> 1 -> 2 -> 3 -> ... + // \-> 1a + _, _, err = chain.ProcessBlock(staleBlock, BFNoPoWCheck) + if err != nil { + t.Fatal(err) + } + + for i, block := range blocks { + if i == 0 { + // Skip the genesis block. + continue + } + _, _, err = chain.ProcessBlock(block, BFNone) + if err != nil { + t.Fatalf("Failed to process block %v(%v). %v", + block.Hash().String(), block.Height(), err) + } + } + } + + // Sync the chain. + ffldb.TstRunWithMaxBlockFileSize(chain.db, maxBlockFileSize, syncBlocks) + + // Function that errors out if the block that should exist doesn't exist. + shouldExist := func(dbTx database.Tx, blockHash *chainhash.Hash) error { + bytes, err := dbTx.FetchBlock(blockHash) + if err != nil { + return err + } + block, err := btcutil.NewBlockFromBytes(bytes) + if err != nil { + return fmt.Errorf("didn't find block %v. %v", blockHash, err) + } + + if !block.Hash().IsEqual(blockHash) { + return fmt.Errorf("expected to find block %v but got %v", + blockHash, block.Hash()) + } + + return nil + } + + // Function that errors out if the block that shouldn't exist exists. + shouldNotExist := func(dbTx database.Tx, blockHash *chainhash.Hash) error { + bytes, err := dbTx.FetchBlock(chaincfg.MainNetParams.GenesisHash) + if err == nil { + return fmt.Errorf("expected block %s to be pruned", blockHash.String()) + } + if len(bytes) != 0 { + return fmt.Errorf("expected block %s to be pruned but got %v", + blockHash, bytes) + } + + return nil + } + + // The below code checks that the correct blocks were pruned. + err = chain.db.View(func(dbTx database.Tx) error { + exist := false + for _, block := range blocks { + // Blocks up to the last flush hash should not exist. + // The utxocache is big enough so that it shouldn't flush + // on it being full. It should only flush on prunes. + if block.Hash().IsEqual(&chain.utxoCache.lastFlushHash) { + exist = true + } + + if exist { + err = shouldExist(dbTx, block.Hash()) + if err != nil { + return err + } + } else { + err = shouldNotExist(dbTx, block.Hash()) + if err != nil { + return err + } + } + } + + return nil + }) + if err != nil { + t.Fatal(err) + } +} + +func TestInitConsistentState(t *testing.T) { + // Boilerplate for creating a chain. + dbName := "TestFlushOnPrune" + chain, tearDown, err := chainSetup(dbName, &chaincfg.MainNetParams) + if err != nil { + panic(fmt.Sprintf("error loading blockchain with database: %v", err)) + } + defer tearDown() + chain.utxoCache.maxTotalMemoryUsage = 10 * 1024 * 1024 + chain.utxoCache.cachedEntries.maxTotalMemoryUsage = chain.utxoCache.maxTotalMemoryUsage + + // Read blocks from the file. + blocks, err := loadBlocks("blk_0_to_14131.dat") + if err != nil { + t.Fatalf("failed to read block from file. %v", err) + } + + // Sync up to height 13,000. Flush the utxocache at height 11_000. + cacheFlushHeight := 9000 + initialSyncHeight := 12_000 + for i, block := range blocks { + if i == 0 { + // Skip the genesis block. + continue + } + + isMainChain, _, err := chain.ProcessBlock(block, BFNone) + if err != nil { + t.Fatal(err) + } + + if !isMainChain { + t.Fatalf("expected block %s to be on the main chain", block.Hash()) + } + + if i == cacheFlushHeight { + err = chain.FlushUtxoCache(FlushRequired) + if err != nil { + t.Fatal(err) + } + } + if i == initialSyncHeight { + break + } + } + + // Sanity check. + if chain.BestSnapshot().Height != int32(initialSyncHeight) { + t.Fatalf("expected the chain to sync up to height %d", initialSyncHeight) + } + + // Close the database without flushing the utxocache. This leaves the + // chaintip at height 13,000 but the utxocache consistent state at 11,000. + err = chain.db.Close() + if err != nil { + t.Fatal(err) + } + chain.db = nil + + // Re-open the database and pass the re-opened db to internal structs. + dbPath := filepath.Join(testDbRoot, dbName) + ndb, err := database.Open(testDbType, dbPath, blockDataNet) + if err != nil { + t.Fatal(err) + } + chain.db = ndb + chain.utxoCache.db = ndb + chain.index.db = ndb + + // Sanity check to see that the utxo cache was flushed before the + // current chain tip. + var statusBytes []byte + ndb.View(func(dbTx database.Tx) error { + statusBytes = dbFetchUtxoStateConsistency(dbTx) + return nil + }) + statusHash, err := chainhash.NewHash(statusBytes) + if err != nil { + t.Fatal(err) + } + if !statusHash.IsEqual(blocks[cacheFlushHeight].Hash()) { + t.Fatalf("expected the utxocache to be flushed at "+ + "block hash %s but got %s", + blocks[cacheFlushHeight].Hash(), statusHash) + } + + // Call InitConsistentState. This will make the utxocache catch back + // up to the tip. + err = chain.InitConsistentState(chain.bestChain.tip(), nil) + if err != nil { + t.Fatal(err) + } + + // Sync the reset of the blocks. + for i, block := range blocks { + if i <= initialSyncHeight { + continue + } + isMainChain, _, err := chain.ProcessBlock(block, BFNone) + if err != nil { + t.Fatal(err) + } + + if !isMainChain { + t.Fatalf("expected block %s to be on the main chain", block.Hash()) + } + } + + if chain.BestSnapshot().Height != blocks[len(blocks)-1].Height() { + t.Fatalf("expected the chain to sync up to height %d", + blocks[len(blocks)-1].Height()) + } +} diff --git a/blockchain/utxoviewpoint.go b/blockchain/utxoviewpoint.go index 08005d27a1..f62f4b915f 100644 --- a/blockchain/utxoviewpoint.go +++ b/blockchain/utxoviewpoint.go @@ -7,11 +7,11 @@ package blockchain import ( "fmt" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/database" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) // txoFlags is a bitmask defining additional information and state for a @@ -28,6 +28,13 @@ const ( // tfModified indicates that a txout has been modified since it was // loaded. tfModified + + // tfFresh indicates that the entry is fresh. This means that the parent + // view never saw this entry. Note that tfFresh is a performance + // optimization with which we can erase entries that are fully spent if we + // know we do not need to commit them. It is always safe to not mark + // tfFresh if that condition is not guaranteed. + tfFresh ) // UtxoEntry houses details about an individual transaction output in a utxo @@ -58,6 +65,22 @@ func (entry *UtxoEntry) isModified() bool { return entry.packedFlags&tfModified == tfModified } +// isFresh returns whether or not it's certain the output has never previously +// been stored in the database. +func (entry *UtxoEntry) isFresh() bool { + return entry.packedFlags&tfFresh == tfFresh +} + +// memoryUsage returns the memory usage in bytes of for the utxo entry. +// It returns 0 for a nil entry. +func (entry *UtxoEntry) memoryUsage() uint64 { + if entry == nil { + return 0 + } + + return baseEntrySize + uint64(cap(entry.pkScript)) +} + // IsCoinBase returns whether or not the output was contained in a coinbase // transaction. func (entry *UtxoEntry) IsCoinBase() bool { @@ -111,6 +134,22 @@ func (entry *UtxoEntry) Clone() *UtxoEntry { } } +// NewUtxoEntry returns a new UtxoEntry built from the arguments. +func NewUtxoEntry( + txOut *wire.TxOut, blockHeight int32, isCoinbase bool) *UtxoEntry { + var cbFlag txoFlags + if isCoinbase { + cbFlag |= tfCoinBase + } + + return &UtxoEntry{ + amount: txOut.Value, + pkScript: txOut.PkScript, + blockHeight: blockHeight, + packedFlags: cbFlag, + } +} + // UtxoViewpoint represents a view into the set of unspent transaction outputs // from a specific point of view in the chain. For example, it could be for // the end of the main chain, some point in the history of the main chain, or @@ -124,13 +163,13 @@ type UtxoViewpoint struct { } // BestHash returns the hash of the best block in the chain the view currently -// respresents. +// represents. func (view *UtxoViewpoint) BestHash() *chainhash.Hash { return &view.bestHash } // SetBestHash sets the hash of the best block in the chain the view currently -// respresents. +// represents. func (view *UtxoViewpoint) SetBestHash(hash *chainhash.Hash) { view.bestHash = *hash } @@ -143,6 +182,23 @@ func (view *UtxoViewpoint) LookupEntry(outpoint wire.OutPoint) *UtxoEntry { return view.entries[outpoint] } +// FetchPrevOutput fetches the previous output referenced by the passed +// outpoint. This is identical to the LookupEntry method, but it returns a +// wire.TxOut instead. +// +// NOTE: This is an implementation of the txscript.PrevOutputFetcher interface. +func (view *UtxoViewpoint) FetchPrevOutput(op wire.OutPoint) *wire.TxOut { + prevOut := view.entries[op] + if prevOut == nil { + return nil + } + + return &wire.TxOut{ + Value: prevOut.amount, + PkScript: prevOut.PkScript(), + } +} + // addTxOut adds the specified output to the view if it is not provably // unspendable. When the view already has an entry for the output, it will be // marked unspent. All fields will be updated for existing entries since it's @@ -166,7 +222,7 @@ func (view *UtxoViewpoint) addTxOut(outpoint wire.OutPoint, txOut *wire.TxOut, i entry.amount = txOut.Value entry.pkScript = txOut.PkScript entry.blockHeight = blockHeight - entry.packedFlags = tfModified + entry.packedFlags = tfFresh | tfModified if isCoinBase { entry.packedFlags |= tfCoinBase } @@ -463,70 +519,68 @@ func (view *UtxoViewpoint) commit() { } } -// fetchUtxosMain fetches unspent transaction output data about the provided +// fetchUtxosFromCache fetches unspent transaction output data about the provided // set of outpoints from the point of view of the end of the main chain at the -// time of the call. +// time of the call. It attempts to fetch them from the cache and whatever entries +// that were not in the cache will be attempted to be fetched from the database and +// it'll be cached. // // Upon completion of this function, the view will contain an entry for each // requested outpoint. Spent outputs, or those which otherwise don't exist, // will result in a nil entry in the view. -func (view *UtxoViewpoint) fetchUtxosMain(db database.DB, outpoints map[wire.OutPoint]struct{}) error { +func (view *UtxoViewpoint) fetchUtxosFromCache(cache *utxoCache, outpoints []wire.OutPoint) error { // Nothing to do if there are no requested outputs. if len(outpoints) == 0 { return nil } // Load the requested set of unspent transaction outputs from the point - // of view of the end of the main chain. + // of view of the end of the main chain. Any missing entries will be + // fetched from the database and be cached. // // NOTE: Missing entries are not considered an error here and instead // will result in nil entries in the view. This is intentionally done // so other code can use the presence of an entry in the store as a way // to unnecessarily avoid attempting to reload it from the database. - return db.View(func(dbTx database.Tx) error { - for outpoint := range outpoints { - entry, err := dbFetchUtxoEntry(dbTx, outpoint) - if err != nil { - return err - } - - view.entries[outpoint] = entry - } - - return nil - }) + entries, err := cache.fetchEntries(outpoints) + if err != nil { + return err + } + for i, entry := range entries { + view.entries[outpoints[i]] = entry.Clone() + } + return nil } // fetchUtxos loads the unspent transaction outputs for the provided set of // outputs into the view from the database as needed unless they already exist // in the view in which case they are ignored. -func (view *UtxoViewpoint) fetchUtxos(db database.DB, outpoints map[wire.OutPoint]struct{}) error { +func (view *UtxoViewpoint) fetchUtxos(cache *utxoCache, outpoints []wire.OutPoint) error { // Nothing to do if there are no requested outputs. if len(outpoints) == 0 { return nil } // Filter entries that are already in the view. - neededSet := make(map[wire.OutPoint]struct{}) - for outpoint := range outpoints { + needed := make([]wire.OutPoint, 0, len(outpoints)) + for i := range outpoints { // Already loaded into the current view. - if _, ok := view.entries[outpoint]; ok { + if _, ok := view.entries[outpoints[i]]; ok { continue } - neededSet[outpoint] = struct{}{} + needed = append(needed, outpoints[i]) } // Request the input utxos from the database. - return view.fetchUtxosMain(db, neededSet) + return view.fetchUtxosFromCache(cache, needed) } -// fetchInputUtxos loads the unspent transaction outputs for the inputs -// referenced by the transactions in the given block into the view from the -// database as needed. In particular, referenced entries that are earlier in -// the block are added to the view and entries that are already in the view are -// not modified. -func (view *UtxoViewpoint) fetchInputUtxos(db database.DB, block *btcutil.Block) error { +// findInputsToFetch goes through all the blocks and returns all the outpoints of +// the entries that need to be fetched in order to validate the block. Outpoints +// for the entries that are already in the block are not included in the returned +// outpoints. +func (view *UtxoViewpoint) findInputsToFetch(block *btcutil.Block) []wire.OutPoint { // Build a map of in-flight transactions because some of the inputs in // this block could be referencing other transactions earlier in this // block which are not yet in the chain. @@ -539,7 +593,7 @@ func (view *UtxoViewpoint) fetchInputUtxos(db database.DB, block *btcutil.Block) // Loop through all of the transaction inputs (except for the coinbase // which has no inputs) collecting them into sets of what is needed and // what is already known (in-flight). - neededSet := make(map[wire.OutPoint]struct{}) + needed := make([]wire.OutPoint, 0, len(transactions)) for i, tx := range transactions[1:] { for _, txIn := range tx.MsgTx().TxIn { // It is acceptable for a transaction input to reference @@ -568,12 +622,20 @@ func (view *UtxoViewpoint) fetchInputUtxos(db database.DB, block *btcutil.Block) continue } - neededSet[txIn.PreviousOutPoint] = struct{}{} + needed = append(needed, txIn.PreviousOutPoint) } } - // Request the input utxos from the database. - return view.fetchUtxosMain(db, neededSet) + return needed +} + +// fetchInputUtxos loads the unspent transaction outputs for the inputs +// referenced by the transactions in the given block into the view from the +// cache as needed. In particular, referenced entries that are earlier in +// the block are added to the view and entries that are already in the view +// are not modified. +func (view *UtxoViewpoint) fetchInputUtxos(cache *utxoCache, block *btcutil.Block) error { + return view.fetchUtxosFromCache(cache, view.findInputsToFetch(block)) } // NewUtxoViewpoint returns a new empty unspent transaction output view. @@ -593,15 +655,19 @@ func (b *BlockChain) FetchUtxoView(tx *btcutil.Tx) (*UtxoViewpoint, error) { // Create a set of needed outputs based on those referenced by the // inputs of the passed transaction and the outputs of the transaction // itself. - neededSet := make(map[wire.OutPoint]struct{}) + neededLen := len(tx.MsgTx().TxOut) + if !IsCoinBase(tx) { + neededLen += len(tx.MsgTx().TxIn) + } + needed := make([]wire.OutPoint, 0, neededLen) prevOut := wire.OutPoint{Hash: *tx.Hash()} for txOutIdx := range tx.MsgTx().TxOut { prevOut.Index = uint32(txOutIdx) - neededSet[prevOut] = struct{}{} + needed = append(needed, prevOut) } if !IsCoinBase(tx) { for _, txIn := range tx.MsgTx().TxIn { - neededSet[txIn.PreviousOutPoint] = struct{}{} + needed = append(needed, txIn.PreviousOutPoint) } } @@ -609,7 +675,7 @@ func (b *BlockChain) FetchUtxoView(tx *btcutil.Tx) (*UtxoViewpoint, error) { // chain. view := NewUtxoViewpoint() b.chainLock.RLock() - err := view.fetchUtxosMain(b.db, neededSet) + err := view.fetchUtxosFromCache(b.utxoCache, needed) b.chainLock.RUnlock() return view, err } @@ -628,15 +694,10 @@ func (b *BlockChain) FetchUtxoEntry(outpoint wire.OutPoint) (*UtxoEntry, error) b.chainLock.RLock() defer b.chainLock.RUnlock() - var entry *UtxoEntry - err := b.db.View(func(dbTx database.Tx) error { - var err error - entry, err = dbFetchUtxoEntry(dbTx, outpoint) - return err - }) + entries, err := b.utxoCache.fetchEntries([]wire.OutPoint{outpoint}) if err != nil { return nil, err } - return entry, nil + return entries[0], nil } diff --git a/blockchain/validate.go b/blockchain/validate.go index b971337fb5..5e24405ef9 100644 --- a/blockchain/validate.go +++ b/blockchain/validate.go @@ -5,17 +5,18 @@ package blockchain import ( + "bytes" "encoding/binary" "fmt" "math" "math/big" "time" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) const ( @@ -41,6 +42,10 @@ const ( // baseSubsidy is the starting subsidy amount for mined blocks. This // value is halved every SubsidyHalvingInterval blocks. baseSubsidy = 50 * btcutil.SatoshiPerBitcoin + + // coinbaseHeightAllocSize is the amount of bytes that the + // ScriptBuilder will allocate when validating the coinbase height. + coinbaseHeightAllocSize = 5 ) var ( @@ -238,9 +243,9 @@ func CheckTransactionSanity(tx *btcutil.Tx) error { return ruleError(ErrBadTxOutValue, str) } if satoshi > btcutil.MaxSatoshi { - str := fmt.Sprintf("transaction output value of %v is "+ - "higher than max allowed value of %v", satoshi, - btcutil.MaxSatoshi) + str := fmt.Sprintf("transaction output value is "+ + "higher than max allowed value: %v > %v ", + satoshi, btcutil.MaxSatoshi) return ruleError(ErrBadTxOutValue, str) } @@ -302,8 +307,8 @@ func CheckTransactionSanity(tx *btcutil.Tx) error { // target difficulty as claimed. // // The flags modify the behavior of this function as follows: -// - BFNoPoWCheck: The check to ensure the block hash is less than the target -// difficulty is not performed. +// - BFNoPoWCheck: The check to ensure the block hash is less than the target +// difficulty is not performed. func checkProofOfWork(header *wire.BlockHeader, powLimit *big.Int, flags BehaviorFlags) error { // The target difficulty must be larger than zero. target := CompactToBig(header.Bits) @@ -421,13 +426,15 @@ func CountP2SHSigOps(tx *btcutil.Tx, isCoinBaseTx bool, utxoView *UtxoViewpoint) return totalSigOps, nil } -// checkBlockHeaderSanity performs some preliminary checks on a block header to +// CheckBlockHeaderSanity performs some preliminary checks on a block header to // ensure it is sane before continuing with processing. These checks are // context free. // // The flags do not modify the behavior of this function directly, however they // are needed to pass along to checkProofOfWork. -func checkBlockHeaderSanity(header *wire.BlockHeader, powLimit *big.Int, timeSource MedianTimeSource, flags BehaviorFlags) error { +func CheckBlockHeaderSanity(header *wire.BlockHeader, powLimit *big.Int, + timeSource MedianTimeSource, flags BehaviorFlags) error { + // Ensure the proof of work bits in the block header is in min/max range // and the block hash is less than the target value described by the // bits. @@ -467,7 +474,7 @@ func checkBlockHeaderSanity(header *wire.BlockHeader, powLimit *big.Int, timeSou func checkBlockSanity(block *btcutil.Block, powLimit *big.Int, timeSource MedianTimeSource, flags BehaviorFlags) error { msgBlock := block.MsgBlock() header := &msgBlock.Header - err := checkBlockHeaderSanity(header, powLimit, timeSource, flags) + err := CheckBlockHeaderSanity(header, powLimit, timeSource, flags) if err != nil { return err } @@ -527,12 +534,11 @@ func checkBlockSanity(block *btcutil.Block, powLimit *big.Int, timeSource Median // checks. Bitcoind builds the tree here and checks the merkle root // after the following checks, but there is no reason not to check the // merkle root matches here. - merkles := BuildMerkleTreeStore(block.Transactions(), false) - calculatedMerkleRoot := merkles[len(merkles)-1] - if !header.MerkleRoot.IsEqual(calculatedMerkleRoot) { + calcMerkleRoot := CalcMerkleRoot(block.Transactions(), false) + if !header.MerkleRoot.IsEqual(&calcMerkleRoot) { str := fmt.Sprintf("block merkle root is invalid - block "+ "header indicates %v, but calculated value is %v", - header.MerkleRoot, calculatedMerkleRoot) + header.MerkleRoot, calcMerkleRoot) return ruleError(ErrBadMerkleRoot, str) } @@ -609,16 +615,25 @@ func ExtractCoinbaseHeight(coinbaseTx *btcutil.Tx) (int32, error) { return 0, ruleError(ErrMissingCoinbaseHeight, str) } - serializedHeightBytes := make([]byte, 8) - copy(serializedHeightBytes, sigScript[1:serializedLen+1]) - serializedHeight := binary.LittleEndian.Uint64(serializedHeightBytes) + // We use 4 bytes here since it saves us allocations. We use a stack + // allocation rather than a heap allocation here. + var serializedHeightBytes [4]byte + copy(serializedHeightBytes[:], sigScript[1:serializedLen+1]) + + serializedHeight := int32( + binary.LittleEndian.Uint32(serializedHeightBytes[:]), + ) + + if err := compareScript(serializedHeight, sigScript); err != nil { + return 0, err + } - return int32(serializedHeight), nil + return serializedHeight, nil } -// checkSerializedHeight checks if the signature script in the passed +// CheckSerializedHeight checks if the signature script in the passed // transaction starts with the serialized block height of wantHeight. -func checkSerializedHeight(coinbaseTx *btcutil.Tx, wantHeight int32) error { +func CheckSerializedHeight(coinbaseTx *btcutil.Tx, wantHeight int32) error { serializedHeight, err := ExtractCoinbaseHeight(coinbaseTx) if err != nil { return err @@ -633,22 +648,50 @@ func checkSerializedHeight(coinbaseTx *btcutil.Tx, wantHeight int32) error { return nil } -// checkBlockHeaderContext performs several validation checks on the block header +func compareScript(height int32, script []byte) error { + scriptBuilder := txscript.NewScriptBuilder( + txscript.WithScriptAllocSize(coinbaseHeightAllocSize), + ) + scriptHeight, err := scriptBuilder.AddInt64( + int64(height), + ).Script() + if err != nil { + return err + } + + if !bytes.HasPrefix(script, scriptHeight) { + str := fmt.Sprintf("the coinbase signature script does not "+ + "minimally encode the height %d", height) + return ruleError(ErrBadCoinbaseHeight, str) + } + + return nil +} + +// CheckBlockHeaderContext performs several validation checks on the block header // which depend on its position within the block chain. // // The flags modify the behavior of this function as follows: -// - BFFastAdd: All checks except those involving comparing the header against -// the checkpoints are not performed. +// - BFFastAdd: All checks except those involving comparing the header against +// the checkpoints are not performed. +// +// The skipCheckpoint boolean is used so that libraries can skip the checkpoint +// sanity checks. // // This function MUST be called with the chain state lock held (for writes). -func (b *BlockChain) checkBlockHeaderContext(header *wire.BlockHeader, prevNode *blockNode, flags BehaviorFlags) error { +// NOTE: Ignore the above lock requirement if this function is not passed a +// *Blockchain instance as the ChainCtx argument. +func CheckBlockHeaderContext(header *wire.BlockHeader, prevNode HeaderCtx, + flags BehaviorFlags, c ChainCtx, skipCheckpoint bool) error { + fastAdd := flags&BFFastAdd == BFFastAdd if !fastAdd { // Ensure the difficulty specified in the block header matches // the calculated difficulty based on the previous block and // difficulty retarget rules. - expectedDifficulty, err := b.calcNextRequiredDifficulty(prevNode, - header.Timestamp) + expectedDifficulty, err := calcNextRequiredDifficulty( + prevNode, header.Timestamp, c, + ) if err != nil { return err } @@ -661,7 +704,7 @@ func (b *BlockChain) checkBlockHeaderContext(header *wire.BlockHeader, prevNode // Ensure the timestamp for the block header is after the // median time of the last several blocks (medianTimeBlocks). - medianTime := prevNode.CalcPastMedianTime() + medianTime := CalcPastMedianTime(prevNode) if !header.Timestamp.After(medianTime) { str := "block timestamp of %v is not after expected %v" str = fmt.Sprintf(str, header.Timestamp, medianTime) @@ -671,11 +714,30 @@ func (b *BlockChain) checkBlockHeaderContext(header *wire.BlockHeader, prevNode // The height of this block is one more than the referenced previous // block. - blockHeight := prevNode.height + 1 + blockHeight := prevNode.Height() + 1 + + // Reject outdated block versions once a majority of the network + // has upgraded. These were originally voted on by BIP0034, + // BIP0065, and BIP0066. + params := c.ChainParams() + if header.Version < 2 && blockHeight >= params.BIP0034Height || + header.Version < 3 && blockHeight >= params.BIP0066Height || + header.Version < 4 && blockHeight >= params.BIP0065Height { + + str := "new blocks with version %d are no longer valid" + str = fmt.Sprintf(str, header.Version) + return ruleError(ErrBlockVersionTooOld, str) + } + + if skipCheckpoint { + // If the caller wants us to skip the checkpoint checks, we'll + // return early. + return nil + } // Ensure chain matches up to predetermined checkpoints. blockHash := header.BlockHash() - if !b.verifyCheckpoint(blockHeight, &blockHash) { + if !c.VerifyCheckpoint(blockHeight, &blockHash) { str := fmt.Sprintf("block at height %d does not match "+ "checkpoint hash", blockHeight) return ruleError(ErrBadCheckpoint, str) @@ -685,39 +747,26 @@ func (b *BlockChain) checkBlockHeaderContext(header *wire.BlockHeader, prevNode // chain before it. This prevents storage of new, otherwise valid, // blocks which build off of old blocks that are likely at a much easier // difficulty and therefore could be used to waste cache and disk space. - checkpointNode, err := b.findPreviousCheckpoint() + checkpointNode, err := c.FindPreviousCheckpoint() if err != nil { return err } - if checkpointNode != nil && blockHeight < checkpointNode.height { + if checkpointNode != nil && blockHeight < checkpointNode.Height() { str := fmt.Sprintf("block at height %d forks the main chain "+ "before the previous checkpoint at height %d", - blockHeight, checkpointNode.height) + blockHeight, checkpointNode.Height()) return ruleError(ErrForkTooOld, str) } - // Reject outdated block versions once a majority of the network - // has upgraded. These were originally voted on by BIP0034, - // BIP0065, and BIP0066. - params := b.chainParams - if header.Version < 2 && blockHeight >= params.BIP0034Height || - header.Version < 3 && blockHeight >= params.BIP0066Height || - header.Version < 4 && blockHeight >= params.BIP0065Height { - - str := "new blocks with version %d are no longer valid" - str = fmt.Sprintf(str, header.Version) - return ruleError(ErrBlockVersionTooOld, str) - } - return nil } -// checkBlockContext peforms several validation checks on the block which depend +// checkBlockContext performs several validation checks on the block which depend // on its position within the block chain. // // The flags modify the behavior of this function as follows: -// - BFFastAdd: The transaction are not checked to see if they are finalized -// and the somewhat expensive BIP0034 validation is not performed. +// - BFFastAdd: The transaction are not checked to see if they are finalized +// and the somewhat expensive BIP0034 validation is not performed. // // The flags are also passed to checkBlockHeaderContext. See its documentation // for how the flags modify its behavior. @@ -726,7 +775,7 @@ func (b *BlockChain) checkBlockHeaderContext(header *wire.BlockHeader, prevNode func (b *BlockChain) checkBlockContext(block *btcutil.Block, prevNode *blockNode, flags BehaviorFlags) error { // Perform all block header related validation checks. header := &block.MsgBlock().Header - err := b.checkBlockHeaderContext(header, prevNode, flags) + err := CheckBlockHeaderContext(header, prevNode, flags, b, false) if err != nil { return err } @@ -746,7 +795,7 @@ func (b *BlockChain) checkBlockContext(block *btcutil.Block, prevNode *blockNode // timestamps for all lock-time based checks. blockTime := header.Timestamp if csvState == ThresholdActive { - blockTime = prevNode.CalcPastMedianTime() + blockTime = CalcPastMedianTime(prevNode) } // The height of this block is one more than the referenced @@ -772,7 +821,7 @@ func (b *BlockChain) checkBlockContext(block *btcutil.Block, prevNode *blockNode blockHeight >= b.chainParams.BIP0034Height { coinbaseTx := block.Transactions()[0] - err := checkSerializedHeight(coinbaseTx, blockHeight) + err := CheckSerializedHeight(coinbaseTx, blockHeight) if err != nil { return err } @@ -830,24 +879,24 @@ func (b *BlockChain) checkBlockContext(block *btcutil.Block, prevNode *blockNode // // This function MUST be called with the chain state lock held (for reads). func (b *BlockChain) checkBIP0030(node *blockNode, block *btcutil.Block, view *UtxoViewpoint) error { - // Fetch utxos for all of the transaction ouputs in this block. + // Fetch utxos for all of the transaction outputs in this block. // Typically, there will not be any utxos for any of the outputs. - fetchSet := make(map[wire.OutPoint]struct{}) + fetch := make([]wire.OutPoint, 0, len(block.Transactions())) for _, tx := range block.Transactions() { prevOut := wire.OutPoint{Hash: *tx.Hash()} for txOutIdx := range tx.MsgTx().TxOut { prevOut.Index = uint32(txOutIdx) - fetchSet[prevOut] = struct{}{} + fetch = append(fetch, prevOut) } } - err := view.fetchUtxos(b.db, fetchSet) + err := view.fetchUtxos(b.utxoCache, fetch) if err != nil { return err } // Duplicate transactions are only allowed if the previous transaction // is fully spent. - for outpoint := range fetchSet { + for _, outpoint := range fetch { utxo := view.LookupEntry(outpoint) if utxo != nil && !utxo.IsSpent() { str := fmt.Sprintf("tried to overwrite transaction %v "+ @@ -877,7 +926,6 @@ func CheckTransactionInputs(tx *btcutil.Tx, txHeight int32, utxoView *UtxoViewpo return 0, nil } - txHash := tx.Hash() var totalSatoshiIn int64 for txInIndex, txIn := range tx.MsgTx().TxIn { // Ensure the referenced input transaction is available. @@ -920,8 +968,8 @@ func CheckTransactionInputs(tx *btcutil.Tx, txHeight int32, utxoView *UtxoViewpo return 0, ruleError(ErrBadTxOutValue, str) } if originTxSatoshi > btcutil.MaxSatoshi { - str := fmt.Sprintf("transaction output value of %v is "+ - "higher than max allowed value of %v", + str := fmt.Sprintf("transaction output value is "+ + "higher than max allowed value: %v > %v ", btcutil.Amount(originTxSatoshi), btcutil.MaxSatoshi) return 0, ruleError(ErrBadTxOutValue, str) @@ -954,7 +1002,7 @@ func CheckTransactionInputs(tx *btcutil.Tx, txHeight int32, utxoView *UtxoViewpo if totalSatoshiIn < totalSatoshiOut { str := fmt.Sprintf("total value of all transaction inputs for "+ "transaction %v is %v which is less than the amount "+ - "spent of %v", txHash, totalSatoshiIn, totalSatoshiOut) + "spent of %v", tx.Hash(), totalSatoshiIn, totalSatoshiOut) return 0, ruleError(ErrSpendTooHigh, str) } @@ -1032,11 +1080,11 @@ func (b *BlockChain) checkConnectBlock(node *blockNode, block *btcutil.Block, vi } // Load all of the utxos referenced by the inputs for all transactions - // in the block don't already exist in the utxo view from the database. + // in the block don't already exist in the utxo view from the cache. // // These utxo entries are needed for verification of things such as // transaction inputs, counting pay-to-script-hashes, and scripts. - err := view.fetchInputUtxos(b.db, block) + err := view.fetchInputUtxos(b.utxoCache, block) if err != nil { return err } @@ -1187,7 +1235,7 @@ func (b *BlockChain) checkConnectBlock(node *blockNode, block *btcutil.Block, vi // We obtain the MTP of the *previous* block in order to // determine if transactions in the current block are final. - medianTime := node.parent.CalcPastMedianTime() + medianTime := CalcPastMedianTime(node.parent) // Additionally, if the CSV soft-fork package is now active, // then we also enforce the relative sequence number based @@ -1219,6 +1267,18 @@ func (b *BlockChain) checkConnectBlock(node *blockNode, block *btcutil.Block, vi scriptFlags |= txscript.ScriptStrictMultiSig } + // Before we execute the main scripts, we'll also check to see if + // taproot is active or not. + taprootState, err := b.deploymentState( + node.parent, chaincfg.DeploymentTaproot, + ) + if err != nil { + return err + } + if taprootState == ThresholdActive { + scriptFlags |= txscript.ScriptVerifyTaproot + } + // Now that the inexpensive checks are done and have passed, verify the // transactions are actually allowed to spend the coins by running the // expensive ECDSA signature check scripts. Doing this last helps @@ -1277,3 +1337,68 @@ func (b *BlockChain) CheckConnectBlockTemplate(block *btcutil.Block) error { newNode := newBlockNode(&header, tip) return b.checkConnectBlock(newNode, block, view, nil) } + +// ChainParams returns the Blockchain's configured chaincfg.Params. +// +// NOTE: Part of the ChainCtx interface. +func (b *BlockChain) ChainParams() *chaincfg.Params { + return b.chainParams +} + +// BlocksPerRetarget returns the number of blocks before retargeting occurs. +// +// NOTE: Part of the ChainCtx interface. +func (b *BlockChain) BlocksPerRetarget() int32 { + return b.blocksPerRetarget +} + +// MinRetargetTimespan returns the minimum amount of time to use in the +// difficulty calculation. +// +// NOTE: Part of the ChainCtx interface. +func (b *BlockChain) MinRetargetTimespan() int64 { + return b.minRetargetTimespan +} + +// MaxRetargetTimespan returns the maximum amount of time to use in the +// difficulty calculation. +// +// NOTE: Part of the ChainCtx interface. +func (b *BlockChain) MaxRetargetTimespan() int64 { + return b.maxRetargetTimespan +} + +// VerifyCheckpoint checks that the height and hash match the stored +// checkpoints. +// +// NOTE: Part of the ChainCtx interface. +func (b *BlockChain) VerifyCheckpoint(height int32, + hash *chainhash.Hash) bool { + + return b.verifyCheckpoint(height, hash) +} + +// FindPreviousCheckpoint finds the checkpoint we've encountered during +// validation. +// +// NOTE: Part of the ChainCtx interface. +func (b *BlockChain) FindPreviousCheckpoint() (HeaderCtx, error) { + checkpoint, err := b.findPreviousCheckpoint() + if err != nil { + return nil, err + } + + if checkpoint == nil { + // This check is necessary because if we just return the nil + // blockNode as a HeaderCtx, a caller performing a nil-check + // will fail. This is a quirk of go where a nil value stored in + // an interface is different from the actual nil interface. + return nil, nil + } + + return checkpoint, err +} + +// A compile-time assertion to ensure BlockChain implements the ChainCtx +// interface. +var _ ChainCtx = (*BlockChain)(nil) diff --git a/blockchain/validate_test.go b/blockchain/validate_test.go index 9bf2ff42e8..ddd59130c1 100644 --- a/blockchain/validate_test.go +++ b/blockchain/validate_test.go @@ -10,10 +10,10 @@ import ( "testing" "time" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) // TestSequenceLocksActive tests the SequenceLockActive function to ensure it @@ -169,7 +169,7 @@ func TestCheckBlockSanity(t *testing.T) { } } -// TestCheckSerializedHeight tests the checkSerializedHeight function with +// TestCheckSerializedHeight tests the CheckSerializedHeight function with // various serialized heights and also does negative tests to ensure errors // and handled properly. func TestCheckSerializedHeight(t *testing.T) { @@ -215,9 +215,9 @@ func TestCheckSerializedHeight(t *testing.T) { msgTx.TxIn[0].SignatureScript = test.sigScript tx := btcutil.NewTx(msgTx) - err := checkSerializedHeight(tx, test.wantHeight) + err := CheckSerializedHeight(tx, test.wantHeight) if reflect.TypeOf(err) != reflect.TypeOf(test.err) { - t.Errorf("checkSerializedHeight #%d wrong error type "+ + t.Errorf("CheckSerializedHeight #%d wrong error type "+ "got: %v <%T>, want: %T", i, err, err, test.err) continue } @@ -225,7 +225,7 @@ func TestCheckSerializedHeight(t *testing.T) { if rerr, ok := err.(RuleError); ok { trerr := test.err.(RuleError) if rerr.ErrorCode != trerr.ErrorCode { - t.Errorf("checkSerializedHeight #%d wrong "+ + t.Errorf("CheckSerializedHeight #%d wrong "+ "error code got: %v, want: %v", i, rerr.ErrorCode, trerr.ErrorCode) continue diff --git a/blockchain/versionbits.go b/blockchain/versionbits.go index ef2a080257..371d4f20e0 100644 --- a/blockchain/versionbits.go +++ b/blockchain/versionbits.go @@ -5,8 +5,6 @@ package blockchain import ( - "math" - "github.com/btcsuite/btcd/chaincfg" ) @@ -26,15 +24,6 @@ const ( // vbNumBits is the total number of bits available for use with the // version bits scheme. vbNumBits = 29 - - // unknownVerNumToCheck is the number of previous blocks to consider - // when checking for a threshold of unknown block versions for the - // purposes of warning the user. - unknownVerNumToCheck = 100 - - // unknownVerWarnNum is the threshold of previous blocks that have an - // unknown version to use for the purposes of warning the user. - unknownVerWarnNum = unknownVerNumToCheck / 2 ) // bitConditionChecker provides a thresholdConditionChecker which can be used to @@ -51,27 +40,26 @@ type bitConditionChecker struct { // interface. var _ thresholdConditionChecker = bitConditionChecker{} -// BeginTime returns the unix timestamp for the median block time after which -// voting on a rule change starts (at the next window). +// HasStarted returns true if based on the passed block blockNode the consensus +// is eligible for deployment. // -// Since this implementation checks for unknown rules, it returns 0 so the rule +// Since this implementation checks for unknown rules, it returns true so // is always treated as active. // // This is part of the thresholdConditionChecker interface implementation. -func (c bitConditionChecker) BeginTime() uint64 { - return 0 +func (c bitConditionChecker) HasStarted(_ *blockNode) bool { + return true } -// EndTime returns the unix timestamp for the median block time after which an -// attempted rule change fails if it has not already been locked in or -// activated. +// HasStarted returns true if based on the passed block blockNode the consensus +// is eligible for deployment. // -// Since this implementation checks for unknown rules, it returns the maximum -// possible timestamp so the rule is always treated as active. +// Since this implementation checks for unknown rules, it returns false so the +// rule is always treated as active. // // This is part of the thresholdConditionChecker interface implementation. -func (c bitConditionChecker) EndTime() uint64 { - return math.MaxUint64 +func (c bitConditionChecker) HasEnded(_ *blockNode) bool { + return false } // RuleChangeActivationThreshold is the number of blocks for which the condition @@ -120,6 +108,32 @@ func (c bitConditionChecker) Condition(node *blockNode) (bool, error) { return uint32(expectedVersion)&conditionMask == 0, nil } +// EligibleToActivate returns true if a custom deployment can transition from +// the LockedIn to the Active state. For normal deployments, this always +// returns true. However, some deployments add extra rules like a minimum +// activation height, which can be abstracted into a generic arbitrary check at +// the final state via this method. +// +// This implementation always returns true, as it's used to warn about other +// unknown deployments. +// +// This is part of the thresholdConditionChecker interface implementation. +func (c bitConditionChecker) EligibleToActivate(blkNode *blockNode) bool { + return true +} + +// IsSpeedy returns true if this is to be a "speedy" deployment. A speedy +// deployment differs from a regular one in that only after a miner block +// confirmation window can the deployment expire. +// +// This implementation returns false, as we want to always be warned if +// something is about to activate. +// +// This is part of the thresholdConditionChecker interface implementation. +func (c bitConditionChecker) IsSpeedy() bool { + return false +} + // deploymentChecker provides a thresholdConditionChecker which can be used to // test a specific deployment rule. This is required for properly detecting // and activating consensus rule changes. @@ -132,27 +146,36 @@ type deploymentChecker struct { // interface. var _ thresholdConditionChecker = deploymentChecker{} -// BeginTime returns the unix timestamp for the median block time after which -// voting on a rule change starts (at the next window). +// HasEnded returns true if the target consensus rule change has expired +// or timed out (at the next window). // // This implementation returns the value defined by the specific deployment the // checker is associated with. // // This is part of the thresholdConditionChecker interface implementation. -func (c deploymentChecker) BeginTime() uint64 { - return c.deployment.StartTime +func (c deploymentChecker) HasStarted(blkNode *blockNode) bool { + // Can't fail as we make sure to set the clock above when we + // instantiate *BlockChain. + header := blkNode.Header() + started, _ := c.deployment.DeploymentStarter.HasStarted(&header) + + return started } -// EndTime returns the unix timestamp for the median block time after which an -// attempted rule change fails if it has not already been locked in or -// activated. +// HasEnded returns true if the target consensus rule change has expired +// or timed out. // // This implementation returns the value defined by the specific deployment the // checker is associated with. // // This is part of the thresholdConditionChecker interface implementation. -func (c deploymentChecker) EndTime() uint64 { - return c.deployment.ExpireTime +func (c deploymentChecker) HasEnded(blkNode *blockNode) bool { + // Can't fail as we make sure to set the clock above when we + // instantiate *BlockChain. + header := blkNode.Header() + ended, _ := c.deployment.DeploymentEnder.HasEnded(&header) + + return ended } // RuleChangeActivationThreshold is the number of blocks for which the condition @@ -163,6 +186,12 @@ func (c deploymentChecker) EndTime() uint64 { // // This is part of the thresholdConditionChecker interface implementation. func (c deploymentChecker) RuleChangeActivationThreshold() uint32 { + // Some deployments like taproot used a custom activation threshold + // that overrides the network level threshold. + if c.deployment.CustomActivationThreshold != 0 { + return c.deployment.CustomActivationThreshold + } + return c.chain.chainParams.RuleChangeActivationThreshold } @@ -177,6 +206,38 @@ func (c deploymentChecker) MinerConfirmationWindow() uint32 { return c.chain.chainParams.MinerConfirmationWindow } +// EligibleToActivate returns true if a custom deployment can transition from +// the LockedIn to the Active state. For normal deployments, this always +// returns true. However, some deployments add extra rules like a minimum +// activation height, which can be abstracted into a generic arbitrary check at +// the final state via this method. +// +// This implementation always returns true, unless a minimum activation height +// is specified. +// +// This is part of the thresholdConditionChecker interface implementation. +func (c deploymentChecker) EligibleToActivate(blkNode *blockNode) bool { + // No activation height, so it's always ready to go. + if c.deployment.MinActivationHeight == 0 { + return true + } + + // If the _next_ block (as this is the prior block to the one being + // connected is the min height or beyond, then this can activate. + return uint32(blkNode.height)+1 >= c.deployment.MinActivationHeight +} + +// IsSpeedy returns true if this is to be a "speedy" deployment. A speedy +// deployment differs from a regular one in that only after a miner block +// confirmation window can the deployment expire. This implementation returns +// true if a min activation height is set. +// +// This is part of the thresholdConditionChecker interface implementation. +func (c deploymentChecker) IsSpeedy() bool { + return (c.deployment.MinActivationHeight != 0 || + c.deployment.CustomActivationThreshold != 0) +} + // Condition returns true when the specific bit defined by the deployment // associated with the checker is set. // @@ -264,38 +325,3 @@ func (b *BlockChain) warnUnknownRuleActivations(node *blockNode) error { return nil } - -// warnUnknownVersions logs a warning if a high enough percentage of the last -// blocks have unexpected versions. -// -// This function MUST be called with the chain state lock held (for writes) -func (b *BlockChain) warnUnknownVersions(node *blockNode) error { - // Nothing to do if already warned. - if b.unknownVersionsWarned { - return nil - } - - // Warn if enough previous blocks have unexpected versions. - numUpgraded := uint32(0) - for i := uint32(0); i < unknownVerNumToCheck && node != nil; i++ { - expectedVersion, err := b.calcNextBlockVersion(node.parent) - if err != nil { - return err - } - if expectedVersion > vbLegacyBlockVersion && - (node.version & ^expectedVersion) != 0 { - - numUpgraded++ - } - - node = node.parent - } - if numUpgraded > unknownVerWarnNum { - log.Warn("Unknown block versions are being mined, so new " + - "rules might be in effect. Are you running the " + - "latest version of the software?") - b.unknownVersionsWarned = true - } - - return nil -} diff --git a/blockchain/weight.go b/blockchain/weight.go index 6f6292a1b6..1b691f0086 100644 --- a/blockchain/weight.go +++ b/blockchain/weight.go @@ -7,9 +7,9 @@ package blockchain import ( "fmt" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) const ( diff --git a/btcd.go b/btcd.go index c17d6ab48a..1d9a1e5f6b 100644 --- a/btcd.go +++ b/btcd.go @@ -14,10 +14,12 @@ import ( "runtime" "runtime/debug" "runtime/pprof" + "runtime/trace" "github.com/btcsuite/btcd/blockchain/indexers" "github.com/btcsuite/btcd/database" "github.com/btcsuite/btcd/limits" + "github.com/btcsuite/btcd/ossec" ) const ( @@ -87,6 +89,30 @@ func btcdMain(serverChan chan<- *server) error { defer pprof.StopCPUProfile() } + // Write mem profile if requested. + if cfg.MemoryProfile != "" { + f, err := os.Create(cfg.MemoryProfile) + if err != nil { + btcdLog.Errorf("Unable to create memory profile: %v", err) + return err + } + defer f.Close() + defer pprof.WriteHeapProfile(f) + defer runtime.GC() + } + + // Write execution trace if requested. + if cfg.TraceProfile != "" { + f, err := os.Create(cfg.TraceProfile) + if err != nil { + btcdLog.Errorf("Unable to create execution trace: %v", err) + return err + } + trace.Start(f) + defer f.Close() + defer trace.Stop() + } + // Perform upgrades to btcd as new versions require it. if err := doUpgrades(); err != nil { btcdLog.Errorf("%v", err) @@ -144,6 +170,98 @@ func btcdMain(serverChan chan<- *server) error { return nil } + // Check if the database had previously been pruned. If it had been, it's + // not possible to newly generate the tx index and addr index. + var beenPruned bool + db.View(func(dbTx database.Tx) error { + beenPruned, err = dbTx.BeenPruned() + return err + }) + if err != nil { + btcdLog.Errorf("%v", err) + return err + } + if beenPruned && cfg.Prune == 0 { + err = fmt.Errorf("--prune cannot be disabled as the node has been "+ + "previously pruned. You must delete the files in the datadir: \"%s\" "+ + "and sync from the beginning to disable pruning", cfg.DataDir) + btcdLog.Errorf("%v", err) + return err + } + if beenPruned && cfg.TxIndex { + err = fmt.Errorf("--txindex cannot be enabled as the node has been "+ + "previously pruned. You must delete the files in the datadir: \"%s\" "+ + "and sync from the beginning to enable the desired index", cfg.DataDir) + btcdLog.Errorf("%v", err) + return err + } + if beenPruned && cfg.AddrIndex { + err = fmt.Errorf("--addrindex cannot be enabled as the node has been "+ + "previously pruned. You must delete the files in the datadir: \"%s\" "+ + "and sync from the beginning to enable the desired index", cfg.DataDir) + btcdLog.Errorf("%v", err) + return err + } + // If we've previously been pruned and the cfindex isn't present, it means that the + // user wants to enable the cfindex after the node has already synced up and been + // pruned. + if beenPruned && !indexers.CfIndexInitialized(db) && !cfg.NoCFilters { + err = fmt.Errorf("compact filters cannot be enabled as the node has been "+ + "previously pruned. You must delete the files in the datadir: \"%s\" "+ + "and sync from the beginning to enable the desired index. You may "+ + "use the --nocfilters flag to start the node up without the compact "+ + "filters", cfg.DataDir) + btcdLog.Errorf("%v", err) + return err + } + // If the user wants to disable the cfindex and is pruned or has enabled pruning, force + // the user to either drop the cfindex manually or restart the node without the --nocfilters + // flag. + if (beenPruned || cfg.Prune != 0) && indexers.CfIndexInitialized(db) && cfg.NoCFilters { + err = fmt.Errorf("--nocfilters flag was given but the compact filters have " + + "previously been enabled on this node and the index data currently " + + "exists in the database. The node has also been previously pruned and " + + "the database would be left in an inconsistent state if the compact " + + "filters don't get indexed now. To disable compact filters, please drop the " + + "index completely with the --dropcfindex flag and restart the node. " + + "To keep the compact filters, restart the node without the --nocfilters " + + "flag") + btcdLog.Errorf("%v", err) + return err + } + + // Enforce removal of txindex and addrindex if user requested pruning. + // This is to require explicit action from the user before removing + // indexes that won't be useful when block files are pruned. + // + // NOTE: The order is important here because dropping the tx index also + // drops the address index since it relies on it. We explicitly make the + // user drop both indexes if --addrindex was enabled previously. + if cfg.Prune != 0 && indexers.AddrIndexInitialized(db) { + err = fmt.Errorf("--prune flag may not be given when the address index " + + "has been initialized. Please drop the address index with the " + + "--dropaddrindex flag before enabling pruning") + btcdLog.Errorf("%v", err) + return err + } + if cfg.Prune != 0 && indexers.TxIndexInitialized(db) { + err = fmt.Errorf("--prune flag may not be given when the transaction index " + + "has been initialized. Please drop the transaction index with the " + + "--droptxindex flag before enabling pruning") + btcdLog.Errorf("%v", err) + return err + } + + // The config file is already created if it did not exist and the log + // file has already been opened by now so we only need to allow + // creating rpc cert and key files if they don't exist. + unveilx(cfg.RPCKey, "rwc") + unveilx(cfg.RPCCert, "rwc") + unveilx(cfg.DataDir, "rwc") + + // drop unveil and tty + pledgex("stdio rpath wpath cpath flock dns inet") + // Create server and start it. server, err := newServer(cfg.Listeners, cfg.AgentBlacklist, cfg.AgentWhitelist, db, activeNetParams.Params, interrupt) @@ -296,15 +414,35 @@ func loadBlockDB() (database.DB, error) { return db, nil } +func unveilx(path string, perms string) { + err := ossec.Unveil(path, perms) + if err != nil { + fmt.Fprintf(os.Stderr, "unveil failed: %v\n", err) + os.Exit(1) + } +} + +func pledgex(promises string) { + err := ossec.PledgePromises(promises) + if err != nil { + fmt.Fprintf(os.Stderr, "pledge failed: %v\n", err) + os.Exit(1) + } +} + +func init() { + pledgex("unveil stdio id rpath wpath cpath flock dns inet tty") +} + func main() { - // Use all processor cores. - runtime.GOMAXPROCS(runtime.NumCPU()) - - // Block and transaction processing can cause bursty allocations. This - // limits the garbage collector from excessively overallocating during - // bursts. This value was arrived at with the help of profiling live - // usage. - debug.SetGCPercent(10) + // If GOGC is not explicitly set, override GC percent. + if os.Getenv("GOGC") == "" { + // Block and transaction processing can cause bursty allocations. This + // limits the garbage collector from excessively overallocating during + // bursts. This value was arrived at with the help of profiling live + // usage. + debug.SetGCPercent(10) + } // Up some limits. if err := limits.SetLimits(); err != nil { diff --git a/btcec/README.md b/btcec/README.md index 130bd200a0..533917736e 100644 --- a/btcec/README.md +++ b/btcec/README.md @@ -1,16 +1,16 @@ btcec ===== -[![Build Status](https://travis-ci.org/btcsuite/btcd.png?branch=master)](https://travis-ci.org/btcsuite/btcec) +[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions) [![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) -[![GoDoc](https://godoc.org/github.com/btcsuite/btcd/btcec?status.png)](http://godoc.org/github.com/btcsuite/btcd/btcec) +[![GoDoc](https://pkg.go.dev/github.com/btcsuite/btcd/btcec/v2?status.png)](https://pkg.go.dev/github.com/btcsuite/btcd/btcec/v2) Package btcec implements elliptic curve cryptography needed for working with Bitcoin (secp256k1 only for now). It is designed so that it may be used with the standard crypto/ecdsa packages provided with go. A comprehensive suite of test is provided to ensure proper functionality. Package btcec was originally based on work from ThePiachu which is licensed under the same terms as Go, but it has -signficantly diverged since then. The btcsuite developers original is licensed +significantly diverged since then. The btcsuite developers original is licensed under the liberal ISC license. Although this package was primarily written for btcd, it has intentionally been @@ -20,47 +20,19 @@ use secp256k1 elliptic curve cryptography. ## Installation and Updating ```bash -$ go get -u github.com/btcsuite/btcd/btcec +$ go install -u -v github.com/btcsuite/btcd/btcec/v2 ``` ## Examples -* [Sign Message](http://godoc.org/github.com/btcsuite/btcd/btcec#example-package--SignMessage) +* [Sign Message](https://pkg.go.dev/github.com/btcsuite/btcd/btcec/v2#example-package--SignMessage) Demonstrates signing a message with a secp256k1 private key that is first parsed form raw bytes and serializing the generated signature. -* [Verify Signature](http://godoc.org/github.com/btcsuite/btcd/btcec#example-package--VerifySignature) +* [Verify Signature](https://pkg.go.dev/github.com/btcsuite/btcd/btcec/v2#example-package--VerifySignature) Demonstrates verifying a secp256k1 signature against a public key that is first parsed from raw bytes. The signature is also parsed from raw bytes. -* [Encryption](http://godoc.org/github.com/btcsuite/btcd/btcec#example-package--EncryptMessage) - Demonstrates encrypting a message for a public key that is first parsed from - raw bytes, then decrypting it using the corresponding private key. - -* [Decryption](http://godoc.org/github.com/btcsuite/btcd/btcec#example-package--DecryptMessage) - Demonstrates decrypting a message using a private key that is first parsed - from raw bytes. - -## GPG Verification Key - -All official release tags are signed by Conformal so users can ensure the code -has not been tampered with and is coming from the btcsuite developers. To -verify the signature perform the following: - -- Download the public key from the Conformal website at - https://opensource.conformal.com/GIT-GPG-KEY-conformal.txt - -- Import the public key into your GPG keyring: - ```bash - gpg --import GIT-GPG-KEY-conformal.txt - ``` - -- Verify the release tag with the following command where `TAG_NAME` is a - placeholder for the specific tag: - ```bash - git tag -v TAG_NAME - ``` - ## License Package btcec is licensed under the [copyfree](http://copyfree.org) ISC License diff --git a/btcec/bench_test.go b/btcec/bench_test.go index 7ccd78cfb9..89e2bc2cce 100644 --- a/btcec/bench_test.go +++ b/btcec/bench_test.go @@ -6,43 +6,114 @@ package btcec import ( "encoding/hex" + "math/big" "testing" + + secp "github.com/decred/dcrd/dcrec/secp256k1/v4" ) -// BenchmarkAddJacobian benchmarks the secp256k1 curve addJacobian function with +// setHex decodes the passed big-endian hex string into the internal field value +// representation. Only the first 32-bytes are used. +// +// This is NOT constant time. +// +// The field value is returned to support chaining. This enables syntax like: +// f := new(FieldVal).SetHex("0abc").Add(1) so that f = 0x0abc + 1 +func setHex(hexString string) *FieldVal { + if len(hexString)%2 != 0 { + hexString = "0" + hexString + } + bytes, _ := hex.DecodeString(hexString) + + var f FieldVal + f.SetByteSlice(bytes) + + return &f +} + +// hexToFieldVal converts the passed hex string into a FieldVal and will panic +// if there is an error. This is only provided for the hard-coded constants so +// errors in the source code can be detected. It will only (and must only) be +// called with hard-coded values. +func hexToFieldVal(s string) *FieldVal { + b, err := hex.DecodeString(s) + if err != nil { + panic("invalid hex in source file: " + s) + } + var f FieldVal + if overflow := f.SetByteSlice(b); overflow { + panic("hex in source file overflows mod P: " + s) + } + return &f +} + +// fromHex converts the passed hex string into a big integer pointer and will +// panic is there is an error. This is only provided for the hard-coded +// constants so errors in the source code can bet detected. It will only (and +// must only) be called for initialization purposes. +func fromHex(s string) *big.Int { + if s == "" { + return big.NewInt(0) + } + r, ok := new(big.Int).SetString(s, 16) + if !ok { + panic("invalid hex in source file: " + s) + } + return r +} + +// jacobianPointFromHex decodes the passed big-endian hex strings into a +// Jacobian point with its internal fields set to the resulting values. Only +// the first 32-bytes are used. +func jacobianPointFromHex(x, y, z string) JacobianPoint { + var p JacobianPoint + p.X = *setHex(x) + p.Y = *setHex(y) + p.Z = *setHex(z) + + return p +} + +// BenchmarkAddNonConst benchmarks the secp256k1 curve AddNonConst function with // Z values of 1 so that the associated optimizations are used. func BenchmarkAddJacobian(b *testing.B) { - b.StopTimer() - x1 := new(fieldVal).SetHex("34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6") - y1 := new(fieldVal).SetHex("0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232") - z1 := new(fieldVal).SetHex("1") - x2 := new(fieldVal).SetHex("34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6") - y2 := new(fieldVal).SetHex("0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232") - z2 := new(fieldVal).SetHex("1") - x3, y3, z3 := new(fieldVal), new(fieldVal), new(fieldVal) - curve := S256() - b.StartTimer() + p1 := jacobianPointFromHex( + "34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6", + "0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232", + "1", + ) + p2 := jacobianPointFromHex( + "34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6", + "0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232", + "1", + ) + + b.ReportAllocs() + b.ResetTimer() + var result JacobianPoint for i := 0; i < b.N; i++ { - curve.addJacobian(x1, y1, z1, x2, y2, z2, x3, y3, z3) + secp.AddNonConst(&p1, &p2, &result) } } -// BenchmarkAddJacobianNotZOne benchmarks the secp256k1 curve addJacobian +// BenchmarkAddNonConstNotZOne benchmarks the secp256k1 curve AddNonConst // function with Z values other than one so the optimizations associated with // Z=1 aren't used. func BenchmarkAddJacobianNotZOne(b *testing.B) { - b.StopTimer() - x1 := new(fieldVal).SetHex("d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718") - y1 := new(fieldVal).SetHex("5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190") - z1 := new(fieldVal).SetHex("2") - x2 := new(fieldVal).SetHex("91abba6a34b7481d922a4bd6a04899d5a686f6cf6da4e66a0cb427fb25c04bd4") - y2 := new(fieldVal).SetHex("03fede65e30b4e7576a2abefc963ddbf9fdccbf791b77c29beadefe49951f7d1") - z2 := new(fieldVal).SetHex("3") - x3, y3, z3 := new(fieldVal), new(fieldVal), new(fieldVal) - curve := S256() - b.StartTimer() + x1 := setHex("d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718") + y1 := setHex("5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190") + z1 := setHex("2") + x2 := setHex("91abba6a34b7481d922a4bd6a04899d5a686f6cf6da4e66a0cb427fb25c04bd4") + y2 := setHex("03fede65e30b4e7576a2abefc963ddbf9fdccbf791b77c29beadefe49951f7d1") + z2 := setHex("3") + p1 := MakeJacobianPoint(x1, y1, z1) + p2 := MakeJacobianPoint(x2, y2, z2) + + b.ReportAllocs() + b.ResetTimer() + var result JacobianPoint for i := 0; i < b.N; i++ { - curve.addJacobian(x1, y1, z1, x2, y2, z2, x3, y3, z3) + AddNonConst(&p1, &p2, &result) } } @@ -77,49 +148,27 @@ func BenchmarkScalarMult(b *testing.B) { } } -// BenchmarkNAF benchmarks the NAF function. -func BenchmarkNAF(b *testing.B) { - k := fromHex("d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575") - for i := 0; i < b.N; i++ { - NAF(k.Bytes()) +// hexToModNScalar converts the passed hex string into a ModNScalar and will +// panic if there is an error. This is only provided for the hard-coded +// constants so errors in the source code can be detected. It will only (and +// must only) be called with hard-coded values. +func hexToModNScalar(s string) *ModNScalar { + b, err := hex.DecodeString(s) + if err != nil { + panic("invalid hex in source file: " + s) } -} - -// BenchmarkSigVerify benchmarks how long it takes the secp256k1 curve to -// verify signatures. -func BenchmarkSigVerify(b *testing.B) { - b.StopTimer() - // Randomly generated keypair. - // Private key: 9e0699c91ca1e3b7e3c9ba71eb71c89890872be97576010fe593fbf3fd57e66d - pubKey := PublicKey{ - Curve: S256(), - X: fromHex("d2e670a19c6d753d1a6d8b20bd045df8a08fb162cf508956c31268c6d81ffdab"), - Y: fromHex("ab65528eefbb8057aa85d597258a3fbd481a24633bc9b47a9aa045c91371de52"), - } - - // Double sha256 of []byte{0x01, 0x02, 0x03, 0x04} - msgHash := fromHex("8de472e2399610baaa7f84840547cd409434e31f5d3bd71e4d947f283874f9c0") - sig := Signature{ - R: fromHex("fef45d2892953aa5bbcdb057b5e98b208f1617a7498af7eb765574e29b5d9c2c"), - S: fromHex("d47563f52aac6b04b55de236b7c515eb9311757db01e02cff079c3ca6efb063f"), - } - - if !sig.Verify(msgHash.Bytes(), &pubKey) { - b.Errorf("Signature failed to verify") - return - } - b.StartTimer() - - for i := 0; i < b.N; i++ { - sig.Verify(msgHash.Bytes(), &pubKey) + var scalar ModNScalar + if overflow := scalar.SetByteSlice(b); overflow { + panic("hex in source file overflows mod N scalar: " + s) } + return &scalar } // BenchmarkFieldNormalize benchmarks how long it takes the internal field // to perform normalization (which includes modular reduction). func BenchmarkFieldNormalize(b *testing.B) { // The normalize function is constant time so default value is fine. - f := new(fieldVal) + var f FieldVal for i := 0; i < b.N; i++ { f.Normalize() } @@ -138,7 +187,7 @@ func BenchmarkParseCompressedPubKey(b *testing.B) { b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { - pk, err = ParsePubKey(rawPk, S256()) + pk, err = ParsePubKey(rawPk) } _ = pk _ = err diff --git a/btcec/btcec.go b/btcec/btcec.go index de93a255a4..f85baba8c7 100644 --- a/btcec/btcec.go +++ b/btcec/btcec.go @@ -20,957 +20,37 @@ package btcec // reverse the transform than to operate in affine coordinates. import ( - "crypto/elliptic" - "math/big" - "sync" + secp "github.com/decred/dcrd/dcrec/secp256k1/v4" ) -var ( - // fieldOne is simply the integer 1 in field representation. It is - // used to avoid needing to create it multiple times during the internal - // arithmetic. - fieldOne = new(fieldVal).SetInt(1) -) - -// KoblitzCurve supports a koblitz curve implementation that fits the ECC Curve -// interface from crypto/elliptic. -type KoblitzCurve struct { - *elliptic.CurveParams - - // q is the value (P+1)/4 used to compute the square root of field - // elements. - q *big.Int - - H int // cofactor of the curve. - halfOrder *big.Int // half the order N - - // fieldB is the constant B of the curve as a fieldVal. - fieldB *fieldVal - - // byteSize is simply the bit size / 8 and is provided for convenience - // since it is calculated repeatedly. - byteSize int - - // bytePoints - bytePoints *[32][256][3]fieldVal - - // The next 6 values are used specifically for endomorphism - // optimizations in ScalarMult. - - // lambda must fulfill lambda^3 = 1 mod N where N is the order of G. - lambda *big.Int - - // beta must fulfill beta^3 = 1 mod P where P is the prime field of the - // curve. - beta *fieldVal - - // See the EndomorphismVectors in gensecp256k1.go to see how these are - // derived. - a1 *big.Int - b1 *big.Int - a2 *big.Int - b2 *big.Int -} - -// Params returns the parameters for the curve. -func (curve *KoblitzCurve) Params() *elliptic.CurveParams { - return curve.CurveParams -} - -// bigAffineToField takes an affine point (x, y) as big integers and converts -// it to an affine point as field values. -func (curve *KoblitzCurve) bigAffineToField(x, y *big.Int) (*fieldVal, *fieldVal) { - x3, y3 := new(fieldVal), new(fieldVal) - x3.SetByteSlice(x.Bytes()) - y3.SetByteSlice(y.Bytes()) - - return x3, y3 -} - -// fieldJacobianToBigAffine takes a Jacobian point (x, y, z) as field values and -// converts it to an affine point as big integers. -func (curve *KoblitzCurve) fieldJacobianToBigAffine(x, y, z *fieldVal) (*big.Int, *big.Int) { - // Inversions are expensive and both point addition and point doubling - // are faster when working with points that have a z value of one. So, - // if the point needs to be converted to affine, go ahead and normalize - // the point itself at the same time as the calculation is the same. - var zInv, tempZ fieldVal - zInv.Set(z).Inverse() // zInv = Z^-1 - tempZ.SquareVal(&zInv) // tempZ = Z^-2 - x.Mul(&tempZ) // X = X/Z^2 (mag: 1) - y.Mul(tempZ.Mul(&zInv)) // Y = Y/Z^3 (mag: 1) - z.SetInt(1) // Z = 1 (mag: 1) - - // Normalize the x and y values. - x.Normalize() - y.Normalize() - - // Convert the field values for the now affine point to big.Ints. - x3, y3 := new(big.Int), new(big.Int) - x3.SetBytes(x.Bytes()[:]) - y3.SetBytes(y.Bytes()[:]) - return x3, y3 -} - -// IsOnCurve returns boolean if the point (x,y) is on the curve. -// Part of the elliptic.Curve interface. This function differs from the -// crypto/elliptic algorithm since a = 0 not -3. -func (curve *KoblitzCurve) IsOnCurve(x, y *big.Int) bool { - // Convert big ints to field values for faster arithmetic. - fx, fy := curve.bigAffineToField(x, y) - - // Elliptic curve equation for secp256k1 is: y^2 = x^3 + 7 - y2 := new(fieldVal).SquareVal(fy).Normalize() - result := new(fieldVal).SquareVal(fx).Mul(fx).AddInt(7).Normalize() - return y2.Equals(result) -} - -// addZ1AndZ2EqualsOne adds two Jacobian points that are already known to have -// z values of 1 and stores the result in (x3, y3, z3). That is to say -// (x1, y1, 1) + (x2, y2, 1) = (x3, y3, z3). It performs faster addition than -// the generic add routine since less arithmetic is needed due to the ability to -// avoid the z value multiplications. -func (curve *KoblitzCurve) addZ1AndZ2EqualsOne(x1, y1, z1, x2, y2, x3, y3, z3 *fieldVal) { - // To compute the point addition efficiently, this implementation splits - // the equation into intermediate elements which are used to minimize - // the number of field multiplications using the method shown at: - // http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#addition-mmadd-2007-bl - // - // In particular it performs the calculations using the following: - // H = X2-X1, HH = H^2, I = 4*HH, J = H*I, r = 2*(Y2-Y1), V = X1*I - // X3 = r^2-J-2*V, Y3 = r*(V-X3)-2*Y1*J, Z3 = 2*H - // - // This results in a cost of 4 field multiplications, 2 field squarings, - // 6 field additions, and 5 integer multiplications. - - // When the x coordinates are the same for two points on the curve, the - // y coordinates either must be the same, in which case it is point - // doubling, or they are opposite and the result is the point at - // infinity per the group law for elliptic curve cryptography. - x1.Normalize() - y1.Normalize() - x2.Normalize() - y2.Normalize() - if x1.Equals(x2) { - if y1.Equals(y2) { - // Since x1 == x2 and y1 == y2, point doubling must be - // done, otherwise the addition would end up dividing - // by zero. - curve.doubleJacobian(x1, y1, z1, x3, y3, z3) - return - } - - // Since x1 == x2 and y1 == -y2, the sum is the point at - // infinity per the group law. - x3.SetInt(0) - y3.SetInt(0) - z3.SetInt(0) - return - } - - // Calculate X3, Y3, and Z3 according to the intermediate elements - // breakdown above. - var h, i, j, r, v fieldVal - var negJ, neg2V, negX3 fieldVal - h.Set(x1).Negate(1).Add(x2) // H = X2-X1 (mag: 3) - i.SquareVal(&h).MulInt(4) // I = 4*H^2 (mag: 4) - j.Mul2(&h, &i) // J = H*I (mag: 1) - r.Set(y1).Negate(1).Add(y2).MulInt(2) // r = 2*(Y2-Y1) (mag: 6) - v.Mul2(x1, &i) // V = X1*I (mag: 1) - negJ.Set(&j).Negate(1) // negJ = -J (mag: 2) - neg2V.Set(&v).MulInt(2).Negate(2) // neg2V = -(2*V) (mag: 3) - x3.Set(&r).Square().Add(&negJ).Add(&neg2V) // X3 = r^2-J-2*V (mag: 6) - negX3.Set(x3).Negate(6) // negX3 = -X3 (mag: 7) - j.Mul(y1).MulInt(2).Negate(2) // J = -(2*Y1*J) (mag: 3) - y3.Set(&v).Add(&negX3).Mul(&r).Add(&j) // Y3 = r*(V-X3)-2*Y1*J (mag: 4) - z3.Set(&h).MulInt(2) // Z3 = 2*H (mag: 6) - - // Normalize the resulting field values to a magnitude of 1 as needed. - x3.Normalize() - y3.Normalize() - z3.Normalize() -} - -// addZ1EqualsZ2 adds two Jacobian points that are already known to have the -// same z value and stores the result in (x3, y3, z3). That is to say -// (x1, y1, z1) + (x2, y2, z1) = (x3, y3, z3). It performs faster addition than -// the generic add routine since less arithmetic is needed due to the known -// equivalence. -func (curve *KoblitzCurve) addZ1EqualsZ2(x1, y1, z1, x2, y2, x3, y3, z3 *fieldVal) { - // To compute the point addition efficiently, this implementation splits - // the equation into intermediate elements which are used to minimize - // the number of field multiplications using a slightly modified version - // of the method shown at: - // http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#addition-mmadd-2007-bl - // - // In particular it performs the calculations using the following: - // A = X2-X1, B = A^2, C=Y2-Y1, D = C^2, E = X1*B, F = X2*B - // X3 = D-E-F, Y3 = C*(E-X3)-Y1*(F-E), Z3 = Z1*A - // - // This results in a cost of 5 field multiplications, 2 field squarings, - // 9 field additions, and 0 integer multiplications. - - // When the x coordinates are the same for two points on the curve, the - // y coordinates either must be the same, in which case it is point - // doubling, or they are opposite and the result is the point at - // infinity per the group law for elliptic curve cryptography. - x1.Normalize() - y1.Normalize() - x2.Normalize() - y2.Normalize() - if x1.Equals(x2) { - if y1.Equals(y2) { - // Since x1 == x2 and y1 == y2, point doubling must be - // done, otherwise the addition would end up dividing - // by zero. - curve.doubleJacobian(x1, y1, z1, x3, y3, z3) - return - } - - // Since x1 == x2 and y1 == -y2, the sum is the point at - // infinity per the group law. - x3.SetInt(0) - y3.SetInt(0) - z3.SetInt(0) - return - } - - // Calculate X3, Y3, and Z3 according to the intermediate elements - // breakdown above. - var a, b, c, d, e, f fieldVal - var negX1, negY1, negE, negX3 fieldVal - negX1.Set(x1).Negate(1) // negX1 = -X1 (mag: 2) - negY1.Set(y1).Negate(1) // negY1 = -Y1 (mag: 2) - a.Set(&negX1).Add(x2) // A = X2-X1 (mag: 3) - b.SquareVal(&a) // B = A^2 (mag: 1) - c.Set(&negY1).Add(y2) // C = Y2-Y1 (mag: 3) - d.SquareVal(&c) // D = C^2 (mag: 1) - e.Mul2(x1, &b) // E = X1*B (mag: 1) - negE.Set(&e).Negate(1) // negE = -E (mag: 2) - f.Mul2(x2, &b) // F = X2*B (mag: 1) - x3.Add2(&e, &f).Negate(3).Add(&d) // X3 = D-E-F (mag: 5) - negX3.Set(x3).Negate(5).Normalize() // negX3 = -X3 (mag: 1) - y3.Set(y1).Mul(f.Add(&negE)).Negate(3) // Y3 = -(Y1*(F-E)) (mag: 4) - y3.Add(e.Add(&negX3).Mul(&c)) // Y3 = C*(E-X3)+Y3 (mag: 5) - z3.Mul2(z1, &a) // Z3 = Z1*A (mag: 1) - - // Normalize the resulting field values to a magnitude of 1 as needed. - x3.Normalize() - y3.Normalize() -} - -// addZ2EqualsOne adds two Jacobian points when the second point is already -// known to have a z value of 1 (and the z value for the first point is not 1) -// and stores the result in (x3, y3, z3). That is to say (x1, y1, z1) + -// (x2, y2, 1) = (x3, y3, z3). It performs faster addition than the generic -// add routine since less arithmetic is needed due to the ability to avoid -// multiplications by the second point's z value. -func (curve *KoblitzCurve) addZ2EqualsOne(x1, y1, z1, x2, y2, x3, y3, z3 *fieldVal) { - // To compute the point addition efficiently, this implementation splits - // the equation into intermediate elements which are used to minimize - // the number of field multiplications using the method shown at: - // http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#addition-madd-2007-bl - // - // In particular it performs the calculations using the following: - // Z1Z1 = Z1^2, U2 = X2*Z1Z1, S2 = Y2*Z1*Z1Z1, H = U2-X1, HH = H^2, - // I = 4*HH, J = H*I, r = 2*(S2-Y1), V = X1*I - // X3 = r^2-J-2*V, Y3 = r*(V-X3)-2*Y1*J, Z3 = (Z1+H)^2-Z1Z1-HH - // - // This results in a cost of 7 field multiplications, 4 field squarings, - // 9 field additions, and 4 integer multiplications. - - // When the x coordinates are the same for two points on the curve, the - // y coordinates either must be the same, in which case it is point - // doubling, or they are opposite and the result is the point at - // infinity per the group law for elliptic curve cryptography. Since - // any number of Jacobian coordinates can represent the same affine - // point, the x and y values need to be converted to like terms. Due to - // the assumption made for this function that the second point has a z - // value of 1 (z2=1), the first point is already "converted". - var z1z1, u2, s2 fieldVal - x1.Normalize() - y1.Normalize() - z1z1.SquareVal(z1) // Z1Z1 = Z1^2 (mag: 1) - u2.Set(x2).Mul(&z1z1).Normalize() // U2 = X2*Z1Z1 (mag: 1) - s2.Set(y2).Mul(&z1z1).Mul(z1).Normalize() // S2 = Y2*Z1*Z1Z1 (mag: 1) - if x1.Equals(&u2) { - if y1.Equals(&s2) { - // Since x1 == x2 and y1 == y2, point doubling must be - // done, otherwise the addition would end up dividing - // by zero. - curve.doubleJacobian(x1, y1, z1, x3, y3, z3) - return - } - - // Since x1 == x2 and y1 == -y2, the sum is the point at - // infinity per the group law. - x3.SetInt(0) - y3.SetInt(0) - z3.SetInt(0) - return - } - - // Calculate X3, Y3, and Z3 according to the intermediate elements - // breakdown above. - var h, hh, i, j, r, rr, v fieldVal - var negX1, negY1, negX3 fieldVal - negX1.Set(x1).Negate(1) // negX1 = -X1 (mag: 2) - h.Add2(&u2, &negX1) // H = U2-X1 (mag: 3) - hh.SquareVal(&h) // HH = H^2 (mag: 1) - i.Set(&hh).MulInt(4) // I = 4 * HH (mag: 4) - j.Mul2(&h, &i) // J = H*I (mag: 1) - negY1.Set(y1).Negate(1) // negY1 = -Y1 (mag: 2) - r.Set(&s2).Add(&negY1).MulInt(2) // r = 2*(S2-Y1) (mag: 6) - rr.SquareVal(&r) // rr = r^2 (mag: 1) - v.Mul2(x1, &i) // V = X1*I (mag: 1) - x3.Set(&v).MulInt(2).Add(&j).Negate(3) // X3 = -(J+2*V) (mag: 4) - x3.Add(&rr) // X3 = r^2+X3 (mag: 5) - negX3.Set(x3).Negate(5) // negX3 = -X3 (mag: 6) - y3.Set(y1).Mul(&j).MulInt(2).Negate(2) // Y3 = -(2*Y1*J) (mag: 3) - y3.Add(v.Add(&negX3).Mul(&r)) // Y3 = r*(V-X3)+Y3 (mag: 4) - z3.Add2(z1, &h).Square() // Z3 = (Z1+H)^2 (mag: 1) - z3.Add(z1z1.Add(&hh).Negate(2)) // Z3 = Z3-(Z1Z1+HH) (mag: 4) - - // Normalize the resulting field values to a magnitude of 1 as needed. - x3.Normalize() - y3.Normalize() - z3.Normalize() -} - -// addGeneric adds two Jacobian points (x1, y1, z1) and (x2, y2, z2) without any -// assumptions about the z values of the two points and stores the result in -// (x3, y3, z3). That is to say (x1, y1, z1) + (x2, y2, z2) = (x3, y3, z3). It -// is the slowest of the add routines due to requiring the most arithmetic. -func (curve *KoblitzCurve) addGeneric(x1, y1, z1, x2, y2, z2, x3, y3, z3 *fieldVal) { - // To compute the point addition efficiently, this implementation splits - // the equation into intermediate elements which are used to minimize - // the number of field multiplications using the method shown at: - // http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#addition-add-2007-bl - // - // In particular it performs the calculations using the following: - // Z1Z1 = Z1^2, Z2Z2 = Z2^2, U1 = X1*Z2Z2, U2 = X2*Z1Z1, S1 = Y1*Z2*Z2Z2 - // S2 = Y2*Z1*Z1Z1, H = U2-U1, I = (2*H)^2, J = H*I, r = 2*(S2-S1) - // V = U1*I - // X3 = r^2-J-2*V, Y3 = r*(V-X3)-2*S1*J, Z3 = ((Z1+Z2)^2-Z1Z1-Z2Z2)*H - // - // This results in a cost of 11 field multiplications, 5 field squarings, - // 9 field additions, and 4 integer multiplications. - - // When the x coordinates are the same for two points on the curve, the - // y coordinates either must be the same, in which case it is point - // doubling, or they are opposite and the result is the point at - // infinity. Since any number of Jacobian coordinates can represent the - // same affine point, the x and y values need to be converted to like - // terms. - var z1z1, z2z2, u1, u2, s1, s2 fieldVal - z1z1.SquareVal(z1) // Z1Z1 = Z1^2 (mag: 1) - z2z2.SquareVal(z2) // Z2Z2 = Z2^2 (mag: 1) - u1.Set(x1).Mul(&z2z2).Normalize() // U1 = X1*Z2Z2 (mag: 1) - u2.Set(x2).Mul(&z1z1).Normalize() // U2 = X2*Z1Z1 (mag: 1) - s1.Set(y1).Mul(&z2z2).Mul(z2).Normalize() // S1 = Y1*Z2*Z2Z2 (mag: 1) - s2.Set(y2).Mul(&z1z1).Mul(z1).Normalize() // S2 = Y2*Z1*Z1Z1 (mag: 1) - if u1.Equals(&u2) { - if s1.Equals(&s2) { - // Since x1 == x2 and y1 == y2, point doubling must be - // done, otherwise the addition would end up dividing - // by zero. - curve.doubleJacobian(x1, y1, z1, x3, y3, z3) - return - } - - // Since x1 == x2 and y1 == -y2, the sum is the point at - // infinity per the group law. - x3.SetInt(0) - y3.SetInt(0) - z3.SetInt(0) - return - } - - // Calculate X3, Y3, and Z3 according to the intermediate elements - // breakdown above. - var h, i, j, r, rr, v fieldVal - var negU1, negS1, negX3 fieldVal - negU1.Set(&u1).Negate(1) // negU1 = -U1 (mag: 2) - h.Add2(&u2, &negU1) // H = U2-U1 (mag: 3) - i.Set(&h).MulInt(2).Square() // I = (2*H)^2 (mag: 2) - j.Mul2(&h, &i) // J = H*I (mag: 1) - negS1.Set(&s1).Negate(1) // negS1 = -S1 (mag: 2) - r.Set(&s2).Add(&negS1).MulInt(2) // r = 2*(S2-S1) (mag: 6) - rr.SquareVal(&r) // rr = r^2 (mag: 1) - v.Mul2(&u1, &i) // V = U1*I (mag: 1) - x3.Set(&v).MulInt(2).Add(&j).Negate(3) // X3 = -(J+2*V) (mag: 4) - x3.Add(&rr) // X3 = r^2+X3 (mag: 5) - negX3.Set(x3).Negate(5) // negX3 = -X3 (mag: 6) - y3.Mul2(&s1, &j).MulInt(2).Negate(2) // Y3 = -(2*S1*J) (mag: 3) - y3.Add(v.Add(&negX3).Mul(&r)) // Y3 = r*(V-X3)+Y3 (mag: 4) - z3.Add2(z1, z2).Square() // Z3 = (Z1+Z2)^2 (mag: 1) - z3.Add(z1z1.Add(&z2z2).Negate(2)) // Z3 = Z3-(Z1Z1+Z2Z2) (mag: 4) - z3.Mul(&h) // Z3 = Z3*H (mag: 1) - - // Normalize the resulting field values to a magnitude of 1 as needed. - x3.Normalize() - y3.Normalize() -} - -// addJacobian adds the passed Jacobian points (x1, y1, z1) and (x2, y2, z2) -// together and stores the result in (x3, y3, z3). -func (curve *KoblitzCurve) addJacobian(x1, y1, z1, x2, y2, z2, x3, y3, z3 *fieldVal) { - // A point at infinity is the identity according to the group law for - // elliptic curve cryptography. Thus, ∞ + P = P and P + ∞ = P. - if (x1.IsZero() && y1.IsZero()) || z1.IsZero() { - x3.Set(x2) - y3.Set(y2) - z3.Set(z2) - return - } - if (x2.IsZero() && y2.IsZero()) || z2.IsZero() { - x3.Set(x1) - y3.Set(y1) - z3.Set(z1) - return - } - - // Faster point addition can be achieved when certain assumptions are - // met. For example, when both points have the same z value, arithmetic - // on the z values can be avoided. This section thus checks for these - // conditions and calls an appropriate add function which is accelerated - // by using those assumptions. - z1.Normalize() - z2.Normalize() - isZ1One := z1.Equals(fieldOne) - isZ2One := z2.Equals(fieldOne) - switch { - case isZ1One && isZ2One: - curve.addZ1AndZ2EqualsOne(x1, y1, z1, x2, y2, x3, y3, z3) - return - case z1.Equals(z2): - curve.addZ1EqualsZ2(x1, y1, z1, x2, y2, x3, y3, z3) - return - case isZ2One: - curve.addZ2EqualsOne(x1, y1, z1, x2, y2, x3, y3, z3) - return - } - - // None of the above assumptions are true, so fall back to generic - // point addition. - curve.addGeneric(x1, y1, z1, x2, y2, z2, x3, y3, z3) -} - -// Add returns the sum of (x1,y1) and (x2,y2). Part of the elliptic.Curve -// interface. -func (curve *KoblitzCurve) Add(x1, y1, x2, y2 *big.Int) (*big.Int, *big.Int) { - // A point at infinity is the identity according to the group law for - // elliptic curve cryptography. Thus, ∞ + P = P and P + ∞ = P. - if x1.Sign() == 0 && y1.Sign() == 0 { - return x2, y2 - } - if x2.Sign() == 0 && y2.Sign() == 0 { - return x1, y1 - } - - // Convert the affine coordinates from big integers to field values - // and do the point addition in Jacobian projective space. - fx1, fy1 := curve.bigAffineToField(x1, y1) - fx2, fy2 := curve.bigAffineToField(x2, y2) - fx3, fy3, fz3 := new(fieldVal), new(fieldVal), new(fieldVal) - fOne := new(fieldVal).SetInt(1) - curve.addJacobian(fx1, fy1, fOne, fx2, fy2, fOne, fx3, fy3, fz3) - - // Convert the Jacobian coordinate field values back to affine big - // integers. - return curve.fieldJacobianToBigAffine(fx3, fy3, fz3) -} +// KoblitzCurve provides an implementation for secp256k1 that fits the ECC +// Curve interface from crypto/elliptic. +type KoblitzCurve = secp.KoblitzCurve -// doubleZ1EqualsOne performs point doubling on the passed Jacobian point -// when the point is already known to have a z value of 1 and stores -// the result in (x3, y3, z3). That is to say (x3, y3, z3) = 2*(x1, y1, 1). It -// performs faster point doubling than the generic routine since less arithmetic -// is needed due to the ability to avoid multiplication by the z value. -func (curve *KoblitzCurve) doubleZ1EqualsOne(x1, y1, x3, y3, z3 *fieldVal) { - // This function uses the assumptions that z1 is 1, thus the point - // doubling formulas reduce to: - // - // X3 = (3*X1^2)^2 - 8*X1*Y1^2 - // Y3 = (3*X1^2)*(4*X1*Y1^2 - X3) - 8*Y1^4 - // Z3 = 2*Y1 - // - // To compute the above efficiently, this implementation splits the - // equation into intermediate elements which are used to minimize the - // number of field multiplications in favor of field squarings which - // are roughly 35% faster than field multiplications with the current - // implementation at the time this was written. - // - // This uses a slightly modified version of the method shown at: - // http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-mdbl-2007-bl - // - // In particular it performs the calculations using the following: - // A = X1^2, B = Y1^2, C = B^2, D = 2*((X1+B)^2-A-C) - // E = 3*A, F = E^2, X3 = F-2*D, Y3 = E*(D-X3)-8*C - // Z3 = 2*Y1 - // - // This results in a cost of 1 field multiplication, 5 field squarings, - // 6 field additions, and 5 integer multiplications. - var a, b, c, d, e, f fieldVal - z3.Set(y1).MulInt(2) // Z3 = 2*Y1 (mag: 2) - a.SquareVal(x1) // A = X1^2 (mag: 1) - b.SquareVal(y1) // B = Y1^2 (mag: 1) - c.SquareVal(&b) // C = B^2 (mag: 1) - b.Add(x1).Square() // B = (X1+B)^2 (mag: 1) - d.Set(&a).Add(&c).Negate(2) // D = -(A+C) (mag: 3) - d.Add(&b).MulInt(2) // D = 2*(B+D)(mag: 8) - e.Set(&a).MulInt(3) // E = 3*A (mag: 3) - f.SquareVal(&e) // F = E^2 (mag: 1) - x3.Set(&d).MulInt(2).Negate(16) // X3 = -(2*D) (mag: 17) - x3.Add(&f) // X3 = F+X3 (mag: 18) - f.Set(x3).Negate(18).Add(&d).Normalize() // F = D-X3 (mag: 1) - y3.Set(&c).MulInt(8).Negate(8) // Y3 = -(8*C) (mag: 9) - y3.Add(f.Mul(&e)) // Y3 = E*F+Y3 (mag: 10) - - // Normalize the field values back to a magnitude of 1. - x3.Normalize() - y3.Normalize() - z3.Normalize() -} - -// doubleGeneric performs point doubling on the passed Jacobian point without -// any assumptions about the z value and stores the result in (x3, y3, z3). -// That is to say (x3, y3, z3) = 2*(x1, y1, z1). It is the slowest of the point -// doubling routines due to requiring the most arithmetic. -func (curve *KoblitzCurve) doubleGeneric(x1, y1, z1, x3, y3, z3 *fieldVal) { - // Point doubling formula for Jacobian coordinates for the secp256k1 - // curve: - // X3 = (3*X1^2)^2 - 8*X1*Y1^2 - // Y3 = (3*X1^2)*(4*X1*Y1^2 - X3) - 8*Y1^4 - // Z3 = 2*Y1*Z1 - // - // To compute the above efficiently, this implementation splits the - // equation into intermediate elements which are used to minimize the - // number of field multiplications in favor of field squarings which - // are roughly 35% faster than field multiplications with the current - // implementation at the time this was written. - // - // This uses a slightly modified version of the method shown at: - // http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l - // - // In particular it performs the calculations using the following: - // A = X1^2, B = Y1^2, C = B^2, D = 2*((X1+B)^2-A-C) - // E = 3*A, F = E^2, X3 = F-2*D, Y3 = E*(D-X3)-8*C - // Z3 = 2*Y1*Z1 - // - // This results in a cost of 1 field multiplication, 5 field squarings, - // 6 field additions, and 5 integer multiplications. - var a, b, c, d, e, f fieldVal - z3.Mul2(y1, z1).MulInt(2) // Z3 = 2*Y1*Z1 (mag: 2) - a.SquareVal(x1) // A = X1^2 (mag: 1) - b.SquareVal(y1) // B = Y1^2 (mag: 1) - c.SquareVal(&b) // C = B^2 (mag: 1) - b.Add(x1).Square() // B = (X1+B)^2 (mag: 1) - d.Set(&a).Add(&c).Negate(2) // D = -(A+C) (mag: 3) - d.Add(&b).MulInt(2) // D = 2*(B+D)(mag: 8) - e.Set(&a).MulInt(3) // E = 3*A (mag: 3) - f.SquareVal(&e) // F = E^2 (mag: 1) - x3.Set(&d).MulInt(2).Negate(16) // X3 = -(2*D) (mag: 17) - x3.Add(&f) // X3 = F+X3 (mag: 18) - f.Set(x3).Negate(18).Add(&d).Normalize() // F = D-X3 (mag: 1) - y3.Set(&c).MulInt(8).Negate(8) // Y3 = -(8*C) (mag: 9) - y3.Add(f.Mul(&e)) // Y3 = E*F+Y3 (mag: 10) - - // Normalize the field values back to a magnitude of 1. - x3.Normalize() - y3.Normalize() - z3.Normalize() -} - -// doubleJacobian doubles the passed Jacobian point (x1, y1, z1) and stores the -// result in (x3, y3, z3). -func (curve *KoblitzCurve) doubleJacobian(x1, y1, z1, x3, y3, z3 *fieldVal) { - // Doubling a point at infinity is still infinity. - if y1.IsZero() || z1.IsZero() { - x3.SetInt(0) - y3.SetInt(0) - z3.SetInt(0) - return - } - - // Slightly faster point doubling can be achieved when the z value is 1 - // by avoiding the multiplication on the z value. This section calls - // a point doubling function which is accelerated by using that - // assumption when possible. - if z1.Normalize().Equals(fieldOne) { - curve.doubleZ1EqualsOne(x1, y1, x3, y3, z3) - return - } - - // Fall back to generic point doubling which works with arbitrary z - // values. - curve.doubleGeneric(x1, y1, z1, x3, y3, z3) -} - -// Double returns 2*(x1,y1). Part of the elliptic.Curve interface. -func (curve *KoblitzCurve) Double(x1, y1 *big.Int) (*big.Int, *big.Int) { - if y1.Sign() == 0 { - return new(big.Int), new(big.Int) - } - - // Convert the affine coordinates from big integers to field values - // and do the point doubling in Jacobian projective space. - fx1, fy1 := curve.bigAffineToField(x1, y1) - fx3, fy3, fz3 := new(fieldVal), new(fieldVal), new(fieldVal) - fOne := new(fieldVal).SetInt(1) - curve.doubleJacobian(fx1, fy1, fOne, fx3, fy3, fz3) - - // Convert the Jacobian coordinate field values back to affine big - // integers. - return curve.fieldJacobianToBigAffine(fx3, fy3, fz3) -} - -// splitK returns a balanced length-two representation of k and their signs. -// This is algorithm 3.74 from [GECC]. -// -// One thing of note about this algorithm is that no matter what c1 and c2 are, -// the final equation of k = k1 + k2 * lambda (mod n) will hold. This is -// provable mathematically due to how a1/b1/a2/b2 are computed. -// -// c1 and c2 are chosen to minimize the max(k1,k2). -func (curve *KoblitzCurve) splitK(k []byte) ([]byte, []byte, int, int) { - // All math here is done with big.Int, which is slow. - // At some point, it might be useful to write something similar to - // fieldVal but for N instead of P as the prime field if this ends up - // being a bottleneck. - bigIntK := new(big.Int) - c1, c2 := new(big.Int), new(big.Int) - tmp1, tmp2 := new(big.Int), new(big.Int) - k1, k2 := new(big.Int), new(big.Int) - - bigIntK.SetBytes(k) - // c1 = round(b2 * k / n) from step 4. - // Rounding isn't really necessary and costs too much, hence skipped - c1.Mul(curve.b2, bigIntK) - c1.Div(c1, curve.N) - // c2 = round(b1 * k / n) from step 4 (sign reversed to optimize one step) - // Rounding isn't really necessary and costs too much, hence skipped - c2.Mul(curve.b1, bigIntK) - c2.Div(c2, curve.N) - // k1 = k - c1 * a1 - c2 * a2 from step 5 (note c2's sign is reversed) - tmp1.Mul(c1, curve.a1) - tmp2.Mul(c2, curve.a2) - k1.Sub(bigIntK, tmp1) - k1.Add(k1, tmp2) - // k2 = - c1 * b1 - c2 * b2 from step 5 (note c2's sign is reversed) - tmp1.Mul(c1, curve.b1) - tmp2.Mul(c2, curve.b2) - k2.Sub(tmp2, tmp1) - - // Note Bytes() throws out the sign of k1 and k2. This matters - // since k1 and/or k2 can be negative. Hence, we pass that - // back separately. - return k1.Bytes(), k2.Bytes(), k1.Sign(), k2.Sign() -} - -// moduloReduce reduces k from more than 32 bytes to 32 bytes and under. This -// is done by doing a simple modulo curve.N. We can do this since G^N = 1 and -// thus any other valid point on the elliptic curve has the same order. -func (curve *KoblitzCurve) moduloReduce(k []byte) []byte { - // Since the order of G is curve.N, we can use a much smaller number - // by doing modulo curve.N - if len(k) > curve.byteSize { - // Reduce k by performing modulo curve.N. - tmpK := new(big.Int).SetBytes(k) - tmpK.Mod(tmpK, curve.N) - return tmpK.Bytes() - } - - return k -} - -// NAF takes a positive integer k and returns the Non-Adjacent Form (NAF) as two -// byte slices. The first is where 1s will be. The second is where -1s will -// be. NAF is convenient in that on average, only 1/3rd of its values are -// non-zero. This is algorithm 3.30 from [GECC]. -// -// Essentially, this makes it possible to minimize the number of operations -// since the resulting ints returned will be at least 50% 0s. -func NAF(k []byte) ([]byte, []byte) { - // The essence of this algorithm is that whenever we have consecutive 1s - // in the binary, we want to put a -1 in the lowest bit and get a bunch - // of 0s up to the highest bit of consecutive 1s. This is due to this - // identity: - // 2^n + 2^(n-1) + 2^(n-2) + ... + 2^(n-k) = 2^(n+1) - 2^(n-k) - // - // The algorithm thus may need to go 1 more bit than the length of the - // bits we actually have, hence bits being 1 bit longer than was - // necessary. Since we need to know whether adding will cause a carry, - // we go from right-to-left in this addition. - var carry, curIsOne, nextIsOne bool - // these default to zero - retPos := make([]byte, len(k)+1) - retNeg := make([]byte, len(k)+1) - for i := len(k) - 1; i >= 0; i-- { - curByte := k[i] - for j := uint(0); j < 8; j++ { - curIsOne = curByte&1 == 1 - if j == 7 { - if i == 0 { - nextIsOne = false - } else { - nextIsOne = k[i-1]&1 == 1 - } - } else { - nextIsOne = curByte&2 == 2 - } - if carry { - if curIsOne { - // This bit is 1, so continue to carry - // and don't need to do anything. - } else { - // We've hit a 0 after some number of - // 1s. - if nextIsOne { - // Start carrying again since - // a new sequence of 1s is - // starting. - retNeg[i+1] += 1 << j - } else { - // Stop carrying since 1s have - // stopped. - carry = false - retPos[i+1] += 1 << j - } - } - } else if curIsOne { - if nextIsOne { - // If this is the start of at least 2 - // consecutive 1s, set the current one - // to -1 and start carrying. - retNeg[i+1] += 1 << j - carry = true - } else { - // This is a singleton, not consecutive - // 1s. - retPos[i+1] += 1 << j - } - } - curByte >>= 1 - } - } - if carry { - retPos[0] = 1 - return retPos, retNeg - } - return retPos[1:], retNeg[1:] -} - -// ScalarMult returns k*(Bx, By) where k is a big endian integer. -// Part of the elliptic.Curve interface. -func (curve *KoblitzCurve) ScalarMult(Bx, By *big.Int, k []byte) (*big.Int, *big.Int) { - // Point Q = ∞ (point at infinity). - qx, qy, qz := new(fieldVal), new(fieldVal), new(fieldVal) - - // Decompose K into k1 and k2 in order to halve the number of EC ops. - // See Algorithm 3.74 in [GECC]. - k1, k2, signK1, signK2 := curve.splitK(curve.moduloReduce(k)) - - // The main equation here to remember is: - // k * P = k1 * P + k2 * ϕ(P) - // - // P1 below is P in the equation, P2 below is ϕ(P) in the equation - p1x, p1y := curve.bigAffineToField(Bx, By) - p1yNeg := new(fieldVal).NegateVal(p1y, 1) - p1z := new(fieldVal).SetInt(1) - - // NOTE: ϕ(x,y) = (βx,y). The Jacobian z coordinate is 1, so this math - // goes through. - p2x := new(fieldVal).Mul2(p1x, curve.beta) - p2y := new(fieldVal).Set(p1y) - p2yNeg := new(fieldVal).NegateVal(p2y, 1) - p2z := new(fieldVal).SetInt(1) - - // Flip the positive and negative values of the points as needed - // depending on the signs of k1 and k2. As mentioned in the equation - // above, each of k1 and k2 are multiplied by the respective point. - // Since -k * P is the same thing as k * -P, and the group law for - // elliptic curves states that P(x, y) = -P(x, -y), it's faster and - // simplifies the code to just make the point negative. - if signK1 == -1 { - p1y, p1yNeg = p1yNeg, p1y - } - if signK2 == -1 { - p2y, p2yNeg = p2yNeg, p2y - } - - // NAF versions of k1 and k2 should have a lot more zeros. - // - // The Pos version of the bytes contain the +1s and the Neg versions - // contain the -1s. - k1PosNAF, k1NegNAF := NAF(k1) - k2PosNAF, k2NegNAF := NAF(k2) - k1Len := len(k1PosNAF) - k2Len := len(k2PosNAF) - - m := k1Len - if m < k2Len { - m = k2Len - } - - // Add left-to-right using the NAF optimization. See algorithm 3.77 - // from [GECC]. This should be faster overall since there will be a lot - // more instances of 0, hence reducing the number of Jacobian additions - // at the cost of 1 possible extra doubling. - var k1BytePos, k1ByteNeg, k2BytePos, k2ByteNeg byte - for i := 0; i < m; i++ { - // Since we're going left-to-right, pad the front with 0s. - if i < m-k1Len { - k1BytePos = 0 - k1ByteNeg = 0 - } else { - k1BytePos = k1PosNAF[i-(m-k1Len)] - k1ByteNeg = k1NegNAF[i-(m-k1Len)] - } - if i < m-k2Len { - k2BytePos = 0 - k2ByteNeg = 0 - } else { - k2BytePos = k2PosNAF[i-(m-k2Len)] - k2ByteNeg = k2NegNAF[i-(m-k2Len)] - } - - for j := 7; j >= 0; j-- { - // Q = 2 * Q - curve.doubleJacobian(qx, qy, qz, qx, qy, qz) - - if k1BytePos&0x80 == 0x80 { - curve.addJacobian(qx, qy, qz, p1x, p1y, p1z, - qx, qy, qz) - } else if k1ByteNeg&0x80 == 0x80 { - curve.addJacobian(qx, qy, qz, p1x, p1yNeg, p1z, - qx, qy, qz) - } - - if k2BytePos&0x80 == 0x80 { - curve.addJacobian(qx, qy, qz, p2x, p2y, p2z, - qx, qy, qz) - } else if k2ByteNeg&0x80 == 0x80 { - curve.addJacobian(qx, qy, qz, p2x, p2yNeg, p2z, - qx, qy, qz) - } - k1BytePos <<= 1 - k1ByteNeg <<= 1 - k2BytePos <<= 1 - k2ByteNeg <<= 1 - } - } - - // Convert the Jacobian coordinate field values back to affine big.Ints. - return curve.fieldJacobianToBigAffine(qx, qy, qz) -} - -// ScalarBaseMult returns k*G where G is the base point of the group and k is a -// big endian integer. -// Part of the elliptic.Curve interface. -func (curve *KoblitzCurve) ScalarBaseMult(k []byte) (*big.Int, *big.Int) { - newK := curve.moduloReduce(k) - diff := len(curve.bytePoints) - len(newK) - - // Point Q = ∞ (point at infinity). - qx, qy, qz := new(fieldVal), new(fieldVal), new(fieldVal) - - // curve.bytePoints has all 256 byte points for each 8-bit window. The - // strategy is to add up the byte points. This is best understood by - // expressing k in base-256 which it already sort of is. - // Each "digit" in the 8-bit window can be looked up using bytePoints - // and added together. - for i, byteVal := range newK { - p := curve.bytePoints[diff+i][byteVal] - curve.addJacobian(qx, qy, qz, &p[0], &p[1], &p[2], qx, qy, qz) - } - return curve.fieldJacobianToBigAffine(qx, qy, qz) -} - -// QPlus1Div4 returns the (P+1)/4 constant for the curve for use in calculating -// square roots via exponentiation. -// -// DEPRECATED: The actual value returned is (P+1)/4, where as the original -// method name implies that this value is (((P+1)/4)+1)/4. This method is kept -// to maintain backwards compatibility of the API. Use Q() instead. -func (curve *KoblitzCurve) QPlus1Div4() *big.Int { - return curve.q -} - -// Q returns the (P+1)/4 constant for the curve for use in calculating square -// roots via exponentiation. -func (curve *KoblitzCurve) Q() *big.Int { - return curve.q +// S256 returns a Curve which implements secp256k1. +func S256() *KoblitzCurve { + return secp.S256() } -var initonce sync.Once -var secp256k1 KoblitzCurve +// CurveParams contains the parameters for the secp256k1 curve. +type CurveParams = secp.CurveParams -func initAll() { - initS256() +// Params returns the secp256k1 curve parameters for convenience. +func Params() *CurveParams { + return secp.Params() } -// fromHex converts the passed hex string into a big integer pointer and will -// panic is there is an error. This is only provided for the hard-coded -// constants so errors in the source code can bet detected. It will only (and -// must only) be called for initialization purposes. -func fromHex(s string) *big.Int { - r, ok := new(big.Int).SetString(s, 16) - if !ok { - panic("invalid hex in source file: " + s) - } - return r -} +// Generator returns the public key at the Generator Point. +func Generator() *PublicKey { + var ( + result JacobianPoint + k secp.ModNScalar + ) -func initS256() { - // Curve parameters taken from [SECG] section 2.4.1. - secp256k1.CurveParams = new(elliptic.CurveParams) - secp256k1.P = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F") - secp256k1.N = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141") - secp256k1.B = fromHex("0000000000000000000000000000000000000000000000000000000000000007") - secp256k1.Gx = fromHex("79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798") - secp256k1.Gy = fromHex("483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8") - secp256k1.BitSize = 256 - secp256k1.q = new(big.Int).Div(new(big.Int).Add(secp256k1.P, - big.NewInt(1)), big.NewInt(4)) - secp256k1.H = 1 - secp256k1.halfOrder = new(big.Int).Rsh(secp256k1.N, 1) - secp256k1.fieldB = new(fieldVal).SetByteSlice(secp256k1.B.Bytes()) + k.SetInt(1) + ScalarBaseMultNonConst(&k, &result) - // Provided for convenience since this gets computed repeatedly. - secp256k1.byteSize = secp256k1.BitSize / 8 + result.ToAffine() - // Deserialize and set the pre-computed table used to accelerate scalar - // base multiplication. This is hard-coded data, so any errors are - // panics because it means something is wrong in the source code. - if err := loadS256BytePoints(); err != nil { - panic(err) - } - - // Next 6 constants are from Hal Finney's bitcointalk.org post: - // https://bitcointalk.org/index.php?topic=3238.msg45565#msg45565 - // May he rest in peace. - // - // They have also been independently derived from the code in the - // EndomorphismVectors function in gensecp256k1.go. - secp256k1.lambda = fromHex("5363AD4CC05C30E0A5261C028812645A122E22EA20816678DF02967C1B23BD72") - secp256k1.beta = new(fieldVal).SetHex("7AE96A2B657C07106E64479EAC3434E99CF0497512F58995C1396C28719501EE") - secp256k1.a1 = fromHex("3086D221A7D46BCDE86C90E49284EB15") - secp256k1.b1 = fromHex("-E4437ED6010E88286F547FA90ABFE4C3") - secp256k1.a2 = fromHex("114CA50F7A8E2F3F657C1108D9D44CFD8") - secp256k1.b2 = fromHex("3086D221A7D46BCDE86C90E49284EB15") - - // Alternatively, we can use the parameters below, however, they seem - // to be about 8% slower. - // secp256k1.lambda = fromHex("AC9C52B33FA3CF1F5AD9E3FD77ED9BA4A880B9FC8EC739C2E0CFC810B51283CE") - // secp256k1.beta = new(fieldVal).SetHex("851695D49A83F8EF919BB86153CBCB16630FB68AED0A766A3EC693D68E6AFA40") - // secp256k1.a1 = fromHex("E4437ED6010E88286F547FA90ABFE4C3") - // secp256k1.b1 = fromHex("-3086D221A7D46BCDE86C90E49284EB15") - // secp256k1.a2 = fromHex("3086D221A7D46BCDE86C90E49284EB15") - // secp256k1.b2 = fromHex("114CA50F7A8E2F3F657C1108D9D44CFD8") -} - -// S256 returns a Curve which implements secp256k1. -func S256() *KoblitzCurve { - initonce.Do(initAll) - return &secp256k1 + return NewPublicKey(&result.X, &result.Y) } diff --git a/btcec/btcec_test.go b/btcec/btcec_test.go index 42a69037bc..b08155e2f0 100644 --- a/btcec/btcec_test.go +++ b/btcec/btcec_test.go @@ -15,17 +15,17 @@ import ( // isJacobianOnS256Curve returns boolean if the point (x,y,z) is on the // secp256k1 curve. -func isJacobianOnS256Curve(x, y, z *fieldVal) bool { +func isJacobianOnS256Curve(point *JacobianPoint) bool { // Elliptic curve equation for secp256k1 is: y^2 = x^3 + 7 // In Jacobian coordinates, Y = y/z^3 and X = x/z^2 // Thus: // (y/z^3)^2 = (x/z^2)^3 + 7 // y^2/z^6 = x^3/z^6 + 7 // y^2 = x^3 + 7*z^6 - var y2, z2, x3, result fieldVal - y2.SquareVal(y).Normalize() - z2.SquareVal(z) - x3.SquareVal(x).Mul(x) + var y2, z2, x3, result FieldVal + y2.SquareVal(&point.Y).Normalize() + z2.SquareVal(&point.Z) + x3.SquareVal(&point.X).Mul(&point.X) result.SquareVal(&z2).Mul(&z2).MulInt(7).Add(&x3).Normalize() return y2.Equals(&result) } @@ -222,43 +222,37 @@ func TestAddJacobian(t *testing.T) { t.Logf("Running %d tests", len(tests)) for i, test := range tests { - // Convert hex to field values. - x1 := new(fieldVal).SetHex(test.x1) - y1 := new(fieldVal).SetHex(test.y1) - z1 := new(fieldVal).SetHex(test.z1) - x2 := new(fieldVal).SetHex(test.x2) - y2 := new(fieldVal).SetHex(test.y2) - z2 := new(fieldVal).SetHex(test.z2) - x3 := new(fieldVal).SetHex(test.x3) - y3 := new(fieldVal).SetHex(test.y3) - z3 := new(fieldVal).SetHex(test.z3) + // Convert hex to Jacobian points. + p1 := jacobianPointFromHex(test.x1, test.y1, test.z1) + p2 := jacobianPointFromHex(test.x2, test.y2, test.z2) + want := jacobianPointFromHex(test.x3, test.y3, test.z3) // Ensure the test data is using points that are actually on // the curve (or the point at infinity). - if !z1.IsZero() && !isJacobianOnS256Curve(x1, y1, z1) { + if !p1.Z.IsZero() && !isJacobianOnS256Curve(&p1) { t.Errorf("#%d first point is not on the curve -- "+ "invalid test data", i) continue } - if !z2.IsZero() && !isJacobianOnS256Curve(x2, y2, z2) { + if !p2.Z.IsZero() && !isJacobianOnS256Curve(&p2) { t.Errorf("#%d second point is not on the curve -- "+ "invalid test data", i) continue } - if !z3.IsZero() && !isJacobianOnS256Curve(x3, y3, z3) { + if !want.Z.IsZero() && !isJacobianOnS256Curve(&want) { t.Errorf("#%d expected point is not on the curve -- "+ "invalid test data", i) continue } // Add the two points. - rx, ry, rz := new(fieldVal), new(fieldVal), new(fieldVal) - S256().addJacobian(x1, y1, z1, x2, y2, z2, rx, ry, rz) + var r JacobianPoint + AddNonConst(&p1, &p2, &r) // Ensure result matches expected. - if !rx.Equals(x3) || !ry.Equals(y3) || !rz.Equals(z3) { + if !r.X.Equals(&want.X) || !r.Y.Equals(&want.Y) || !r.Z.Equals(&want.Z) { t.Errorf("#%d wrong result\ngot: (%v, %v, %v)\n"+ - "want: (%v, %v, %v)", i, rx, ry, rz, x3, y3, z3) + "want: (%v, %v, %v)", i, r.X, r.Y, r.Z, want.X, want.Y, want.Z) continue } } @@ -360,6 +354,15 @@ func TestAddAffine(t *testing.T) { } } +// isStrictlyEqual returns whether or not the two Jacobian points are strictly +// equal for use in the tests. Recall that several Jacobian points can be +// equal in affine coordinates, while not having the same coordinates in +// projective space, so the two points not being equal doesn't necessarily mean +// they aren't actually the same affine point. +func isStrictlyEqual(p, other *JacobianPoint) bool { + return p.X.Equals(&other.X) && p.Y.Equals(&other.Y) && p.Z.Equals(&other.Z) +} + // TestDoubleJacobian tests doubling of points projected in Jacobian // coordinates. func TestDoubleJacobian(t *testing.T) { @@ -408,34 +411,31 @@ func TestDoubleJacobian(t *testing.T) { t.Logf("Running %d tests", len(tests)) for i, test := range tests { // Convert hex to field values. - x1 := new(fieldVal).SetHex(test.x1) - y1 := new(fieldVal).SetHex(test.y1) - z1 := new(fieldVal).SetHex(test.z1) - x3 := new(fieldVal).SetHex(test.x3) - y3 := new(fieldVal).SetHex(test.y3) - z3 := new(fieldVal).SetHex(test.z3) + p1 := jacobianPointFromHex(test.x1, test.y1, test.z1) + want := jacobianPointFromHex(test.x3, test.y3, test.z3) // Ensure the test data is using points that are actually on // the curve (or the point at infinity). - if !z1.IsZero() && !isJacobianOnS256Curve(x1, y1, z1) { + if !p1.Z.IsZero() && !isJacobianOnS256Curve(&p1) { t.Errorf("#%d first point is not on the curve -- "+ "invalid test data", i) continue } - if !z3.IsZero() && !isJacobianOnS256Curve(x3, y3, z3) { + if !want.Z.IsZero() && !isJacobianOnS256Curve(&want) { t.Errorf("#%d expected point is not on the curve -- "+ "invalid test data", i) continue } // Double the point. - rx, ry, rz := new(fieldVal), new(fieldVal), new(fieldVal) - S256().doubleJacobian(x1, y1, z1, rx, ry, rz) + var result JacobianPoint + DoubleNonConst(&p1, &result) // Ensure result matches expected. - if !rx.Equals(x3) || !ry.Equals(y3) || !rz.Equals(z3) { + if !isStrictlyEqual(&result, &want) { t.Errorf("#%d wrong result\ngot: (%v, %v, %v)\n"+ - "want: (%v, %v, %v)", i, rx, ry, rz, x3, y3, z3) + "want: (%v, %v, %v)", i, result.X, result.Y, result.Z, + want.X, want.Y, want.Z) continue } } @@ -527,7 +527,7 @@ type baseMultTest struct { x, y string } -//TODO: add more test vectors +// TODO: add more test vectors var s256BaseMultTests = []baseMultTest{ { "AA5E28D6A97A2479A65527F7290311A3624D4CC0FA1578598EE3C2613BF99522", @@ -556,7 +556,7 @@ var s256BaseMultTests = []baseMultTest{ }, } -//TODO: test different curves as well? +// TODO: test different curves as well? func TestBaseMult(t *testing.T) { s256 := S256() for i, e := range s256BaseMultTests { @@ -651,18 +651,74 @@ func TestScalarMultRand(t *testing.T) { _, err := rand.Read(data) if err != nil { t.Fatalf("failed to read random data at %d", i) - break } x, y = s256.ScalarMult(x, y, data) exponent.Mul(exponent, new(big.Int).SetBytes(data)) xWant, yWant := s256.ScalarBaseMult(exponent.Bytes()) if x.Cmp(xWant) != 0 || y.Cmp(yWant) != 0 { t.Fatalf("%d: bad output for %X: got (%X, %X), want (%X, %X)", i, data, x, y, xWant, yWant) - break } } } +var ( + // Next 6 constants are from Hal Finney's bitcointalk.org post: + // https://bitcointalk.org/index.php?topic=3238.msg45565#msg45565 + // May he rest in peace. + // + // They have also been independently derived from the code in the + // EndomorphismVectors function in genstatics.go. + endomorphismLambda = fromHex("5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72") + endomorphismBeta = hexToFieldVal("7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee") + endomorphismA1 = fromHex("3086d221a7d46bcde86c90e49284eb15") + endomorphismB1 = fromHex("-e4437ed6010e88286f547fa90abfe4c3") + endomorphismA2 = fromHex("114ca50f7a8e2f3f657c1108d9d44cfd8") + endomorphismB2 = fromHex("3086d221a7d46bcde86c90e49284eb15") +) + +// splitK returns a balanced length-two representation of k and their signs. +// This is algorithm 3.74 from [GECC]. +// +// One thing of note about this algorithm is that no matter what c1 and c2 are, +// the final equation of k = k1 + k2 * lambda (mod n) will hold. This is +// provable mathematically due to how a1/b1/a2/b2 are computed. +// +// c1 and c2 are chosen to minimize the max(k1,k2). +func splitK(k []byte) ([]byte, []byte, int, int) { + // All math here is done with big.Int, which is slow. + // At some point, it might be useful to write something similar to + // FieldVal but for N instead of P as the prime field if this ends up + // being a bottleneck. + bigIntK := new(big.Int) + c1, c2 := new(big.Int), new(big.Int) + tmp1, tmp2 := new(big.Int), new(big.Int) + k1, k2 := new(big.Int), new(big.Int) + + bigIntK.SetBytes(k) + // c1 = round(b2 * k / n) from step 4. + // Rounding isn't really necessary and costs too much, hence skipped + c1.Mul(endomorphismB2, bigIntK) + c1.Div(c1, Params().N) + // c2 = round(b1 * k / n) from step 4 (sign reversed to optimize one step) + // Rounding isn't really necessary and costs too much, hence skipped + c2.Mul(endomorphismB1, bigIntK) + c2.Div(c2, Params().N) + // k1 = k - c1 * a1 - c2 * a2 from step 5 (note c2's sign is reversed) + tmp1.Mul(c1, endomorphismA1) + tmp2.Mul(c2, endomorphismA2) + k1.Sub(bigIntK, tmp1) + k1.Add(k1, tmp2) + // k2 = - c1 * b1 - c2 * b2 from step 5 (note c2's sign is reversed) + tmp1.Mul(c1, endomorphismB1) + tmp2.Mul(c2, endomorphismB2) + k2.Sub(tmp2, tmp1) + + // Note Bytes() throws out the sign of k1 and k2. This matters + // since k1 and/or k2 can be negative. Hence, we pass that + // back separately. + return k1.Bytes(), k2.Bytes(), k1.Sign(), k2.Sign() +} + func TestSplitK(t *testing.T) { tests := []struct { k string @@ -719,7 +775,7 @@ func TestSplitK(t *testing.T) { if !ok { t.Errorf("%d: bad value for k: %s", i, test.k) } - k1, k2, k1Sign, k2Sign := s256.splitK(k.Bytes()) + k1, k2, k1Sign, k2Sign := splitK(k.Bytes()) k1str := fmt.Sprintf("%064x", k1) if test.k1 != k1str { t.Errorf("%d: bad k1: got %v, want %v", i, k1str, test.k1) @@ -740,7 +796,7 @@ func TestSplitK(t *testing.T) { k2Int := new(big.Int).SetBytes(k2) k2SignInt := new(big.Int).SetInt64(int64(k2Sign)) k2Int.Mul(k2Int, k2SignInt) - gotK := new(big.Int).Mul(k2Int, s256.lambda) + gotK := new(big.Int).Mul(k2Int, endomorphismLambda) gotK.Add(k1Int, gotK) gotK.Mod(gotK, s256.N) if k.Cmp(gotK) != 0 { @@ -756,17 +812,16 @@ func TestSplitKRand(t *testing.T) { _, err := rand.Read(bytesK) if err != nil { t.Fatalf("failed to read random data at %d", i) - break } k := new(big.Int).SetBytes(bytesK) - k1, k2, k1Sign, k2Sign := s256.splitK(bytesK) + k1, k2, k1Sign, k2Sign := splitK(bytesK) k1Int := new(big.Int).SetBytes(k1) k1SignInt := new(big.Int).SetInt64(int64(k1Sign)) k1Int.Mul(k1Int, k1SignInt) k2Int := new(big.Int).SetBytes(k2) k2SignInt := new(big.Int).SetInt64(int64(k2Sign)) k2Int.Mul(k2Int, k2SignInt) - gotK := new(big.Int).Mul(k2Int, s256.lambda) + gotK := new(big.Int).Mul(k2Int, endomorphismLambda) gotK.Add(k1Int, gotK) gotK.Mod(gotK, s256.N) if k.Cmp(gotK) != 0 { @@ -778,12 +833,13 @@ func TestSplitKRand(t *testing.T) { // Test this curve's usage with the ecdsa package. func testKeyGeneration(t *testing.T, c *KoblitzCurve, tag string) { - priv, err := NewPrivateKey(c) + priv, err := NewPrivateKey() if err != nil { t.Errorf("%s: error: %s", tag, err) return } - if !c.IsOnCurve(priv.PublicKey.X, priv.PublicKey.Y) { + pub := priv.PubKey() + if !c.IsOnCurve(pub.X(), pub.Y()) { t.Errorf("%s: public key invalid: %s", tag, err) } } @@ -792,98 +848,41 @@ func TestKeyGeneration(t *testing.T) { testKeyGeneration(t, S256(), "S256") } -func testSignAndVerify(t *testing.T, c *KoblitzCurve, tag string) { - priv, _ := NewPrivateKey(c) - pub := priv.PubKey() - - hashed := []byte("testing") - sig, err := priv.Sign(hashed) - if err != nil { - t.Errorf("%s: error signing: %s", tag, err) - return +// checkNAFEncoding returns an error if the provided positive and negative +// portions of an overall NAF encoding do not adhere to the requirements or they +// do not sum back to the provided original value. +func checkNAFEncoding(pos, neg []byte, origValue *big.Int) error { + // NAF must not have a leading zero byte and the number of negative + // bytes must not exceed the positive portion. + if len(pos) > 0 && pos[0] == 0 { + return fmt.Errorf("positive has leading zero -- got %x", pos) } - - if !sig.Verify(hashed, pub) { - t.Errorf("%s: Verify failed", tag) + if len(neg) > len(pos) { + return fmt.Errorf("negative has len %d > pos len %d", len(neg), + len(pos)) } - hashed[0] ^= 0xff - if sig.Verify(hashed, pub) { - t.Errorf("%s: Verify always works!", tag) + // Ensure the result doesn't have any adjacent non-zero digits. + gotPos := new(big.Int).SetBytes(pos) + gotNeg := new(big.Int).SetBytes(neg) + posOrNeg := new(big.Int).Or(gotPos, gotNeg) + prevBit := posOrNeg.Bit(0) + for bit := 1; bit < posOrNeg.BitLen(); bit++ { + thisBit := posOrNeg.Bit(bit) + if prevBit == 1 && thisBit == 1 { + return fmt.Errorf("adjacent non-zero digits found at bit pos %d", + bit-1) + } + prevBit = thisBit } -} - -func TestSignAndVerify(t *testing.T) { - testSignAndVerify(t, S256(), "S256") -} -func TestNAF(t *testing.T) { - tests := []string{ - "6df2b5d30854069ccdec40ae022f5c948936324a4e9ebed8eb82cfd5a6b6d766", - "b776e53fb55f6b006a270d42d64ec2b1", - "d6cc32c857f1174b604eefc544f0c7f7", - "45c53aa1bb56fcd68c011e2dad6758e4", - "a2e79d200f27f2360fba57619936159b", + // Ensure the resulting positive and negative portions of the overall + // NAF representation sum back to the original value. + gotValue := new(big.Int).Sub(gotPos, gotNeg) + if origValue.Cmp(gotValue) != 0 { + return fmt.Errorf("pos-neg is not original value: got %x, want %x", + gotValue, origValue) } - negOne := big.NewInt(-1) - one := big.NewInt(1) - two := big.NewInt(2) - for i, test := range tests { - want, _ := new(big.Int).SetString(test, 16) - nafPos, nafNeg := NAF(want.Bytes()) - got := big.NewInt(0) - // Check that the NAF representation comes up with the right number - for i := 0; i < len(nafPos); i++ { - bytePos := nafPos[i] - byteNeg := nafNeg[i] - for j := 7; j >= 0; j-- { - got.Mul(got, two) - if bytePos&0x80 == 0x80 { - got.Add(got, one) - } else if byteNeg&0x80 == 0x80 { - got.Add(got, negOne) - } - bytePos <<= 1 - byteNeg <<= 1 - } - } - if got.Cmp(want) != 0 { - t.Errorf("%d: Failed NAF got %X want %X", i, got, want) - } - } -} -func TestNAFRand(t *testing.T) { - negOne := big.NewInt(-1) - one := big.NewInt(1) - two := big.NewInt(2) - for i := 0; i < 1024; i++ { - data := make([]byte, 32) - _, err := rand.Read(data) - if err != nil { - t.Fatalf("failed to read random data at %d", i) - break - } - nafPos, nafNeg := NAF(data) - want := new(big.Int).SetBytes(data) - got := big.NewInt(0) - // Check that the NAF representation comes up with the right number - for i := 0; i < len(nafPos); i++ { - bytePos := nafPos[i] - byteNeg := nafNeg[i] - for j := 7; j >= 0; j-- { - got.Mul(got, two) - if bytePos&0x80 == 0x80 { - got.Add(got, one) - } else if byteNeg&0x80 == 0x80 { - got.Add(got, negOne) - } - bytePos <<= 1 - byteNeg <<= 1 - } - } - if got.Cmp(want) != 0 { - t.Errorf("%d: Failed NAF got %X want %X", i, got, want) - } - } + return nil } diff --git a/btcec/ciphering.go b/btcec/ciphering.go index b18c9b7a30..88d93e2766 100644 --- a/btcec/ciphering.go +++ b/btcec/ciphering.go @@ -5,212 +5,12 @@ package btcec import ( - "bytes" - "crypto/aes" - "crypto/cipher" - "crypto/hmac" - "crypto/rand" - "crypto/sha256" - "crypto/sha512" - "errors" - "io" -) - -var ( - // ErrInvalidMAC occurs when Message Authentication Check (MAC) fails - // during decryption. This happens because of either invalid private key or - // corrupt ciphertext. - ErrInvalidMAC = errors.New("invalid mac hash") - - // errInputTooShort occurs when the input ciphertext to the Decrypt - // function is less than 134 bytes long. - errInputTooShort = errors.New("ciphertext too short") - - // errUnsupportedCurve occurs when the first two bytes of the encrypted - // text aren't 0x02CA (= 712 = secp256k1, from OpenSSL). - errUnsupportedCurve = errors.New("unsupported curve") - - errInvalidXLength = errors.New("invalid X length, must be 32") - errInvalidYLength = errors.New("invalid Y length, must be 32") - errInvalidPadding = errors.New("invalid PKCS#7 padding") - - // 0x02CA = 714 - ciphCurveBytes = [2]byte{0x02, 0xCA} - // 0x20 = 32 - ciphCoordLength = [2]byte{0x00, 0x20} + secp "github.com/decred/dcrd/dcrec/secp256k1/v4" ) // GenerateSharedSecret generates a shared secret based on a private key and a // public key using Diffie-Hellman key exchange (ECDH) (RFC 4753). // RFC5903 Section 9 states we should only return x. func GenerateSharedSecret(privkey *PrivateKey, pubkey *PublicKey) []byte { - x, _ := pubkey.Curve.ScalarMult(pubkey.X, pubkey.Y, privkey.D.Bytes()) - return x.Bytes() -} - -// Encrypt encrypts data for the target public key using AES-256-CBC. It also -// generates a private key (the pubkey of which is also in the output). The only -// supported curve is secp256k1. The `structure' that it encodes everything into -// is: -// -// struct { -// // Initialization Vector used for AES-256-CBC -// IV [16]byte -// // Public Key: curve(2) + len_of_pubkeyX(2) + pubkeyX + -// // len_of_pubkeyY(2) + pubkeyY (curve = 714) -// PublicKey [70]byte -// // Cipher text -// Data []byte -// // HMAC-SHA-256 Message Authentication Code -// HMAC [32]byte -// } -// -// The primary aim is to ensure byte compatibility with Pyelliptic. Also, refer -// to section 5.8.1 of ANSI X9.63 for rationale on this format. -func Encrypt(pubkey *PublicKey, in []byte) ([]byte, error) { - ephemeral, err := NewPrivateKey(S256()) - if err != nil { - return nil, err - } - ecdhKey := GenerateSharedSecret(ephemeral, pubkey) - derivedKey := sha512.Sum512(ecdhKey) - keyE := derivedKey[:32] - keyM := derivedKey[32:] - - paddedIn := addPKCSPadding(in) - // IV + Curve params/X/Y + padded plaintext/ciphertext + HMAC-256 - out := make([]byte, aes.BlockSize+70+len(paddedIn)+sha256.Size) - iv := out[:aes.BlockSize] - if _, err = io.ReadFull(rand.Reader, iv); err != nil { - return nil, err - } - // start writing public key - pb := ephemeral.PubKey().SerializeUncompressed() - offset := aes.BlockSize - - // curve and X length - copy(out[offset:offset+4], append(ciphCurveBytes[:], ciphCoordLength[:]...)) - offset += 4 - // X - copy(out[offset:offset+32], pb[1:33]) - offset += 32 - // Y length - copy(out[offset:offset+2], ciphCoordLength[:]) - offset += 2 - // Y - copy(out[offset:offset+32], pb[33:]) - offset += 32 - - // start encryption - block, err := aes.NewCipher(keyE) - if err != nil { - return nil, err - } - mode := cipher.NewCBCEncrypter(block, iv) - mode.CryptBlocks(out[offset:len(out)-sha256.Size], paddedIn) - - // start HMAC-SHA-256 - hm := hmac.New(sha256.New, keyM) - hm.Write(out[:len(out)-sha256.Size]) // everything is hashed - copy(out[len(out)-sha256.Size:], hm.Sum(nil)) // write checksum - - return out, nil -} - -// Decrypt decrypts data that was encrypted using the Encrypt function. -func Decrypt(priv *PrivateKey, in []byte) ([]byte, error) { - // IV + Curve params/X/Y + 1 block + HMAC-256 - if len(in) < aes.BlockSize+70+aes.BlockSize+sha256.Size { - return nil, errInputTooShort - } - - // read iv - iv := in[:aes.BlockSize] - offset := aes.BlockSize - - // start reading pubkey - if !bytes.Equal(in[offset:offset+2], ciphCurveBytes[:]) { - return nil, errUnsupportedCurve - } - offset += 2 - - if !bytes.Equal(in[offset:offset+2], ciphCoordLength[:]) { - return nil, errInvalidXLength - } - offset += 2 - - xBytes := in[offset : offset+32] - offset += 32 - - if !bytes.Equal(in[offset:offset+2], ciphCoordLength[:]) { - return nil, errInvalidYLength - } - offset += 2 - - yBytes := in[offset : offset+32] - offset += 32 - - pb := make([]byte, 65) - pb[0] = byte(0x04) // uncompressed - copy(pb[1:33], xBytes) - copy(pb[33:], yBytes) - // check if (X, Y) lies on the curve and create a Pubkey if it does - pubkey, err := ParsePubKey(pb, S256()) - if err != nil { - return nil, err - } - - // check for cipher text length - if (len(in)-aes.BlockSize-offset-sha256.Size)%aes.BlockSize != 0 { - return nil, errInvalidPadding // not padded to 16 bytes - } - - // read hmac - messageMAC := in[len(in)-sha256.Size:] - - // generate shared secret - ecdhKey := GenerateSharedSecret(priv, pubkey) - derivedKey := sha512.Sum512(ecdhKey) - keyE := derivedKey[:32] - keyM := derivedKey[32:] - - // verify mac - hm := hmac.New(sha256.New, keyM) - hm.Write(in[:len(in)-sha256.Size]) // everything is hashed - expectedMAC := hm.Sum(nil) - if !hmac.Equal(messageMAC, expectedMAC) { - return nil, ErrInvalidMAC - } - - // start decryption - block, err := aes.NewCipher(keyE) - if err != nil { - return nil, err - } - mode := cipher.NewCBCDecrypter(block, iv) - // same length as ciphertext - plaintext := make([]byte, len(in)-offset-sha256.Size) - mode.CryptBlocks(plaintext, in[offset:len(in)-sha256.Size]) - - return removePKCSPadding(plaintext) -} - -// Implement PKCS#7 padding with block size of 16 (AES block size). - -// addPKCSPadding adds padding to a block of data -func addPKCSPadding(src []byte) []byte { - padding := aes.BlockSize - len(src)%aes.BlockSize - padtext := bytes.Repeat([]byte{byte(padding)}, padding) - return append(src, padtext...) -} - -// removePKCSPadding removes padding from data that was added with addPKCSPadding -func removePKCSPadding(src []byte) ([]byte, error) { - length := len(src) - padLength := int(src[length-1]) - if padLength > aes.BlockSize || length < aes.BlockSize { - return nil, errInvalidPadding - } - - return src[:length-padLength], nil + return secp.GenerateSharedSecret(privkey, pubkey) } diff --git a/btcec/ciphering_test.go b/btcec/ciphering_test.go index 819f18846c..c6bea3da73 100644 --- a/btcec/ciphering_test.go +++ b/btcec/ciphering_test.go @@ -6,17 +6,16 @@ package btcec import ( "bytes" - "encoding/hex" "testing" ) func TestGenerateSharedSecret(t *testing.T) { - privKey1, err := NewPrivateKey(S256()) + privKey1, err := NewPrivateKey() if err != nil { t.Errorf("private key generation error: %s", err) return } - privKey2, err := NewPrivateKey(S256()) + privKey2, err := NewPrivateKey() if err != nil { t.Errorf("private key generation error: %s", err) return @@ -30,145 +29,3 @@ func TestGenerateSharedSecret(t *testing.T) { secret1, secret2) } } - -// Test 1: Encryption and decryption -func TestCipheringBasic(t *testing.T) { - privkey, err := NewPrivateKey(S256()) - if err != nil { - t.Fatal("failed to generate private key") - } - - in := []byte("Hey there dude. How are you doing? This is a test.") - - out, err := Encrypt(privkey.PubKey(), in) - if err != nil { - t.Fatal("failed to encrypt:", err) - } - - dec, err := Decrypt(privkey, out) - if err != nil { - t.Fatal("failed to decrypt:", err) - } - - if !bytes.Equal(in, dec) { - t.Error("decrypted data doesn't match original") - } -} - -// Test 2: Byte compatibility with Pyelliptic -func TestCiphering(t *testing.T) { - pb, _ := hex.DecodeString("fe38240982f313ae5afb3e904fb8215fb11af1200592b" + - "fca26c96c4738e4bf8f") - privkey, _ := PrivKeyFromBytes(S256(), pb) - - in := []byte("This is just a test.") - out, _ := hex.DecodeString("b0d66e5adaa5ed4e2f0ca68e17b8f2fc02ca002009e3" + - "3487e7fa4ab505cf34d98f131be7bd258391588ca7804acb30251e71a04e0020ecf" + - "df0f84608f8add82d7353af780fbb28868c713b7813eb4d4e61f7b75d7534dd9856" + - "9b0ba77cf14348fcff80fee10e11981f1b4be372d93923e9178972f69937ec850ed" + - "6c3f11ff572ddd5b2bedf9f9c0b327c54da02a28fcdce1f8369ffec") - - dec, err := Decrypt(privkey, out) - if err != nil { - t.Fatal("failed to decrypt:", err) - } - - if !bytes.Equal(in, dec) { - t.Error("decrypted data doesn't match original") - } -} - -func TestCipheringErrors(t *testing.T) { - privkey, err := NewPrivateKey(S256()) - if err != nil { - t.Fatal("failed to generate private key") - } - - tests1 := []struct { - ciphertext []byte // input ciphertext - }{ - {bytes.Repeat([]byte{0x00}, 133)}, // errInputTooShort - {bytes.Repeat([]byte{0x00}, 134)}, // errUnsupportedCurve - {bytes.Repeat([]byte{0x02, 0xCA}, 134)}, // errInvalidXLength - {bytes.Repeat([]byte{0x02, 0xCA, 0x00, 0x20}, 134)}, // errInvalidYLength - {[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // IV - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0xCA, 0x00, 0x20, // curve and X length - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // X - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, // Y length - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Y - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ciphertext - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // MAC - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }}, // invalid pubkey - {[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // IV - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0xCA, 0x00, 0x20, // curve and X length - 0x11, 0x5C, 0x42, 0xE7, 0x57, 0xB2, 0xEF, 0xB7, // X - 0x67, 0x1C, 0x57, 0x85, 0x30, 0xEC, 0x19, 0x1A, - 0x13, 0x59, 0x38, 0x1E, 0x6A, 0x71, 0x12, 0x7A, - 0x9D, 0x37, 0xC4, 0x86, 0xFD, 0x30, 0xDA, 0xE5, - 0x00, 0x20, // Y length - 0x7E, 0x76, 0xDC, 0x58, 0xF6, 0x93, 0xBD, 0x7E, // Y - 0x70, 0x10, 0x35, 0x8C, 0xE6, 0xB1, 0x65, 0xE4, - 0x83, 0xA2, 0x92, 0x10, 0x10, 0xDB, 0x67, 0xAC, - 0x11, 0xB1, 0xB5, 0x1B, 0x65, 0x19, 0x53, 0xD2, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ciphertext - // padding not aligned to 16 bytes - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // MAC - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }}, // errInvalidPadding - {[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // IV - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0xCA, 0x00, 0x20, // curve and X length - 0x11, 0x5C, 0x42, 0xE7, 0x57, 0xB2, 0xEF, 0xB7, // X - 0x67, 0x1C, 0x57, 0x85, 0x30, 0xEC, 0x19, 0x1A, - 0x13, 0x59, 0x38, 0x1E, 0x6A, 0x71, 0x12, 0x7A, - 0x9D, 0x37, 0xC4, 0x86, 0xFD, 0x30, 0xDA, 0xE5, - 0x00, 0x20, // Y length - 0x7E, 0x76, 0xDC, 0x58, 0xF6, 0x93, 0xBD, 0x7E, // Y - 0x70, 0x10, 0x35, 0x8C, 0xE6, 0xB1, 0x65, 0xE4, - 0x83, 0xA2, 0x92, 0x10, 0x10, 0xDB, 0x67, 0xAC, - 0x11, 0xB1, 0xB5, 0x1B, 0x65, 0x19, 0x53, 0xD2, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ciphertext - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // MAC - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }}, // ErrInvalidMAC - } - - for i, test := range tests1 { - _, err = Decrypt(privkey, test.ciphertext) - if err == nil { - t.Errorf("Decrypt #%d did not get error", i) - } - } - - // test error from removePKCSPadding - tests2 := []struct { - in []byte // input data - }{ - {bytes.Repeat([]byte{0x11}, 17)}, - {bytes.Repeat([]byte{0x07}, 15)}, - } - for i, test := range tests2 { - _, err = removePKCSPadding(test.in) - if err == nil { - t.Errorf("removePKCSPadding #%d did not get error", i) - } - } -} diff --git a/btcec/curve.go b/btcec/curve.go new file mode 100644 index 0000000000..70a9229f9a --- /dev/null +++ b/btcec/curve.go @@ -0,0 +1,115 @@ +// Copyright (c) 2015-2021 The btcsuite developers +// Copyright (c) 2015-2021 The Decred developers + +package btcec + +import ( + "fmt" + + secp "github.com/decred/dcrd/dcrec/secp256k1/v4" +) + +// JacobianPoint is an element of the group formed by the secp256k1 curve in +// Jacobian projective coordinates and thus represents a point on the curve. +type JacobianPoint = secp.JacobianPoint + +// infinityPoint is the jacobian representation of the point at infinity. +var infinityPoint JacobianPoint + +// MakeJacobianPoint returns a Jacobian point with the provided X, Y, and Z +// coordinates. +func MakeJacobianPoint(x, y, z *FieldVal) JacobianPoint { + return secp.MakeJacobianPoint(x, y, z) +} + +// AddNonConst adds the passed Jacobian points together and stores the result +// in the provided result param in *non-constant* time. +func AddNonConst(p1, p2, result *JacobianPoint) { + secp.AddNonConst(p1, p2, result) +} + +// DecompressY attempts to calculate the Y coordinate for the given X +// coordinate such that the result pair is a point on the secp256k1 curve. It +// adjusts Y based on the desired oddness and returns whether or not it was +// successful since not all X coordinates are valid. +// +// The magnitude of the provided X coordinate field val must be a max of 8 for +// a correct result. The resulting Y field val will have a max magnitude of 2. +func DecompressY(x *FieldVal, odd bool, resultY *FieldVal) bool { + return secp.DecompressY(x, odd, resultY) +} + +// DoubleNonConst doubles the passed Jacobian point and stores the result in +// the provided result parameter in *non-constant* time. +// +// NOTE: The point must be normalized for this function to return the correct +// result. The resulting point will be normalized. +func DoubleNonConst(p, result *JacobianPoint) { + secp.DoubleNonConst(p, result) +} + +// ScalarBaseMultNonConst multiplies k*G where G is the base point of the group +// and k is a big endian integer. The result is stored in Jacobian coordinates +// (x1, y1, z1). +// +// NOTE: The resulting point will be normalized. +func ScalarBaseMultNonConst(k *ModNScalar, result *JacobianPoint) { + secp.ScalarBaseMultNonConst(k, result) +} + +// ScalarMultNonConst multiplies k*P where k is a big endian integer modulo the +// curve order and P is a point in Jacobian projective coordinates and stores +// the result in the provided Jacobian point. +// +// NOTE: The point must be normalized for this function to return the correct +// result. The resulting point will be normalized. +func ScalarMultNonConst(k *ModNScalar, point, result *JacobianPoint) { + secp.ScalarMultNonConst(k, point, result) +} + +// ParseJacobian parses a byte slice point as a secp.Publickey and returns the +// pubkey as a JacobianPoint. If the nonce is a zero slice, the infinityPoint +// is returned. +func ParseJacobian(point []byte) (JacobianPoint, error) { + var result JacobianPoint + + if len(point) != 33 { + str := fmt.Sprintf("invalid nonce: invalid length: %v", + len(point)) + return JacobianPoint{}, makeError(secp.ErrPubKeyInvalidLen, str) + } + + if point[0] == 0x00 { + return infinityPoint, nil + } + + noncePk, err := secp.ParsePubKey(point) + if err != nil { + return JacobianPoint{}, err + } + noncePk.AsJacobian(&result) + + return result, nil +} + +// JacobianToByteSlice converts the passed JacobianPoint to a Pubkey +// and serializes that to a byte slice. If the JacobianPoint is the infinity +// point, a zero slice is returned. +func JacobianToByteSlice(point JacobianPoint) []byte { + if point.X == infinityPoint.X && point.Y == infinityPoint.Y { + return make([]byte, 33) + } + + point.ToAffine() + + return NewPublicKey( + &point.X, &point.Y, + ).SerializeCompressed() +} + +// GeneratorJacobian sets the passed JacobianPoint to the Generator Point. +func GeneratorJacobian(jacobian *JacobianPoint) { + var k ModNScalar + k.SetInt(1) + ScalarBaseMultNonConst(&k, jacobian) +} diff --git a/btcec/ecdsa/bench_test.go b/btcec/ecdsa/bench_test.go new file mode 100644 index 0000000000..57864af9fd --- /dev/null +++ b/btcec/ecdsa/bench_test.go @@ -0,0 +1,210 @@ +// Copyright 2013-2016 The btcsuite developers +// Copyright (c) 2015-2021 The Decred developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package ecdsa + +import ( + "encoding/hex" + "math/big" + "testing" + + "github.com/btcsuite/btcd/btcec/v2" + "github.com/decred/dcrd/dcrec/secp256k1/v4" +) + +// hexToBytes converts the passed hex string into bytes and will panic if there +// is an error. This is only provided for the hard-coded constants so errors in +// the source code can be detected. It will only (and must only) be called with +// hard-coded values. +func hexToBytes(s string) []byte { + b, err := hex.DecodeString(s) + if err != nil { + panic("invalid hex in source file: " + s) + } + return b +} + +// hexToModNScalar converts the passed hex string into a ModNScalar and will +// panic if there is an error. This is only provided for the hard-coded +// constants so errors in the source code can be detected. It will only (and +// must only) be called with hard-coded values. +func hexToModNScalar(s string) *btcec.ModNScalar { + b, err := hex.DecodeString(s) + if err != nil { + panic("invalid hex in source file: " + s) + } + var scalar btcec.ModNScalar + if overflow := scalar.SetByteSlice(b); overflow { + panic("hex in source file overflows mod N scalar: " + s) + } + return &scalar +} + +// hexToFieldVal converts the passed hex string into a FieldVal and will panic +// if there is an error. This is only provided for the hard-coded constants so +// errors in the source code can be detected. It will only (and must only) be +// called with hard-coded values. +func hexToFieldVal(s string) *btcec.FieldVal { + b, err := hex.DecodeString(s) + if err != nil { + panic("invalid hex in source file: " + s) + } + var f btcec.FieldVal + if overflow := f.SetByteSlice(b); overflow { + panic("hex in source file overflows mod P: " + s) + } + return &f +} + +// fromHex converts the passed hex string into a big integer pointer and will +// panic is there is an error. This is only provided for the hard-coded +// constants so errors in the source code can bet detected. It will only (and +// must only) be called for initialization purposes. +func fromHex(s string) *big.Int { + if s == "" { + return big.NewInt(0) + } + r, ok := new(big.Int).SetString(s, 16) + if !ok { + panic("invalid hex in source file: " + s) + } + return r +} + +// BenchmarkSigVerify benchmarks how long it takes the secp256k1 curve to +// verify signatures. +func BenchmarkSigVerify(b *testing.B) { + b.StopTimer() + // Randomly generated keypair. + // Private key: 9e0699c91ca1e3b7e3c9ba71eb71c89890872be97576010fe593fbf3fd57e66d + pubKey := btcec.NewPublicKey( + hexToFieldVal("d2e670a19c6d753d1a6d8b20bd045df8a08fb162cf508956c31268c6d81ffdab"), + hexToFieldVal("ab65528eefbb8057aa85d597258a3fbd481a24633bc9b47a9aa045c91371de52"), + ) + + // Double sha256 of []byte{0x01, 0x02, 0x03, 0x04} + msgHash := fromHex("8de472e2399610baaa7f84840547cd409434e31f5d3bd71e4d947f283874f9c0") + sig := NewSignature( + hexToModNScalar("fef45d2892953aa5bbcdb057b5e98b208f1617a7498af7eb765574e29b5d9c2c"), + hexToModNScalar("d47563f52aac6b04b55de236b7c515eb9311757db01e02cff079c3ca6efb063f"), + ) + + if !sig.Verify(msgHash.Bytes(), pubKey) { + b.Errorf("Signature failed to verify") + return + } + b.StartTimer() + + for i := 0; i < b.N; i++ { + sig.Verify(msgHash.Bytes(), pubKey) + } +} + +// BenchmarkSign benchmarks how long it takes to sign a message. +func BenchmarkSign(b *testing.B) { + // Randomly generated keypair. + d := hexToModNScalar("9e0699c91ca1e3b7e3c9ba71eb71c89890872be97576010fe593fbf3fd57e66d") + privKey := secp256k1.NewPrivateKey(d) + + // blake256 of []byte{0x01, 0x02, 0x03, 0x04}. + msgHash := hexToBytes("c301ba9de5d6053caad9f5eb46523f007702add2c62fa39de03146a36b8026b7") + + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + Sign(privKey, msgHash) + } +} + +// BenchmarkSigSerialize benchmarks how long it takes to serialize a typical +// signature with the strict DER encoding. +func BenchmarkSigSerialize(b *testing.B) { + // Randomly generated keypair. + // Private key: 9e0699c91ca1e3b7e3c9ba71eb71c89890872be97576010fe593fbf3fd57e66d + // Signature for double sha256 of []byte{0x01, 0x02, 0x03, 0x04}. + sig := NewSignature( + hexToModNScalar("fef45d2892953aa5bbcdb057b5e98b208f1617a7498af7eb765574e29b5d9c2c"), + hexToModNScalar("d47563f52aac6b04b55de236b7c515eb9311757db01e02cff079c3ca6efb063f"), + ) + + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + sig.Serialize() + } +} + +// BenchmarkNonceRFC6979 benchmarks how long it takes to generate a +// deterministic nonce according to RFC6979. +func BenchmarkNonceRFC6979(b *testing.B) { + // Randomly generated keypair. + // Private key: 9e0699c91ca1e3b7e3c9ba71eb71c89890872be97576010fe593fbf3fd57e66d + // X: d2e670a19c6d753d1a6d8b20bd045df8a08fb162cf508956c31268c6d81ffdab + // Y: ab65528eefbb8057aa85d597258a3fbd481a24633bc9b47a9aa045c91371de52 + privKeyStr := "9e0699c91ca1e3b7e3c9ba71eb71c89890872be97576010fe593fbf3fd57e66d" + privKey := hexToBytes(privKeyStr) + + // BLAKE-256 of []byte{0x01, 0x02, 0x03, 0x04}. + msgHash := hexToBytes("c301ba9de5d6053caad9f5eb46523f007702add2c62fa39de03146a36b8026b7") + + b.ReportAllocs() + b.ResetTimer() + var noElideNonce *secp256k1.ModNScalar + for i := 0; i < b.N; i++ { + noElideNonce = secp256k1.NonceRFC6979(privKey, msgHash, nil, nil, 0) + } + _ = noElideNonce +} + +// BenchmarkSignCompact benchmarks how long it takes to produce a compact +// signature for a message. +func BenchmarkSignCompact(b *testing.B) { + d := hexToModNScalar("9e0699c91ca1e3b7e3c9ba71eb71c89890872be97576010fe593fbf3fd57e66d") + privKey := secp256k1.NewPrivateKey(d) + + // blake256 of []byte{0x01, 0x02, 0x03, 0x04}. + msgHash := hexToBytes("c301ba9de5d6053caad9f5eb46523f007702add2c62fa39de03146a36b8026b7") + + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + _ = SignCompact(privKey, msgHash, true) + } +} + +// BenchmarkSignCompact benchmarks how long it takes to recover a public key +// given a compact signature and message. +func BenchmarkRecoverCompact(b *testing.B) { + // Private key: 9e0699c91ca1e3b7e3c9ba71eb71c89890872be97576010fe593fbf3fd57e66d + wantPubKey := secp256k1.NewPublicKey( + hexToFieldVal("d2e670a19c6d753d1a6d8b20bd045df8a08fb162cf508956c31268c6d81ffdab"), + hexToFieldVal("ab65528eefbb8057aa85d597258a3fbd481a24633bc9b47a9aa045c91371de52"), + ) + + compactSig := hexToBytes("205978b7896bc71676ba2e459882a8f52e1299449596c4f" + + "93c59bf1fbfa2f9d3b76ecd0c99406f61a6de2bb5a8937c061c176ecf381d0231e0d" + + "af73b922c8952c7") + + // blake256 of []byte{0x01, 0x02, 0x03, 0x04}. + msgHash := hexToBytes("c301ba9de5d6053caad9f5eb46523f007702add2c62fa39de03146a36b8026b7") + + // Ensure a valid compact signature is being benchmarked. + pubKey, wasCompressed, err := RecoverCompact(compactSig, msgHash) + if err != nil { + b.Fatalf("unexpected err: %v", err) + } + if !wasCompressed { + b.Fatal("recover claims uncompressed pubkey") + } + if !pubKey.IsEqual(wantPubKey) { + b.Fatal("recover returned unexpected pubkey") + } + + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, _, _ = RecoverCompact(compactSig, msgHash) + } +} diff --git a/btcec/ecdsa/error.go b/btcec/ecdsa/error.go new file mode 100644 index 0000000000..a30d63b636 --- /dev/null +++ b/btcec/ecdsa/error.go @@ -0,0 +1,18 @@ +// Copyright (c) 2013-2021 The btcsuite developers +// Copyright (c) 2015-2021 The Decred developers + +package ecdsa + +import ( + secp_ecdsa "github.com/decred/dcrd/dcrec/secp256k1/v4/ecdsa" +) + +// ErrorKind identifies a kind of error. It has full support for +// errors.Is and errors.As, so the caller can directly check against +// an error kind when determining the reason for an error. +type ErrorKind = secp_ecdsa.ErrorKind + +// Error identifies an error related to an ECDSA signature. It has full +// support for errors.Is and errors.As, so the caller can ascertain the +// specific reason for the error by checking the underlying error. +type Error = secp_ecdsa.ErrorKind diff --git a/btcec/ecdsa/example_test.go b/btcec/ecdsa/example_test.go new file mode 100644 index 0000000000..409a95bd23 --- /dev/null +++ b/btcec/ecdsa/example_test.go @@ -0,0 +1,85 @@ +// Copyright (c) 2014 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package ecdsa_test + +import ( + "encoding/hex" + "fmt" + + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcec/v2/ecdsa" + "github.com/btcsuite/btcd/chaincfg/chainhash" +) + +// This example demonstrates signing a message with a secp256k1 private key that +// is first parsed form raw bytes and serializing the generated signature. +func Example_signMessage() { + // Decode a hex-encoded private key. + pkBytes, err := hex.DecodeString("22a47fa09a223f2aa079edf85a7c2d4f87" + + "20ee63e502ee2869afab7de234b80c") + if err != nil { + fmt.Println(err) + return + } + privKey, pubKey := btcec.PrivKeyFromBytes(pkBytes) + + // Sign a message using the private key. + message := "test message" + messageHash := chainhash.DoubleHashB([]byte(message)) + signature := ecdsa.Sign(privKey, messageHash) + + // Serialize and display the signature. + fmt.Printf("Serialized Signature: %x\n", signature.Serialize()) + + // Verify the signature for the message using the public key. + verified := signature.Verify(messageHash, pubKey) + fmt.Printf("Signature Verified? %v\n", verified) + + // Output: + // Serialized Signature: 304402201008e236fa8cd0f25df4482dddbb622e8a8b26ef0ba731719458de3ccd93805b022032f8ebe514ba5f672466eba334639282616bb3c2f0ab09998037513d1f9e3d6d + // Signature Verified? true +} + +// This example demonstrates verifying a secp256k1 signature against a public +// key that is first parsed from raw bytes. The signature is also parsed from +// raw bytes. +func Example_verifySignature() { + // Decode hex-encoded serialized public key. + pubKeyBytes, err := hex.DecodeString("02a673638cb9587cb68ea08dbef685c" + + "6f2d2a751a8b3c6f2a7e9a4999e6e4bfaf5") + if err != nil { + fmt.Println(err) + return + } + pubKey, err := btcec.ParsePubKey(pubKeyBytes) + if err != nil { + fmt.Println(err) + return + } + + // Decode hex-encoded serialized signature. + sigBytes, err := hex.DecodeString("30450220090ebfb3690a0ff115bb1b38b" + + "8b323a667b7653454f1bccb06d4bbdca42c2079022100ec95778b51e707" + + "1cb1205f8bde9af6592fc978b0452dafe599481c46d6b2e479") + + if err != nil { + fmt.Println(err) + return + } + signature, err := ecdsa.ParseSignature(sigBytes) + if err != nil { + fmt.Println(err) + return + } + + // Verify the signature for the message using the public key. + message := "test message" + messageHash := chainhash.DoubleHashB([]byte(message)) + verified := signature.Verify(messageHash, pubKey) + fmt.Println("Signature Verified?", verified) + + // Output: + // Signature Verified? true +} diff --git a/btcec/ecdsa/signature.go b/btcec/ecdsa/signature.go new file mode 100644 index 0000000000..a2574f8794 --- /dev/null +++ b/btcec/ecdsa/signature.go @@ -0,0 +1,256 @@ +// Copyright (c) 2013-2017 The btcsuite developers +// Copyright (c) 2015-2021 The Decred developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package ecdsa + +import ( + "errors" + "fmt" + "math/big" + + "github.com/btcsuite/btcd/btcec/v2" + secp_ecdsa "github.com/decred/dcrd/dcrec/secp256k1/v4/ecdsa" +) + +// Errors returned by canonicalPadding. +var ( + errNegativeValue = errors.New("value may be interpreted as negative") + errExcessivelyPaddedValue = errors.New("value is excessively padded") +) + +// Signature is a type representing an ecdsa signature. +type Signature = secp_ecdsa.Signature + +// NewSignature instantiates a new signature given some r and s values. +func NewSignature(r, s *btcec.ModNScalar) *Signature { + return secp_ecdsa.NewSignature(r, s) +} + +var ( + // Used in RFC6979 implementation when testing the nonce for correctness + one = big.NewInt(1) + + // oneInitializer is used to fill a byte slice with byte 0x01. It is provided + // here to avoid the need to create it multiple times. + oneInitializer = []byte{0x01} +) + +const ( + // MinSigLen is the minimum length of a DER encoded signature and is when both R + // and S are 1 byte each. + // 0x30 + <1-byte> + 0x02 + 0x01 + + 0x2 + 0x01 + + MinSigLen = 8 + + // MaxSigLen is the maximum length of a DER encoded signature and is + // when both R and S are 33 bytes each. It is 33 bytes because a + // 256-bit integer requires 32 bytes and an additional leading null byte + // might be required if the high bit is set in the value. + // + // 0x30 + <1-byte> + 0x02 + 0x21 + <33 bytes> + 0x2 + 0x21 + <33 bytes> + MaxSigLen = 72 +) + +// canonicalPadding checks whether a big-endian encoded integer could +// possibly be misinterpreted as a negative number (even though OpenSSL +// treats all numbers as unsigned), or if there is any unnecessary +// leading zero padding. +func canonicalPadding(b []byte) error { + switch { + case b[0]&0x80 == 0x80: + return errNegativeValue + case len(b) > 1 && b[0] == 0x00 && b[1]&0x80 != 0x80: + return errExcessivelyPaddedValue + default: + return nil + } +} + +func parseSig(sigStr []byte, der bool) (*Signature, error) { + // Originally this code used encoding/asn1 in order to parse the + // signature, but a number of problems were found with this approach. + // Despite the fact that signatures are stored as DER, the difference + // between go's idea of a bignum (and that they have sign) doesn't agree + // with the openssl one (where they do not). The above is true as of + // Go 1.1. In the end it was simpler to rewrite the code to explicitly + // understand the format which is this: + // 0x30 <0x02> 0x2 + // . + + // The signature must adhere to the minimum and maximum allowed length. + totalSigLen := len(sigStr) + if totalSigLen < MinSigLen { + return nil, errors.New("malformed signature: too short") + } + if der && totalSigLen > MaxSigLen { + return nil, errors.New("malformed signature: too long") + } + + // 0x30 + index := 0 + if sigStr[index] != 0x30 { + return nil, errors.New("malformed signature: no header magic") + } + index++ + // length of remaining message + siglen := sigStr[index] + index++ + + // siglen should be less than the entire message and greater than + // the minimal message size. + if int(siglen+2) > len(sigStr) || int(siglen+2) < MinSigLen { + return nil, errors.New("malformed signature: bad length") + } + // trim the slice we're working on so we only look at what matters. + sigStr = sigStr[:siglen+2] + + // 0x02 + if sigStr[index] != 0x02 { + return nil, + errors.New("malformed signature: no 1st int marker") + } + index++ + + // Length of signature R. + rLen := int(sigStr[index]) + // must be positive, must be able to fit in another 0x2, + // hence the -3. We assume that the length must be at least one byte. + index++ + if rLen <= 0 || rLen > len(sigStr)-index-3 { + return nil, errors.New("malformed signature: bogus R length") + } + + // Then R itself. + rBytes := sigStr[index : index+rLen] + if der { + switch err := canonicalPadding(rBytes); err { + case errNegativeValue: + return nil, errors.New("signature R is negative") + case errExcessivelyPaddedValue: + return nil, errors.New("signature R is excessively padded") + } + } + + // Strip leading zeroes from R. + for len(rBytes) > 0 && rBytes[0] == 0x00 { + rBytes = rBytes[1:] + } + + // R must be in the range [1, N-1]. Notice the check for the maximum number + // of bytes is required because SetByteSlice truncates as noted in its + // comment so it could otherwise fail to detect the overflow. + var r btcec.ModNScalar + if len(rBytes) > 32 { + str := "invalid signature: R is larger than 256 bits" + return nil, errors.New(str) + } + if overflow := r.SetByteSlice(rBytes); overflow { + str := "invalid signature: R >= group order" + return nil, errors.New(str) + } + if r.IsZero() { + str := "invalid signature: R is 0" + return nil, errors.New(str) + } + index += rLen + // 0x02. length already checked in previous if. + if sigStr[index] != 0x02 { + return nil, errors.New("malformed signature: no 2nd int marker") + } + index++ + + // Length of signature S. + sLen := int(sigStr[index]) + index++ + // S should be the rest of the string. + if sLen <= 0 || sLen > len(sigStr)-index { + return nil, errors.New("malformed signature: bogus S length") + } + + // Then S itself. + sBytes := sigStr[index : index+sLen] + if der { + switch err := canonicalPadding(sBytes); err { + case errNegativeValue: + return nil, errors.New("signature S is negative") + case errExcessivelyPaddedValue: + return nil, errors.New("signature S is excessively padded") + } + } + + // Strip leading zeroes from S. + for len(sBytes) > 0 && sBytes[0] == 0x00 { + sBytes = sBytes[1:] + } + + // S must be in the range [1, N-1]. Notice the check for the maximum number + // of bytes is required because SetByteSlice truncates as noted in its + // comment so it could otherwise fail to detect the overflow. + var s btcec.ModNScalar + if len(sBytes) > 32 { + str := "invalid signature: S is larger than 256 bits" + return nil, errors.New(str) + } + if overflow := s.SetByteSlice(sBytes); overflow { + str := "invalid signature: S >= group order" + return nil, errors.New(str) + } + if s.IsZero() { + str := "invalid signature: S is 0" + return nil, errors.New(str) + } + index += sLen + + // sanity check length parsing + if index != len(sigStr) { + return nil, fmt.Errorf("malformed signature: bad final length %v != %v", + index, len(sigStr)) + } + + return NewSignature(&r, &s), nil +} + +// ParseSignature parses a signature in BER format for the curve type `curve' +// into a Signature type, performing some basic sanity checks. If parsing +// according to the more strict DER format is needed, use ParseDERSignature. +func ParseSignature(sigStr []byte) (*Signature, error) { + return parseSig(sigStr, false) +} + +// ParseDERSignature parses a signature in DER format for the curve type +// `curve` into a Signature type. If parsing according to the less strict +// BER format is needed, use ParseSignature. +func ParseDERSignature(sigStr []byte) (*Signature, error) { + return parseSig(sigStr, true) +} + +// SignCompact produces a compact signature of the data in hash with the given +// private key on the given koblitz curve. The isCompressed parameter should +// be used to detail if the given signature should reference a compressed +// public key or not. If successful the bytes of the compact signature will be +// returned in the format: +// <(byte of 27+public key solution)+4 if compressed >< padded bytes for signature R> +// where the R and S parameters are padde up to the bitlengh of the curve. +func SignCompact(key *btcec.PrivateKey, hash []byte, + isCompressedKey bool) []byte { + + return secp_ecdsa.SignCompact(key, hash, isCompressedKey) +} + +// RecoverCompact verifies the compact signature "signature" of "hash" for the +// Koblitz curve in "curve". If the signature matches then the recovered public +// key will be returned as well as a boolean if the original key was compressed +// or not, else an error will be returned. +func RecoverCompact(signature, hash []byte) (*btcec.PublicKey, bool, error) { + return secp_ecdsa.RecoverCompact(signature, hash) +} + +// Sign generates an ECDSA signature over the secp256k1 curve for the provided +// hash (which should be the result of hashing a larger message) using the +// given private key. The produced signature is deterministic (same message and +// same key yield the same signature) and canonical in accordance with RFC6979 +// and BIP0062. +func Sign(key *btcec.PrivateKey, hash []byte) *Signature { + return secp_ecdsa.Sign(key, hash) +} diff --git a/btcec/signature_test.go b/btcec/ecdsa/signature_test.go similarity index 74% rename from btcec/signature_test.go rename to btcec/ecdsa/signature_test.go index 19ab772ef9..7a457b1e66 100644 --- a/btcec/signature_test.go +++ b/btcec/ecdsa/signature_test.go @@ -1,8 +1,9 @@ // Copyright (c) 2013-2017 The btcsuite developers +// Copyright (c) 2015-2021 The Decred developers // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. -package btcec +package ecdsa import ( "bytes" @@ -10,9 +11,10 @@ import ( "crypto/sha256" "encoding/hex" "fmt" - "math/big" "reflect" "testing" + + "github.com/btcsuite/btcd/btcec/v2" ) type signatureTest struct { @@ -331,23 +333,36 @@ var signatureTests = []signatureTest{ der: false, isValid: false, }, + { + name: "Long signature.", + sig: []byte{0x30, 0x44, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69, + 0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1, + 0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6, + 0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd, + 0x41, 0x02, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca, + 0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90, + 0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22, + 0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09, 0x91, + 0x17, 0x90, 0xda, 0x42, 0xca, 0xaf, 0x19, 0x7d, 0xb4, + }, + der: true, + isValid: false, + }, } func TestSignatures(t *testing.T) { for _, test := range signatureTests { var err error if test.der { - _, err = ParseDERSignature(test.sig, S256()) + _, err = ParseDERSignature(test.sig) } else { - _, err = ParseSignature(test.sig, S256()) + _, err = ParseSignature(test.sig) } if err != nil { if test.isValid { t.Errorf("%s signature failed when shouldn't %v", test.name, err) - } /* else { - t.Errorf("%s got error %v", test.name, err) - } */ + } continue } if !test.isValid { @@ -368,10 +383,10 @@ func TestSignatureSerialize(t *testing.T) { // 0437cd7f8525ceed2324359c2d0ba26006d92d85 { "valid 1 - r and s most significant bits are zero", - &Signature{ - R: fromHex("4e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd41"), - S: fromHex("181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d09"), - }, + NewSignature( + hexToModNScalar("4e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd41"), + hexToModNScalar("181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d09"), + ), []byte{ 0x30, 0x44, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69, 0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, @@ -388,51 +403,51 @@ func TestSignatureSerialize(t *testing.T) { // cb00f8a0573b18faa8c4f467b049f5d202bf1101d9ef2633bc611be70376a4b4 { "valid 2 - r most significant bit is one", - &Signature{ - R: fromHex("0082235e21a2300022738dabb8e1bbd9d19cfb1e7ab8c30a23b0afbb8d178abcf3"), - S: fromHex("24bf68e256c534ddfaf966bf908deb944305596f7bdcc38d69acad7f9c868724"), - }, + NewSignature( + hexToModNScalar("0082235e21a2300022738dabb8e1bbd9d19cfb1e7ab8c30a23b0afbb8d178abcf3"), + hexToModNScalar("24bf68e256c534ddfaf966bf908deb944305596f7bdcc38d69acad7f9c868724"), + ), []byte{ - 0x30, 0x45, 0x02, 0x21, 0x00, 0x82, 0x23, 0x5e, + 0x30, 0x44, 0x02, 0x20, 0x00, 0x82, 0x23, 0x5e, 0x21, 0xa2, 0x30, 0x00, 0x22, 0x73, 0x8d, 0xab, 0xb8, 0xe1, 0xbb, 0xd9, 0xd1, 0x9c, 0xfb, 0x1e, 0x7a, 0xb8, 0xc3, 0x0a, 0x23, 0xb0, 0xaf, 0xbb, - 0x8d, 0x17, 0x8a, 0xbc, 0xf3, 0x02, 0x20, 0x24, - 0xbf, 0x68, 0xe2, 0x56, 0xc5, 0x34, 0xdd, 0xfa, - 0xf9, 0x66, 0xbf, 0x90, 0x8d, 0xeb, 0x94, 0x43, - 0x05, 0x59, 0x6f, 0x7b, 0xdc, 0xc3, 0x8d, 0x69, - 0xac, 0xad, 0x7f, 0x9c, 0x86, 0x87, 0x24, + 0x8d, 0x17, 0x8a, 0xbc, 0x02, 0x20, 0x24, 0xbf, + 0x68, 0xe2, 0x56, 0xc5, 0x34, 0xdd, 0xfa, 0xf9, + 0x66, 0xbf, 0x90, 0x8d, 0xeb, 0x94, 0x43, 0x05, + 0x59, 0x6f, 0x7b, 0xdc, 0xc3, 0x8d, 0x69, 0xac, + 0xad, 0x7f, 0x9c, 0x86, 0x87, 0x24, }, }, // signature from bitcoin blockchain tx // fda204502a3345e08afd6af27377c052e77f1fefeaeb31bdd45f1e1237ca5470 { "valid 3 - s most significant bit is one", - &Signature{ - R: fromHex("1cadddc2838598fee7dc35a12b340c6bde8b389f7bfd19a1252a17c4b5ed2d71"), - S: new(big.Int).Add(fromHex("00c1a251bbecb14b058a8bd77f65de87e51c47e95904f4c0e9d52eddc21c1415ac"), S256().N), - }, + NewSignature( + hexToModNScalar("1cadddc2838598fee7dc35a12b340c6bde8b389f7bfd19a1252a17c4b5ed2d71"), + hexToModNScalar("c1a251bbecb14b058a8bd77f65de87e51c47e95904f4c0e9d52eddc21c1415ac"), + ), []byte{ - 0x30, 0x45, 0x02, 0x20, 0x1c, 0xad, 0xdd, 0xc2, + 0x30, 0x44, 0x2, 0x20, 0x1c, 0xad, 0xdd, 0xc2, 0x83, 0x85, 0x98, 0xfe, 0xe7, 0xdc, 0x35, 0xa1, - 0x2b, 0x34, 0x0c, 0x6b, 0xde, 0x8b, 0x38, 0x9f, + 0x2b, 0x34, 0xc, 0x6b, 0xde, 0x8b, 0x38, 0x9f, 0x7b, 0xfd, 0x19, 0xa1, 0x25, 0x2a, 0x17, 0xc4, - 0xb5, 0xed, 0x2d, 0x71, 0x02, 0x21, 0x00, 0xc1, - 0xa2, 0x51, 0xbb, 0xec, 0xb1, 0x4b, 0x05, 0x8a, - 0x8b, 0xd7, 0x7f, 0x65, 0xde, 0x87, 0xe5, 0x1c, - 0x47, 0xe9, 0x59, 0x04, 0xf4, 0xc0, 0xe9, 0xd5, - 0x2e, 0xdd, 0xc2, 0x1c, 0x14, 0x15, 0xac, + 0xb5, 0xed, 0x2d, 0x71, 0x2, 0x20, 0x3e, 0x5d, + 0xae, 0x44, 0x13, 0x4e, 0xb4, 0xfa, 0x75, 0x74, + 0x28, 0x80, 0x9a, 0x21, 0x78, 0x19, 0x9e, 0x66, + 0xf3, 0x8d, 0xaa, 0x53, 0xdf, 0x51, 0xea, 0xa3, + 0x80, 0xca, 0xb4, 0x22, 0x2b, 0x95, }, }, { "valid 4 - s is bigger than half order", - &Signature{ - R: fromHex("a196ed0e7ebcbe7b63fe1d8eecbdbde03a67ceba4fc8f6482bdcb9606a911404"), - S: fromHex("971729c7fa944b465b35250c6570a2f31acbb14b13d1565fab7330dcb2b3dfb1"), - }, + NewSignature( + hexToModNScalar("a196ed0e7ebcbe7b63fe1d8eecbdbde03a67ceba4fc8f6482bdcb9606a911404"), + hexToModNScalar("971729c7fa944b465b35250c6570a2f31acbb14b13d1565fab7330dcb2b3dfb1"), + ), []byte{ 0x30, 0x45, 0x02, 0x21, 0x00, 0xa1, 0x96, 0xed, - 0x0e, 0x7e, 0xbc, 0xbe, 0x7b, 0x63, 0xfe, 0x1d, + 0xe, 0x7e, 0xbc, 0xbe, 0x7b, 0x63, 0xfe, 0x1d, 0x8e, 0xec, 0xbd, 0xbd, 0xe0, 0x3a, 0x67, 0xce, 0xba, 0x4f, 0xc8, 0xf6, 0x48, 0x2b, 0xdc, 0xb9, 0x60, 0x6a, 0x91, 0x14, 0x04, 0x02, 0x20, 0x68, @@ -444,10 +459,7 @@ func TestSignatureSerialize(t *testing.T) { }, { "zero signature", - &Signature{ - R: big.NewInt(0), - S: big.NewInt(0), - }, + NewSignature(&btcec.ModNScalar{}, &btcec.ModNScalar{}), []byte{0x30, 0x06, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00}, }, } @@ -462,26 +474,22 @@ func TestSignatureSerialize(t *testing.T) { } } -func testSignCompact(t *testing.T, tag string, curve *KoblitzCurve, +func testSignCompact(t *testing.T, tag string, curve *btcec.KoblitzCurve, data []byte, isCompressed bool) { - tmp, _ := NewPrivateKey(curve) - priv := (*PrivateKey)(tmp) + priv, _ := btcec.NewPrivateKey() hashed := []byte("testing") - sig, err := SignCompact(curve, priv, hashed, isCompressed) - if err != nil { - t.Errorf("%s: error signing: %s", tag, err) - return - } + sig := SignCompact(priv, hashed, isCompressed) - pk, wasCompressed, err := RecoverCompact(curve, sig, hashed) + pk, wasCompressed, err := RecoverCompact(sig, hashed) if err != nil { t.Errorf("%s: error recovering: %s", tag, err) return } - if pk.X.Cmp(priv.X) != 0 || pk.Y.Cmp(priv.Y) != 0 { + if pk.X().Cmp(priv.PubKey().X()) != 0 || pk.Y().Cmp(priv.PubKey().Y()) != 0 { t.Errorf("%s: recovered pubkey doesn't match original "+ - "(%v,%v) vs (%v,%v) ", tag, pk.X, pk.Y, priv.X, priv.Y) + "(%v,%v) vs (%v,%v) ", tag, pk.X(), pk.Y(), + priv.PubKey().X(), priv.PubKey().Y()) return } if wasCompressed != isCompressed { @@ -498,14 +506,15 @@ func testSignCompact(t *testing.T, tag string, curve *KoblitzCurve, sig[0] += 4 } - pk, wasCompressed, err = RecoverCompact(curve, sig, hashed) + pk, wasCompressed, err = RecoverCompact(sig, hashed) if err != nil { t.Errorf("%s: error recovering (2): %s", tag, err) return } - if pk.X.Cmp(priv.X) != 0 || pk.Y.Cmp(priv.Y) != 0 { + if pk.X().Cmp(priv.PubKey().X()) != 0 || pk.Y().Cmp(priv.PubKey().Y()) != 0 { t.Errorf("%s: recovered pubkey (2) doesn't match original "+ - "(%v,%v) vs (%v,%v) ", tag, pk.X, pk.Y, priv.X, priv.Y) + "(%v,%v) vs (%v,%v) ", tag, pk.X(), pk.Y(), + priv.PubKey().X(), priv.PubKey().Y()) return } if wasCompressed == isCompressed { @@ -526,7 +535,7 @@ func TestSignCompact(t *testing.T) { continue } compressed := i%2 != 0 - testSignCompact(t, name, S256(), data, compressed) + testSignCompact(t, name, btcec.S256(), data, compressed) } } @@ -548,7 +557,13 @@ var recoveryTests = []struct { // Invalid curve point recovered. msg: "00c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c", sig: "0100b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f00b940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549", - err: fmt.Errorf("invalid square root"), + err: fmt.Errorf("signature is not for a valid curve point"), + }, + { + // Point at infinity recovered + msg: "6b8d2c81b11b2d699528dde488dbdf2f94293d0d33c32e347f255fa4a6c1f0a9", + sig: "0079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f817986b8d2c81b11b2d699528dde488dbdf2f94293d0d33c32e347f255fa4a6c1f0a9", + err: fmt.Errorf("recovered pubkey is the point at infinity"), }, { // Low R and S values. @@ -556,6 +571,40 @@ var recoveryTests = []struct { sig: "00000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000004", pub: "04A7640409AA2083FDAD38B2D8DE1263B2251799591D840653FB02DBBA503D7745FCB83D80E08A1E02896BE691EA6AFFB8A35939A646F1FC79052A744B1C82EDC3", }, + { + // Zero R value + // + // Test case contributed by Ethereum Swarm: GH-1651 + msg: "3060d2c77c1e192d62ad712fb400e04e6f779914a6876328ff3b213fa85d2012", + sig: "65000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037a3", + err: fmt.Errorf("invalid compact signature recovery code"), + }, + { + // Zero R value + // + // Test case contributed by Ethereum Swarm: GH-1651 + msg: "2bcebac60d8a78e520ae81c2ad586792df495ed429bd730dcd897b301932d054", + sig: "060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007c", + err: fmt.Errorf("signature R is 0"), + }, + { + // R = N (curve order of secp256k1) + msg: "2bcebac60d8a78e520ae81c2ad586792df495ed429bd730dcd897b301932d054", + sig: "65fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036414100000000000000000000000000000000000000000000000000000000000037a3", + err: fmt.Errorf("invalid compact signature recovery code"), + }, + { + // Zero S value + msg: "ce0677bb30baa8cf067c88db9811f4333d131bf8bcf12fe7065d211dce971008", + sig: "0190f27b8b488db00b00606796d2987f6a5f59ae62ea05effe84fef5b8b0e549980000000000000000000000000000000000000000000000000000000000000000", + err: fmt.Errorf("signature S is 0"), + }, + { + // S = N (curve order of secp256k1) + msg: "ce0677bb30baa8cf067c88db9811f4333d131bf8bcf12fe7065d211dce971008", + sig: "0190f27b8b488db00b00606796d2987f6a5f59ae62ea05effe84fef5b8b0e54998fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + err: fmt.Errorf("signature S is >= curve order"), + }, } func TestRecoverCompact(t *testing.T) { @@ -566,7 +615,7 @@ func TestRecoverCompact(t *testing.T) { // Magic DER constant. sig[0] += 27 - pub, _, err := RecoverCompact(S256(), sig, msg) + pub, _, err := RecoverCompact(sig, msg) // Verify that returned error matches as expected. if !reflect.DeepEqual(test.err, err) { @@ -583,7 +632,7 @@ func TestRecoverCompact(t *testing.T) { } // Otherwise, ensure the correct public key was recovered. - exPub, _ := ParsePubKey(decodeHex(test.pub), S256()) + exPub, _ := btcec.ParsePubKey(decodeHex(test.pub)) if !exPub.IsEqual(pub) { t.Errorf("unexpected recovered public key #%d: "+ "want %v, got %v", i, exPub, pub) @@ -642,13 +691,13 @@ func TestRFC6979(t *testing.T) { } for i, test := range tests { - privKey, _ := PrivKeyFromBytes(S256(), decodeHex(test.key)) + privKey, _ := btcec.PrivKeyFromBytes(decodeHex(test.key)) hash := sha256.Sum256([]byte(test.msg)) // Ensure deterministically generated nonce is the expected value. - gotNonce := nonceRFC6979(privKey.D, hash[:]).Bytes() + gotNonce := btcec.NonceRFC6979(privKey.Serialize(), hash[:], nil, nil, 0).Bytes() wantNonce := decodeHex(test.nonce) - if !bytes.Equal(gotNonce, wantNonce) { + if !bytes.Equal(gotNonce[:], wantNonce) { t.Errorf("NonceRFC6979 #%d (%s): Nonce is incorrect: "+ "%x (expected %x)", i, test.msg, gotNonce, wantNonce) @@ -656,12 +705,8 @@ func TestRFC6979(t *testing.T) { } // Ensure deterministically generated signature is the expected value. - gotSig, err := privKey.Sign(hash[:]) - if err != nil { - t.Errorf("Sign #%d (%s): unexpected error: %v", i, - test.msg, err) - continue - } + gotSig := Sign(privKey, hash[:]) + gotSigBytes := gotSig.Serialize() wantSigBytes := decodeHex(test.signature) if !bytes.Equal(gotSigBytes, wantSigBytes) { @@ -674,14 +719,14 @@ func TestRFC6979(t *testing.T) { } func TestSignatureIsEqual(t *testing.T) { - sig1 := &Signature{ - R: fromHex("0082235e21a2300022738dabb8e1bbd9d19cfb1e7ab8c30a23b0afbb8d178abcf3"), - S: fromHex("24bf68e256c534ddfaf966bf908deb944305596f7bdcc38d69acad7f9c868724"), - } - sig2 := &Signature{ - R: fromHex("4e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd41"), - S: fromHex("181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d09"), - } + sig1 := NewSignature( + hexToModNScalar("0082235e21a2300022738dabb8e1bbd9d19cfb1e7ab8c30a23b0afbb8d178abcf3"), + hexToModNScalar("24bf68e256c534ddfaf966bf908deb944305596f7bdcc38d69acad7f9c868724"), + ) + sig2 := NewSignature( + hexToModNScalar("4e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd41"), + hexToModNScalar("181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d09"), + ) if !sig1.IsEqual(sig1) { t.Fatalf("value of IsEqual is incorrect, %v is "+ @@ -693,3 +738,65 @@ func TestSignatureIsEqual(t *testing.T) { "equal to %v", sig1, sig2) } } + +func testSignAndVerify(t *testing.T, c *btcec.KoblitzCurve, tag string) { + priv, _ := btcec.NewPrivateKey() + pub := priv.PubKey() + + hashed := []byte("testing") + sig := Sign(priv, hashed) + + if !sig.Verify(hashed, pub) { + t.Errorf("%s: Verify failed", tag) + } + + hashed[0] ^= 0xff + if sig.Verify(hashed, pub) { + t.Errorf("%s: Verify always works!", tag) + } +} + +func TestSignAndVerify(t *testing.T) { + testSignAndVerify(t, btcec.S256(), "S256") +} + +func TestPrivKeys(t *testing.T) { + tests := []struct { + name string + key []byte + }{ + { + name: "check curve", + key: []byte{ + 0xea, 0xf0, 0x2c, 0xa3, 0x48, 0xc5, 0x24, 0xe6, + 0x39, 0x26, 0x55, 0xba, 0x4d, 0x29, 0x60, 0x3c, + 0xd1, 0xa7, 0x34, 0x7d, 0x9d, 0x65, 0xcf, 0xe9, + 0x3c, 0xe1, 0xeb, 0xff, 0xdc, 0xa2, 0x26, 0x94, + }, + }, + } + + for _, test := range tests { + priv, pub := btcec.PrivKeyFromBytes(test.key) + + _, err := btcec.ParsePubKey(pub.SerializeUncompressed()) + if err != nil { + t.Errorf("%s privkey: %v", test.name, err) + continue + } + + hash := []byte{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9} + sig := Sign(priv, hash) + + if !sig.Verify(hash, pub) { + t.Errorf("%s could not verify: %v", test.name, err) + continue + } + + serializedKey := priv.Serialize() + if !bytes.Equal(serializedKey, test.key) { + t.Errorf("%s unexpected serialized bytes - got: %x, "+ + "want: %x", test.name, serializedKey, test.key) + } + } +} diff --git a/btcec/error.go b/btcec/error.go new file mode 100644 index 0000000000..df6ec678a8 --- /dev/null +++ b/btcec/error.go @@ -0,0 +1,24 @@ +// Copyright (c) 2013-2021 The btcsuite developers +// Copyright (c) 2015-2021 The Decred developers + +package btcec + +import ( + secp "github.com/decred/dcrd/dcrec/secp256k1/v4" +) + +// Error identifies an error related to public key cryptography using a +// sec256k1 curve. It has full support for errors.Is and errors.As, so the +// caller can ascertain the specific reason for the error by checking the +// underlying error. +type Error = secp.Error + +// ErrorKind identifies a kind of error. It has full support for errors.Is and +// errors.As, so the caller can directly check against an error kind when +// determining the reason for an error. +type ErrorKind = secp.ErrorKind + +// makeError creates an secp.Error given a set of arguments. +func makeError(kind ErrorKind, desc string) Error { + return Error{Err: kind, Description: desc} +} diff --git a/btcec/example_test.go b/btcec/example_test.go deleted file mode 100644 index ca51ee87cc..0000000000 --- a/btcec/example_test.go +++ /dev/null @@ -1,168 +0,0 @@ -// Copyright (c) 2014 The btcsuite developers -// Use of this source code is governed by an ISC -// license that can be found in the LICENSE file. - -package btcec_test - -import ( - "encoding/hex" - "fmt" - - "github.com/btcsuite/btcd/btcec" - "github.com/btcsuite/btcd/chaincfg/chainhash" -) - -// This example demonstrates signing a message with a secp256k1 private key that -// is first parsed form raw bytes and serializing the generated signature. -func Example_signMessage() { - // Decode a hex-encoded private key. - pkBytes, err := hex.DecodeString("22a47fa09a223f2aa079edf85a7c2d4f87" + - "20ee63e502ee2869afab7de234b80c") - if err != nil { - fmt.Println(err) - return - } - privKey, pubKey := btcec.PrivKeyFromBytes(btcec.S256(), pkBytes) - - // Sign a message using the private key. - message := "test message" - messageHash := chainhash.DoubleHashB([]byte(message)) - signature, err := privKey.Sign(messageHash) - if err != nil { - fmt.Println(err) - return - } - - // Serialize and display the signature. - fmt.Printf("Serialized Signature: %x\n", signature.Serialize()) - - // Verify the signature for the message using the public key. - verified := signature.Verify(messageHash, pubKey) - fmt.Printf("Signature Verified? %v\n", verified) - - // Output: - // Serialized Signature: 304402201008e236fa8cd0f25df4482dddbb622e8a8b26ef0ba731719458de3ccd93805b022032f8ebe514ba5f672466eba334639282616bb3c2f0ab09998037513d1f9e3d6d - // Signature Verified? true -} - -// This example demonstrates verifying a secp256k1 signature against a public -// key that is first parsed from raw bytes. The signature is also parsed from -// raw bytes. -func Example_verifySignature() { - // Decode hex-encoded serialized public key. - pubKeyBytes, err := hex.DecodeString("02a673638cb9587cb68ea08dbef685c" + - "6f2d2a751a8b3c6f2a7e9a4999e6e4bfaf5") - if err != nil { - fmt.Println(err) - return - } - pubKey, err := btcec.ParsePubKey(pubKeyBytes, btcec.S256()) - if err != nil { - fmt.Println(err) - return - } - - // Decode hex-encoded serialized signature. - sigBytes, err := hex.DecodeString("30450220090ebfb3690a0ff115bb1b38b" + - "8b323a667b7653454f1bccb06d4bbdca42c2079022100ec95778b51e707" + - "1cb1205f8bde9af6592fc978b0452dafe599481c46d6b2e479") - - if err != nil { - fmt.Println(err) - return - } - signature, err := btcec.ParseSignature(sigBytes, btcec.S256()) - if err != nil { - fmt.Println(err) - return - } - - // Verify the signature for the message using the public key. - message := "test message" - messageHash := chainhash.DoubleHashB([]byte(message)) - verified := signature.Verify(messageHash, pubKey) - fmt.Println("Signature Verified?", verified) - - // Output: - // Signature Verified? true -} - -// This example demonstrates encrypting a message for a public key that is first -// parsed from raw bytes, then decrypting it using the corresponding private key. -func Example_encryptMessage() { - // Decode the hex-encoded pubkey of the recipient. - pubKeyBytes, err := hex.DecodeString("04115c42e757b2efb7671c578530ec191a1" + - "359381e6a71127a9d37c486fd30dae57e76dc58f693bd7e7010358ce6b165e483a29" + - "21010db67ac11b1b51b651953d2") // uncompressed pubkey - if err != nil { - fmt.Println(err) - return - } - pubKey, err := btcec.ParsePubKey(pubKeyBytes, btcec.S256()) - if err != nil { - fmt.Println(err) - return - } - - // Encrypt a message decryptable by the private key corresponding to pubKey - message := "test message" - ciphertext, err := btcec.Encrypt(pubKey, []byte(message)) - if err != nil { - fmt.Println(err) - return - } - - // Decode the hex-encoded private key. - pkBytes, err := hex.DecodeString("a11b0a4e1a132305652ee7a8eb7848f6ad" + - "5ea381e3ce20a2c086a2e388230811") - if err != nil { - fmt.Println(err) - return - } - // note that we already have corresponding pubKey - privKey, _ := btcec.PrivKeyFromBytes(btcec.S256(), pkBytes) - - // Try decrypting and verify if it's the same message. - plaintext, err := btcec.Decrypt(privKey, ciphertext) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println(string(plaintext)) - - // Output: - // test message -} - -// This example demonstrates decrypting a message using a private key that is -// first parsed from raw bytes. -func Example_decryptMessage() { - // Decode the hex-encoded private key. - pkBytes, err := hex.DecodeString("a11b0a4e1a132305652ee7a8eb7848f6ad" + - "5ea381e3ce20a2c086a2e388230811") - if err != nil { - fmt.Println(err) - return - } - - privKey, _ := btcec.PrivKeyFromBytes(btcec.S256(), pkBytes) - - ciphertext, err := hex.DecodeString("35f644fbfb208bc71e57684c3c8b437402ca" + - "002047a2f1b38aa1a8f1d5121778378414f708fe13ebf7b4a7bb74407288c1958969" + - "00207cf4ac6057406e40f79961c973309a892732ae7a74ee96cd89823913b8b8d650" + - "a44166dc61ea1c419d47077b748a9c06b8d57af72deb2819d98a9d503efc59fc8307" + - "d14174f8b83354fac3ff56075162") - - // Try decrypting the message. - plaintext, err := btcec.Decrypt(privKey, ciphertext) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println(string(plaintext)) - - // Output: - // test message -} diff --git a/btcec/field.go b/btcec/field.go index c2bb84b3fe..fef6f345da 100644 --- a/btcec/field.go +++ b/btcec/field.go @@ -1,1352 +1,43 @@ -// Copyright (c) 2013-2016 The btcsuite developers -// Copyright (c) 2013-2016 Dave Collins -// Use of this source code is governed by an ISC -// license that can be found in the LICENSE file. - package btcec -// References: -// [HAC]: Handbook of Applied Cryptography Menezes, van Oorschot, Vanstone. -// http://cacr.uwaterloo.ca/hac/ - -// All elliptic curve operations for secp256k1 are done in a finite field -// characterized by a 256-bit prime. Given this precision is larger than the -// biggest available native type, obviously some form of bignum math is needed. -// This package implements specialized fixed-precision field arithmetic rather -// than relying on an arbitrary-precision arithmetic package such as math/big -// for dealing with the field math since the size is known. As a result, rather -// large performance gains are achieved by taking advantage of many -// optimizations not available to arbitrary-precision arithmetic and generic -// modular arithmetic algorithms. -// -// There are various ways to internally represent each finite field element. -// For example, the most obvious representation would be to use an array of 4 -// uint64s (64 bits * 4 = 256 bits). However, that representation suffers from -// a couple of issues. First, there is no native Go type large enough to handle -// the intermediate results while adding or multiplying two 64-bit numbers, and -// second there is no space left for overflows when performing the intermediate -// arithmetic between each array element which would lead to expensive carry -// propagation. -// -// Given the above, this implementation represents the the field elements as -// 10 uint32s with each word (array entry) treated as base 2^26. This was -// chosen for the following reasons: -// 1) Most systems at the current time are 64-bit (or at least have 64-bit -// registers available for specialized purposes such as MMX) so the -// intermediate results can typically be done using a native register (and -// using uint64s to avoid the need for additional half-word arithmetic) -// 2) In order to allow addition of the internal words without having to -// propagate the the carry, the max normalized value for each register must -// be less than the number of bits available in the register -// 3) Since we're dealing with 32-bit values, 64-bits of overflow is a -// reasonable choice for #2 -// 4) Given the need for 256-bits of precision and the properties stated in #1, -// #2, and #3, the representation which best accommodates this is 10 uint32s -// with base 2^26 (26 bits * 10 = 260 bits, so the final word only needs 22 -// bits) which leaves the desired 64 bits (32 * 10 = 320, 320 - 256 = 64) for -// overflow -// -// Since it is so important that the field arithmetic is extremely fast for -// high performance crypto, this package does not perform any validation where -// it ordinarily would. For example, some functions only give the correct -// result is the field is normalized and there is no checking to ensure it is. -// While I typically prefer to ensure all state and input is valid for most -// packages, this code is really only used internally and every extra check -// counts. - -import ( - "encoding/hex" -) - -// Constants used to make the code more readable. -const ( - twoBitsMask = 0x3 - fourBitsMask = 0xf - sixBitsMask = 0x3f - eightBitsMask = 0xff -) - -// Constants related to the field representation. -const ( - // fieldWords is the number of words used to internally represent the - // 256-bit value. - fieldWords = 10 - - // fieldBase is the exponent used to form the numeric base of each word. - // 2^(fieldBase*i) where i is the word position. - fieldBase = 26 - - // fieldOverflowBits is the minimum number of "overflow" bits for each - // word in the field value. - fieldOverflowBits = 32 - fieldBase - - // fieldBaseMask is the mask for the bits in each word needed to - // represent the numeric base of each word (except the most significant - // word). - fieldBaseMask = (1 << fieldBase) - 1 - - // fieldMSBBits is the number of bits in the most significant word used - // to represent the value. - fieldMSBBits = 256 - (fieldBase * (fieldWords - 1)) - - // fieldMSBMask is the mask for the bits in the most significant word - // needed to represent the value. - fieldMSBMask = (1 << fieldMSBBits) - 1 - - // fieldPrimeWordZero is word zero of the secp256k1 prime in the - // internal field representation. It is used during negation. - fieldPrimeWordZero = 0x3fffc2f - - // fieldPrimeWordOne is word one of the secp256k1 prime in the - // internal field representation. It is used during negation. - fieldPrimeWordOne = 0x3ffffbf -) - -var ( - // fieldQBytes is the value Q = (P+1)/4 for the secp256k1 prime P. This - // value is used to efficiently compute the square root of values in the - // field via exponentiation. The value of Q in hex is: - // - // Q = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffff0c - fieldQBytes = []byte{ - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0x0c, - } -) - -// fieldVal implements optimized fixed-precision arithmetic over the -// secp256k1 finite field. This means all arithmetic is performed modulo -// 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f. It -// represents each 256-bit value as 10 32-bit integers in base 2^26. This -// provides 6 bits of overflow in each word (10 bits in the most significant -// word) for a total of 64 bits of overflow (9*6 + 10 = 64). It only implements -// the arithmetic needed for elliptic curve operations. -// -// The following depicts the internal representation: -// ----------------------------------------------------------------- -// | n[9] | n[8] | ... | n[0] | -// | 32 bits available | 32 bits available | ... | 32 bits available | -// | 22 bits for value | 26 bits for value | ... | 26 bits for value | -// | 10 bits overflow | 6 bits overflow | ... | 6 bits overflow | -// | Mult: 2^(26*9) | Mult: 2^(26*8) | ... | Mult: 2^(26*0) | -// ----------------------------------------------------------------- -// -// For example, consider the number 2^49 + 1. It would be represented as: -// n[0] = 1 -// n[1] = 2^23 -// n[2..9] = 0 -// -// The full 256-bit value is then calculated by looping i from 9..0 and -// doing sum(n[i] * 2^(26i)) like so: -// n[9] * 2^(26*9) = 0 * 2^234 = 0 -// n[8] * 2^(26*8) = 0 * 2^208 = 0 -// ... -// n[1] * 2^(26*1) = 2^23 * 2^26 = 2^49 -// n[0] * 2^(26*0) = 1 * 2^0 = 1 -// Sum: 0 + 0 + ... + 2^49 + 1 = 2^49 + 1 -type fieldVal struct { - n [10]uint32 -} - -// String returns the field value as a human-readable hex string. -func (f fieldVal) String() string { - t := new(fieldVal).Set(&f).Normalize() - return hex.EncodeToString(t.Bytes()[:]) -} - -// Zero sets the field value to zero. A newly created field value is already -// set to zero. This function can be useful to clear an existing field value -// for reuse. -func (f *fieldVal) Zero() { - f.n[0] = 0 - f.n[1] = 0 - f.n[2] = 0 - f.n[3] = 0 - f.n[4] = 0 - f.n[5] = 0 - f.n[6] = 0 - f.n[7] = 0 - f.n[8] = 0 - f.n[9] = 0 -} - -// Set sets the field value equal to the passed value. -// -// The field value is returned to support chaining. This enables syntax like: -// f := new(fieldVal).Set(f2).Add(1) so that f = f2 + 1 where f2 is not -// modified. -func (f *fieldVal) Set(val *fieldVal) *fieldVal { - *f = *val - return f -} - -// SetInt sets the field value to the passed integer. This is a convenience -// function since it is fairly common to perform some arithemetic with small -// native integers. -// -// The field value is returned to support chaining. This enables syntax such -// as f := new(fieldVal).SetInt(2).Mul(f2) so that f = 2 * f2. -func (f *fieldVal) SetInt(ui uint) *fieldVal { - f.Zero() - f.n[0] = uint32(ui) - return f -} - -// SetBytes packs the passed 32-byte big-endian value into the internal field -// value representation. -// -// The field value is returned to support chaining. This enables syntax like: -// f := new(fieldVal).SetBytes(byteArray).Mul(f2) so that f = ba * f2. -func (f *fieldVal) SetBytes(b *[32]byte) *fieldVal { - // Pack the 256 total bits across the 10 uint32 words with a max of - // 26-bits per word. This could be done with a couple of for loops, - // but this unrolled version is significantly faster. Benchmarks show - // this is about 34 times faster than the variant which uses loops. - f.n[0] = uint32(b[31]) | uint32(b[30])<<8 | uint32(b[29])<<16 | - (uint32(b[28])&twoBitsMask)<<24 - f.n[1] = uint32(b[28])>>2 | uint32(b[27])<<6 | uint32(b[26])<<14 | - (uint32(b[25])&fourBitsMask)<<22 - f.n[2] = uint32(b[25])>>4 | uint32(b[24])<<4 | uint32(b[23])<<12 | - (uint32(b[22])&sixBitsMask)<<20 - f.n[3] = uint32(b[22])>>6 | uint32(b[21])<<2 | uint32(b[20])<<10 | - uint32(b[19])<<18 - f.n[4] = uint32(b[18]) | uint32(b[17])<<8 | uint32(b[16])<<16 | - (uint32(b[15])&twoBitsMask)<<24 - f.n[5] = uint32(b[15])>>2 | uint32(b[14])<<6 | uint32(b[13])<<14 | - (uint32(b[12])&fourBitsMask)<<22 - f.n[6] = uint32(b[12])>>4 | uint32(b[11])<<4 | uint32(b[10])<<12 | - (uint32(b[9])&sixBitsMask)<<20 - f.n[7] = uint32(b[9])>>6 | uint32(b[8])<<2 | uint32(b[7])<<10 | - uint32(b[6])<<18 - f.n[8] = uint32(b[5]) | uint32(b[4])<<8 | uint32(b[3])<<16 | - (uint32(b[2])&twoBitsMask)<<24 - f.n[9] = uint32(b[2])>>2 | uint32(b[1])<<6 | uint32(b[0])<<14 - return f -} - -// SetByteSlice packs the passed big-endian value into the internal field value -// representation. Only the first 32-bytes are used. As a result, it is up to -// the caller to ensure numbers of the appropriate size are used or the value -// will be truncated. -// -// The field value is returned to support chaining. This enables syntax like: -// f := new(fieldVal).SetByteSlice(byteSlice) -func (f *fieldVal) SetByteSlice(b []byte) *fieldVal { - var b32 [32]byte - for i := 0; i < len(b); i++ { - if i < 32 { - b32[i+(32-len(b))] = b[i] - } - } - return f.SetBytes(&b32) -} - -// SetHex decodes the passed big-endian hex string into the internal field value -// representation. Only the first 32-bytes are used. -// -// The field value is returned to support chaining. This enables syntax like: -// f := new(fieldVal).SetHex("0abc").Add(1) so that f = 0x0abc + 1 -func (f *fieldVal) SetHex(hexString string) *fieldVal { - if len(hexString)%2 != 0 { - hexString = "0" + hexString - } - bytes, _ := hex.DecodeString(hexString) - return f.SetByteSlice(bytes) -} - -// Normalize normalizes the internal field words into the desired range and -// performs fast modular reduction over the secp256k1 prime by making use of the -// special form of the prime. -func (f *fieldVal) Normalize() *fieldVal { - // The field representation leaves 6 bits of overflow in each word so - // intermediate calculations can be performed without needing to - // propagate the carry to each higher word during the calculations. In - // order to normalize, we need to "compact" the full 256-bit value to - // the right while propagating any carries through to the high order - // word. - // - // Since this field is doing arithmetic modulo the secp256k1 prime, we - // also need to perform modular reduction over the prime. - // - // Per [HAC] section 14.3.4: Reduction method of moduli of special form, - // when the modulus is of the special form m = b^t - c, highly efficient - // reduction can be achieved. - // - // The secp256k1 prime is equivalent to 2^256 - 4294968273, so it fits - // this criteria. - // - // 4294968273 in field representation (base 2^26) is: - // n[0] = 977 - // n[1] = 64 - // That is to say (2^26 * 64) + 977 = 4294968273 - // - // The algorithm presented in the referenced section typically repeats - // until the quotient is zero. However, due to our field representation - // we already know to within one reduction how many times we would need - // to repeat as it's the uppermost bits of the high order word. Thus we - // can simply multiply the magnitude by the field representation of the - // prime and do a single iteration. After this step there might be an - // additional carry to bit 256 (bit 22 of the high order word). - t9 := f.n[9] - m := t9 >> fieldMSBBits - t9 = t9 & fieldMSBMask - t0 := f.n[0] + m*977 - t1 := (t0 >> fieldBase) + f.n[1] + (m << 6) - t0 = t0 & fieldBaseMask - t2 := (t1 >> fieldBase) + f.n[2] - t1 = t1 & fieldBaseMask - t3 := (t2 >> fieldBase) + f.n[3] - t2 = t2 & fieldBaseMask - t4 := (t3 >> fieldBase) + f.n[4] - t3 = t3 & fieldBaseMask - t5 := (t4 >> fieldBase) + f.n[5] - t4 = t4 & fieldBaseMask - t6 := (t5 >> fieldBase) + f.n[6] - t5 = t5 & fieldBaseMask - t7 := (t6 >> fieldBase) + f.n[7] - t6 = t6 & fieldBaseMask - t8 := (t7 >> fieldBase) + f.n[8] - t7 = t7 & fieldBaseMask - t9 = (t8 >> fieldBase) + t9 - t8 = t8 & fieldBaseMask - - // At this point, the magnitude is guaranteed to be one, however, the - // value could still be greater than the prime if there was either a - // carry through to bit 256 (bit 22 of the higher order word) or the - // value is greater than or equal to the field characteristic. The - // following determines if either or these conditions are true and does - // the final reduction in constant time. - // - // Note that the if/else statements here intentionally do the bitwise - // operators even when it won't change the value to ensure constant time - // between the branches. Also note that 'm' will be zero when neither - // of the aforementioned conditions are true and the value will not be - // changed when 'm' is zero. - m = 1 - if t9 == fieldMSBMask { - m &= 1 - } else { - m &= 0 - } - if t2&t3&t4&t5&t6&t7&t8 == fieldBaseMask { - m &= 1 - } else { - m &= 0 - } - if ((t0+977)>>fieldBase + t1 + 64) > fieldBaseMask { - m &= 1 - } else { - m &= 0 - } - if t9>>fieldMSBBits != 0 { - m |= 1 - } else { - m |= 0 - } - t0 = t0 + m*977 - t1 = (t0 >> fieldBase) + t1 + (m << 6) - t0 = t0 & fieldBaseMask - t2 = (t1 >> fieldBase) + t2 - t1 = t1 & fieldBaseMask - t3 = (t2 >> fieldBase) + t3 - t2 = t2 & fieldBaseMask - t4 = (t3 >> fieldBase) + t4 - t3 = t3 & fieldBaseMask - t5 = (t4 >> fieldBase) + t5 - t4 = t4 & fieldBaseMask - t6 = (t5 >> fieldBase) + t6 - t5 = t5 & fieldBaseMask - t7 = (t6 >> fieldBase) + t7 - t6 = t6 & fieldBaseMask - t8 = (t7 >> fieldBase) + t8 - t7 = t7 & fieldBaseMask - t9 = (t8 >> fieldBase) + t9 - t8 = t8 & fieldBaseMask - t9 = t9 & fieldMSBMask // Remove potential multiple of 2^256. - - // Finally, set the normalized and reduced words. - f.n[0] = t0 - f.n[1] = t1 - f.n[2] = t2 - f.n[3] = t3 - f.n[4] = t4 - f.n[5] = t5 - f.n[6] = t6 - f.n[7] = t7 - f.n[8] = t8 - f.n[9] = t9 - return f -} - -// PutBytes unpacks the field value to a 32-byte big-endian value using the -// passed byte array. There is a similar function, Bytes, which unpacks the -// field value into a new array and returns that. This version is provided -// since it can be useful to cut down on the number of allocations by allowing -// the caller to reuse a buffer. -// -// The field value must be normalized for this function to return the correct -// result. -func (f *fieldVal) PutBytes(b *[32]byte) { - // Unpack the 256 total bits from the 10 uint32 words with a max of - // 26-bits per word. This could be done with a couple of for loops, - // but this unrolled version is a bit faster. Benchmarks show this is - // about 10 times faster than the variant which uses loops. - b[31] = byte(f.n[0] & eightBitsMask) - b[30] = byte((f.n[0] >> 8) & eightBitsMask) - b[29] = byte((f.n[0] >> 16) & eightBitsMask) - b[28] = byte((f.n[0]>>24)&twoBitsMask | (f.n[1]&sixBitsMask)<<2) - b[27] = byte((f.n[1] >> 6) & eightBitsMask) - b[26] = byte((f.n[1] >> 14) & eightBitsMask) - b[25] = byte((f.n[1]>>22)&fourBitsMask | (f.n[2]&fourBitsMask)<<4) - b[24] = byte((f.n[2] >> 4) & eightBitsMask) - b[23] = byte((f.n[2] >> 12) & eightBitsMask) - b[22] = byte((f.n[2]>>20)&sixBitsMask | (f.n[3]&twoBitsMask)<<6) - b[21] = byte((f.n[3] >> 2) & eightBitsMask) - b[20] = byte((f.n[3] >> 10) & eightBitsMask) - b[19] = byte((f.n[3] >> 18) & eightBitsMask) - b[18] = byte(f.n[4] & eightBitsMask) - b[17] = byte((f.n[4] >> 8) & eightBitsMask) - b[16] = byte((f.n[4] >> 16) & eightBitsMask) - b[15] = byte((f.n[4]>>24)&twoBitsMask | (f.n[5]&sixBitsMask)<<2) - b[14] = byte((f.n[5] >> 6) & eightBitsMask) - b[13] = byte((f.n[5] >> 14) & eightBitsMask) - b[12] = byte((f.n[5]>>22)&fourBitsMask | (f.n[6]&fourBitsMask)<<4) - b[11] = byte((f.n[6] >> 4) & eightBitsMask) - b[10] = byte((f.n[6] >> 12) & eightBitsMask) - b[9] = byte((f.n[6]>>20)&sixBitsMask | (f.n[7]&twoBitsMask)<<6) - b[8] = byte((f.n[7] >> 2) & eightBitsMask) - b[7] = byte((f.n[7] >> 10) & eightBitsMask) - b[6] = byte((f.n[7] >> 18) & eightBitsMask) - b[5] = byte(f.n[8] & eightBitsMask) - b[4] = byte((f.n[8] >> 8) & eightBitsMask) - b[3] = byte((f.n[8] >> 16) & eightBitsMask) - b[2] = byte((f.n[8]>>24)&twoBitsMask | (f.n[9]&sixBitsMask)<<2) - b[1] = byte((f.n[9] >> 6) & eightBitsMask) - b[0] = byte((f.n[9] >> 14) & eightBitsMask) -} - -// Bytes unpacks the field value to a 32-byte big-endian value. See PutBytes -// for a variant that allows the a buffer to be passed which can be useful to -// to cut down on the number of allocations by allowing the caller to reuse a -// buffer. -// -// The field value must be normalized for this function to return correct -// result. -func (f *fieldVal) Bytes() *[32]byte { - b := new([32]byte) - f.PutBytes(b) - return b -} - -// IsZero returns whether or not the field value is equal to zero. -func (f *fieldVal) IsZero() bool { - // The value can only be zero if no bits are set in any of the words. - // This is a constant time implementation. - bits := f.n[0] | f.n[1] | f.n[2] | f.n[3] | f.n[4] | - f.n[5] | f.n[6] | f.n[7] | f.n[8] | f.n[9] - - return bits == 0 -} - -// IsOdd returns whether or not the field value is an odd number. -// -// The field value must be normalized for this function to return correct -// result. -func (f *fieldVal) IsOdd() bool { - // Only odd numbers have the bottom bit set. - return f.n[0]&1 == 1 -} - -// Equals returns whether or not the two field values are the same. Both -// field values being compared must be normalized for this function to return -// the correct result. -func (f *fieldVal) Equals(val *fieldVal) bool { - // Xor only sets bits when they are different, so the two field values - // can only be the same if no bits are set after xoring each word. - // This is a constant time implementation. - bits := (f.n[0] ^ val.n[0]) | (f.n[1] ^ val.n[1]) | (f.n[2] ^ val.n[2]) | - (f.n[3] ^ val.n[3]) | (f.n[4] ^ val.n[4]) | (f.n[5] ^ val.n[5]) | - (f.n[6] ^ val.n[6]) | (f.n[7] ^ val.n[7]) | (f.n[8] ^ val.n[8]) | - (f.n[9] ^ val.n[9]) - - return bits == 0 -} - -// NegateVal negates the passed value and stores the result in f. The caller -// must provide the magnitude of the passed value for a correct result. -// -// The field value is returned to support chaining. This enables syntax like: -// f.NegateVal(f2).AddInt(1) so that f = -f2 + 1. -func (f *fieldVal) NegateVal(val *fieldVal, magnitude uint32) *fieldVal { - // Negation in the field is just the prime minus the value. However, - // in order to allow negation against a field value without having to - // normalize/reduce it first, multiply by the magnitude (that is how - // "far" away it is from the normalized value) to adjust. Also, since - // negating a value pushes it one more order of magnitude away from the - // normalized range, add 1 to compensate. - // - // For some intuition here, imagine you're performing mod 12 arithmetic - // (picture a clock) and you are negating the number 7. So you start at - // 12 (which is of course 0 under mod 12) and count backwards (left on - // the clock) 7 times to arrive at 5. Notice this is just 12-7 = 5. - // Now, assume you're starting with 19, which is a number that is - // already larger than the modulus and congruent to 7 (mod 12). When a - // value is already in the desired range, its magnitude is 1. Since 19 - // is an additional "step", its magnitude (mod 12) is 2. Since any - // multiple of the modulus is conguent to zero (mod m), the answer can - // be shortcut by simply mulplying the magnitude by the modulus and - // subtracting. Keeping with the example, this would be (2*12)-19 = 5. - f.n[0] = (magnitude+1)*fieldPrimeWordZero - val.n[0] - f.n[1] = (magnitude+1)*fieldPrimeWordOne - val.n[1] - f.n[2] = (magnitude+1)*fieldBaseMask - val.n[2] - f.n[3] = (magnitude+1)*fieldBaseMask - val.n[3] - f.n[4] = (magnitude+1)*fieldBaseMask - val.n[4] - f.n[5] = (magnitude+1)*fieldBaseMask - val.n[5] - f.n[6] = (magnitude+1)*fieldBaseMask - val.n[6] - f.n[7] = (magnitude+1)*fieldBaseMask - val.n[7] - f.n[8] = (magnitude+1)*fieldBaseMask - val.n[8] - f.n[9] = (magnitude+1)*fieldMSBMask - val.n[9] - - return f -} - -// Negate negates the field value. The existing field value is modified. The -// caller must provide the magnitude of the field value for a correct result. -// -// The field value is returned to support chaining. This enables syntax like: -// f.Negate().AddInt(1) so that f = -f + 1. -func (f *fieldVal) Negate(magnitude uint32) *fieldVal { - return f.NegateVal(f, magnitude) -} - -// AddInt adds the passed integer to the existing field value and stores the -// result in f. This is a convenience function since it is fairly common to -// perform some arithemetic with small native integers. -// -// The field value is returned to support chaining. This enables syntax like: -// f.AddInt(1).Add(f2) so that f = f + 1 + f2. -func (f *fieldVal) AddInt(ui uint) *fieldVal { - // Since the field representation intentionally provides overflow bits, - // it's ok to use carryless addition as the carry bit is safely part of - // the word and will be normalized out. - f.n[0] += uint32(ui) - - return f -} - -// Add adds the passed value to the existing field value and stores the result -// in f. -// -// The field value is returned to support chaining. This enables syntax like: -// f.Add(f2).AddInt(1) so that f = f + f2 + 1. -func (f *fieldVal) Add(val *fieldVal) *fieldVal { - // Since the field representation intentionally provides overflow bits, - // it's ok to use carryless addition as the carry bit is safely part of - // each word and will be normalized out. This could obviously be done - // in a loop, but the unrolled version is faster. - f.n[0] += val.n[0] - f.n[1] += val.n[1] - f.n[2] += val.n[2] - f.n[3] += val.n[3] - f.n[4] += val.n[4] - f.n[5] += val.n[5] - f.n[6] += val.n[6] - f.n[7] += val.n[7] - f.n[8] += val.n[8] - f.n[9] += val.n[9] - - return f -} - -// Add2 adds the passed two field values together and stores the result in f. -// -// The field value is returned to support chaining. This enables syntax like: -// f3.Add2(f, f2).AddInt(1) so that f3 = f + f2 + 1. -func (f *fieldVal) Add2(val *fieldVal, val2 *fieldVal) *fieldVal { - // Since the field representation intentionally provides overflow bits, - // it's ok to use carryless addition as the carry bit is safely part of - // each word and will be normalized out. This could obviously be done - // in a loop, but the unrolled version is faster. - f.n[0] = val.n[0] + val2.n[0] - f.n[1] = val.n[1] + val2.n[1] - f.n[2] = val.n[2] + val2.n[2] - f.n[3] = val.n[3] + val2.n[3] - f.n[4] = val.n[4] + val2.n[4] - f.n[5] = val.n[5] + val2.n[5] - f.n[6] = val.n[6] + val2.n[6] - f.n[7] = val.n[7] + val2.n[7] - f.n[8] = val.n[8] + val2.n[8] - f.n[9] = val.n[9] + val2.n[9] - - return f -} - -// MulInt multiplies the field value by the passed int and stores the result in -// f. Note that this function can overflow if multiplying the value by any of -// the individual words exceeds a max uint32. Therefore it is important that -// the caller ensures no overflows will occur before using this function. -// -// The field value is returned to support chaining. This enables syntax like: -// f.MulInt(2).Add(f2) so that f = 2 * f + f2. -func (f *fieldVal) MulInt(val uint) *fieldVal { - // Since each word of the field representation can hold up to - // fieldOverflowBits extra bits which will be normalized out, it's safe - // to multiply each word without using a larger type or carry - // propagation so long as the values won't overflow a uint32. This - // could obviously be done in a loop, but the unrolled version is - // faster. - ui := uint32(val) - f.n[0] *= ui - f.n[1] *= ui - f.n[2] *= ui - f.n[3] *= ui - f.n[4] *= ui - f.n[5] *= ui - f.n[6] *= ui - f.n[7] *= ui - f.n[8] *= ui - f.n[9] *= ui - - return f -} - -// Mul multiplies the passed value to the existing field value and stores the -// result in f. Note that this function can overflow if multiplying any -// of the individual words exceeds a max uint32. In practice, this means the -// magnitude of either value involved in the multiplication must be a max of -// 8. -// -// The field value is returned to support chaining. This enables syntax like: -// f.Mul(f2).AddInt(1) so that f = (f * f2) + 1. -func (f *fieldVal) Mul(val *fieldVal) *fieldVal { - return f.Mul2(f, val) -} - -// Mul2 multiplies the passed two field values together and stores the result -// result in f. Note that this function can overflow if multiplying any of -// the individual words exceeds a max uint32. In practice, this means the -// magnitude of either value involved in the multiplication must be a max of -// 8. -// -// The field value is returned to support chaining. This enables syntax like: -// f3.Mul2(f, f2).AddInt(1) so that f3 = (f * f2) + 1. -func (f *fieldVal) Mul2(val *fieldVal, val2 *fieldVal) *fieldVal { - // This could be done with a couple of for loops and an array to store - // the intermediate terms, but this unrolled version is significantly - // faster. - - // Terms for 2^(fieldBase*0). - m := uint64(val.n[0]) * uint64(val2.n[0]) - t0 := m & fieldBaseMask - - // Terms for 2^(fieldBase*1). - m = (m >> fieldBase) + - uint64(val.n[0])*uint64(val2.n[1]) + - uint64(val.n[1])*uint64(val2.n[0]) - t1 := m & fieldBaseMask - - // Terms for 2^(fieldBase*2). - m = (m >> fieldBase) + - uint64(val.n[0])*uint64(val2.n[2]) + - uint64(val.n[1])*uint64(val2.n[1]) + - uint64(val.n[2])*uint64(val2.n[0]) - t2 := m & fieldBaseMask - - // Terms for 2^(fieldBase*3). - m = (m >> fieldBase) + - uint64(val.n[0])*uint64(val2.n[3]) + - uint64(val.n[1])*uint64(val2.n[2]) + - uint64(val.n[2])*uint64(val2.n[1]) + - uint64(val.n[3])*uint64(val2.n[0]) - t3 := m & fieldBaseMask - - // Terms for 2^(fieldBase*4). - m = (m >> fieldBase) + - uint64(val.n[0])*uint64(val2.n[4]) + - uint64(val.n[1])*uint64(val2.n[3]) + - uint64(val.n[2])*uint64(val2.n[2]) + - uint64(val.n[3])*uint64(val2.n[1]) + - uint64(val.n[4])*uint64(val2.n[0]) - t4 := m & fieldBaseMask - - // Terms for 2^(fieldBase*5). - m = (m >> fieldBase) + - uint64(val.n[0])*uint64(val2.n[5]) + - uint64(val.n[1])*uint64(val2.n[4]) + - uint64(val.n[2])*uint64(val2.n[3]) + - uint64(val.n[3])*uint64(val2.n[2]) + - uint64(val.n[4])*uint64(val2.n[1]) + - uint64(val.n[5])*uint64(val2.n[0]) - t5 := m & fieldBaseMask - - // Terms for 2^(fieldBase*6). - m = (m >> fieldBase) + - uint64(val.n[0])*uint64(val2.n[6]) + - uint64(val.n[1])*uint64(val2.n[5]) + - uint64(val.n[2])*uint64(val2.n[4]) + - uint64(val.n[3])*uint64(val2.n[3]) + - uint64(val.n[4])*uint64(val2.n[2]) + - uint64(val.n[5])*uint64(val2.n[1]) + - uint64(val.n[6])*uint64(val2.n[0]) - t6 := m & fieldBaseMask - - // Terms for 2^(fieldBase*7). - m = (m >> fieldBase) + - uint64(val.n[0])*uint64(val2.n[7]) + - uint64(val.n[1])*uint64(val2.n[6]) + - uint64(val.n[2])*uint64(val2.n[5]) + - uint64(val.n[3])*uint64(val2.n[4]) + - uint64(val.n[4])*uint64(val2.n[3]) + - uint64(val.n[5])*uint64(val2.n[2]) + - uint64(val.n[6])*uint64(val2.n[1]) + - uint64(val.n[7])*uint64(val2.n[0]) - t7 := m & fieldBaseMask - - // Terms for 2^(fieldBase*8). - m = (m >> fieldBase) + - uint64(val.n[0])*uint64(val2.n[8]) + - uint64(val.n[1])*uint64(val2.n[7]) + - uint64(val.n[2])*uint64(val2.n[6]) + - uint64(val.n[3])*uint64(val2.n[5]) + - uint64(val.n[4])*uint64(val2.n[4]) + - uint64(val.n[5])*uint64(val2.n[3]) + - uint64(val.n[6])*uint64(val2.n[2]) + - uint64(val.n[7])*uint64(val2.n[1]) + - uint64(val.n[8])*uint64(val2.n[0]) - t8 := m & fieldBaseMask - - // Terms for 2^(fieldBase*9). - m = (m >> fieldBase) + - uint64(val.n[0])*uint64(val2.n[9]) + - uint64(val.n[1])*uint64(val2.n[8]) + - uint64(val.n[2])*uint64(val2.n[7]) + - uint64(val.n[3])*uint64(val2.n[6]) + - uint64(val.n[4])*uint64(val2.n[5]) + - uint64(val.n[5])*uint64(val2.n[4]) + - uint64(val.n[6])*uint64(val2.n[3]) + - uint64(val.n[7])*uint64(val2.n[2]) + - uint64(val.n[8])*uint64(val2.n[1]) + - uint64(val.n[9])*uint64(val2.n[0]) - t9 := m & fieldBaseMask - - // Terms for 2^(fieldBase*10). - m = (m >> fieldBase) + - uint64(val.n[1])*uint64(val2.n[9]) + - uint64(val.n[2])*uint64(val2.n[8]) + - uint64(val.n[3])*uint64(val2.n[7]) + - uint64(val.n[4])*uint64(val2.n[6]) + - uint64(val.n[5])*uint64(val2.n[5]) + - uint64(val.n[6])*uint64(val2.n[4]) + - uint64(val.n[7])*uint64(val2.n[3]) + - uint64(val.n[8])*uint64(val2.n[2]) + - uint64(val.n[9])*uint64(val2.n[1]) - t10 := m & fieldBaseMask - - // Terms for 2^(fieldBase*11). - m = (m >> fieldBase) + - uint64(val.n[2])*uint64(val2.n[9]) + - uint64(val.n[3])*uint64(val2.n[8]) + - uint64(val.n[4])*uint64(val2.n[7]) + - uint64(val.n[5])*uint64(val2.n[6]) + - uint64(val.n[6])*uint64(val2.n[5]) + - uint64(val.n[7])*uint64(val2.n[4]) + - uint64(val.n[8])*uint64(val2.n[3]) + - uint64(val.n[9])*uint64(val2.n[2]) - t11 := m & fieldBaseMask - - // Terms for 2^(fieldBase*12). - m = (m >> fieldBase) + - uint64(val.n[3])*uint64(val2.n[9]) + - uint64(val.n[4])*uint64(val2.n[8]) + - uint64(val.n[5])*uint64(val2.n[7]) + - uint64(val.n[6])*uint64(val2.n[6]) + - uint64(val.n[7])*uint64(val2.n[5]) + - uint64(val.n[8])*uint64(val2.n[4]) + - uint64(val.n[9])*uint64(val2.n[3]) - t12 := m & fieldBaseMask - - // Terms for 2^(fieldBase*13). - m = (m >> fieldBase) + - uint64(val.n[4])*uint64(val2.n[9]) + - uint64(val.n[5])*uint64(val2.n[8]) + - uint64(val.n[6])*uint64(val2.n[7]) + - uint64(val.n[7])*uint64(val2.n[6]) + - uint64(val.n[8])*uint64(val2.n[5]) + - uint64(val.n[9])*uint64(val2.n[4]) - t13 := m & fieldBaseMask - - // Terms for 2^(fieldBase*14). - m = (m >> fieldBase) + - uint64(val.n[5])*uint64(val2.n[9]) + - uint64(val.n[6])*uint64(val2.n[8]) + - uint64(val.n[7])*uint64(val2.n[7]) + - uint64(val.n[8])*uint64(val2.n[6]) + - uint64(val.n[9])*uint64(val2.n[5]) - t14 := m & fieldBaseMask - - // Terms for 2^(fieldBase*15). - m = (m >> fieldBase) + - uint64(val.n[6])*uint64(val2.n[9]) + - uint64(val.n[7])*uint64(val2.n[8]) + - uint64(val.n[8])*uint64(val2.n[7]) + - uint64(val.n[9])*uint64(val2.n[6]) - t15 := m & fieldBaseMask - - // Terms for 2^(fieldBase*16). - m = (m >> fieldBase) + - uint64(val.n[7])*uint64(val2.n[9]) + - uint64(val.n[8])*uint64(val2.n[8]) + - uint64(val.n[9])*uint64(val2.n[7]) - t16 := m & fieldBaseMask - - // Terms for 2^(fieldBase*17). - m = (m >> fieldBase) + - uint64(val.n[8])*uint64(val2.n[9]) + - uint64(val.n[9])*uint64(val2.n[8]) - t17 := m & fieldBaseMask - - // Terms for 2^(fieldBase*18). - m = (m >> fieldBase) + uint64(val.n[9])*uint64(val2.n[9]) - t18 := m & fieldBaseMask - - // What's left is for 2^(fieldBase*19). - t19 := m >> fieldBase - - // At this point, all of the terms are grouped into their respective - // base. - // - // Per [HAC] section 14.3.4: Reduction method of moduli of special form, - // when the modulus is of the special form m = b^t - c, highly efficient - // reduction can be achieved per the provided algorithm. - // - // The secp256k1 prime is equivalent to 2^256 - 4294968273, so it fits - // this criteria. - // - // 4294968273 in field representation (base 2^26) is: - // n[0] = 977 - // n[1] = 64 - // That is to say (2^26 * 64) + 977 = 4294968273 - // - // Since each word is in base 26, the upper terms (t10 and up) start - // at 260 bits (versus the final desired range of 256 bits), so the - // field representation of 'c' from above needs to be adjusted for the - // extra 4 bits by multiplying it by 2^4 = 16. 4294968273 * 16 = - // 68719492368. Thus, the adjusted field representation of 'c' is: - // n[0] = 977 * 16 = 15632 - // n[1] = 64 * 16 = 1024 - // That is to say (2^26 * 1024) + 15632 = 68719492368 - // - // To reduce the final term, t19, the entire 'c' value is needed instead - // of only n[0] because there are no more terms left to handle n[1]. - // This means there might be some magnitude left in the upper bits that - // is handled below. - m = t0 + t10*15632 - t0 = m & fieldBaseMask - m = (m >> fieldBase) + t1 + t10*1024 + t11*15632 - t1 = m & fieldBaseMask - m = (m >> fieldBase) + t2 + t11*1024 + t12*15632 - t2 = m & fieldBaseMask - m = (m >> fieldBase) + t3 + t12*1024 + t13*15632 - t3 = m & fieldBaseMask - m = (m >> fieldBase) + t4 + t13*1024 + t14*15632 - t4 = m & fieldBaseMask - m = (m >> fieldBase) + t5 + t14*1024 + t15*15632 - t5 = m & fieldBaseMask - m = (m >> fieldBase) + t6 + t15*1024 + t16*15632 - t6 = m & fieldBaseMask - m = (m >> fieldBase) + t7 + t16*1024 + t17*15632 - t7 = m & fieldBaseMask - m = (m >> fieldBase) + t8 + t17*1024 + t18*15632 - t8 = m & fieldBaseMask - m = (m >> fieldBase) + t9 + t18*1024 + t19*68719492368 - t9 = m & fieldMSBMask - m = m >> fieldMSBBits - - // At this point, if the magnitude is greater than 0, the overall value - // is greater than the max possible 256-bit value. In particular, it is - // "how many times larger" than the max value it is. - // - // The algorithm presented in [HAC] section 14.3.4 repeats until the - // quotient is zero. However, due to the above, we already know at - // least how many times we would need to repeat as it's the value - // currently in m. Thus we can simply multiply the magnitude by the - // field representation of the prime and do a single iteration. Notice - // that nothing will be changed when the magnitude is zero, so we could - // skip this in that case, however always running regardless allows it - // to run in constant time. The final result will be in the range - // 0 <= result <= prime + (2^64 - c), so it is guaranteed to have a - // magnitude of 1, but it is denormalized. - d := t0 + m*977 - f.n[0] = uint32(d & fieldBaseMask) - d = (d >> fieldBase) + t1 + m*64 - f.n[1] = uint32(d & fieldBaseMask) - f.n[2] = uint32((d >> fieldBase) + t2) - f.n[3] = uint32(t3) - f.n[4] = uint32(t4) - f.n[5] = uint32(t5) - f.n[6] = uint32(t6) - f.n[7] = uint32(t7) - f.n[8] = uint32(t8) - f.n[9] = uint32(t9) - - return f -} - -// Square squares the field value. The existing field value is modified. Note -// that this function can overflow if multiplying any of the individual words -// exceeds a max uint32. In practice, this means the magnitude of the field -// must be a max of 8 to prevent overflow. -// -// The field value is returned to support chaining. This enables syntax like: -// f.Square().Mul(f2) so that f = f^2 * f2. -func (f *fieldVal) Square() *fieldVal { - return f.SquareVal(f) -} - -// SquareVal squares the passed value and stores the result in f. Note that -// this function can overflow if multiplying any of the individual words -// exceeds a max uint32. In practice, this means the magnitude of the field -// being squred must be a max of 8 to prevent overflow. -// -// The field value is returned to support chaining. This enables syntax like: -// f3.SquareVal(f).Mul(f) so that f3 = f^2 * f = f^3. -func (f *fieldVal) SquareVal(val *fieldVal) *fieldVal { - // This could be done with a couple of for loops and an array to store - // the intermediate terms, but this unrolled version is significantly - // faster. - - // Terms for 2^(fieldBase*0). - m := uint64(val.n[0]) * uint64(val.n[0]) - t0 := m & fieldBaseMask - - // Terms for 2^(fieldBase*1). - m = (m >> fieldBase) + 2*uint64(val.n[0])*uint64(val.n[1]) - t1 := m & fieldBaseMask - - // Terms for 2^(fieldBase*2). - m = (m >> fieldBase) + - 2*uint64(val.n[0])*uint64(val.n[2]) + - uint64(val.n[1])*uint64(val.n[1]) - t2 := m & fieldBaseMask - - // Terms for 2^(fieldBase*3). - m = (m >> fieldBase) + - 2*uint64(val.n[0])*uint64(val.n[3]) + - 2*uint64(val.n[1])*uint64(val.n[2]) - t3 := m & fieldBaseMask - - // Terms for 2^(fieldBase*4). - m = (m >> fieldBase) + - 2*uint64(val.n[0])*uint64(val.n[4]) + - 2*uint64(val.n[1])*uint64(val.n[3]) + - uint64(val.n[2])*uint64(val.n[2]) - t4 := m & fieldBaseMask - - // Terms for 2^(fieldBase*5). - m = (m >> fieldBase) + - 2*uint64(val.n[0])*uint64(val.n[5]) + - 2*uint64(val.n[1])*uint64(val.n[4]) + - 2*uint64(val.n[2])*uint64(val.n[3]) - t5 := m & fieldBaseMask - - // Terms for 2^(fieldBase*6). - m = (m >> fieldBase) + - 2*uint64(val.n[0])*uint64(val.n[6]) + - 2*uint64(val.n[1])*uint64(val.n[5]) + - 2*uint64(val.n[2])*uint64(val.n[4]) + - uint64(val.n[3])*uint64(val.n[3]) - t6 := m & fieldBaseMask - - // Terms for 2^(fieldBase*7). - m = (m >> fieldBase) + - 2*uint64(val.n[0])*uint64(val.n[7]) + - 2*uint64(val.n[1])*uint64(val.n[6]) + - 2*uint64(val.n[2])*uint64(val.n[5]) + - 2*uint64(val.n[3])*uint64(val.n[4]) - t7 := m & fieldBaseMask - - // Terms for 2^(fieldBase*8). - m = (m >> fieldBase) + - 2*uint64(val.n[0])*uint64(val.n[8]) + - 2*uint64(val.n[1])*uint64(val.n[7]) + - 2*uint64(val.n[2])*uint64(val.n[6]) + - 2*uint64(val.n[3])*uint64(val.n[5]) + - uint64(val.n[4])*uint64(val.n[4]) - t8 := m & fieldBaseMask - - // Terms for 2^(fieldBase*9). - m = (m >> fieldBase) + - 2*uint64(val.n[0])*uint64(val.n[9]) + - 2*uint64(val.n[1])*uint64(val.n[8]) + - 2*uint64(val.n[2])*uint64(val.n[7]) + - 2*uint64(val.n[3])*uint64(val.n[6]) + - 2*uint64(val.n[4])*uint64(val.n[5]) - t9 := m & fieldBaseMask - - // Terms for 2^(fieldBase*10). - m = (m >> fieldBase) + - 2*uint64(val.n[1])*uint64(val.n[9]) + - 2*uint64(val.n[2])*uint64(val.n[8]) + - 2*uint64(val.n[3])*uint64(val.n[7]) + - 2*uint64(val.n[4])*uint64(val.n[6]) + - uint64(val.n[5])*uint64(val.n[5]) - t10 := m & fieldBaseMask - - // Terms for 2^(fieldBase*11). - m = (m >> fieldBase) + - 2*uint64(val.n[2])*uint64(val.n[9]) + - 2*uint64(val.n[3])*uint64(val.n[8]) + - 2*uint64(val.n[4])*uint64(val.n[7]) + - 2*uint64(val.n[5])*uint64(val.n[6]) - t11 := m & fieldBaseMask - - // Terms for 2^(fieldBase*12). - m = (m >> fieldBase) + - 2*uint64(val.n[3])*uint64(val.n[9]) + - 2*uint64(val.n[4])*uint64(val.n[8]) + - 2*uint64(val.n[5])*uint64(val.n[7]) + - uint64(val.n[6])*uint64(val.n[6]) - t12 := m & fieldBaseMask - - // Terms for 2^(fieldBase*13). - m = (m >> fieldBase) + - 2*uint64(val.n[4])*uint64(val.n[9]) + - 2*uint64(val.n[5])*uint64(val.n[8]) + - 2*uint64(val.n[6])*uint64(val.n[7]) - t13 := m & fieldBaseMask - - // Terms for 2^(fieldBase*14). - m = (m >> fieldBase) + - 2*uint64(val.n[5])*uint64(val.n[9]) + - 2*uint64(val.n[6])*uint64(val.n[8]) + - uint64(val.n[7])*uint64(val.n[7]) - t14 := m & fieldBaseMask - - // Terms for 2^(fieldBase*15). - m = (m >> fieldBase) + - 2*uint64(val.n[6])*uint64(val.n[9]) + - 2*uint64(val.n[7])*uint64(val.n[8]) - t15 := m & fieldBaseMask - - // Terms for 2^(fieldBase*16). - m = (m >> fieldBase) + - 2*uint64(val.n[7])*uint64(val.n[9]) + - uint64(val.n[8])*uint64(val.n[8]) - t16 := m & fieldBaseMask - - // Terms for 2^(fieldBase*17). - m = (m >> fieldBase) + 2*uint64(val.n[8])*uint64(val.n[9]) - t17 := m & fieldBaseMask - - // Terms for 2^(fieldBase*18). - m = (m >> fieldBase) + uint64(val.n[9])*uint64(val.n[9]) - t18 := m & fieldBaseMask - - // What's left is for 2^(fieldBase*19). - t19 := m >> fieldBase - - // At this point, all of the terms are grouped into their respective - // base. - // - // Per [HAC] section 14.3.4: Reduction method of moduli of special form, - // when the modulus is of the special form m = b^t - c, highly efficient - // reduction can be achieved per the provided algorithm. - // - // The secp256k1 prime is equivalent to 2^256 - 4294968273, so it fits - // this criteria. - // - // 4294968273 in field representation (base 2^26) is: - // n[0] = 977 - // n[1] = 64 - // That is to say (2^26 * 64) + 977 = 4294968273 - // - // Since each word is in base 26, the upper terms (t10 and up) start - // at 260 bits (versus the final desired range of 256 bits), so the - // field representation of 'c' from above needs to be adjusted for the - // extra 4 bits by multiplying it by 2^4 = 16. 4294968273 * 16 = - // 68719492368. Thus, the adjusted field representation of 'c' is: - // n[0] = 977 * 16 = 15632 - // n[1] = 64 * 16 = 1024 - // That is to say (2^26 * 1024) + 15632 = 68719492368 - // - // To reduce the final term, t19, the entire 'c' value is needed instead - // of only n[0] because there are no more terms left to handle n[1]. - // This means there might be some magnitude left in the upper bits that - // is handled below. - m = t0 + t10*15632 - t0 = m & fieldBaseMask - m = (m >> fieldBase) + t1 + t10*1024 + t11*15632 - t1 = m & fieldBaseMask - m = (m >> fieldBase) + t2 + t11*1024 + t12*15632 - t2 = m & fieldBaseMask - m = (m >> fieldBase) + t3 + t12*1024 + t13*15632 - t3 = m & fieldBaseMask - m = (m >> fieldBase) + t4 + t13*1024 + t14*15632 - t4 = m & fieldBaseMask - m = (m >> fieldBase) + t5 + t14*1024 + t15*15632 - t5 = m & fieldBaseMask - m = (m >> fieldBase) + t6 + t15*1024 + t16*15632 - t6 = m & fieldBaseMask - m = (m >> fieldBase) + t7 + t16*1024 + t17*15632 - t7 = m & fieldBaseMask - m = (m >> fieldBase) + t8 + t17*1024 + t18*15632 - t8 = m & fieldBaseMask - m = (m >> fieldBase) + t9 + t18*1024 + t19*68719492368 - t9 = m & fieldMSBMask - m = m >> fieldMSBBits - - // At this point, if the magnitude is greater than 0, the overall value - // is greater than the max possible 256-bit value. In particular, it is - // "how many times larger" than the max value it is. - // - // The algorithm presented in [HAC] section 14.3.4 repeats until the - // quotient is zero. However, due to the above, we already know at - // least how many times we would need to repeat as it's the value - // currently in m. Thus we can simply multiply the magnitude by the - // field representation of the prime and do a single iteration. Notice - // that nothing will be changed when the magnitude is zero, so we could - // skip this in that case, however always running regardless allows it - // to run in constant time. The final result will be in the range - // 0 <= result <= prime + (2^64 - c), so it is guaranteed to have a - // magnitude of 1, but it is denormalized. - n := t0 + m*977 - f.n[0] = uint32(n & fieldBaseMask) - n = (n >> fieldBase) + t1 + m*64 - f.n[1] = uint32(n & fieldBaseMask) - f.n[2] = uint32((n >> fieldBase) + t2) - f.n[3] = uint32(t3) - f.n[4] = uint32(t4) - f.n[5] = uint32(t5) - f.n[6] = uint32(t6) - f.n[7] = uint32(t7) - f.n[8] = uint32(t8) - f.n[9] = uint32(t9) - - return f -} - -// Inverse finds the modular multiplicative inverse of the field value. The -// existing field value is modified. -// -// The field value is returned to support chaining. This enables syntax like: -// f.Inverse().Mul(f2) so that f = f^-1 * f2. -func (f *fieldVal) Inverse() *fieldVal { - // Fermat's little theorem states that for a nonzero number a and prime - // prime p, a^(p-1) = 1 (mod p). Since the multipliciative inverse is - // a*b = 1 (mod p), it follows that b = a*a^(p-2) = a^(p-1) = 1 (mod p). - // Thus, a^(p-2) is the multiplicative inverse. - // - // In order to efficiently compute a^(p-2), p-2 needs to be split into - // a sequence of squares and multipications that minimizes the number of - // multiplications needed (since they are more costly than squarings). - // Intermediate results are saved and reused as well. - // - // The secp256k1 prime - 2 is 2^256 - 4294968275. - // - // This has a cost of 258 field squarings and 33 field multiplications. - var a2, a3, a4, a10, a11, a21, a42, a45, a63, a1019, a1023 fieldVal - a2.SquareVal(f) - a3.Mul2(&a2, f) - a4.SquareVal(&a2) - a10.SquareVal(&a4).Mul(&a2) - a11.Mul2(&a10, f) - a21.Mul2(&a10, &a11) - a42.SquareVal(&a21) - a45.Mul2(&a42, &a3) - a63.Mul2(&a42, &a21) - a1019.SquareVal(&a63).Square().Square().Square().Mul(&a11) - a1023.Mul2(&a1019, &a4) - f.Set(&a63) // f = a^(2^6 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^11 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^16 - 1024) - f.Mul(&a1023) // f = a^(2^16 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^21 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^26 - 1024) - f.Mul(&a1023) // f = a^(2^26 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^31 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^36 - 1024) - f.Mul(&a1023) // f = a^(2^36 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^41 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^46 - 1024) - f.Mul(&a1023) // f = a^(2^46 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^51 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^56 - 1024) - f.Mul(&a1023) // f = a^(2^56 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^61 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^66 - 1024) - f.Mul(&a1023) // f = a^(2^66 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^71 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^76 - 1024) - f.Mul(&a1023) // f = a^(2^76 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^81 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^86 - 1024) - f.Mul(&a1023) // f = a^(2^86 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^91 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^96 - 1024) - f.Mul(&a1023) // f = a^(2^96 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^101 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^106 - 1024) - f.Mul(&a1023) // f = a^(2^106 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^111 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^116 - 1024) - f.Mul(&a1023) // f = a^(2^116 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^121 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^126 - 1024) - f.Mul(&a1023) // f = a^(2^126 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^131 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^136 - 1024) - f.Mul(&a1023) // f = a^(2^136 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^141 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^146 - 1024) - f.Mul(&a1023) // f = a^(2^146 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^151 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^156 - 1024) - f.Mul(&a1023) // f = a^(2^156 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^161 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^166 - 1024) - f.Mul(&a1023) // f = a^(2^166 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^171 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^176 - 1024) - f.Mul(&a1023) // f = a^(2^176 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^181 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^186 - 1024) - f.Mul(&a1023) // f = a^(2^186 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^191 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^196 - 1024) - f.Mul(&a1023) // f = a^(2^196 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^201 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^206 - 1024) - f.Mul(&a1023) // f = a^(2^206 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^211 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^216 - 1024) - f.Mul(&a1023) // f = a^(2^216 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^221 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^226 - 1024) - f.Mul(&a1019) // f = a^(2^226 - 5) - f.Square().Square().Square().Square().Square() // f = a^(2^231 - 160) - f.Square().Square().Square().Square().Square() // f = a^(2^236 - 5120) - f.Mul(&a1023) // f = a^(2^236 - 4097) - f.Square().Square().Square().Square().Square() // f = a^(2^241 - 131104) - f.Square().Square().Square().Square().Square() // f = a^(2^246 - 4195328) - f.Mul(&a1023) // f = a^(2^246 - 4194305) - f.Square().Square().Square().Square().Square() // f = a^(2^251 - 134217760) - f.Square().Square().Square().Square().Square() // f = a^(2^256 - 4294968320) - return f.Mul(&a45) // f = a^(2^256 - 4294968275) = a^(p-2) -} - -// SqrtVal computes the square root of x modulo the curve's prime, and stores -// the result in f. The square root is computed via exponentiation of x by the -// value Q = (P+1)/4 using the curve's precomputed big-endian representation of -// the Q. This method uses a modified version of square-and-multiply -// exponentiation over secp256k1 fieldVals to operate on bytes instead of bits, -// which offers better performance over both big.Int exponentiation and bit-wise -// square-and-multiply. -// -// NOTE: This method only works when P is intended to be the secp256k1 prime and -// is not constant time. The returned value is of magnitude 1, but is -// denormalized. -func (f *fieldVal) SqrtVal(x *fieldVal) *fieldVal { - // The following computation iteratively computes x^((P+1)/4) = x^Q - // using the recursive, piece-wise definition: - // - // x^n = (x^2)^(n/2) mod P if n is even - // x^n = x(x^2)^(n-1/2) mod P if n is odd - // - // Given n in its big-endian representation b_k, ..., b_0, x^n can be - // computed by defining the sequence r_k+1, ..., r_0, where: - // - // r_k+1 = 1 - // r_i = (r_i+1)^2 * x^b_i for i = k, ..., 0 - // - // The final value r_0 = x^n. - // - // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more - // details. - // - // This can be further optimized, by observing that the value of Q in - // secp256k1 has the value: - // - // Q = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffff0c - // - // We can unroll the typical bit-wise interpretation of the - // exponentiation algorithm above to instead operate on bytes. - // This reduces the number of comparisons by an order of magnitude, - // reducing the overhead of failed branch predictions and additional - // comparisons in this method. - // - // Since there there are only 4 unique bytes of Q, this keeps the jump - // table small without the need to handle all possible 8-bit values. - // Further, we observe that 29 of the 32 bytes are 0xff; making the - // first case handle 0xff therefore optimizes the hot path. - f.SetInt(1) - for _, b := range fieldQBytes { - switch b { - - // Most common case, where all 8 bits are set. - case 0xff: - f.Square().Mul(x) - f.Square().Mul(x) - f.Square().Mul(x) - f.Square().Mul(x) - f.Square().Mul(x) - f.Square().Mul(x) - f.Square().Mul(x) - f.Square().Mul(x) - - // First byte of Q (0x3f), where all but the top two bits are - // set. Note that this case only applies six operations, since - // the highest bit of Q resides in bit six of the first byte. We - // ignore the first two bits, since squaring for these bits will - // result in an invalid result. We forgo squaring f before the - // first multiply, since 1^2 = 1. - case 0x3f: - f.Mul(x) - f.Square().Mul(x) - f.Square().Mul(x) - f.Square().Mul(x) - f.Square().Mul(x) - f.Square().Mul(x) - - // Byte 28 of Q (0xbf), where only bit 7 is unset. - case 0xbf: - f.Square().Mul(x) - f.Square() - f.Square().Mul(x) - f.Square().Mul(x) - f.Square().Mul(x) - f.Square().Mul(x) - f.Square().Mul(x) - f.Square().Mul(x) - - // Byte 31 of Q (0x0c), where only bits 3 and 4 are set. - default: - f.Square() - f.Square() - f.Square() - f.Square() - f.Square().Mul(x) - f.Square().Mul(x) - f.Square() - f.Square() - } - } - - return f -} - -// Sqrt computes the square root of f modulo the curve's prime, and stores the -// result in f. The square root is computed via exponentiation of x by the value -// Q = (P+1)/4 using the curve's precomputed big-endian representation of the Q. -// This method uses a modified version of square-and-multiply exponentiation -// over secp256k1 fieldVals to operate on bytes instead of bits, which offers -// better performance over both big.Int exponentiation and bit-wise -// square-and-multiply. -// -// NOTE: This method only works when P is intended to be the secp256k1 prime and -// is not constant time. The returned value is of magnitude 1, but is -// denormalized. -func (f *fieldVal) Sqrt() *fieldVal { - return f.SqrtVal(f) -} +import secp "github.com/decred/dcrd/dcrec/secp256k1/v4" + +// FieldVal implements optimized fixed-precision arithmetic over the secp256k1 +// finite field. This means all arithmetic is performed modulo +// '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f'. +// +// WARNING: Since it is so important for the field arithmetic to be extremely +// fast for high performance crypto, this type does not perform any validation +// of documented preconditions where it ordinarily would. As a result, it is +// IMPERATIVE for callers to understand some key concepts that are described +// below and ensure the methods are called with the necessary preconditions +// that each method is documented with. For example, some methods only give the +// correct result if the field value is normalized and others require the field +// values involved to have a maximum magnitude and THERE ARE NO EXPLICIT CHECKS +// TO ENSURE THOSE PRECONDITIONS ARE SATISFIED. This does, unfortunately, make +// the type more difficult to use correctly and while I typically prefer to +// ensure all state and input is valid for most code, this is a bit of an +// exception because those extra checks really add up in what ends up being +// critical hot paths. +// +// The first key concept when working with this type is normalization. In order +// to avoid the need to propagate a ton of carries, the internal representation +// provides additional overflow bits for each word of the overall 256-bit +// value. This means that there are multiple internal representations for the +// same value and, as a result, any methods that rely on comparison of the +// value, such as equality and oddness determination, require the caller to +// provide a normalized value. +// +// The second key concept when working with this type is magnitude. As +// previously mentioned, the internal representation provides additional +// overflow bits which means that the more math operations that are performed +// on the field value between normalizations, the more those overflow bits +// accumulate. The magnitude is effectively that maximum possible number of +// those overflow bits that could possibly be required as a result of a given +// operation. Since there are only a limited number of overflow bits available, +// this implies that the max possible magnitude MUST be tracked by the caller +// and the caller MUST normalize the field value if a given operation would +// cause the magnitude of the result to exceed the max allowed value. +// +// IMPORTANT: The max allowed magnitude of a field value is 64. +type FieldVal = secp.FieldVal diff --git a/btcec/field_test.go b/btcec/field_test.go index 27b9730f65..0844dc1d67 100644 --- a/btcec/field_test.go +++ b/btcec/field_test.go @@ -6,69 +6,30 @@ package btcec import ( - "crypto/rand" - "fmt" - "reflect" + "math/rand" + + "encoding/hex" "testing" ) -// TestSetInt ensures that setting a field value to various native integers -// works as expected. -func TestSetInt(t *testing.T) { - tests := []struct { - in uint - raw [10]uint32 - }{ - {5, [10]uint32{5, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - // 2^26 - {67108864, [10]uint32{67108864, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - // 2^26 + 1 - {67108865, [10]uint32{67108865, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - // 2^32 - 1 - {4294967295, [10]uint32{4294967295, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, - } - - t.Logf("Running %d tests", len(tests)) - for i, test := range tests { - f := new(fieldVal).SetInt(test.in) - if !reflect.DeepEqual(f.n, test.raw) { - t.Errorf("fieldVal.Set #%d wrong result\ngot: %v\n"+ - "want: %v", i, f.n, test.raw) - continue - } - } -} - -// TestZero ensures that zeroing a field value zero works as expected. -func TestZero(t *testing.T) { - f := new(fieldVal).SetInt(2) - f.Zero() - for idx, rawInt := range f.n { - if rawInt != 0 { - t.Errorf("internal field integer at index #%d is not "+ - "zero - got %d", idx, rawInt) - } - } -} - // TestIsZero ensures that checking if a field IsZero works as expected. func TestIsZero(t *testing.T) { - f := new(fieldVal) + f := new(FieldVal) if !f.IsZero() { t.Errorf("new field value is not zero - got %v (rawints %x)", f, - f.n) + f.String()) } f.SetInt(1) if f.IsZero() { t.Errorf("field claims it's zero when it's not - got %v "+ - "(raw rawints %x)", f, f.n) + "(raw rawints %x)", f, f.String()) } f.Zero() if !f.IsZero() { t.Errorf("field claims it's not zero when it is - got %v "+ - "(raw rawints %x)", f, f.n) + "(raw rawints %x)", f, f.String()) } } @@ -146,10 +107,10 @@ func TestStringer(t *testing.T) { t.Logf("Running %d tests", len(tests)) for i, test := range tests { - f := new(fieldVal).SetHex(test.in) + f := setHex(test.in) result := f.String() if result != test.expected { - t.Errorf("fieldVal.String #%d wrong result\ngot: %v\n"+ + t.Errorf("FieldVal.String #%d wrong result\ngot: %v\n"+ "want: %v", i, result, test.expected) continue } @@ -312,15 +273,16 @@ func TestNormalize(t *testing.T) { } t.Logf("Running %d tests", len(tests)) - for i, test := range tests { - f := new(fieldVal) + for range tests { + // TODO(roasbeef): can't access internal state + /*f := new(FieldVal) f.n = test.raw f.Normalize() if !reflect.DeepEqual(f.n, test.normalized) { - t.Errorf("fieldVal.Normalize #%d wrong result\n"+ + t.Errorf("FieldVal.Normalize #%d wrong result\n"+ "got: %x\nwant: %x", i, f.n, test.normalized) continue - } + }*/ } } @@ -343,10 +305,10 @@ func TestIsOdd(t *testing.T) { t.Logf("Running %d tests", len(tests)) for i, test := range tests { - f := new(fieldVal).SetHex(test.in) + f := setHex(test.in) result := f.IsOdd() if result != test.expected { - t.Errorf("fieldVal.IsOdd #%d wrong result\n"+ + t.Errorf("FieldVal.IsOdd #%d wrong result\n"+ "got: %v\nwant: %v", i, result, test.expected) continue } @@ -376,11 +338,11 @@ func TestEquals(t *testing.T) { t.Logf("Running %d tests", len(tests)) for i, test := range tests { - f := new(fieldVal).SetHex(test.in1).Normalize() - f2 := new(fieldVal).SetHex(test.in2).Normalize() + f := setHex(test.in1).Normalize() + f2 := setHex(test.in2).Normalize() result := f.Equals(f2) if result != test.expected { - t.Errorf("fieldVal.Equals #%d wrong result\n"+ + t.Errorf("FieldVal.Equals #%d wrong result\n"+ "got: %v\nwant: %v", i, result, test.expected) continue } @@ -424,347 +386,419 @@ func TestNegate(t *testing.T) { t.Logf("Running %d tests", len(tests)) for i, test := range tests { - f := new(fieldVal).SetHex(test.in).Normalize() - expected := new(fieldVal).SetHex(test.expected).Normalize() + f := setHex(test.in).Normalize() + expected := setHex(test.expected).Normalize() result := f.Negate(1).Normalize() if !result.Equals(expected) { - t.Errorf("fieldVal.Negate #%d wrong result\n"+ + t.Errorf("FieldVal.Negate #%d wrong result\n"+ "got: %v\nwant: %v", i, result, expected) continue } } } -// TestAddInt ensures that adding an integer to field values via AddInt works as -// expected. -func TestAddInt(t *testing.T) { +// TestFieldAddInt ensures that adding an integer to field values via AddInt +// works as expected. +func TestFieldAddInt(t *testing.T) { tests := []struct { + name string // test description in1 string // hex encoded value - in2 uint // unsigned integer to add to the value above + in2 uint16 // unsigned integer to add to the value above expected string // expected hex encoded value - }{ - {"0", 1, "1"}, - {"1", 0, "1"}, - {"1", 1, "2"}, - // secp256k1 prime-1 + 1 - {"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e", 1, "0"}, - // secp256k1 prime + 1 - {"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", 1, "1"}, - // Random samples. - { - "ff95ad9315aff04ab4af0ce673620c7145dc85d03bab5ba4b09ca2c4dec2d6c1", - 0x10f, - "ff95ad9315aff04ab4af0ce673620c7145dc85d03bab5ba4b09ca2c4dec2d7d0", - }, - { - "44bdae6b772e7987941f1ba314e6a5b7804a4c12c00961b57d20f41deea9cecf", - 0x2cf11d41, - "44bdae6b772e7987941f1ba314e6a5b7804a4c12c00961b57d20f41e1b9aec10", - }, - { - "88c3ecae67b591935fb1f6a9499c35315ffad766adca665c50b55f7105122c9c", - 0x4829aa2d, - "88c3ecae67b591935fb1f6a9499c35315ffad766adca665c50b55f714d3bd6c9", - }, - { - "8523e9edf360ca32a95aae4e57fcde5a542b471d08a974d94ea0ee09a015e2a6", - 0xa21265a5, - "8523e9edf360ca32a95aae4e57fcde5a542b471d08a974d94ea0ee0a4228484b", - }, - } + }{{ + name: "zero + one", + in1: "0", + in2: 1, + expected: "1", + }, { + name: "one + zero", + in1: "1", + in2: 0, + expected: "1", + }, { + name: "one + one", + in1: "1", + in2: 1, + expected: "2", + }, { + name: "secp256k1 prime-1 + 1", + in1: "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e", + in2: 1, + expected: "0", + }, { + name: "secp256k1 prime + 1", + in1: "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + in2: 1, + expected: "1", + }, { + name: "random sampling #1", + in1: "ff95ad9315aff04ab4af0ce673620c7145dc85d03bab5ba4b09ca2c4dec2d6c1", + in2: 0x10f, + expected: "ff95ad9315aff04ab4af0ce673620c7145dc85d03bab5ba4b09ca2c4dec2d7d0", + }, { + name: "random sampling #2", + in1: "44bdae6b772e7987941f1ba314e6a5b7804a4c12c00961b57d20f41deea9cecf", + in2: 0x3196, + expected: "44bdae6b772e7987941f1ba314e6a5b7804a4c12c00961b57d20f41deeaa0065", + }, { + name: "random sampling #3", + in1: "88c3ecae67b591935fb1f6a9499c35315ffad766adca665c50b55f7105122c9c", + in2: 0x966f, + expected: "88c3ecae67b591935fb1f6a9499c35315ffad766adca665c50b55f710512c30b", + }, { + name: "random sampling #4", + in1: "8523e9edf360ca32a95aae4e57fcde5a542b471d08a974d94ea0ee09a015e2a6", + in2: 0xc54, + expected: "8523e9edf360ca32a95aae4e57fcde5a542b471d08a974d94ea0ee09a015eefa", + }} - t.Logf("Running %d tests", len(tests)) - for i, test := range tests { - f := new(fieldVal).SetHex(test.in1).Normalize() - expected := new(fieldVal).SetHex(test.expected).Normalize() + for _, test := range tests { + f := setHex(test.in1).Normalize() + expected := setHex(test.expected).Normalize() result := f.AddInt(test.in2).Normalize() if !result.Equals(expected) { - t.Errorf("fieldVal.AddInt #%d wrong result\n"+ - "got: %v\nwant: %v", i, result, expected) + t.Errorf("%s: wrong result -- got: %v -- want: %v", test.name, + result, expected) continue } } } -// TestAdd ensures that adding two field values together via Add works as -// expected. -func TestAdd(t *testing.T) { +// TestFieldAdd ensures that adding two field values together via Add and Add2 +// works as expected. +func TestFieldAdd(t *testing.T) { tests := []struct { + name string // test description in1 string // first hex encoded value in2 string // second hex encoded value to add expected string // expected hex encoded value - }{ - {"0", "1", "1"}, - {"1", "0", "1"}, - {"1", "1", "2"}, - // secp256k1 prime-1 + 1 - {"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e", "1", "0"}, - // secp256k1 prime + 1 - {"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", "1", "1"}, - // Random samples. - { - "2b2012f975404e5065b4292fb8bed0a5d315eacf24c74d8b27e73bcc5430edcc", - "2c3cefa4e4753e8aeec6ac4c12d99da4d78accefda3b7885d4c6bab46c86db92", - "575d029e59b58cdb547ad57bcb986e4aaaa0b7beff02c610fcadf680c0b7c95e", - }, - { - "8131e8722fe59bb189692b96c9f38de92885730f1dd39ab025daffb94c97f79c", - "ff5454b765f0aab5f0977dcc629becc84cabeb9def48e79c6aadb2622c490fa9", - "80863d2995d646677a00a9632c8f7ab175315ead0d1c824c9088b21c78e10b16", - }, - { - "c7c95e93d0892b2b2cdd77e80eb646ea61be7a30ac7e097e9f843af73fad5c22", - "3afe6f91a74dfc1c7f15c34907ee981656c37236d946767dd53ccad9190e437c", - "02c7ce2577d72747abf33b3116a4df00b881ec6785c47ffc74c105d158bba36f", - }, - { - "fd1c26f6a23381e5d785ba889494ec059369b888ad8431cd67d8c934b580dbe1", - "a475aa5a31dcca90ef5b53c097d9133d6b7117474b41e7877bb199590fc0489c", - "a191d150d4104c76c6e10e492c6dff42fedacfcff8c61954e38a628ec541284e", - }, - } + }{{ + name: "zero + one", + in1: "0", + in2: "1", + expected: "1", + }, { + name: "one + zero", + in1: "1", + in2: "0", + expected: "1", + }, { + name: "secp256k1 prime-1 + 1", + in1: "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e", + in2: "1", + expected: "0", + }, { + name: "secp256k1 prime + 1", + in1: "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + in2: "1", + expected: "1", + }, { + name: "random sampling #1", + in1: "2b2012f975404e5065b4292fb8bed0a5d315eacf24c74d8b27e73bcc5430edcc", + in2: "2c3cefa4e4753e8aeec6ac4c12d99da4d78accefda3b7885d4c6bab46c86db92", + expected: "575d029e59b58cdb547ad57bcb986e4aaaa0b7beff02c610fcadf680c0b7c95e", + }, { + name: "random sampling #2", + in1: "8131e8722fe59bb189692b96c9f38de92885730f1dd39ab025daffb94c97f79c", + in2: "ff5454b765f0aab5f0977dcc629becc84cabeb9def48e79c6aadb2622c490fa9", + expected: "80863d2995d646677a00a9632c8f7ab175315ead0d1c824c9088b21c78e10b16", + }, { + name: "random sampling #3", + in1: "c7c95e93d0892b2b2cdd77e80eb646ea61be7a30ac7e097e9f843af73fad5c22", + in2: "3afe6f91a74dfc1c7f15c34907ee981656c37236d946767dd53ccad9190e437c", + expected: "2c7ce2577d72747abf33b3116a4df00b881ec6785c47ffc74c105d158bba36f", + }, { + name: "random sampling #4", + in1: "fd1c26f6a23381e5d785ba889494ec059369b888ad8431cd67d8c934b580dbe1", + in2: "a475aa5a31dcca90ef5b53c097d9133d6b7117474b41e7877bb199590fc0489c", + expected: "a191d150d4104c76c6e10e492c6dff42fedacfcff8c61954e38a628ec541284e", + }, { + name: "random sampling #5", + in1: "ad82b8d1cc136e23e9fd77fe2c7db1fe5a2ecbfcbde59ab3529758334f862d28", + in2: "4d6a4e95d6d61f4f46b528bebe152d408fd741157a28f415639347a84f6f574b", + expected: "faed0767a2e98d7330b2a0bcea92df3eea060d12380e8ec8b62a9fdb9ef58473", + }, { + name: "random sampling #6", + in1: "f3f43a2540054a86e1df98547ec1c0e157b193e5350fb4a3c3ea214b228ac5e7", + in2: "25706572592690ea3ddc951a1b48b504a4c83dc253756e1b96d56fdfb3199522", + expected: "19649f97992bdb711fbc2d6e9a0a75e5fc79d1a7888522bf5abf912bd5a45eda", + }, { + name: "random sampling #7", + in1: "6915bb94eef13ff1bb9b2633d997e13b9b1157c713363cc0e891416d6734f5b8", + in2: "11f90d6ac6fe1c4e8900b1c85fb575c251ec31b9bc34b35ada0aea1c21eded22", + expected: "7b0ec8ffb5ef5c40449bd7fc394d56fdecfd8980cf6af01bc29c2b898922e2da", + }, { + name: "random sampling #8", + in1: "48b0c9eae622eed9335b747968544eb3e75cb2dc8128388f948aa30f88cabde4", + in2: "0989882b52f85f9d524a3a3061a0e01f46d597839d2ba637320f4b9510c8d2d5", + expected: "523a5216391b4e7685a5aea9c9f52ed32e324a601e53dec6c699eea4999390b9", + }} - t.Logf("Running %d tests", len(tests)) - for i, test := range tests { - f := new(fieldVal).SetHex(test.in1).Normalize() - f2 := new(fieldVal).SetHex(test.in2).Normalize() - expected := new(fieldVal).SetHex(test.expected).Normalize() - result := f.Add(f2).Normalize() + for _, test := range tests { + // Parse test hex. + f1 := setHex(test.in1).Normalize() + f2 := setHex(test.in2).Normalize() + expected := setHex(test.expected).Normalize() + + // Ensure adding the two values with the result going to another + // variable produces the expected result. + result := new(FieldVal).Add2(f1, f2).Normalize() if !result.Equals(expected) { - t.Errorf("fieldVal.Add #%d wrong result\n"+ - "got: %v\nwant: %v", i, result, expected) + t.Errorf("%s: unexpected result\ngot: %v\nwant: %v", test.name, + result, expected) continue } - } -} -// TestAdd2 ensures that adding two field values together via Add2 works as -// expected. -func TestAdd2(t *testing.T) { - tests := []struct { - in1 string // first hex encoded value - in2 string // second hex encoded value to add - expected string // expected hex encoded value - }{ - {"0", "1", "1"}, - {"1", "0", "1"}, - {"1", "1", "2"}, - // secp256k1 prime-1 + 1 - {"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e", "1", "0"}, - // secp256k1 prime + 1 - {"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", "1", "1"}, - // close but over the secp256k1 prime - {"fffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000", "f1ffff000", "1ffff3d1"}, - // Random samples. - { - "ad82b8d1cc136e23e9fd77fe2c7db1fe5a2ecbfcbde59ab3529758334f862d28", - "4d6a4e95d6d61f4f46b528bebe152d408fd741157a28f415639347a84f6f574b", - "faed0767a2e98d7330b2a0bcea92df3eea060d12380e8ec8b62a9fdb9ef58473", - }, - { - "f3f43a2540054a86e1df98547ec1c0e157b193e5350fb4a3c3ea214b228ac5e7", - "25706572592690ea3ddc951a1b48b504a4c83dc253756e1b96d56fdfb3199522", - "19649f97992bdb711fbc2d6e9a0a75e5fc79d1a7888522bf5abf912bd5a45eda", - }, - { - "6915bb94eef13ff1bb9b2633d997e13b9b1157c713363cc0e891416d6734f5b8", - "11f90d6ac6fe1c4e8900b1c85fb575c251ec31b9bc34b35ada0aea1c21eded22", - "7b0ec8ffb5ef5c40449bd7fc394d56fdecfd8980cf6af01bc29c2b898922e2da", - }, - { - "48b0c9eae622eed9335b747968544eb3e75cb2dc8128388f948aa30f88cabde4", - "0989882b52f85f9d524a3a3061a0e01f46d597839d2ba637320f4b9510c8d2d5", - "523a5216391b4e7685a5aea9c9f52ed32e324a601e53dec6c699eea4999390b9", - }, - } - - t.Logf("Running %d tests", len(tests)) - for i, test := range tests { - f := new(fieldVal).SetHex(test.in1).Normalize() - f2 := new(fieldVal).SetHex(test.in2).Normalize() - expected := new(fieldVal).SetHex(test.expected).Normalize() - result := f.Add2(f, f2).Normalize() - if !result.Equals(expected) { - t.Errorf("fieldVal.Add2 #%d wrong result\n"+ - "got: %v\nwant: %v", i, result, expected) + // Ensure adding the value to an existing field value produces the + // expected result. + f1.Add(f2).Normalize() + if !f1.Equals(expected) { + t.Errorf("%s: unexpected result\ngot: %v\nwant: %v", test.name, + f1, expected) continue } } } -// TestMulInt ensures that adding an integer to field values via MulInt works as -// expected. -func TestMulInt(t *testing.T) { +// TestFieldMulInt ensures that multiplying an integer to field values via +// MulInt works as expected. +func TestFieldMulInt(t *testing.T) { tests := []struct { + name string // test description in1 string // hex encoded value - in2 uint // unsigned integer to multiply with value above + in2 uint8 // unsigned integer to multiply with value above expected string // expected hex encoded value - }{ - {"0", 0, "0"}, - {"1", 0, "0"}, - {"0", 1, "0"}, - {"1", 1, "1"}, - // secp256k1 prime-1 * 2 - { - "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e", - 2, - "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2d", - }, - // secp256k1 prime * 3 - {"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", 3, "0"}, - // secp256k1 prime-1 * 8 - { - "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e", - 8, - "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc27", - }, + }{{ + name: "zero * zero", + in1: "0", + in2: 0, + expected: "0", + }, { + name: "one * zero", + in1: "1", + in2: 0, + expected: "0", + }, { + name: "zero * one", + in1: "0", + in2: 1, + expected: "0", + }, { + name: "one * one", + in1: "1", + in2: 1, + expected: "1", + }, { + name: "secp256k1 prime-1 * 2", + in1: "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e", + in2: 2, + expected: "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2d", + }, { + name: "secp256k1 prime * 3", + in1: "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + in2: 3, + expected: "0", + }, { + name: "secp256k1 prime-1 * 8", + in1: "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e", + in2: 8, + expected: "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc27", + }, { // Random samples for first value. The second value is limited // to 8 since that is the maximum int used in the elliptic curve // calculations. - { - "b75674dc9180d306c692163ac5e089f7cef166af99645c0c23568ab6d967288a", - 6, - "4c06bd2b6904f228a76c8560a3433bced9a8681d985a2848d407404d186b0280", - }, - { - "54873298ac2b5ba8591c125ae54931f5ea72040aee07b208d6135476fb5b9c0e", - 3, - "fd9597ca048212f90b543710afdb95e1bf560c20ca17161a8239fd64f212d42a", - }, - { - "7c30fbd363a74c17e1198f56b090b59bbb6c8755a74927a6cba7a54843506401", - 5, - "6cf4eb20f2447c77657fccb172d38c0aa91ea4ac446dc641fa463a6b5091fba7", - }, - { - "fb4529be3e027a3d1587d8a500b72f2d312e3577340ef5175f96d113be4c2ceb", - 8, - "da294df1f013d1e8ac3ec52805b979698971abb9a077a8bafcb688a4f261820f", - }, - } + name: "random sampling #1", + in1: "b75674dc9180d306c692163ac5e089f7cef166af99645c0c23568ab6d967288a", + in2: 6, + expected: "4c06bd2b6904f228a76c8560a3433bced9a8681d985a2848d407404d186b0280", + }, { + name: "random sampling #2", + in1: "54873298ac2b5ba8591c125ae54931f5ea72040aee07b208d6135476fb5b9c0e", + in2: 3, + expected: "fd9597ca048212f90b543710afdb95e1bf560c20ca17161a8239fd64f212d42a", + }, { + name: "random sampling #3", + in1: "7c30fbd363a74c17e1198f56b090b59bbb6c8755a74927a6cba7a54843506401", + in2: 5, + expected: "6cf4eb20f2447c77657fccb172d38c0aa91ea4ac446dc641fa463a6b5091fba7", + }, { + name: "random sampling #3", + in1: "fb4529be3e027a3d1587d8a500b72f2d312e3577340ef5175f96d113be4c2ceb", + in2: 8, + expected: "da294df1f013d1e8ac3ec52805b979698971abb9a077a8bafcb688a4f261820f", + }} - t.Logf("Running %d tests", len(tests)) - for i, test := range tests { - f := new(fieldVal).SetHex(test.in1).Normalize() - expected := new(fieldVal).SetHex(test.expected).Normalize() + for _, test := range tests { + f := setHex(test.in1).Normalize() + expected := setHex(test.expected).Normalize() result := f.MulInt(test.in2).Normalize() if !result.Equals(expected) { - t.Errorf("fieldVal.MulInt #%d wrong result\n"+ - "got: %v\nwant: %v", i, result, expected) + t.Errorf("%s: wrong result -- got: %v -- want: %v", test.name, + result, expected) continue } } } -// TestMul ensures that multiplying two field valuess via Mul works as expected. -func TestMul(t *testing.T) { +// TestFieldMul ensures that multiplying two field values via Mul and Mul2 works +// as expected. +func TestFieldMul(t *testing.T) { tests := []struct { + name string // test description in1 string // first hex encoded value in2 string // second hex encoded value to multiply with expected string // expected hex encoded value - }{ - {"0", "0", "0"}, - {"1", "0", "0"}, - {"0", "1", "0"}, - {"1", "1", "1"}, - // slightly over prime - { - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1ffff", - "1000", - "1ffff3d1", - }, - // secp256k1 prime-1 * 2 - { - "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e", - "2", - "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2d", - }, - // secp256k1 prime * 3 - {"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", "3", "0"}, - // secp256k1 prime-1 * 8 - { - "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e", - "8", - "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc27", - }, - // Random samples. - { - "cfb81753d5ef499a98ecc04c62cb7768c2e4f1740032946db1c12e405248137e", - "58f355ad27b4d75fb7db0442452e732c436c1f7c5a7c4e214fa9cc031426a7d3", - "1018cd2d7c2535235b71e18db9cd98027386328d2fa6a14b36ec663c4c87282b", - }, - { - "26e9d61d1cdf3920e9928e85fa3df3e7556ef9ab1d14ec56d8b4fc8ed37235bf", - "2dfc4bbe537afee979c644f8c97b31e58be5296d6dbc460091eae630c98511cf", - "da85f48da2dc371e223a1ae63bd30b7e7ee45ae9b189ac43ff357e9ef8cf107a", - }, - { - "5db64ed5afb71646c8b231585d5b2bf7e628590154e0854c4c29920b999ff351", - "279cfae5eea5d09ade8e6a7409182f9de40981bc31c84c3d3dfe1d933f152e9a", - "2c78fbae91792dd0b157abe3054920049b1879a7cc9d98cfda927d83be411b37", - }, - { - "b66dfc1f96820b07d2bdbd559c19319a3a73c97ceb7b3d662f4fe75ecb6819e6", - "bf774aba43e3e49eb63a6e18037d1118152568f1a3ac4ec8b89aeb6ff8008ae1", - "c4f016558ca8e950c21c3f7fc15f640293a979c7b01754ee7f8b3340d4902ebb", - }, - } + }{{ + name: "zero * zero", + in1: "0", + in2: "0", + expected: "0", + }, { + name: "one * zero", + in1: "1", + in2: "0", + expected: "0", + }, { + name: "zero * one", + in1: "0", + in2: "1", + expected: "0", + }, { + name: "one * one", + in1: "1", + in2: "1", + expected: "1", + }, { + name: "slightly over prime", + in1: "ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1ffff", + in2: "1000", + expected: "1ffff3d1", + }, { + name: "secp256k1 prime-1 * 2", + in1: "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e", + in2: "2", + expected: "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2d", + }, { + name: "secp256k1 prime * 3", + in1: "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + in2: "3", + expected: "0", + }, { + name: "secp256k1 prime * 3", + in1: "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e", + in2: "8", + expected: "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc27", + }, { + name: "random sampling #1", + in1: "cfb81753d5ef499a98ecc04c62cb7768c2e4f1740032946db1c12e405248137e", + in2: "58f355ad27b4d75fb7db0442452e732c436c1f7c5a7c4e214fa9cc031426a7d3", + expected: "1018cd2d7c2535235b71e18db9cd98027386328d2fa6a14b36ec663c4c87282b", + }, { + name: "random sampling #2", + in1: "26e9d61d1cdf3920e9928e85fa3df3e7556ef9ab1d14ec56d8b4fc8ed37235bf", + in2: "2dfc4bbe537afee979c644f8c97b31e58be5296d6dbc460091eae630c98511cf", + expected: "da85f48da2dc371e223a1ae63bd30b7e7ee45ae9b189ac43ff357e9ef8cf107a", + }, { + name: "random sampling #3", + in1: "5db64ed5afb71646c8b231585d5b2bf7e628590154e0854c4c29920b999ff351", + in2: "279cfae5eea5d09ade8e6a7409182f9de40981bc31c84c3d3dfe1d933f152e9a", + expected: "2c78fbae91792dd0b157abe3054920049b1879a7cc9d98cfda927d83be411b37", + }, { + name: "random sampling #4", + in1: "b66dfc1f96820b07d2bdbd559c19319a3a73c97ceb7b3d662f4fe75ecb6819e6", + in2: "bf774aba43e3e49eb63a6e18037d1118152568f1a3ac4ec8b89aeb6ff8008ae1", + expected: "c4f016558ca8e950c21c3f7fc15f640293a979c7b01754ee7f8b3340d4902ebb", + }} - t.Logf("Running %d tests", len(tests)) - for i, test := range tests { - f := new(fieldVal).SetHex(test.in1).Normalize() - f2 := new(fieldVal).SetHex(test.in2).Normalize() - expected := new(fieldVal).SetHex(test.expected).Normalize() - result := f.Mul(f2).Normalize() + for _, test := range tests { + f1 := setHex(test.in1).Normalize() + f2 := setHex(test.in2).Normalize() + expected := setHex(test.expected).Normalize() + + // Ensure multiplying the two values with the result going to another + // variable produces the expected result. + result := new(FieldVal).Mul2(f1, f2).Normalize() if !result.Equals(expected) { - t.Errorf("fieldVal.Mul #%d wrong result\n"+ - "got: %v\nwant: %v", i, result, expected) + t.Errorf("%s: unexpected result\ngot: %v\nwant: %v", test.name, + result, expected) + continue + } + + // Ensure multiplying the value to an existing field value produces the + // expected result. + f1.Mul(f2).Normalize() + if !f1.Equals(expected) { + t.Errorf("%s: unexpected result\ngot: %v\nwant: %v", test.name, + f1, expected) continue } } } -// TestSquare ensures that squaring field values via Square works as expected. -func TestSquare(t *testing.T) { +// TestFieldSquare ensures that squaring field values via Square and SqualVal +// works as expected. +func TestFieldSquare(t *testing.T) { tests := []struct { + name string // test description in string // hex encoded value expected string // expected hex encoded value - }{ - // secp256k1 prime (aka 0) - {"0", "0"}, - {"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", "0"}, - {"0", "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"}, - // secp256k1 prime-1 - {"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e", "1"}, - // secp256k1 prime-2 - {"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2d", "4"}, - // Random sampling - { - "b0ba920360ea8436a216128047aab9766d8faf468895eb5090fc8241ec758896", - "133896b0b69fda8ce9f648b9a3af38f345290c9eea3cbd35bafcadf7c34653d3", - }, - { - "c55d0d730b1d0285a1599995938b042a756e6e8857d390165ffab480af61cbd5", - "cd81758b3f5877cbe7e5b0a10cebfa73bcbf0957ca6453e63ee8954ab7780bee", - }, - { - "e89c1f9a70d93651a1ba4bca5b78658f00de65a66014a25544d3365b0ab82324", - "39ffc7a43e5dbef78fd5d0354fb82c6d34f5a08735e34df29da14665b43aa1f", - }, - { - "7dc26186079d22bcbe1614aa20ae627e62d72f9be7ad1e99cac0feb438956f05", - "bf86bcfc4edb3d81f916853adfda80c07c57745b008b60f560b1912f95bce8ae", - }, - } + }{{ + name: "zero", + in: "0", + expected: "0", + }, { + name: "secp256k1 prime (direct val in with 0 out)", + in: "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + expected: "0", + }, { + name: "secp256k1 prime (0 in with direct val out)", + in: "0", + expected: "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + }, { + name: "secp256k1 prime - 1", + in: "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e", + expected: "1", + }, { + name: "secp256k1 prime - 2", + in: "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2d", + expected: "4", + }, { + name: "random sampling #1", + in: "b0ba920360ea8436a216128047aab9766d8faf468895eb5090fc8241ec758896", + expected: "133896b0b69fda8ce9f648b9a3af38f345290c9eea3cbd35bafcadf7c34653d3", + }, { + name: "random sampling #2", + in: "c55d0d730b1d0285a1599995938b042a756e6e8857d390165ffab480af61cbd5", + expected: "cd81758b3f5877cbe7e5b0a10cebfa73bcbf0957ca6453e63ee8954ab7780bee", + }, { + name: "random sampling #3", + in: "e89c1f9a70d93651a1ba4bca5b78658f00de65a66014a25544d3365b0ab82324", + expected: "39ffc7a43e5dbef78fd5d0354fb82c6d34f5a08735e34df29da14665b43aa1f", + }, { + name: "random sampling #4", + in: "7dc26186079d22bcbe1614aa20ae627e62d72f9be7ad1e99cac0feb438956f05", + expected: "bf86bcfc4edb3d81f916853adfda80c07c57745b008b60f560b1912f95bce8ae", + }} - t.Logf("Running %d tests", len(tests)) - for i, test := range tests { - f := new(fieldVal).SetHex(test.in).Normalize() - expected := new(fieldVal).SetHex(test.expected).Normalize() - result := f.Square().Normalize() + for _, test := range tests { + f := setHex(test.in).Normalize() + expected := setHex(test.expected).Normalize() + + // Ensure squaring the value with the result going to another variable + // produces the expected result. + result := new(FieldVal).SquareVal(f).Normalize() if !result.Equals(expected) { - t.Errorf("fieldVal.Square #%d wrong result\n"+ - "got: %v\nwant: %v", i, result, expected) + t.Errorf("%s: unexpected result\ngot: %v\nwant: %v", test.name, + result, expected) + continue + } + + // Ensure self squaring an existing field value produces the expected + // result. + f.Square().Normalize() + if !f.Equals(expected) { + t.Errorf("%s: unexpected result\ngot: %v\nwant: %v", test.name, + f, expected) continue } } @@ -812,156 +846,140 @@ func TestInverse(t *testing.T) { t.Logf("Running %d tests", len(tests)) for i, test := range tests { - f := new(fieldVal).SetHex(test.in).Normalize() - expected := new(fieldVal).SetHex(test.expected).Normalize() + f := setHex(test.in).Normalize() + expected := setHex(test.expected).Normalize() result := f.Inverse().Normalize() if !result.Equals(expected) { - t.Errorf("fieldVal.Inverse #%d wrong result\n"+ + t.Errorf("FieldVal.Inverse #%d wrong result\n"+ "got: %v\nwant: %v", i, result, expected) continue } } } -// randFieldVal returns a random, normalized element in the field. -func randFieldVal(t *testing.T) fieldVal { - var b [32]byte - if _, err := rand.Read(b[:]); err != nil { - t.Fatalf("unable to create random element: %v", err) - } - - var x fieldVal - return *x.SetBytes(&b).Normalize() -} +// randFieldVal returns a field value created from a random value generated by +// the passed rng. +func randFieldVal(t *testing.T, rng *rand.Rand) *FieldVal { + t.Helper() -type sqrtTest struct { - name string - in string - expected string -} - -// TestSqrt asserts that a fieldVal properly computes the square root modulo the -// sep256k1 prime. -func TestSqrt(t *testing.T) { - var tests []sqrtTest - - // No valid root exists for the negative of a square. - for i := uint(9); i > 0; i-- { - var ( - x fieldVal - s fieldVal // x^2 mod p - n fieldVal // -x^2 mod p - ) - - x.SetInt(i) - s.SquareVal(&x).Normalize() - n.NegateVal(&s, 1).Normalize() - - tests = append(tests, sqrtTest{ - name: fmt.Sprintf("-%d", i), - in: fmt.Sprintf("%x", *n.Bytes()), - }) - } - - // A root should exist for true squares. - for i := uint(0); i < 10; i++ { - var ( - x fieldVal - s fieldVal // x^2 mod p - ) - - x.SetInt(i) - s.SquareVal(&x).Normalize() - - tests = append(tests, sqrtTest{ - name: fmt.Sprintf("%d", i), - in: fmt.Sprintf("%x", *s.Bytes()), - expected: fmt.Sprintf("%x", *x.Bytes()), - }) + var buf [32]byte + if _, err := rng.Read(buf[:]); err != nil { + t.Fatalf("failed to read random: %v", err) } - // Compute a non-square element, by negating if it has a root. - ns := randFieldVal(t) - if new(fieldVal).SqrtVal(&ns).Square().Equals(&ns) { - ns.Negate(1).Normalize() - } + // Create and return both a big integer and a field value. + var fv FieldVal + fv.SetBytes(&buf) + return &fv +} - // For large random field values, test that: - // 1) its square has a valid root. - // 2) the negative of its square has no root. - // 3) the product of its square with a non-square has no root. - for i := 0; i < 10; i++ { - var ( - x fieldVal - s fieldVal // x^2 mod p - n fieldVal // -x^2 mod p - m fieldVal // ns*x^2 mod p - ) - - x = randFieldVal(t) - s.SquareVal(&x).Normalize() - n.NegateVal(&s, 1).Normalize() - m.Mul2(&s, &ns).Normalize() - - // A root should exist for true squares. - tests = append(tests, sqrtTest{ - name: fmt.Sprintf("%x", *s.Bytes()), - in: fmt.Sprintf("%x", *s.Bytes()), - expected: fmt.Sprintf("%x", *x.Bytes()), - }) - - // No valid root exists for the negative of a square. - tests = append(tests, sqrtTest{ - name: fmt.Sprintf("-%x", *s.Bytes()), - in: fmt.Sprintf("%x", *n.Bytes()), - }) - - // No root should be computed for product of a square and - // non-square. - tests = append(tests, sqrtTest{ - name: fmt.Sprintf("ns*%x", *s.Bytes()), - in: fmt.Sprintf("%x", *m.Bytes()), - }) - } +// TestFieldSquareRoot ensures that calculating the square root of field values +// via SquareRootVal works as expected for edge cases. +func TestFieldSquareRoot(t *testing.T) { + tests := []struct { + name string // test description + in string // hex encoded value + valid bool // whether or not the value has a square root + want string // expected hex encoded value + }{{ + name: "secp256k1 prime (as 0 in and out)", + in: "0", + valid: true, + want: "0", + }, { + name: "secp256k1 prime (direct val with 0 out)", + in: "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + valid: true, + want: "0", + }, { + name: "secp256k1 prime (as 0 in direct val out)", + in: "0", + valid: true, + want: "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", + }, { + name: "secp256k1 prime-1", + in: "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e", + valid: false, + want: "0000000000000000000000000000000000000000000000000000000000000001", + }, { + name: "secp256k1 prime-2", + in: "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2d", + valid: false, + want: "210c790573632359b1edb4302c117d8a132654692c3feeb7de3a86ac3f3b53f7", + }, { + name: "(secp256k1 prime-2)^2", + in: "0000000000000000000000000000000000000000000000000000000000000004", + valid: true, + want: "0000000000000000000000000000000000000000000000000000000000000002", + }, { + name: "value 1", + in: "0000000000000000000000000000000000000000000000000000000000000001", + valid: true, + want: "0000000000000000000000000000000000000000000000000000000000000001", + }, { + name: "value 2", + in: "0000000000000000000000000000000000000000000000000000000000000002", + valid: true, + want: "210c790573632359b1edb4302c117d8a132654692c3feeb7de3a86ac3f3b53f7", + }, { + name: "random sampling 1", + in: "16fb970147a9acc73654d4be233cc48b875ce20a2122d24f073d29bd28805aca", + valid: false, + want: "6a27dcfca440cf7930a967be533b9620e397f122787c53958aaa7da7ad3d89a4", + }, { + name: "square of random sampling 1", + in: "f4a8c3738ace0a1c3abf77737ae737f07687b5e24c07a643398298bd96893a18", + valid: true, + want: "e90468feb8565338c9ab2b41dcc33b7478a31df5dedd2db0f8c2d641d77fa165", + }, { + name: "random sampling 2", + in: "69d1323ce9f1f7b3bd3c7320b0d6311408e30281e273e39a0d8c7ee1c8257919", + valid: true, + want: "61f4a7348274a52d75dfe176b8e3aaff61c1c833b6678260ba73def0fb2ad148", + }, { + name: "random sampling 3", + in: "e0debf988ae098ecda07d0b57713e97c6d213db19753e8c95aa12a2fc1cc5272", + valid: false, + want: "6e1cc9c311d33d901670135244f994b1ea39501f38002269b34ce231750cfbac", + }, { + name: "random sampling 4", + in: "dcd394f91f74c2ba16aad74a22bb0ed47fe857774b8f2d6c09e28bfb14642878", + valid: true, + want: "72b22fe6f173f8bcb21898806142ed4c05428601256eafce5d36c1b08fb82bab", + }} for _, test := range tests { - t.Run(test.name, func(t *testing.T) { - testSqrt(t, test) - }) - } -} - -func testSqrt(t *testing.T, test sqrtTest) { - var ( - f fieldVal - root fieldVal - rootNeg fieldVal - ) - - f.SetHex(test.in).Normalize() - - // Compute sqrt(f) and its negative. - root.SqrtVal(&f).Normalize() - rootNeg.NegateVal(&root, 1).Normalize() - - switch { - - // If we expect a square root, verify that either the computed square - // root is +/- the expected value. - case len(test.expected) > 0: - var expected fieldVal - expected.SetHex(test.expected).Normalize() - if !root.Equals(&expected) && !rootNeg.Equals(&expected) { - t.Fatalf("fieldVal.Sqrt incorrect root\n"+ - "got: %v\ngot_neg: %v\nwant: %v", - root, rootNeg, expected) + input := setHex(test.in).Normalize() + want := setHex(test.want).Normalize() + + // Calculate the square root and ensure the validity flag matches the + // expected value. + var result FieldVal + isValid := result.SquareRootVal(input) + if isValid != test.valid { + t.Errorf("%s: mismatched validity -- got %v, want %v", test.name, + isValid, test.valid) + continue } - // Otherwise, we expect this input not to have a square root. - default: - if root.Square().Equals(&f) || rootNeg.Square().Equals(&f) { - t.Fatalf("fieldVal.Sqrt root should not exist\n"+ - "got: %v\ngot_neg: %v", root, rootNeg) + // Ensure the calculated result matches the expected value. + result.Normalize() + if !result.Equals(want) { + t.Errorf("%s: d wrong result\ngot: %v\nwant: %v", test.name, result, + want) + continue } } } + +// hexToBytes converts the passed hex string into bytes and will panic if there +// is an error. This is only provided for the hard-coded constants so errors in +// the source code can be detected. It will only (and must only) be called with +// hard-coded values. +func hexToBytes(s string) []byte { + b, err := hex.DecodeString(s) + if err != nil { + panic("invalid hex in source file: " + s) + } + return b +} diff --git a/btcec/fuzz_test.go b/btcec/fuzz_test.go new file mode 100644 index 0000000000..ebbbb4261e --- /dev/null +++ b/btcec/fuzz_test.go @@ -0,0 +1,46 @@ +//go:build gofuzz || go1.18 + +// Copyright (c) 2013-2017 The btcsuite developers +// Copyright (c) 2015-2022 The Decred developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package btcec + +import ( + "encoding/hex" + "testing" +) + +func FuzzParsePubKey(f *testing.F) { + // 1. Seeds from pubkey tests. + for _, test := range pubKeyTests { + if test.isValid { + f.Add(test.key) + } + } + + // 2. Seeds from recovery tests. + var recoveryTestPubKeys = []string{ + "04E32DF42865E97135ACFB65F3BAE71BDC86F4D49150AD6A440B6F15878109880A0A2B2667F7E725CEEA70C673093BF67663E0312623C8E091B13CF2C0F11EF652", + "04A7640409AA2083FDAD38B2D8DE1263B2251799591D840653FB02DBBA503D7745FCB83D80E08A1E02896BE691EA6AFFB8A35939A646F1FC79052A744B1C82EDC3", + } + for _, pubKey := range recoveryTestPubKeys { + seed, err := hex.DecodeString(pubKey) + if err != nil { + f.Fatal(err) + } + f.Add(seed) + } + + // Now run the fuzzer. + f.Fuzz(func(t *testing.T, input []byte) { + key, err := ParsePubKey(input) + if key == nil && err == nil { + panic("key==nil && err==nil") + } + if key != nil && err != nil { + panic("key!=nil yet err!=nil") + } + }) +} diff --git a/btcec/genprecomps.go b/btcec/genprecomps.go deleted file mode 100644 index d4a9c1b830..0000000000 --- a/btcec/genprecomps.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2015 The btcsuite developers -// Use of this source code is governed by an ISC -// license that can be found in the LICENSE file. - -// This file is ignored during the regular build due to the following build tag. -// It is called by go generate and used to automatically generate pre-computed -// tables used to accelerate operations. -// +build ignore - -package main - -import ( - "bytes" - "compress/zlib" - "encoding/base64" - "fmt" - "log" - "os" - - "github.com/btcsuite/btcd/btcec" -) - -func main() { - fi, err := os.Create("secp256k1.go") - if err != nil { - log.Fatal(err) - } - defer fi.Close() - - // Compress the serialized byte points. - serialized := btcec.S256().SerializedBytePoints() - var compressed bytes.Buffer - w := zlib.NewWriter(&compressed) - if _, err := w.Write(serialized); err != nil { - fmt.Println(err) - os.Exit(1) - } - w.Close() - - // Encode the compressed byte points with base64. - encoded := make([]byte, base64.StdEncoding.EncodedLen(compressed.Len())) - base64.StdEncoding.Encode(encoded, compressed.Bytes()) - - fmt.Fprintln(fi, "// Copyright (c) 2015 The btcsuite developers") - fmt.Fprintln(fi, "// Use of this source code is governed by an ISC") - fmt.Fprintln(fi, "// license that can be found in the LICENSE file.") - fmt.Fprintln(fi) - fmt.Fprintln(fi, "package btcec") - fmt.Fprintln(fi) - fmt.Fprintln(fi, "// Auto-generated file (see genprecomps.go)") - fmt.Fprintln(fi, "// DO NOT EDIT") - fmt.Fprintln(fi) - fmt.Fprintf(fi, "var secp256k1BytePoints = %q\n", string(encoded)) - - a1, b1, a2, b2 := btcec.S256().EndomorphismVectors() - fmt.Println("The following values are the computed linearly " + - "independent vectors needed to make use of the secp256k1 " + - "endomorphism:") - fmt.Printf("a1: %x\n", a1) - fmt.Printf("b1: %x\n", b1) - fmt.Printf("a2: %x\n", a2) - fmt.Printf("b2: %x\n", b2) -} diff --git a/btcec/gensecp256k1.go b/btcec/gensecp256k1.go deleted file mode 100644 index 1928702da8..0000000000 --- a/btcec/gensecp256k1.go +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright (c) 2014-2015 The btcsuite developers -// Use of this source code is governed by an ISC -// license that can be found in the LICENSE file. - -// This file is ignored during the regular build due to the following build tag. -// This build tag is set during go generate. -// +build gensecp256k1 - -package btcec - -// References: -// [GECC]: Guide to Elliptic Curve Cryptography (Hankerson, Menezes, Vanstone) - -import ( - "encoding/binary" - "math/big" -) - -// secp256k1BytePoints are dummy points used so the code which generates the -// real values can compile. -var secp256k1BytePoints = "" - -// getDoublingPoints returns all the possible G^(2^i) for i in -// 0..n-1 where n is the curve's bit size (256 in the case of secp256k1) -// the coordinates are recorded as Jacobian coordinates. -func (curve *KoblitzCurve) getDoublingPoints() [][3]fieldVal { - doublingPoints := make([][3]fieldVal, curve.BitSize) - - // initialize px, py, pz to the Jacobian coordinates for the base point - px, py := curve.bigAffineToField(curve.Gx, curve.Gy) - pz := new(fieldVal).SetInt(1) - for i := 0; i < curve.BitSize; i++ { - doublingPoints[i] = [3]fieldVal{*px, *py, *pz} - // P = 2*P - curve.doubleJacobian(px, py, pz, px, py, pz) - } - return doublingPoints -} - -// SerializedBytePoints returns a serialized byte slice which contains all of -// the possible points per 8-bit window. This is used to when generating -// secp256k1.go. -func (curve *KoblitzCurve) SerializedBytePoints() []byte { - doublingPoints := curve.getDoublingPoints() - - // Segregate the bits into byte-sized windows - serialized := make([]byte, curve.byteSize*256*3*10*4) - offset := 0 - for byteNum := 0; byteNum < curve.byteSize; byteNum++ { - // Grab the 8 bits that make up this byte from doublingPoints. - startingBit := 8 * (curve.byteSize - byteNum - 1) - computingPoints := doublingPoints[startingBit : startingBit+8] - - // Compute all points in this window and serialize them. - for i := 0; i < 256; i++ { - px, py, pz := new(fieldVal), new(fieldVal), new(fieldVal) - for j := 0; j < 8; j++ { - if i>>uint(j)&1 == 1 { - curve.addJacobian(px, py, pz, &computingPoints[j][0], - &computingPoints[j][1], &computingPoints[j][2], px, py, pz) - } - } - for i := 0; i < 10; i++ { - binary.LittleEndian.PutUint32(serialized[offset:], px.n[i]) - offset += 4 - } - for i := 0; i < 10; i++ { - binary.LittleEndian.PutUint32(serialized[offset:], py.n[i]) - offset += 4 - } - for i := 0; i < 10; i++ { - binary.LittleEndian.PutUint32(serialized[offset:], pz.n[i]) - offset += 4 - } - } - } - - return serialized -} - -// sqrt returns the square root of the provided big integer using Newton's -// method. It's only compiled and used during generation of pre-computed -// values, so speed is not a huge concern. -func sqrt(n *big.Int) *big.Int { - // Initial guess = 2^(log_2(n)/2) - guess := big.NewInt(2) - guess.Exp(guess, big.NewInt(int64(n.BitLen()/2)), nil) - - // Now refine using Newton's method. - big2 := big.NewInt(2) - prevGuess := big.NewInt(0) - for { - prevGuess.Set(guess) - guess.Add(guess, new(big.Int).Div(n, guess)) - guess.Div(guess, big2) - if guess.Cmp(prevGuess) == 0 { - break - } - } - return guess -} - -// EndomorphismVectors runs the first 3 steps of algorithm 3.74 from [GECC] to -// generate the linearly independent vectors needed to generate a balanced -// length-two representation of a multiplier such that k = k1 + k2λ (mod N) and -// returns them. Since the values will always be the same given the fact that N -// and λ are fixed, the final results can be accelerated by storing the -// precomputed values with the curve. -func (curve *KoblitzCurve) EndomorphismVectors() (a1, b1, a2, b2 *big.Int) { - bigMinus1 := big.NewInt(-1) - - // This section uses an extended Euclidean algorithm to generate a - // sequence of equations: - // s[i] * N + t[i] * λ = r[i] - - nSqrt := sqrt(curve.N) - u, v := new(big.Int).Set(curve.N), new(big.Int).Set(curve.lambda) - x1, y1 := big.NewInt(1), big.NewInt(0) - x2, y2 := big.NewInt(0), big.NewInt(1) - q, r := new(big.Int), new(big.Int) - qu, qx1, qy1 := new(big.Int), new(big.Int), new(big.Int) - s, t := new(big.Int), new(big.Int) - ri, ti := new(big.Int), new(big.Int) - a1, b1, a2, b2 = new(big.Int), new(big.Int), new(big.Int), new(big.Int) - found, oneMore := false, false - for u.Sign() != 0 { - // q = v/u - q.Div(v, u) - - // r = v - q*u - qu.Mul(q, u) - r.Sub(v, qu) - - // s = x2 - q*x1 - qx1.Mul(q, x1) - s.Sub(x2, qx1) - - // t = y2 - q*y1 - qy1.Mul(q, y1) - t.Sub(y2, qy1) - - // v = u, u = r, x2 = x1, x1 = s, y2 = y1, y1 = t - v.Set(u) - u.Set(r) - x2.Set(x1) - x1.Set(s) - y2.Set(y1) - y1.Set(t) - - // As soon as the remainder is less than the sqrt of n, the - // values of a1 and b1 are known. - if !found && r.Cmp(nSqrt) < 0 { - // When this condition executes ri and ti represent the - // r[i] and t[i] values such that i is the greatest - // index for which r >= sqrt(n). Meanwhile, the current - // r and t values are r[i+1] and t[i+1], respectively. - - // a1 = r[i+1], b1 = -t[i+1] - a1.Set(r) - b1.Mul(t, bigMinus1) - found = true - oneMore = true - - // Skip to the next iteration so ri and ti are not - // modified. - continue - - } else if oneMore { - // When this condition executes ri and ti still - // represent the r[i] and t[i] values while the current - // r and t are r[i+2] and t[i+2], respectively. - - // sum1 = r[i]^2 + t[i]^2 - rSquared := new(big.Int).Mul(ri, ri) - tSquared := new(big.Int).Mul(ti, ti) - sum1 := new(big.Int).Add(rSquared, tSquared) - - // sum2 = r[i+2]^2 + t[i+2]^2 - r2Squared := new(big.Int).Mul(r, r) - t2Squared := new(big.Int).Mul(t, t) - sum2 := new(big.Int).Add(r2Squared, t2Squared) - - // if (r[i]^2 + t[i]^2) <= (r[i+2]^2 + t[i+2]^2) - if sum1.Cmp(sum2) <= 0 { - // a2 = r[i], b2 = -t[i] - a2.Set(ri) - b2.Mul(ti, bigMinus1) - } else { - // a2 = r[i+2], b2 = -t[i+2] - a2.Set(r) - b2.Mul(t, bigMinus1) - } - - // All done. - break - } - - ri.Set(r) - ti.Set(t) - } - - return a1, b1, a2, b2 -} diff --git a/btcec/go.mod b/btcec/go.mod new file mode 100644 index 0000000000..452399cfc6 --- /dev/null +++ b/btcec/go.mod @@ -0,0 +1,16 @@ +module github.com/btcsuite/btcd/btcec/v2 + +go 1.17 + +require ( + github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 + github.com/davecgh/go-spew v1.1.1 + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 + github.com/stretchr/testify v1.8.0 +) + +require ( + github.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/btcec/go.sum b/btcec/go.sum new file mode 100644 index 0000000000..73b8f2b5ac --- /dev/null +++ b/btcec/go.sum @@ -0,0 +1,21 @@ +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/btcec/modnscalar.go b/btcec/modnscalar.go new file mode 100644 index 0000000000..939b0c17a7 --- /dev/null +++ b/btcec/modnscalar.go @@ -0,0 +1,45 @@ +// Copyright (c) 2013-2021 The btcsuite developers +// Copyright (c) 2015-2021 The Decred developers + +package btcec + +import ( + secp "github.com/decred/dcrd/dcrec/secp256k1/v4" +) + +// ModNScalar implements optimized 256-bit constant-time fixed-precision +// arithmetic over the secp256k1 group order. This means all arithmetic is +// performed modulo: +// +// 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141 +// +// It only implements the arithmetic needed for elliptic curve operations, +// however, the operations that are not implemented can typically be worked +// around if absolutely needed. For example, subtraction can be performed by +// adding the negation. +// +// Should it be absolutely necessary, conversion to the standard library +// math/big.Int can be accomplished by using the Bytes method, slicing the +// resulting fixed-size array, and feeding it to big.Int.SetBytes. However, +// that should typically be avoided when possible as conversion to big.Ints +// requires allocations, is not constant time, and is slower when working modulo +// the group order. +type ModNScalar = secp.ModNScalar + +// NonceRFC6979 generates a nonce deterministically according to RFC 6979 using +// HMAC-SHA256 for the hashing function. It takes a 32-byte hash as an input +// and returns a 32-byte nonce to be used for deterministic signing. The extra +// and version arguments are optional, but allow additional data to be added to +// the input of the HMAC. When provided, the extra data must be 32-bytes and +// version must be 16 bytes or they will be ignored. +// +// Finally, the extraIterations parameter provides a method to produce a stream +// of deterministic nonces to ensure the signing code is able to produce a nonce +// that results in a valid signature in the extremely unlikely event the +// original nonce produced results in an invalid signature (e.g. R == 0). +// Signing code should start with 0 and increment it if necessary. +func NonceRFC6979(privKey []byte, hash []byte, extra []byte, version []byte, + extraIterations uint32) *ModNScalar { + + return secp.NonceRFC6979(privKey, hash, extra, version, extraIterations) +} diff --git a/btcec/precompute.go b/btcec/precompute.go deleted file mode 100644 index 034cd55332..0000000000 --- a/btcec/precompute.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2015 The btcsuite developers -// Use of this source code is governed by an ISC -// license that can be found in the LICENSE file. - -package btcec - -import ( - "compress/zlib" - "encoding/base64" - "encoding/binary" - "io/ioutil" - "strings" -) - -//go:generate go run -tags gensecp256k1 genprecomps.go - -// loadS256BytePoints decompresses and deserializes the pre-computed byte points -// used to accelerate scalar base multiplication for the secp256k1 curve. This -// approach is used since it allows the compile to use significantly less ram -// and be performed much faster than it is with hard-coding the final in-memory -// data structure. At the same time, it is quite fast to generate the in-memory -// data structure at init time with this approach versus computing the table. -func loadS256BytePoints() error { - // There will be no byte points to load when generating them. - bp := secp256k1BytePoints - if len(bp) == 0 { - return nil - } - - // Decompress the pre-computed table used to accelerate scalar base - // multiplication. - decoder := base64.NewDecoder(base64.StdEncoding, strings.NewReader(bp)) - r, err := zlib.NewReader(decoder) - if err != nil { - return err - } - serialized, err := ioutil.ReadAll(r) - if err != nil { - return err - } - - // Deserialize the precomputed byte points and set the curve to them. - offset := 0 - var bytePoints [32][256][3]fieldVal - for byteNum := 0; byteNum < 32; byteNum++ { - // All points in this window. - for i := 0; i < 256; i++ { - px := &bytePoints[byteNum][i][0] - py := &bytePoints[byteNum][i][1] - pz := &bytePoints[byteNum][i][2] - for i := 0; i < 10; i++ { - px.n[i] = binary.LittleEndian.Uint32(serialized[offset:]) - offset += 4 - } - for i := 0; i < 10; i++ { - py.n[i] = binary.LittleEndian.Uint32(serialized[offset:]) - offset += 4 - } - for i := 0; i < 10; i++ { - pz.n[i] = binary.LittleEndian.Uint32(serialized[offset:]) - offset += 4 - } - } - } - secp256k1.bytePoints = &bytePoints - return nil -} diff --git a/btcec/privkey.go b/btcec/privkey.go index 676a8c3fb0..d0dbd8d9f9 100644 --- a/btcec/privkey.go +++ b/btcec/privkey.go @@ -5,69 +5,33 @@ package btcec import ( - "crypto/ecdsa" - "crypto/elliptic" - "crypto/rand" - "math/big" + secp "github.com/decred/dcrd/dcrec/secp256k1/v4" ) // PrivateKey wraps an ecdsa.PrivateKey as a convenience mainly for signing -// things with the the private key without having to directly import the ecdsa +// things with the private key without having to directly import the ecdsa // package. -type PrivateKey ecdsa.PrivateKey +type PrivateKey = secp.PrivateKey // PrivKeyFromBytes returns a private and public key for `curve' based on the // private key passed as an argument as a byte slice. -func PrivKeyFromBytes(curve elliptic.Curve, pk []byte) (*PrivateKey, - *PublicKey) { - x, y := curve.ScalarBaseMult(pk) +func PrivKeyFromBytes(pk []byte) (*PrivateKey, *PublicKey) { + privKey := secp.PrivKeyFromBytes(pk) - priv := &ecdsa.PrivateKey{ - PublicKey: ecdsa.PublicKey{ - Curve: curve, - X: x, - Y: y, - }, - D: new(big.Int).SetBytes(pk), - } - - return (*PrivateKey)(priv), (*PublicKey)(&priv.PublicKey) + return privKey, privKey.PubKey() } // NewPrivateKey is a wrapper for ecdsa.GenerateKey that returns a PrivateKey // instead of the normal ecdsa.PrivateKey. -func NewPrivateKey(curve elliptic.Curve) (*PrivateKey, error) { - key, err := ecdsa.GenerateKey(curve, rand.Reader) - if err != nil { - return nil, err - } - return (*PrivateKey)(key), nil -} - -// PubKey returns the PublicKey corresponding to this private key. -func (p *PrivateKey) PubKey() *PublicKey { - return (*PublicKey)(&p.PublicKey) +func NewPrivateKey() (*PrivateKey, error) { + return secp.GeneratePrivateKey() } -// ToECDSA returns the private key as a *ecdsa.PrivateKey. -func (p *PrivateKey) ToECDSA() *ecdsa.PrivateKey { - return (*ecdsa.PrivateKey)(p) -} - -// Sign generates an ECDSA signature for the provided hash (which should be the result -// of hashing a larger message) using the private key. Produced signature -// is deterministic (same message and same key yield the same signature) and canonical -// in accordance with RFC6979 and BIP0062. -func (p *PrivateKey) Sign(hash []byte) (*Signature, error) { - return signRFC6979(p, hash) +// PrivKeyFromScalar instantiates a new private key from a scalar encoded as a +// big integer. +func PrivKeyFromScalar(key *ModNScalar) *PrivateKey { + return &PrivateKey{Key: *key} } // PrivKeyBytesLen defines the length in bytes of a serialized private key. const PrivKeyBytesLen = 32 - -// Serialize returns the private key number d as a big-endian binary-encoded -// number, padded to a length of 32 bytes. -func (p *PrivateKey) Serialize() []byte { - b := make([]byte, 0, PrivKeyBytesLen) - return paddedAppend(PrivKeyBytesLen, b, p.ToECDSA().D.Bytes()) -} diff --git a/btcec/privkey_test.go b/btcec/privkey_test.go deleted file mode 100644 index a2918dc191..0000000000 --- a/btcec/privkey_test.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) 2013-2016 The btcsuite developers -// Use of this source code is governed by an ISC -// license that can be found in the LICENSE file. - -package btcec - -import ( - "bytes" - "testing" -) - -func TestPrivKeys(t *testing.T) { - tests := []struct { - name string - key []byte - }{ - { - name: "check curve", - key: []byte{ - 0xea, 0xf0, 0x2c, 0xa3, 0x48, 0xc5, 0x24, 0xe6, - 0x39, 0x26, 0x55, 0xba, 0x4d, 0x29, 0x60, 0x3c, - 0xd1, 0xa7, 0x34, 0x7d, 0x9d, 0x65, 0xcf, 0xe9, - 0x3c, 0xe1, 0xeb, 0xff, 0xdc, 0xa2, 0x26, 0x94, - }, - }, - } - - for _, test := range tests { - priv, pub := PrivKeyFromBytes(S256(), test.key) - - _, err := ParsePubKey(pub.SerializeUncompressed(), S256()) - if err != nil { - t.Errorf("%s privkey: %v", test.name, err) - continue - } - - hash := []byte{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9} - sig, err := priv.Sign(hash) - if err != nil { - t.Errorf("%s could not sign: %v", test.name, err) - continue - } - - if !sig.Verify(hash, pub) { - t.Errorf("%s could not verify: %v", test.name, err) - continue - } - - serializedKey := priv.Serialize() - if !bytes.Equal(serializedKey, test.key) { - t.Errorf("%s unexpected serialized bytes - got: %x, "+ - "want: %x", test.name, serializedKey, test.key) - } - } -} diff --git a/btcec/pubkey.go b/btcec/pubkey.go index 3c9d5d02d2..2c3a5ccbef 100644 --- a/btcec/pubkey.go +++ b/btcec/pubkey.go @@ -5,66 +5,23 @@ package btcec import ( - "crypto/ecdsa" - "errors" - "fmt" - "math/big" + secp "github.com/decred/dcrd/dcrec/secp256k1/v4" ) // These constants define the lengths of serialized public keys. const ( - PubKeyBytesLenCompressed = 33 - PubKeyBytesLenUncompressed = 65 - PubKeyBytesLenHybrid = 65 + // PubKeyBytesLenCompressed is the bytes length of a serialized compressed + // public key. + PubKeyBytesLenCompressed = 33 ) -func isOdd(a *big.Int) bool { - return a.Bit(0) == 1 -} - -// decompressPoint decompresses a point on the secp256k1 curve given the X point and -// the solution to use. -func decompressPoint(curve *KoblitzCurve, bigX *big.Int, ybit bool) (*big.Int, error) { - var x fieldVal - x.SetByteSlice(bigX.Bytes()) - - // Compute x^3 + B mod p. - var x3 fieldVal - x3.SquareVal(&x).Mul(&x) - x3.Add(curve.fieldB).Normalize() - - // Now calculate sqrt mod p of x^3 + B - // This code used to do a full sqrt based on tonelli/shanks, - // but this was replaced by the algorithms referenced in - // https://bitcointalk.org/index.php?topic=162805.msg1712294#msg1712294 - var y fieldVal - y.SqrtVal(&x3).Normalize() - if ybit != y.IsOdd() { - y.Negate(1).Normalize() - } - - // Check that y is a square root of x^3 + B. - var y2 fieldVal - y2.SquareVal(&y).Normalize() - if !y2.Equals(&x3) { - return nil, fmt.Errorf("invalid square root") - } - - // Verify that y-coord has expected parity. - if ybit != y.IsOdd() { - return nil, fmt.Errorf("ybit doesn't match oddness") - } - - return new(big.Int).SetBytes(y.Bytes()[:]), nil -} - const ( pubkeyCompressed byte = 0x2 // y_bit + x coord pubkeyUncompressed byte = 0x4 // x coord + y coord pubkeyHybrid byte = 0x6 // y_bit + x coord + y coord ) -// IsCompressedPubKey returns true the the passed serialized public key has +// IsCompressedPubKey returns true the passed serialized public key has // been encoded in compressed format, and false otherwise. func IsCompressedPubKey(pubKey []byte) bool { // The public key is only compressed if it is the correct length and @@ -76,119 +33,56 @@ func IsCompressedPubKey(pubKey []byte) bool { // ParsePubKey parses a public key for a koblitz curve from a bytestring into a // ecdsa.Publickey, verifying that it is valid. It supports compressed, // uncompressed and hybrid signature formats. -func ParsePubKey(pubKeyStr []byte, curve *KoblitzCurve) (key *PublicKey, err error) { - pubkey := PublicKey{} - pubkey.Curve = curve - - if len(pubKeyStr) == 0 { - return nil, errors.New("pubkey string is empty") - } - - format := pubKeyStr[0] - ybit := (format & 0x1) == 0x1 - format &= ^byte(0x1) - - switch len(pubKeyStr) { - case PubKeyBytesLenUncompressed: - if format != pubkeyUncompressed && format != pubkeyHybrid { - return nil, fmt.Errorf("invalid magic in pubkey str: "+ - "%d", pubKeyStr[0]) - } - - pubkey.X = new(big.Int).SetBytes(pubKeyStr[1:33]) - pubkey.Y = new(big.Int).SetBytes(pubKeyStr[33:]) - // hybrid keys have extra information, make use of it. - if format == pubkeyHybrid && ybit != isOdd(pubkey.Y) { - return nil, fmt.Errorf("ybit doesn't match oddness") - } - - if pubkey.X.Cmp(pubkey.Curve.Params().P) >= 0 { - return nil, fmt.Errorf("pubkey X parameter is >= to P") - } - if pubkey.Y.Cmp(pubkey.Curve.Params().P) >= 0 { - return nil, fmt.Errorf("pubkey Y parameter is >= to P") - } - if !pubkey.Curve.IsOnCurve(pubkey.X, pubkey.Y) { - return nil, fmt.Errorf("pubkey isn't on secp256k1 curve") - } - - case PubKeyBytesLenCompressed: - // format is 0x2 | solution, - // solution determines which solution of the curve we use. - /// y^2 = x^3 + Curve.B - if format != pubkeyCompressed { - return nil, fmt.Errorf("invalid magic in compressed "+ - "pubkey string: %d", pubKeyStr[0]) - } - pubkey.X = new(big.Int).SetBytes(pubKeyStr[1:33]) - pubkey.Y, err = decompressPoint(curve, pubkey.X, ybit) - if err != nil { - return nil, err - } - - default: // wrong! - return nil, fmt.Errorf("invalid pub key length %d", - len(pubKeyStr)) - } - - return &pubkey, nil +func ParsePubKey(pubKeyStr []byte) (*PublicKey, error) { + return secp.ParsePubKey(pubKeyStr) } // PublicKey is an ecdsa.PublicKey with additional functions to // serialize in uncompressed, compressed, and hybrid formats. -type PublicKey ecdsa.PublicKey - -// ToECDSA returns the public key as a *ecdsa.PublicKey. -func (p *PublicKey) ToECDSA() *ecdsa.PublicKey { - return (*ecdsa.PublicKey)(p) +type PublicKey = secp.PublicKey + +// NewPublicKey instantiates a new public key with the given x and y +// coordinates. +// +// It should be noted that, unlike ParsePubKey, since this accepts arbitrary x +// and y coordinates, it allows creation of public keys that are not valid +// points on the secp256k1 curve. The IsOnCurve method of the returned instance +// can be used to determine validity. +func NewPublicKey(x, y *FieldVal) *PublicKey { + return secp.NewPublicKey(x, y) } -// SerializeUncompressed serializes a public key in a 65-byte uncompressed -// format. -func (p *PublicKey) SerializeUncompressed() []byte { - b := make([]byte, 0, PubKeyBytesLenUncompressed) - b = append(b, pubkeyUncompressed) - b = paddedAppend(32, b, p.X.Bytes()) - return paddedAppend(32, b, p.Y.Bytes()) -} +// SerializedKey is a type for representing a public key in its compressed +// serialized form. +// +// NOTE: This type is useful when using public keys as keys in maps. +type SerializedKey [PubKeyBytesLenCompressed]byte -// SerializeCompressed serializes a public key in a 33-byte compressed format. -func (p *PublicKey) SerializeCompressed() []byte { - b := make([]byte, 0, PubKeyBytesLenCompressed) - format := pubkeyCompressed - if isOdd(p.Y) { - format |= 0x1 - } - b = append(b, format) - return paddedAppend(32, b, p.X.Bytes()) +// ToPubKey returns the public key parsed from the serialized key. +func (s SerializedKey) ToPubKey() (*PublicKey, error) { + return ParsePubKey(s[:]) } -// SerializeHybrid serializes a public key in a 65-byte hybrid format. -func (p *PublicKey) SerializeHybrid() []byte { - b := make([]byte, 0, PubKeyBytesLenHybrid) - format := pubkeyHybrid - if isOdd(p.Y) { - format |= 0x1 - } - b = append(b, format) - b = paddedAppend(32, b, p.X.Bytes()) - return paddedAppend(32, b, p.Y.Bytes()) +// SchnorrSerialized returns the Schnorr serialized, x-only 32-byte +// representation of the serialized key. +func (s SerializedKey) SchnorrSerialized() [32]byte { + var serializedSchnorr [32]byte + copy(serializedSchnorr[:], s[1:]) + return serializedSchnorr } -// IsEqual compares this PublicKey instance to the one passed, returning true if -// both PublicKeys are equivalent. A PublicKey is equivalent to another, if they -// both have the same X and Y coordinate. -func (p *PublicKey) IsEqual(otherPubKey *PublicKey) bool { - return p.X.Cmp(otherPubKey.X) == 0 && - p.Y.Cmp(otherPubKey.Y) == 0 +// CopyBytes returns a copy of the underlying array as a byte slice. +func (s SerializedKey) CopyBytes() []byte { + c := make([]byte, PubKeyBytesLenCompressed) + copy(c, s[:]) + + return c } -// paddedAppend appends the src byte slice to dst, returning the new slice. -// If the length of the source is smaller than the passed size, leading zero -// bytes are appended to the dst slice before appending src. -func paddedAppend(size uint, dst, src []byte) []byte { - for i := 0; i < int(size)-len(src); i++ { - dst = append(dst, 0) - } - return append(dst, src...) +// ToSerialized serializes a public key into its compressed form. +func ToSerialized(pubKey *PublicKey) SerializedKey { + var serialized SerializedKey + copy(serialized[:], pubKey.SerializeCompressed()) + + return serialized } diff --git a/btcec/pubkey_test.go b/btcec/pubkey_test.go index 0a45f1c01d..7ee7cd8044 100644 --- a/btcec/pubkey_test.go +++ b/btcec/pubkey_test.go @@ -216,7 +216,7 @@ var pubKeyTests = []pubKeyTest{ func TestPubKeys(t *testing.T) { for _, test := range pubKeyTests { - pk, err := ParsePubKey(test.key, S256()) + pk, err := ParsePubKey(test.key) if err != nil { if test.isValid { t.Errorf("%s pubkey failed when shouldn't %v", @@ -232,11 +232,11 @@ func TestPubKeys(t *testing.T) { var pkStr []byte switch test.format { case pubkeyUncompressed: - pkStr = (*PublicKey)(pk).SerializeUncompressed() + pkStr = pk.SerializeUncompressed() case pubkeyCompressed: - pkStr = (*PublicKey)(pk).SerializeCompressed() + pkStr = pk.SerializeCompressed() case pubkeyHybrid: - pkStr = (*PublicKey)(pk).SerializeHybrid() + pkStr = test.key } if !bytes.Equal(test.key, pkStr) { t.Errorf("%s pubkey: serialized keys do not match.", @@ -254,7 +254,6 @@ func TestPublicKeyIsEqual(t *testing.T) { 0x25, 0x21, 0x88, 0x7e, 0x97, 0x66, 0x90, 0xb6, 0xb4, 0x7f, 0x5b, 0x2a, 0x4b, 0x7d, 0x44, 0x8e, }, - S256(), ) if err != nil { t.Fatalf("failed to parse raw bytes for pubKey1: %v", err) @@ -266,7 +265,6 @@ func TestPublicKeyIsEqual(t *testing.T) { 0x2e, 0x9c, 0x51, 0x0f, 0x8e, 0xf5, 0x2b, 0xd0, 0x21, 0xa9, 0xa1, 0xf4, 0x80, 0x9d, 0x3b, 0x4d, }, - S256(), ) if err != nil { t.Fatalf("failed to parse raw bytes for pubKey2: %v", err) diff --git a/btcec/schnorr/bench_test.go b/btcec/schnorr/bench_test.go new file mode 100644 index 0000000000..4dadbb1fd6 --- /dev/null +++ b/btcec/schnorr/bench_test.go @@ -0,0 +1,169 @@ +// Copyright 2013-2016 The btcsuite developers +// Copyright (c) 2015-2021 The Decred developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package schnorr + +import ( + "crypto/sha256" + "encoding/hex" + "math/big" + "testing" + + "github.com/btcsuite/btcd/btcec/v2" + "github.com/decred/dcrd/dcrec/secp256k1/v4" +) + +// hexToBytes converts the passed hex string into bytes and will panic if there +// is an error. This is only provided for the hard-coded constants so errors in +// the source code can be detected. It will only (and must only) be called with +// hard-coded values. +func hexToBytes(s string) []byte { + b, err := hex.DecodeString(s) + if err != nil { + panic("invalid hex in source file: " + s) + } + return b +} + +// hexToModNScalar converts the passed hex string into a ModNScalar and will +// panic if there is an error. This is only provided for the hard-coded +// constants so errors in the source code can be detected. It will only (and +// must only) be called with hard-coded values. +func hexToModNScalar(s string) *btcec.ModNScalar { + b, err := hex.DecodeString(s) + if err != nil { + panic("invalid hex in source file: " + s) + } + var scalar btcec.ModNScalar + if overflow := scalar.SetByteSlice(b); overflow { + panic("hex in source file overflows mod N scalar: " + s) + } + return &scalar +} + +// hexToFieldVal converts the passed hex string into a FieldVal and will panic +// if there is an error. This is only provided for the hard-coded constants so +// errors in the source code can be detected. It will only (and must only) be +// called with hard-coded values. +func hexToFieldVal(s string) *btcec.FieldVal { + b, err := hex.DecodeString(s) + if err != nil { + panic("invalid hex in source file: " + s) + } + var f btcec.FieldVal + if overflow := f.SetByteSlice(b); overflow { + panic("hex in source file overflows mod P: " + s) + } + return &f +} + +// fromHex converts the passed hex string into a big integer pointer and will +// panic is there is an error. This is only provided for the hard-coded +// constants so errors in the source code can bet detected. It will only (and +// must only) be called for initialization purposes. +func fromHex(s string) *big.Int { + if s == "" { + return big.NewInt(0) + } + r, ok := new(big.Int).SetString(s, 16) + if !ok { + panic("invalid hex in source file: " + s) + } + return r +} + +var testOk bool + +// BenchmarkSigVerify benchmarks how long it takes the secp256k1 curve to +// verify signatures. +func BenchmarkSigVerify(b *testing.B) { + // Randomly generated keypair. + d := hexToModNScalar("9e0699c91ca1e3b7e3c9ba71eb71c89890872be97576010fe593fbf3fd57e66d") + + privKey := secp256k1.NewPrivateKey(d) + pubKey := privKey.PubKey() + + // Double sha256 of []byte{0x01, 0x02, 0x03, 0x04} + msgHash := sha256.Sum256([]byte("benchmark")) + sig, err := Sign(privKey, msgHash[:]) + if err != nil { + b.Fatalf("unable to sign: %v", err) + } + + if !sig.Verify(msgHash[:], pubKey) { + b.Errorf("Signature failed to verify") + return + } + + var ok bool + + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + ok = sig.Verify(msgHash[:], pubKey) + } + + testOk = ok +} + +// Used to ensure the compiler doesn't optimize away the benchmark. +var ( + testSig *Signature + testErr error +) + +// BenchmarkSign benchmarks how long it takes to sign a message. +func BenchmarkSign(b *testing.B) { + // Randomly generated keypair. + d := hexToModNScalar("9e0699c91ca1e3b7e3c9ba71eb71c89890872be97576010fe593fbf3fd57e66d") + privKey := secp256k1.NewPrivateKey(d) + + // blake256 of []byte{0x01, 0x02, 0x03, 0x04}. + msgHash := hexToBytes("c301ba9de5d6053caad9f5eb46523f007702add2c62fa39de03146a36b8026b7") + + var auxBytes [32]byte + copy(auxBytes[:], msgHash) + auxBytes[0] ^= 1 + + var ( + sig *Signature + err error + ) + + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + sig, err = Sign( + privKey, msgHash, CustomNonce(auxBytes), FastSign(), + ) + } + + testSig = sig + testErr = err +} + +// BenchmarkSignRfc6979 benchmarks how long it takes to sign a message. +func BenchmarkSignRfc6979(b *testing.B) { + // Randomly generated keypair. + d := hexToModNScalar("9e0699c91ca1e3b7e3c9ba71eb71c89890872be97576010fe593fbf3fd57e66d") + privKey := secp256k1.NewPrivateKey(d) + + // blake256 of []byte{0x01, 0x02, 0x03, 0x04}. + msgHash := hexToBytes("c301ba9de5d6053caad9f5eb46523f007702add2c62fa39de03146a36b8026b7") + + var ( + sig *Signature + err error + ) + + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + sig, err = Sign(privKey, msgHash, FastSign()) + } + + testSig = sig + testErr = err +} diff --git a/btcec/schnorr/error.go b/btcec/schnorr/error.go new file mode 100644 index 0000000000..4014339647 --- /dev/null +++ b/btcec/schnorr/error.go @@ -0,0 +1,25 @@ +// Copyright (c) 2013-2017 The btcsuite developers +// Copyright (c) 2015-2021 The Decred developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package schnorr + +import ( + ecdsa_schnorr "github.com/decred/dcrd/dcrec/secp256k1/v4/schnorr" +) + +// ErrorKind identifies a kind of error. It has full support for errors.Is +// and errors.As, so the caller can directly check against an error kind +// when determining the reason for an error. +type ErrorKind = ecdsa_schnorr.ErrorKind + +// Error identifies an error related to a schnorr signature. It has full +// support for errors.Is and errors.As, so the caller can ascertain the +// specific reason for the error by checking the underlying error. +type Error = ecdsa_schnorr.Error + +// signatureError creates an Error given a set of arguments. +func signatureError(kind ErrorKind, desc string) Error { + return Error{Err: kind, Description: desc} +} diff --git a/btcec/schnorr/musig2/bench_test.go b/btcec/schnorr/musig2/bench_test.go new file mode 100644 index 0000000000..aac298aa28 --- /dev/null +++ b/btcec/schnorr/musig2/bench_test.go @@ -0,0 +1,308 @@ +// Copyright 2013-2022 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package musig2 + +import ( + "encoding/hex" + "fmt" + "testing" + + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcec/v2/schnorr" +) + +var ( + testPrivBytes = hexToModNScalar("9e0699c91ca1e3b7e3c9ba71eb71c89890872be97576010fe593fbf3fd57e66d") + + testMsg = hexToBytes("c301ba9de5d6053caad9f5eb46523f007702add2c62fa39de03146a36b8026b7") +) + +func hexToBytes(s string) []byte { + b, err := hex.DecodeString(s) + if err != nil { + panic("invalid hex in source file: " + s) + } + return b +} + +func hexToModNScalar(s string) *btcec.ModNScalar { + b, err := hex.DecodeString(s) + if err != nil { + panic("invalid hex in source file: " + s) + } + var scalar btcec.ModNScalar + if overflow := scalar.SetByteSlice(b); overflow { + panic("hex in source file overflows mod N scalar: " + s) + } + return &scalar +} + +func genSigner(t *testing.B) signer { + privKey, err := btcec.NewPrivateKey() + if err != nil { + t.Fatalf("unable to gen priv key: %v", err) + } + + pubKey := privKey.PubKey() + + nonces, err := GenNonces(WithPublicKey(pubKey)) + if err != nil { + t.Fatalf("unable to gen nonces: %v", err) + } + + return signer{ + privKey: privKey, + pubKey: pubKey, + nonces: nonces, + } +} + +var ( + testSig *PartialSignature + testErr error +) + +// BenchmarkPartialSign benchmarks how long it takes to generate a partial +// signature factoring in if the keys are sorted and also if we're in fast sign +// mode. +func BenchmarkPartialSign(b *testing.B) { + for _, numSigners := range []int{10, 100} { + for _, fastSign := range []bool{true, false} { + for _, sortKeys := range []bool{true, false} { + name := fmt.Sprintf("num_signers=%v/fast_sign=%v/sort=%v", + numSigners, fastSign, sortKeys) + + signers := make(signerSet, numSigners) + for i := 0; i < numSigners; i++ { + signers[i] = genSigner(b) + } + + combinedNonce, err := AggregateNonces(signers.pubNonces()) + if err != nil { + b.Fatalf("unable to generate combined nonce: %v", err) + } + + var sig *PartialSignature + + var msg [32]byte + copy(msg[:], testMsg[:]) + + keys := signers.keys() + + b.Run(name, func(b *testing.B) { + var signOpts []SignOption + if fastSign { + signOpts = append(signOpts, WithFastSign()) + } + if sortKeys { + signOpts = append(signOpts, WithSortedKeys()) + } + + b.ResetTimer() + b.ReportAllocs() + + for i := 0; i < b.N; i++ { + sig, err = Sign( + signers[0].nonces.SecNonce, signers[0].privKey, + combinedNonce, keys, msg, signOpts..., + ) + if err != nil { + b.Fatalf("unable to generate sig: %v", err) + } + } + + testSig = sig + testErr = err + }) + } + } + } +} + +// TODO(roasbeef): add impact of sorting ^ + +var sigOk bool + +// BenchmarkPartialVerify benchmarks how long it takes to verify a partial +// signature. +func BenchmarkPartialVerify(b *testing.B) { + for _, numSigners := range []int{10, 100} { + for _, sortKeys := range []bool{true, false} { + name := fmt.Sprintf("sort_keys=%v/num_signers=%v", + sortKeys, numSigners) + + signers := make(signerSet, numSigners) + for i := 0; i < numSigners; i++ { + signers[i] = genSigner(b) + } + + combinedNonce, err := AggregateNonces( + signers.pubNonces(), + ) + if err != nil { + b.Fatalf("unable to generate combined "+ + "nonce: %v", err) + } + + var sig *PartialSignature + + var msg [32]byte + copy(msg[:], testMsg[:]) + + b.ReportAllocs() + b.ResetTimer() + + sig, err = Sign( + signers[0].nonces.SecNonce, signers[0].privKey, + combinedNonce, signers.keys(), msg, + ) + if err != nil { + b.Fatalf("unable to generate sig: %v", err) + } + + keys := signers.keys() + pubKey := signers[0].pubKey + + b.Run(name, func(b *testing.B) { + var signOpts []SignOption + if sortKeys { + signOpts = append( + signOpts, WithSortedKeys(), + ) + } + + b.ResetTimer() + b.ReportAllocs() + + var ok bool + for i := 0; i < b.N; i++ { + ok = sig.Verify( + signers[0].nonces.PubNonce, combinedNonce, + keys, pubKey, msg, signOpts..., + ) + if !ok { + b.Fatalf("generated invalid sig!") + } + } + sigOk = ok + }) + + } + } +} + +var finalSchnorrSig *schnorr.Signature + +// BenchmarkCombineSigs benchmarks how long it takes to combine a set amount of +// signatures. +func BenchmarkCombineSigs(b *testing.B) { + + for _, numSigners := range []int{10, 100} { + signers := make(signerSet, numSigners) + for i := 0; i < numSigners; i++ { + signers[i] = genSigner(b) + } + + combinedNonce, err := AggregateNonces(signers.pubNonces()) + if err != nil { + b.Fatalf("unable to generate combined nonce: %v", err) + } + + var msg [32]byte + copy(msg[:], testMsg[:]) + + var finalNonce *btcec.PublicKey + for i := range signers { + signer := signers[i] + partialSig, err := Sign( + signer.nonces.SecNonce, signer.privKey, + combinedNonce, signers.keys(), msg, + ) + if err != nil { + b.Fatalf("unable to generate partial sig: %v", + err) + } + + signers[i].partialSig = partialSig + + if finalNonce == nil { + finalNonce = partialSig.R + } + } + + sigs := signers.partialSigs() + + name := fmt.Sprintf("num_signers=%v", numSigners) + b.Run(name, func(b *testing.B) { + b.ResetTimer() + b.ReportAllocs() + + finalSig := CombineSigs(finalNonce, sigs) + + finalSchnorrSig = finalSig + }) + } +} + +var testNonce [PubNonceSize]byte + +// BenchmarkAggregateNonces benchmarks how long it takes to combine nonces. +func BenchmarkAggregateNonces(b *testing.B) { + for _, numSigners := range []int{10, 100} { + signers := make(signerSet, numSigners) + for i := 0; i < numSigners; i++ { + signers[i] = genSigner(b) + } + + nonces := signers.pubNonces() + + name := fmt.Sprintf("num_signers=%v", numSigners) + b.Run(name, func(b *testing.B) { + b.ResetTimer() + b.ReportAllocs() + + pubNonce, err := AggregateNonces(nonces) + if err != nil { + b.Fatalf("unable to generate nonces: %v", err) + } + + testNonce = pubNonce + }) + } +} + +var testKey *btcec.PublicKey + +// BenchmarkAggregateKeys benchmarks how long it takes to aggregate public +// keys. +func BenchmarkAggregateKeys(b *testing.B) { + for _, numSigners := range []int{10, 100} { + for _, sortKeys := range []bool{true, false} { + signers := make(signerSet, numSigners) + for i := 0; i < numSigners; i++ { + signers[i] = genSigner(b) + } + + signerKeys := signers.keys() + + name := fmt.Sprintf("num_signers=%v/sort_keys=%v", + numSigners, sortKeys) + + uniqueKeyIndex := secondUniqueKeyIndex(signerKeys, false) + + b.Run(name, func(b *testing.B) { + b.ResetTimer() + b.ReportAllocs() + + aggKey, _, _, _ := AggregateKeys( + signerKeys, sortKeys, + WithUniqueKeyIndex(uniqueKeyIndex), + ) + + testKey = aggKey.FinalKey + }) + } + } +} diff --git a/btcec/schnorr/musig2/context.go b/btcec/schnorr/musig2/context.go new file mode 100644 index 0000000000..8e6b7154d3 --- /dev/null +++ b/btcec/schnorr/musig2/context.go @@ -0,0 +1,669 @@ +// Copyright (c) 2013-2022 The btcsuite developers + +package musig2 + +import ( + "fmt" + + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcec/v2/schnorr" +) + +var ( + // ErrSignersNotSpecified is returned when a caller attempts to create + // a context without specifying either the total number of signers, or + // the complete set of singers. + ErrSignersNotSpecified = fmt.Errorf("total number of signers or all " + + "signers must be known") + + // ErrSignerNotInKeySet is returned when a the private key for a signer + // isn't included in the set of signing public keys. + ErrSignerNotInKeySet = fmt.Errorf("signing key is not found in key" + + " set") + + // ErrAlredyHaveAllNonces is called when RegisterPubNonce is called too + // many times for a given signing session. + ErrAlredyHaveAllNonces = fmt.Errorf("already have all nonces") + + // ErrNotEnoughSigners is returned when a caller attempts to create a + // session from a context, but before all the required signers are + // known. + ErrNotEnoughSigners = fmt.Errorf("not enough signers") + + // ErrAlredyHaveAllNonces is returned when a caller attempts to + // register a signer, once we already have the total set of known + // signers. + ErrAlreadyHaveAllSigners = fmt.Errorf("all signers registered") + + // ErrAlredyHaveAllSigs is called when CombineSig is called too many + // times for a given signing session. + ErrAlredyHaveAllSigs = fmt.Errorf("already have all sigs") + + // ErrSigningContextReuse is returned if a user attempts to sign using + // the same signing context more than once. + ErrSigningContextReuse = fmt.Errorf("nonce already used") + + // ErrFinalSigInvalid is returned when the combined signature turns out + // to be invalid. + ErrFinalSigInvalid = fmt.Errorf("final signature is invalid") + + // ErrCombinedNonceUnavailable is returned when a caller attempts to + // sign a partial signature, without first having collected all the + // required combined nonces. + ErrCombinedNonceUnavailable = fmt.Errorf("missing combined nonce") + + // ErrTaprootInternalKeyUnavailable is returned when a user attempts to + // obtain the + ErrTaprootInternalKeyUnavailable = fmt.Errorf("taproot tweak not used") + + // ErrNotEnoughSigners is returned if a caller attempts to obtain an + // early nonce when it wasn't specified + ErrNoEarlyNonce = fmt.Errorf("no early nonce available") +) + +// Context is a managed signing context for musig2. It takes care of things +// like securely generating secret nonces, aggregating keys and nonces, etc. +type Context struct { + // signingKey is the key we'll use for signing. + signingKey *btcec.PrivateKey + + // pubKey is our even-y coordinate public key. + pubKey *btcec.PublicKey + + // combinedKey is the aggregated public key. + combinedKey *AggregateKey + + // uniqueKeyIndex is the index of the second unique key in the keySet. + // This is used to speed up signing and verification computations. + uniqueKeyIndex int + + // keysHash is the hash of all the keys as defined in musig2. + keysHash []byte + + // opts is the set of options for the context. + opts *contextOptions + + // shouldSort keeps track of if the public keys should be sorted before + // any operations. + shouldSort bool + + // sessionNonce will be populated if the earlyNonce option is true. + // After the first session is created, this nonce will be blanked out. + sessionNonce *Nonces +} + +// ContextOption is a functional option argument that allows callers to modify +// the musig2 signing is done within a context. +type ContextOption func(*contextOptions) + +// contextOptions houses the set of functional options that can be used to +// musig2 signing protocol. +type contextOptions struct { + // tweaks is the set of optinoal tweaks to apply to the combined public + // key. + tweaks []KeyTweakDesc + + // taprootTweak specifies the taproot tweak. If specified, then we'll + // use this as the script root for the BIP 341 taproot (x-only) tweak. + // Normally we'd just apply the raw 32 byte tweak, but for taproot, we + // first need to compute the aggregated key before tweaking, and then + // use it as the internal key. This is required as the taproot tweak + // also commits to the public key, which in this case is the aggregated + // key before the tweak. + taprootTweak []byte + + // bip86Tweak if true, then the weak will just be + // h_tapTweak(internalKey) as there is no true script root. + bip86Tweak bool + + // keySet is the complete set of signers for this context. + keySet []*btcec.PublicKey + + // numSigners is the total number of signers that will eventually be a + // part of the context. + numSigners int + + // earlyNonce determines if a nonce should be generated during context + // creation, to be automatically passed to the created session. + earlyNonce bool +} + +// defaultContextOptions returns the default context options. +func defaultContextOptions() *contextOptions { + return &contextOptions{} +} + +// WithTweakedContext specifies that within the context, the aggregated public +// key should be tweaked with the specified tweaks. +func WithTweakedContext(tweaks ...KeyTweakDesc) ContextOption { + return func(o *contextOptions) { + o.tweaks = tweaks + } +} + +// WithTaprootTweakCtx specifies that within this context, the final key should +// use the taproot tweak as defined in BIP 341: outputKey = internalKey + +// h_tapTweak(internalKey || scriptRoot). In this case, the aggreaged key +// before the tweak will be used as the internal key. +func WithTaprootTweakCtx(scriptRoot []byte) ContextOption { + return func(o *contextOptions) { + o.taprootTweak = scriptRoot + } +} + +// WithBip86TweakCtx specifies that within this context, the final key should +// use the taproot tweak as defined in BIP 341, with the BIP 86 modification: +// outputKey = internalKey + h_tapTweak(internalKey)*G. In this case, the +// aggreaged key before the tweak will be used as the internal key. +func WithBip86TweakCtx() ContextOption { + return func(o *contextOptions) { + o.bip86Tweak = true + } +} + +// WithKnownSigners is an optional parameter that should be used if a session +// can be created as soon as all the singers are known. +func WithKnownSigners(signers []*btcec.PublicKey) ContextOption { + return func(o *contextOptions) { + o.keySet = signers + o.numSigners = len(signers) + } +} + +// WithNumSigners is a functional option used to specify that a context should +// be created without knowing all the signers. Instead the total number of +// signers is specified to ensure that a session can only be created once all +// the signers are known. +// +// NOTE: Either WithKnownSigners or WithNumSigners MUST be specified. +func WithNumSigners(n int) ContextOption { + return func(o *contextOptions) { + o.numSigners = n + } +} + +// WithEarlyNonceGen allow a caller to specify that a nonce should be generated +// early, before the session is created. This should be used in protocols that +// require some partial nonce exchange before all the signers are known. +// +// NOTE: This option must only be specified with the WithNumSigners option. +func WithEarlyNonceGen() ContextOption { + return func(o *contextOptions) { + o.earlyNonce = true + } +} + +// NewContext creates a new signing context with the passed singing key and set +// of public keys for each of the other signers. +// +// NOTE: This struct should be used over the raw Sign API whenever possible. +func NewContext(signingKey *btcec.PrivateKey, shouldSort bool, + ctxOpts ...ContextOption) (*Context, error) { + + // First, parse the set of optional context options. + opts := defaultContextOptions() + for _, option := range ctxOpts { + option(opts) + } + + pubKey := signingKey.PubKey() + + ctx := &Context{ + signingKey: signingKey, + pubKey: pubKey, + opts: opts, + shouldSort: shouldSort, + } + + switch { + + // We know all the signers, so we can compute the aggregated key, along + // with all the other intermediate state we need to do signing and + // verification. + case opts.keySet != nil: + if err := ctx.combineSignerKeys(); err != nil { + return nil, err + } + + // The total signers are known, so we add ourselves, and skip key + // aggregation. + case opts.numSigners != 0: + // Otherwise, we'll add ourselves as the only known signer, and + // await further calls to RegisterSigner before a session can + // be created. + opts.keySet = make([]*btcec.PublicKey, 0, opts.numSigners) + opts.keySet = append(opts.keySet, pubKey) + + default: + return nil, ErrSignersNotSpecified + } + + // If early nonce generation is specified, then we'll generate the + // nonce now to pass in to the session once all the callers are known. + if opts.earlyNonce { + var err error + ctx.sessionNonce, err = GenNonces( + WithPublicKey(ctx.pubKey), + WithNonceSecretKeyAux(signingKey), + ) + if err != nil { + return nil, err + } + } + + return ctx, nil +} + +// combineSignerKeys is used to compute the aggregated signer key once all the +// signers are known. +func (c *Context) combineSignerKeys() error { + // As a sanity check, make sure the signing key is actually + // amongst the sit of signers. + var keyFound bool + for _, key := range c.opts.keySet { + if key.IsEqual(c.pubKey) { + keyFound = true + break + } + } + if !keyFound { + return ErrSignerNotInKeySet + } + + // Now that we know that we're actually a signer, we'll + // generate the key hash finger print and second unique key + // index so we can speed up signing later. + c.keysHash = keyHashFingerprint(c.opts.keySet, c.shouldSort) + c.uniqueKeyIndex = secondUniqueKeyIndex( + c.opts.keySet, c.shouldSort, + ) + + keyAggOpts := []KeyAggOption{ + WithKeysHash(c.keysHash), + WithUniqueKeyIndex(c.uniqueKeyIndex), + } + switch { + case c.opts.bip86Tweak: + keyAggOpts = append( + keyAggOpts, WithBIP86KeyTweak(), + ) + case c.opts.taprootTweak != nil: + keyAggOpts = append( + keyAggOpts, WithTaprootKeyTweak(c.opts.taprootTweak), + ) + case len(c.opts.tweaks) != 0: + keyAggOpts = append(keyAggOpts, WithKeyTweaks(c.opts.tweaks...)) + } + + // Next, we'll use this information to compute the aggregated + // public key that'll be used for signing in practice. + var err error + c.combinedKey, _, _, err = AggregateKeys( + c.opts.keySet, c.shouldSort, keyAggOpts..., + ) + if err != nil { + return err + } + + return nil +} + +// EarlySessionNonce returns the early session nonce, if available. +func (c *Context) EarlySessionNonce() (*Nonces, error) { + if c.sessionNonce == nil { + return nil, ErrNoEarlyNonce + } + + return c.sessionNonce, nil +} + +// RegisterSigner allows a caller to register a signer after the context has +// been created. This will be used in scenarios where the total number of +// signers is known, but nonce exchange needs to happen before all the signers +// are known. +// +// A bool is returned which indicates if all the signers have been registered. +// +// NOTE: If the set of keys are not to be sorted during signing, then the +// ordering each key is registered with MUST match the desired ordering. +func (c *Context) RegisterSigner(pub *btcec.PublicKey) (bool, error) { + haveAllSigners := len(c.opts.keySet) == c.opts.numSigners + if haveAllSigners { + return false, ErrAlreadyHaveAllSigners + } + + c.opts.keySet = append(c.opts.keySet, pub) + + // If we have the expected number of signers at this point, then we can + // generate the aggregated key and other necessary information. + haveAllSigners = len(c.opts.keySet) == c.opts.numSigners + if haveAllSigners { + if err := c.combineSignerKeys(); err != nil { + return false, err + } + } + + return haveAllSigners, nil +} + +// NumRegisteredSigners returns the total number of registered signers. +func (c *Context) NumRegisteredSigners() int { + return len(c.opts.keySet) +} + +// CombinedKey returns the combined public key that will be used to generate +// multi-signatures against. +func (c *Context) CombinedKey() (*btcec.PublicKey, error) { + // If the caller hasn't registered all the signers at this point, then + // the combined key won't be available. + if c.combinedKey == nil { + return nil, ErrNotEnoughSigners + } + + return c.combinedKey.FinalKey, nil +} + +// PubKey returns the public key of the signer of this session. +func (c *Context) PubKey() btcec.PublicKey { + return *c.pubKey +} + +// SigningKeys returns the set of keys used for signing. +func (c *Context) SigningKeys() []*btcec.PublicKey { + keys := make([]*btcec.PublicKey, len(c.opts.keySet)) + copy(keys, c.opts.keySet) + + return keys +} + +// TaprootInternalKey returns the internal taproot key, which is the aggregated +// key _before_ the tweak is applied. If a taproot tweak was specified, then +// CombinedKey() will return the fully tweaked output key, with this method +// returning the internal key. If a taproot tweak wasn't specified, then this +// method will return an error. +func (c *Context) TaprootInternalKey() (*btcec.PublicKey, error) { + // If the caller hasn't registered all the signers at this point, then + // the combined key won't be available. + if c.combinedKey == nil { + return nil, ErrNotEnoughSigners + } + + if c.opts.taprootTweak == nil && !c.opts.bip86Tweak { + return nil, ErrTaprootInternalKeyUnavailable + } + + return c.combinedKey.PreTweakedKey, nil +} + +// SessionOption is a functional option argument that allows callers to modify +// the musig2 signing is done within a session. +type SessionOption func(*sessionOptions) + +// sessionOptions houses the set of functional options that can be used to +// modify the musig2 signing protocol. +type sessionOptions struct { + externalNonce *Nonces +} + +// defaultSessionOptions returns the default session options. +func defaultSessionOptions() *sessionOptions { + return &sessionOptions{} +} + +// WithPreGeneratedNonce allows a caller to start a session using a nonce +// they've generated themselves. This may be useful in protocols where all the +// signer keys may not be known before nonce exchange needs to occur. +func WithPreGeneratedNonce(nonce *Nonces) SessionOption { + return func(o *sessionOptions) { + o.externalNonce = nonce + } +} + +// Session represents a musig2 signing session. A new instance should be +// created each time a multi-signature is needed. The session struct handles +// nonces management, incremental partial sig vitrifaction, as well as final +// signature combination. Errors are returned when unsafe behavior such as +// nonce re-use is attempted. +// +// NOTE: This struct should be used over the raw Sign API whenever possible. +type Session struct { + opts *sessionOptions + + ctx *Context + + localNonces *Nonces + + pubNonces [][PubNonceSize]byte + + combinedNonce *[PubNonceSize]byte + + msg [32]byte + + ourSig *PartialSignature + sigs []*PartialSignature + + finalSig *schnorr.Signature +} + +// NewSession creates a new musig2 signing session. +func (c *Context) NewSession(options ...SessionOption) (*Session, error) { + opts := defaultSessionOptions() + for _, opt := range options { + opt(opts) + } + + // At this point we verify that we know of all the signers, as + // otherwise we can't proceed with the session. This check is intended + // to catch misuse of the API wherein a caller forgets to register the + // remaining signers if they're doing nonce generation ahead of time. + if len(c.opts.keySet) != c.opts.numSigners { + return nil, ErrNotEnoughSigners + } + + // If an early nonce was specified, then we'll automatically add the + // corresponding session option for the caller. + var localNonces *Nonces + if c.sessionNonce != nil { + // Apply the early nonce to the session, and also blank out the + // session nonce on the context to ensure it isn't ever re-used + // for another session. + localNonces = c.sessionNonce + c.sessionNonce = nil + } else if opts.externalNonce != nil { + // Otherwise if there's a custom nonce passed in via the + // session options, then use that instead. + localNonces = opts.externalNonce + } + + // Now that we know we have enough signers, we'll either use the caller + // specified nonce, or generate a fresh set. + var err error + if localNonces == nil { + // At this point we need to generate a fresh nonce. We'll pass + // in some auxiliary information to strengthen the nonce + // generated. + localNonces, err = GenNonces( + WithPublicKey(c.pubKey), + WithNonceSecretKeyAux(c.signingKey), + WithNonceCombinedKeyAux(c.combinedKey.FinalKey), + ) + if err != nil { + return nil, err + } + } + + s := &Session{ + opts: opts, + ctx: c, + localNonces: localNonces, + pubNonces: make([][PubNonceSize]byte, 0, c.opts.numSigners), + sigs: make([]*PartialSignature, 0, c.opts.numSigners), + } + + s.pubNonces = append(s.pubNonces, localNonces.PubNonce) + + return s, nil +} + +// PublicNonce returns the public nonce for a signer. This should be sent to +// other parties before signing begins, so they can compute the aggregated +// public nonce. +func (s *Session) PublicNonce() [PubNonceSize]byte { + return s.localNonces.PubNonce +} + +// NumRegisteredNonces returns the total number of nonces that have been +// registered so far. +func (s *Session) NumRegisteredNonces() int { + return len(s.pubNonces) +} + +// RegisterPubNonce should be called for each public nonce from the set of +// signers. This method returns true once all the public nonces have been +// accounted for. +func (s *Session) RegisterPubNonce(nonce [PubNonceSize]byte) (bool, error) { + // If we already have all the nonces, then this method was called too + // many times. + haveAllNonces := len(s.pubNonces) == s.ctx.opts.numSigners + if haveAllNonces { + return false, ErrAlredyHaveAllNonces + } + + // Add this nonce and check again if we already have tall the nonces we + // need. + s.pubNonces = append(s.pubNonces, nonce) + haveAllNonces = len(s.pubNonces) == s.ctx.opts.numSigners + + // If we have all the nonces, then we can go ahead and combine them + // now. + if haveAllNonces { + combinedNonce, err := AggregateNonces(s.pubNonces) + if err != nil { + return false, err + } + + s.combinedNonce = &combinedNonce + } + + return haveAllNonces, nil +} + +// Sign generates a partial signature for the target message, using the target +// context. If this method is called more than once per context, then an error +// is returned, as that means a nonce was re-used. +func (s *Session) Sign(msg [32]byte, + signOpts ...SignOption) (*PartialSignature, error) { + + switch { + // If no local nonce is present, then this means we already signed, so + // we'll return an error to prevent nonce re-use. + case s.localNonces == nil: + return nil, ErrSigningContextReuse + + // We also need to make sure we have the combined nonce, otherwise this + // function was called too early. + case s.combinedNonce == nil: + return nil, ErrCombinedNonceUnavailable + } + + switch { + case s.ctx.opts.bip86Tweak: + signOpts = append( + signOpts, WithBip86SignTweak(), + ) + case s.ctx.opts.taprootTweak != nil: + signOpts = append( + signOpts, WithTaprootSignTweak(s.ctx.opts.taprootTweak), + ) + case len(s.ctx.opts.tweaks) != 0: + signOpts = append(signOpts, WithTweaks(s.ctx.opts.tweaks...)) + } + + partialSig, err := Sign( + s.localNonces.SecNonce, s.ctx.signingKey, *s.combinedNonce, + s.ctx.opts.keySet, msg, signOpts..., + ) + + // Now that we've generated our signature, we'll make sure to blank out + // our signing nonce. + s.localNonces = nil + + if err != nil { + return nil, err + } + + s.msg = msg + + s.ourSig = partialSig + s.sigs = append(s.sigs, partialSig) + + return partialSig, nil +} + +// CombineSig buffers a partial signature received from a signing party. The +// method returns true once all the signatures are available, and can be +// combined into the final signature. +func (s *Session) CombineSig(sig *PartialSignature) (bool, error) { + // First check if we already have all the signatures we need. We + // already accumulated our own signature when we generated the sig. + haveAllSigs := len(s.sigs) == len(s.ctx.opts.keySet) + if haveAllSigs { + return false, ErrAlredyHaveAllSigs + } + + // TODO(roasbeef): incremental check for invalid sig, or just detect at + // the very end? + + // Accumulate this sig, and check again if we have all the sigs we + // need. + s.sigs = append(s.sigs, sig) + haveAllSigs = len(s.sigs) == len(s.ctx.opts.keySet) + + // If we have all the signatures, then we can combine them all into the + // final signature. + if haveAllSigs { + var combineOpts []CombineOption + switch { + case s.ctx.opts.bip86Tweak: + combineOpts = append( + combineOpts, WithBip86TweakedCombine( + s.msg, s.ctx.opts.keySet, + s.ctx.shouldSort, + ), + ) + case s.ctx.opts.taprootTweak != nil: + combineOpts = append( + combineOpts, WithTaprootTweakedCombine( + s.msg, s.ctx.opts.keySet, + s.ctx.opts.taprootTweak, s.ctx.shouldSort, + ), + ) + case len(s.ctx.opts.tweaks) != 0: + combineOpts = append( + combineOpts, WithTweakedCombine( + s.msg, s.ctx.opts.keySet, + s.ctx.opts.tweaks, s.ctx.shouldSort, + ), + ) + } + + finalSig := CombineSigs(s.ourSig.R, s.sigs, combineOpts...) + + // We'll also verify the signature at this point to ensure it's + // valid. + // + // TODO(roasbef): allow skipping? + if !finalSig.Verify(s.msg[:], s.ctx.combinedKey.FinalKey) { + return false, ErrFinalSigInvalid + } + + s.finalSig = finalSig + } + + return haveAllSigs, nil +} + +// FinalSig returns the final combined multi-signature, if present. +func (s *Session) FinalSig() *schnorr.Signature { + return s.finalSig +} diff --git a/btcec/schnorr/musig2/data/key_agg_vectors.json b/btcec/schnorr/musig2/data/key_agg_vectors.json new file mode 100644 index 0000000000..b2e623de60 --- /dev/null +++ b/btcec/schnorr/musig2/data/key_agg_vectors.json @@ -0,0 +1,88 @@ +{ + "pubkeys": [ + "02F9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9", + "03DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659", + "023590A94E768F8E1815C2F24B4D80A8E3149316C3518CE7B7AD338368D038CA66", + "020000000000000000000000000000000000000000000000000000000000000005", + "02FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC30", + "04F9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9", + "03935F972DA013F80AE011890FA89B67A27B7BE6CCB24D3274D18B2D4067F261A9" + ], + "tweaks": [ + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", + "252E4BD67410A76CDF933D30EAA1608214037F1B105A013ECCD3C5C184A6110B" + ], + "valid_test_cases": [ + { + "key_indices": [0, 1, 2], + "expected": "90539EEDE565F5D054F32CC0C220126889ED1E5D193BAF15AEF344FE59D4610C" + }, + { + "key_indices": [2, 1, 0], + "expected": "6204DE8B083426DC6EAF9502D27024D53FC826BF7D2012148A0575435DF54B2B" + }, + { + "key_indices": [0, 0, 0], + "expected": "B436E3BAD62B8CD409969A224731C193D051162D8C5AE8B109306127DA3AA935" + }, + { + "key_indices": [0, 0, 1, 1], + "expected": "69BC22BFA5D106306E48A20679DE1D7389386124D07571D0D872686028C26A3E" + } + ], + "error_test_cases": [ + { + "key_indices": [0, 3], + "tweak_indices": [], + "is_xonly": [], + "error": { + "type": "invalid_contribution", + "signer": 1, + "contrib": "pubkey" + }, + "comment": "Invalid public key" + }, + { + "key_indices": [0, 4], + "tweak_indices": [], + "is_xonly": [], + "error": { + "type": "invalid_contribution", + "signer": 1, + "contrib": "pubkey" + }, + "comment": "Public key exceeds field size" + }, + { + "key_indices": [5, 0], + "tweak_indices": [], + "is_xonly": [], + "error": { + "type": "invalid_contribution", + "signer": 0, + "contrib": "pubkey" + }, + "comment": "First byte of public key is not 2 or 3" + }, + { + "key_indices": [0, 1], + "tweak_indices": [0], + "is_xonly": [true], + "error": { + "type": "value", + "message": "The tweak must be less than n." + }, + "comment": "Tweak is out of range" + }, + { + "key_indices": [6], + "tweak_indices": [1], + "is_xonly": [false], + "error": { + "type": "value", + "message": "The result of tweaking cannot be infinity." + }, + "comment": "Intermediate tweaking result is point at infinity" + } + ] +} diff --git a/btcec/schnorr/musig2/data/key_sort_vectors.json b/btcec/schnorr/musig2/data/key_sort_vectors.json new file mode 100644 index 0000000000..022f3417fa --- /dev/null +++ b/btcec/schnorr/musig2/data/key_sort_vectors.json @@ -0,0 +1,16 @@ +{ + "pubkeys": [ + "02DD308AFEC5777E13121FA72B9CC1B7CC0139715309B086C960E18FD969774EB8", + "02F9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9", + "03DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659", + "023590A94E768F8E1815C2F24B4D80A8E3149316C3518CE7B7AD338368D038CA66", + "02DD308AFEC5777E13121FA72B9CC1B7CC0139715309B086C960E18FD969774EB8" + ], + "sorted_pubkeys": [ + "023590A94E768F8E1815C2F24B4D80A8E3149316C3518CE7B7AD338368D038CA66", + "02DD308AFEC5777E13121FA72B9CC1B7CC0139715309B086C960E18FD969774EB8", + "02DD308AFEC5777E13121FA72B9CC1B7CC0139715309B086C960E18FD969774EB8", + "02F9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9", + "03DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659" + ] +} diff --git a/btcec/schnorr/musig2/data/nonce_agg_vectors.json b/btcec/schnorr/musig2/data/nonce_agg_vectors.json new file mode 100644 index 0000000000..597246dd72 --- /dev/null +++ b/btcec/schnorr/musig2/data/nonce_agg_vectors.json @@ -0,0 +1,54 @@ +{ + "pnonces": [ + "020151C80F435648DF67A22B749CD798CE54E0321D034B92B709B567D60A42E66603BA47FBC1834437B3212E89A84D8425E7BF12E0245D98262268EBDCB385D50641", + "03FF406FFD8ADB9CD29877E4985014F66A59F6CD01C0E88CAA8E5F3166B1F676A60248C264CDD57D3C24D79990B0F865674EB62A0F9018277A95011B41BFC193B833", + "020151C80F435648DF67A22B749CD798CE54E0321D034B92B709B567D60A42E6660279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", + "03FF406FFD8ADB9CD29877E4985014F66A59F6CD01C0E88CAA8E5F3166B1F676A60379BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", + "04FF406FFD8ADB9CD29877E4985014F66A59F6CD01C0E88CAA8E5F3166B1F676A60248C264CDD57D3C24D79990B0F865674EB62A0F9018277A95011B41BFC193B833", + "03FF406FFD8ADB9CD29877E4985014F66A59F6CD01C0E88CAA8E5F3166B1F676A60248C264CDD57D3C24D79990B0F865674EB62A0F9018277A95011B41BFC193B831", + "03FF406FFD8ADB9CD29877E4985014F66A59F6CD01C0E88CAA8E5F3166B1F676A602FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC30" + ], + "valid_test_cases": [ + { + "pnonce_indices": [0, 1], + "expected": "035FE1873B4F2967F52FEA4A06AD5A8ECCBE9D0FD73068012C894E2E87CCB5804B024725377345BDE0E9C33AF3C43C0A29A9249F2F2956FA8CFEB55C8573D0262DC8" + }, + { + "pnonce_indices": [2, 3], + "expected": "035FE1873B4F2967F52FEA4A06AD5A8ECCBE9D0FD73068012C894E2E87CCB5804B000000000000000000000000000000000000000000000000000000000000000000", + "comment": "Sum of second points encoded in the nonces is point at infinity which is serialized as 33 zero bytes" + } + ], + "error_test_cases": [ + { + "pnonce_indices": [0, 4], + "error": { + "type": "invalid_contribution", + "signer": 1, + "contrib": "pubnonce" + }, + "comment": "Public nonce from signer 1 is invalid due wrong tag, 0x04, in the first half", + "btcec_err": "invalid public key: unsupported format: 4" + }, + { + "pnonce_indices": [5, 1], + "error": { + "type": "invalid_contribution", + "signer": 0, + "contrib": "pubnonce" + }, + "comment": "Public nonce from signer 0 is invalid because the second half does not correspond to an X coordinate", + "btcec_err": "invalid public key: x coordinate 48c264cdd57d3c24d79990b0f865674eb62a0f9018277a95011b41bfc193b831 is not on the secp256k1 curve" + }, + { + "pnonce_indices": [6, 1], + "error": { + "type": "invalid_contribution", + "signer": 0, + "contrib": "pubnonce" + }, + "comment": "Public nonce from signer 0 is invalid because second half exceeds field size", + "btcec_err": "invalid public key: x >= field prime" + } + ] +} diff --git a/btcec/schnorr/musig2/data/nonce_gen_vectors.json b/btcec/schnorr/musig2/data/nonce_gen_vectors.json new file mode 100644 index 0000000000..450234974c --- /dev/null +++ b/btcec/schnorr/musig2/data/nonce_gen_vectors.json @@ -0,0 +1,40 @@ +{ + "test_cases": [ + { + "rand_": "0000000000000000000000000000000000000000000000000000000000000000", + "sk": "0202020202020202020202020202020202020202020202020202020202020202", + "pk": "024D4B6CD1361032CA9BD2AEB9D900AA4D45D9EAD80AC9423374C451A7254D0766", + "aggpk": "0707070707070707070707070707070707070707070707070707070707070707", + "msg": "0101010101010101010101010101010101010101010101010101010101010101", + "extra_in": "0808080808080808080808080808080808080808080808080808080808080808", + "expected": "227243DCB40EF2A13A981DB188FA433717B506BDFA14B1AE47D5DC027C9C3B9EF2370B2AD206E724243215137C86365699361126991E6FEC816845F837BDDAC3024D4B6CD1361032CA9BD2AEB9D900AA4D45D9EAD80AC9423374C451A7254D0766" + }, + { + "rand_": "0000000000000000000000000000000000000000000000000000000000000000", + "sk": "0202020202020202020202020202020202020202020202020202020202020202", + "pk": "024D4B6CD1361032CA9BD2AEB9D900AA4D45D9EAD80AC9423374C451A7254D0766", + "aggpk": "0707070707070707070707070707070707070707070707070707070707070707", + "msg": "", + "extra_in": "0808080808080808080808080808080808080808080808080808080808080808", + "expected": "CD0F47FE471D6788FF3243F47345EA0A179AEF69476BE8348322EF39C2723318870C2065AFB52DEDF02BF4FDBF6D2F442E608692F50C2374C08FFFE57042A61C024D4B6CD1361032CA9BD2AEB9D900AA4D45D9EAD80AC9423374C451A7254D0766" + }, + { + "rand_": "0000000000000000000000000000000000000000000000000000000000000000", + "sk": "0202020202020202020202020202020202020202020202020202020202020202", + "pk": "024D4B6CD1361032CA9BD2AEB9D900AA4D45D9EAD80AC9423374C451A7254D0766", + "aggpk": "0707070707070707070707070707070707070707070707070707070707070707", + "msg": "2626262626262626262626262626262626262626262626262626262626262626262626262626", + "extra_in": "0808080808080808080808080808080808080808080808080808080808080808", + "expected": "011F8BC60EF061DEEF4D72A0A87200D9994B3F0CD9867910085C38D5366E3E6B9FF03BC0124E56B24069E91EC3F162378983F194E8BD0ED89BE3059649EAE262024D4B6CD1361032CA9BD2AEB9D900AA4D45D9EAD80AC9423374C451A7254D0766" + }, + { + "rand_": "0000000000000000000000000000000000000000000000000000000000000000", + "sk": null, + "pk": "02F9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9", + "aggpk": null, + "msg": null, + "extra_in": null, + "expected": "890E83616A3BC4640AB9B6374F21C81FF89CDDDBAFAA7475AE2A102A92E3EDB29FD7E874E23342813A60D9646948242646B7951CA046B4B36D7D6078506D3C9402F9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9" + } + ] +} \ No newline at end of file diff --git a/btcec/schnorr/musig2/data/sig_agg_vectors.json b/btcec/schnorr/musig2/data/sig_agg_vectors.json new file mode 100644 index 0000000000..afe9eaf3f4 --- /dev/null +++ b/btcec/schnorr/musig2/data/sig_agg_vectors.json @@ -0,0 +1,151 @@ +{ + "pubkeys": [ + "03935F972DA013F80AE011890FA89B67A27B7BE6CCB24D3274D18B2D4067F261A9", + "02D2DC6F5DF7C56ACF38C7FA0AE7A759AE30E19B37359DFDE015872324C7EF6E05", + "03C7FB101D97FF930ACD0C6760852EF64E69083DE0B06AC6335724754BB4B0522C", + "02352433B21E7E05D3B452B81CAE566E06D2E003ECE16D1074AABA4289E0E3D581" + ], + "pnonces": [ + "036E5EE6E28824029FEA3E8A9DDD2C8483F5AF98F7177C3AF3CB6F47CAF8D94AE902DBA67E4A1F3680826172DA15AFB1A8CA85C7C5CC88900905C8DC8C328511B53E", + "03E4F798DA48A76EEC1C9CC5AB7A880FFBA201A5F064E627EC9CB0031D1D58FC5103E06180315C5A522B7EC7C08B69DCD721C313C940819296D0A7AB8E8795AC1F00", + "02C0068FD25523A31578B8077F24F78F5BD5F2422AFF47C1FADA0F36B3CEB6C7D202098A55D1736AA5FCC21CF0729CCE852575C06C081125144763C2C4C4A05C09B6", + "031F5C87DCFBFCF330DEE4311D85E8F1DEA01D87A6F1C14CDFC7E4F1D8C441CFA40277BF176E9F747C34F81B0D9F072B1B404A86F402C2D86CF9EA9E9C69876EA3B9", + "023F7042046E0397822C4144A17F8B63D78748696A46C3B9F0A901D296EC3406C302022B0B464292CF9751D699F10980AC764E6F671EFCA15069BBE62B0D1C62522A", + "02D97DDA5988461DF58C5897444F116A7C74E5711BF77A9446E27806563F3B6C47020CBAD9C363A7737F99FA06B6BE093CEAFF5397316C5AC46915C43767AE867C00" + ], + "tweaks": [ + "B511DA492182A91B0FFB9A98020D55F260AE86D7ECBD0399C7383D59A5F2AF7C", + "A815FE049EE3C5AAB66310477FBC8BCCCAC2F3395F59F921C364ACD78A2F48DC", + "75448A87274B056468B977BE06EB1E9F657577B7320B0A3376EA51FD420D18A8" + ], + "psigs": [ + "B15D2CD3C3D22B04DAE438CE653F6B4ECF042F42CFDED7C41B64AAF9B4AF53FB", + "6193D6AC61B354E9105BBDC8937A3454A6D705B6D57322A5A472A02CE99FCB64", + "9A87D3B79EC67228CB97878B76049B15DBD05B8158D17B5B9114D3C226887505", + "66F82EA90923689B855D36C6B7E032FB9970301481B99E01CDB4D6AC7C347A15", + "4F5AEE41510848A6447DCD1BBC78457EF69024944C87F40250D3EF2C25D33EFE", + "DDEF427BBB847CC027BEFF4EDB01038148917832253EBC355FC33F4A8E2FCCE4", + "97B890A26C981DA8102D3BC294159D171D72810FDF7C6A691DEF02F0F7AF3FDC", + "53FA9E08BA5243CBCB0D797C5EE83BC6728E539EB76C2D0BF0F971EE4E909971", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141" + ], + "msg": "599C67EA410D005B9DA90817CF03ED3B1C868E4DA4EDF00A5880B0082C237869", + "valid_test_cases": [ + { + "aggnonce": "0341432722C5CD0268D829C702CF0D1CBCE57033EED201FD335191385227C3210C03D377F2D258B64AADC0E16F26462323D701D286046A2EA93365656AFD9875982B", + "nonce_indices": [ + 0, + 1 + ], + "key_indices": [ + 0, + 1 + ], + "tweak_indices": [], + "is_xonly": [], + "psig_indices": [ + 0, + 1 + ], + "expected": "041DA22223CE65C92C9A0D6C2CAC828AAF1EEE56304FEC371DDF91EBB2B9EF0912F1038025857FEDEB3FF696F8B99FA4BB2C5812F6095A2E0004EC99CE18DE1E" + }, + { + "aggnonce": "0224AFD36C902084058B51B5D36676BBA4DC97C775873768E58822F87FE437D792028CB15929099EEE2F5DAE404CD39357591BA32E9AF4E162B8D3E7CB5EFE31CB20", + "nonce_indices": [ + 0, + 2 + ], + "key_indices": [ + 0, + 2 + ], + "tweak_indices": [], + "is_xonly": [], + "psig_indices": [ + 2, + 3 + ], + "expected": "1069B67EC3D2F3C7C08291ACCB17A9C9B8F2819A52EB5DF8726E17E7D6B52E9F01800260A7E9DAC450F4BE522DE4CE12BA91AEAF2B4279219EF74BE1D286ADD9" + }, + { + "aggnonce": "0208C5C438C710F4F96A61E9FF3C37758814B8C3AE12BFEA0ED2C87FF6954FF186020B1816EA104B4FCA2D304D733E0E19CEAD51303FF6420BFD222335CAA402916D", + "nonce_indices": [ + 0, + 3 + ], + "key_indices": [ + 0, + 2 + ], + "tweak_indices": [ + 0 + ], + "is_xonly": [ + false + ], + "psig_indices": [ + 4, + 5 + ], + "expected": "5C558E1DCADE86DA0B2F02626A512E30A22CF5255CAEA7EE32C38E9A71A0E9148BA6C0E6EC7683B64220F0298696F1B878CD47B107B81F7188812D593971E0CC" + }, + { + "aggnonce": "02B5AD07AFCD99B6D92CB433FBD2A28FDEB98EAE2EB09B6014EF0F8197CD58403302E8616910F9293CF692C49F351DB86B25E352901F0E237BAFDA11F1C1CEF29FFD", + "nonce_indices": [ + 0, + 4 + ], + "key_indices": [ + 0, + 3 + ], + "tweak_indices": [ + 0, + 1, + 2 + ], + "is_xonly": [ + true, + false, + true + ], + "psig_indices": [ + 6, + 7 + ], + "expected": "839B08820B681DBA8DAF4CC7B104E8F2638F9388F8D7A555DC17B6E6971D7426CE07BF6AB01F1DB50E4E33719295F4094572B79868E440FB3DEFD3FAC1DB589E" + } + ], + "error_test_cases": [ + { + "aggnonce": "02B5AD07AFCD99B6D92CB433FBD2A28FDEB98EAE2EB09B6014EF0F8197CD58403302E8616910F9293CF692C49F351DB86B25E352901F0E237BAFDA11F1C1CEF29FFD", + "nonce_indices": [ + 0, + 4 + ], + "key_indices": [ + 0, + 3 + ], + "tweak_indices": [ + 0, + 1, + 2 + ], + "is_xonly": [ + true, + false, + true + ], + "psig_indices": [ + 7, + 8 + ], + "error": { + "type": "invalid_contribution", + "signer": 1 + }, + "comment": "Partial signature is invalid because it exceeds group size" + } + ] +} \ No newline at end of file diff --git a/btcec/schnorr/musig2/data/sign_verify_vectors.json b/btcec/schnorr/musig2/data/sign_verify_vectors.json new file mode 100644 index 0000000000..324537168b --- /dev/null +++ b/btcec/schnorr/musig2/data/sign_verify_vectors.json @@ -0,0 +1,194 @@ +{ + "sk": "7FB9E0E687ADA1EEBF7ECFE2F21E73EBDB51A7D450948DFE8D76D7F2D1007671", + "pubkeys": [ + "03935F972DA013F80AE011890FA89B67A27B7BE6CCB24D3274D18B2D4067F261A9", + "02F9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9", + "02DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA661", + "020000000000000000000000000000000000000000000000000000000000000007" + ], + "secnonces": [ + "508B81A611F100A6B2B6B29656590898AF488BCF2E1F55CF22E5CFB84421FE61FA27FD49B1D50085B481285E1CA205D55C82CC1B31FF5CD54A489829355901F703935F972DA013F80AE011890FA89B67A27B7BE6CCB24D3274D18B2D4067F261A9", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003935F972DA013F80AE011890FA89B67A27B7BE6CCB24D3274D18B2D4067F261A9" + ], + "pnonces": [ + "0337C87821AFD50A8644D820A8F3E02E499C931865C2360FB43D0A0D20DAFE07EA0287BF891D2A6DEAEBADC909352AA9405D1428C15F4B75F04DAE642A95C2548480", + "0279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F817980279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", + "032DE2662628C90B03F5E720284EB52FF7D71F4284F627B68A853D78C78E1FFE9303E4C5524E83FFE1493B9077CF1CA6BEB2090C93D930321071AD40B2F44E599046", + "0237C87821AFD50A8644D820A8F3E02E499C931865C2360FB43D0A0D20DAFE07EA0387BF891D2A6DEAEBADC909352AA9405D1428C15F4B75F04DAE642A95C2548480", + "020000000000000000000000000000000000000000000000000000000000000009" + ], + "aggnonces": [ + "028465FCF0BBDBCF443AABCCE533D42B4B5A10966AC09A49655E8C42DAAB8FCD61037496A3CC86926D452CAFCFD55D25972CA1675D549310DE296BFF42F72EEEA8C9", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "048465FCF0BBDBCF443AABCCE533D42B4B5A10966AC09A49655E8C42DAAB8FCD61037496A3CC86926D452CAFCFD55D25972CA1675D549310DE296BFF42F72EEEA8C9", + "028465FCF0BBDBCF443AABCCE533D42B4B5A10966AC09A49655E8C42DAAB8FCD61020000000000000000000000000000000000000000000000000000000000000009", + "028465FCF0BBDBCF443AABCCE533D42B4B5A10966AC09A49655E8C42DAAB8FCD6102FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC30" + ], + "msgs": [ + "F95466D086770E689964664219266FE5ED215C92AE20BAB5C9D79ADDDDF3C0CF", + "", + "2626262626262626262626262626262626262626262626262626262626262626262626262626" + ], + "valid_test_cases": [ + { + "key_indices": [0, 1, 2], + "nonce_indices": [0, 1, 2], + "aggnonce_index": 0, + "msg_index": 0, + "signer_index": 0, + "expected": "012ABBCB52B3016AC03AD82395A1A415C48B93DEF78718E62A7A90052FE224FB" + }, + { + "key_indices": [1, 0, 2], + "nonce_indices": [1, 0, 2], + "aggnonce_index": 0, + "msg_index": 0, + "signer_index": 1, + "expected": "9FF2F7AAA856150CC8819254218D3ADEEB0535269051897724F9DB3789513A52" + }, + { + "key_indices": [1, 2, 0], + "nonce_indices": [1, 2, 0], + "aggnonce_index": 0, + "msg_index": 0, + "signer_index": 2, + "expected": "FA23C359F6FAC4E7796BB93BC9F0532A95468C539BA20FF86D7C76ED92227900" + }, + { + "key_indices": [0, 1], + "nonce_indices": [0, 3], + "aggnonce_index": 1, + "msg_index": 0, + "signer_index": 0, + "expected": "AE386064B26105404798F75DE2EB9AF5EDA5387B064B83D049CB7C5E08879531", + "comment": "Both halves of aggregate nonce correspond to point at infinity" + } + ], + "sign_error_test_cases": [ + { + "key_indices": [1, 2], + "aggnonce_index": 0, + "msg_index": 0, + "secnonce_index": 0, + "error": { + "type": "value", + "message": "The signer's pubkey must be included in the list of pubkeys." + }, + "comment": "The signers pubkey is not in the list of pubkeys" + }, + { + "key_indices": [1, 0, 3], + "aggnonce_index": 0, + "msg_index": 0, + "secnonce_index": 0, + "error": { + "type": "invalid_contribution", + "signer": 2, + "contrib": "pubkey" + }, + "comment": "Signer 2 provided an invalid public key" + }, + { + "key_indices": [1, 2, 0], + "aggnonce_index": 2, + "msg_index": 0, + "secnonce_index": 0, + "error": { + "type": "invalid_contribution", + "signer": null, + "contrib": "aggnonce" + }, + "comment": "Aggregate nonce is invalid due wrong tag, 0x04, in the first half" + }, + { + "key_indices": [1, 2, 0], + "aggnonce_index": 3, + "msg_index": 0, + "secnonce_index": 0, + "error": { + "type": "invalid_contribution", + "signer": null, + "contrib": "aggnonce" + }, + "comment": "Aggregate nonce is invalid because the second half does not correspond to an X coordinate" + }, + { + "key_indices": [1, 2, 0], + "aggnonce_index": 4, + "msg_index": 0, + "secnonce_index": 0, + "error": { + "type": "invalid_contribution", + "signer": null, + "contrib": "aggnonce" + }, + "comment": "Aggregate nonce is invalid because second half exceeds field size" + }, + { + "key_indices": [0, 1, 2], + "aggnonce_index": 0, + "msg_index": 0, + "signer_index": 0, + "secnonce_index": 1, + "error": { + "type": "value", + "message": "first secnonce value is out of range." + }, + "comment": "Secnonce is invalid which may indicate nonce reuse" + } + ], + "verify_fail_test_cases": [ + { + "sig": "97AC833ADCB1AFA42EBF9E0725616F3C9A0D5B614F6FE283CEAAA37A8FFAF406", + "key_indices": [0, 1, 2], + "nonce_indices": [0, 1, 2], + "msg_index": 0, + "signer_index": 0, + "comment": "Wrong signature (which is equal to the negation of valid signature)" + }, + { + "sig": "68537CC5234E505BD14061F8DA9E90C220A181855FD8BDB7F127BB12403B4D3B", + "key_indices": [0, 1, 2], + "nonce_indices": [0, 1, 2], + "msg_index": 0, + "signer_index": 1, + "comment": "Wrong signer" + }, + { + "sig": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", + "key_indices": [0, 1, 2], + "nonce_indices": [0, 1, 2], + "msg_index": 0, + "signer_index": 0, + "comment": "Signature exceeds group size" + } + ], + "verify_error_test_cases": [ + { + "sig": "68537CC5234E505BD14061F8DA9E90C220A181855FD8BDB7F127BB12403B4D3B", + "key_indices": [0, 1, 2], + "nonce_indices": [4, 1, 2], + "msg_index": 0, + "signer_index": 0, + "error": { + "type": "invalid_contribution", + "signer": 0, + "contrib": "pubnonce" + }, + "comment": "Invalid pubnonce" + }, + { + "sig": "68537CC5234E505BD14061F8DA9E90C220A181855FD8BDB7F127BB12403B4D3B", + "key_indices": [3, 1, 2], + "nonce_indices": [0, 1, 2], + "msg_index": 0, + "signer_index": 0, + "error": { + "type": "invalid_contribution", + "signer": 0, + "contrib": "pubkey" + }, + "comment": "Invalid pubkey" + } + ] +} diff --git a/btcec/schnorr/musig2/data/tweak_vectors.json b/btcec/schnorr/musig2/data/tweak_vectors.json new file mode 100644 index 0000000000..d0a7cfe832 --- /dev/null +++ b/btcec/schnorr/musig2/data/tweak_vectors.json @@ -0,0 +1,84 @@ +{ + "sk": "7FB9E0E687ADA1EEBF7ECFE2F21E73EBDB51A7D450948DFE8D76D7F2D1007671", + "pubkeys": [ + "03935F972DA013F80AE011890FA89B67A27B7BE6CCB24D3274D18B2D4067F261A9", + "02F9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9", + "02DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659" + ], + "secnonce": "508B81A611F100A6B2B6B29656590898AF488BCF2E1F55CF22E5CFB84421FE61FA27FD49B1D50085B481285E1CA205D55C82CC1B31FF5CD54A489829355901F703935F972DA013F80AE011890FA89B67A27B7BE6CCB24D3274D18B2D4067F261A9", + "pnonces": [ + "0337C87821AFD50A8644D820A8F3E02E499C931865C2360FB43D0A0D20DAFE07EA0287BF891D2A6DEAEBADC909352AA9405D1428C15F4B75F04DAE642A95C2548480", + "0279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F817980279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", + "032DE2662628C90B03F5E720284EB52FF7D71F4284F627B68A853D78C78E1FFE9303E4C5524E83FFE1493B9077CF1CA6BEB2090C93D930321071AD40B2F44E599046" + ], + "aggnonce": "028465FCF0BBDBCF443AABCCE533D42B4B5A10966AC09A49655E8C42DAAB8FCD61037496A3CC86926D452CAFCFD55D25972CA1675D549310DE296BFF42F72EEEA8C9", + "tweaks": [ + "E8F791FF9225A2AF0102AFFF4A9A723D9612A682A25EBE79802B263CDFCD83BB", + "AE2EA797CC0FE72AC5B97B97F3C6957D7E4199A167A58EB08BCAFFDA70AC0455", + "F52ECBC565B3D8BEA2DFD5B75A4F457E54369809322E4120831626F290FA87E0", + "1969AD73CC177FA0B4FCED6DF1F7BF9907E665FDE9BA196A74FED0A3CF5AEF9D", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141" + ], + "msg": "F95466D086770E689964664219266FE5ED215C92AE20BAB5C9D79ADDDDF3C0CF", + "valid_test_cases": [ + { + "key_indices": [1, 2, 0], + "nonce_indices": [1, 2, 0], + "tweak_indices": [0], + "is_xonly": [true], + "signer_index": 2, + "expected": "E28A5C66E61E178C2BA19DB77B6CF9F7E2F0F56C17918CD13135E60CC848FE91", + "comment": "A single x-only tweak" + }, + { + "key_indices": [1, 2, 0], + "nonce_indices": [1, 2, 0], + "tweak_indices": [0], + "is_xonly": [false], + "signer_index": 2, + "expected": "38B0767798252F21BF5702C48028B095428320F73A4B14DB1E25DE58543D2D2D", + "comment": "A single plain tweak" + }, + { + "key_indices": [1, 2, 0], + "nonce_indices": [1, 2, 0], + "tweak_indices": [0, 1], + "is_xonly": [false, true], + "signer_index": 2, + "expected": "408A0A21C4A0F5DACAF9646AD6EB6FECD7F7A11F03ED1F48DFFF2185BC2C2408", + "comment": "A plain tweak followed by an x-only tweak" + }, + { + "key_indices": [1, 2, 0], + "nonce_indices": [1, 2, 0], + "tweak_indices": [0, 1, 2, 3], + "is_xonly": [false, false, true, true], + "signer_index": 2, + "expected": "45ABD206E61E3DF2EC9E264A6FEC8292141A633C28586388235541F9ADE75435", + "comment": "Four tweaks: plain, plain, x-only, x-only." + }, + { + "key_indices": [1, 2, 0], + "nonce_indices": [1, 2, 0], + "tweak_indices": [0, 1, 2, 3], + "is_xonly": [true, false, true, false], + "signer_index": 2, + "expected": "B255FDCAC27B40C7CE7848E2D3B7BF5EA0ED756DA81565AC804CCCA3E1D5D239", + "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." + } + ], + "error_test_cases": [ + { + "key_indices": [1, 2, 0], + "nonce_indices": [1, 2, 0], + "tweak_indices": [4], + "is_xonly": [false], + "signer_index": 2, + "error": { + "type": "value", + "message": "The tweak must be less than n." + }, + "comment": "Tweak is invalid because it exceeds group size" + } + ] +} diff --git a/btcec/schnorr/musig2/keys.go b/btcec/schnorr/musig2/keys.go new file mode 100644 index 0000000000..4ee63be2eb --- /dev/null +++ b/btcec/schnorr/musig2/keys.go @@ -0,0 +1,457 @@ +// Copyright 2013-2022 The btcsuite developers + +package musig2 + +import ( + "bytes" + "fmt" + "sort" + + secp "github.com/decred/dcrd/dcrec/secp256k1/v4" + + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcec/v2/schnorr" + "github.com/btcsuite/btcd/chaincfg/chainhash" +) + +var ( + // KeyAggTagList is the tagged hash tag used to compute the hash of the + // list of sorted public keys. + KeyAggTagList = []byte("KeyAgg list") + + // KeyAggTagCoeff is the tagged hash tag used to compute the key + // aggregation coefficient for each key. + KeyAggTagCoeff = []byte("KeyAgg coefficient") + + // ErrTweakedKeyIsInfinity is returned if while tweaking a key, we end + // up with the point at infinity. + ErrTweakedKeyIsInfinity = fmt.Errorf("tweaked key is infinity point") + + // ErrTweakedKeyOverflows is returned if a tweaking key is larger than + // 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141. + ErrTweakedKeyOverflows = fmt.Errorf("tweaked key is too large") +) + +// sortableKeys defines a type of slice of public keys that implements the sort +// interface for BIP 340 keys. +type sortableKeys []*btcec.PublicKey + +// Less reports whether the element with index i must sort before the element +// with index j. +func (s sortableKeys) Less(i, j int) bool { + // TODO(roasbeef): more efficient way to compare... + keyIBytes := s[i].SerializeCompressed() + keyJBytes := s[j].SerializeCompressed() + + return bytes.Compare(keyIBytes, keyJBytes) == -1 +} + +// Swap swaps the elements with indexes i and j. +func (s sortableKeys) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +// Len is the number of elements in the collection. +func (s sortableKeys) Len() int { + return len(s) +} + +// sortKeys takes a set of public keys and returns a new slice that is a copy +// of the keys sorted in lexicographical order bytes on the x-only pubkey +// serialization. +func sortKeys(keys []*btcec.PublicKey) []*btcec.PublicKey { + keySet := sortableKeys(keys) + if sort.IsSorted(keySet) { + return keys + } + + sort.Sort(keySet) + return keySet +} + +// keyHashFingerprint computes the tagged hash of the series of (sorted) public +// keys passed as input. This is used to compute the aggregation coefficient +// for each key. The final computation is: +// - H(tag=KeyAgg list, pk1 || pk2..) +func keyHashFingerprint(keys []*btcec.PublicKey, sort bool) []byte { + if sort { + keys = sortKeys(keys) + } + + // We'll create a single buffer and slice into that so the bytes buffer + // doesn't continually need to grow the underlying buffer. + keyAggBuf := make([]byte, 33*len(keys)) + keyBytes := bytes.NewBuffer(keyAggBuf[0:0]) + for _, key := range keys { + keyBytes.Write(key.SerializeCompressed()) + } + + h := chainhash.TaggedHash(KeyAggTagList, keyBytes.Bytes()) + return h[:] +} + +// keyBytesEqual returns true if two keys are the same based on the compressed +// serialization of each key. +func keyBytesEqual(a, b *btcec.PublicKey) bool { + return bytes.Equal(a.SerializeCompressed(), b.SerializeCompressed()) +} + +// aggregationCoefficient computes the key aggregation coefficient for the +// specified target key. The coefficient is computed as: +// - H(tag=KeyAgg coefficient, keyHashFingerprint(pks) || pk) +func aggregationCoefficient(keySet []*btcec.PublicKey, + targetKey *btcec.PublicKey, keysHash []byte, + secondKeyIdx int) *btcec.ModNScalar { + + var mu btcec.ModNScalar + + // If this is the second key, then this coefficient is just one. + if secondKeyIdx != -1 && keyBytesEqual(keySet[secondKeyIdx], targetKey) { + return mu.SetInt(1) + } + + // Otherwise, we'll compute the full finger print hash for this given + // key and then use that to compute the coefficient tagged hash: + // * H(tag=KeyAgg coefficient, keyHashFingerprint(pks, pk) || pk) + var coefficientBytes [65]byte + copy(coefficientBytes[:], keysHash[:]) + copy(coefficientBytes[32:], targetKey.SerializeCompressed()) + + muHash := chainhash.TaggedHash(KeyAggTagCoeff, coefficientBytes[:]) + + mu.SetByteSlice(muHash[:]) + + return &mu +} + +// secondUniqueKeyIndex returns the index of the second unique key. If all keys +// are the same, then a value of -1 is returned. +func secondUniqueKeyIndex(keySet []*btcec.PublicKey, sort bool) int { + if sort { + keySet = sortKeys(keySet) + } + + // Find the first key that isn't the same as the very first key (second + // unique key). + for i := range keySet { + if !keyBytesEqual(keySet[i], keySet[0]) { + return i + } + } + + // A value of negative one is used to indicate that all the keys in the + // sign set are actually equal, which in practice actually makes musig2 + // useless, but we need a value to distinguish this case. + return -1 +} + +// KeyTweakDesc describes a tweak to be applied to the aggregated public key +// generation and signing process. The IsXOnly specifies if the target key +// should be converted to an x-only public key before tweaking. +type KeyTweakDesc struct { + // Tweak is the 32-byte value that will modify the public key. + Tweak [32]byte + + // IsXOnly if true, then the public key will be mapped to an x-only key + // before the tweaking operation is applied. + IsXOnly bool +} + +// KeyAggOption is a functional option argument that allows callers to specify +// more or less information that has been pre-computed to the main routine. +type KeyAggOption func(*keyAggOption) + +// keyAggOption houses the set of functional options that modify key +// aggregation. +type keyAggOption struct { + // keyHash is the output of keyHashFingerprint for a given set of keys. + keyHash []byte + + // uniqueKeyIndex is the pre-computed index of the second unique key. + uniqueKeyIndex *int + + // tweaks specifies a series of tweaks to be applied to the aggregated + // public key. + tweaks []KeyTweakDesc + + // taprootTweak controls if the tweaks above should be applied in a BIP + // 340 style. + taprootTweak bool + + // bip86Tweak specifies that the taproot tweak should be done in a BIP + // 86 style, where we don't expect an actual tweak and instead just + // commit to the public key itself. + bip86Tweak bool +} + +// WithKeysHash allows key aggregation to be optimize, by allowing the caller +// to specify the hash of all the keys. +func WithKeysHash(keyHash []byte) KeyAggOption { + return func(o *keyAggOption) { + o.keyHash = keyHash + } +} + +// WithUniqueKeyIndex allows the caller to specify the index of the second +// unique key. +func WithUniqueKeyIndex(idx int) KeyAggOption { + return func(o *keyAggOption) { + i := idx + o.uniqueKeyIndex = &i + } +} + +// WithKeyTweaks allows a caller to specify a series of 32-byte tweaks that +// should be applied to the final aggregated public key. +func WithKeyTweaks(tweaks ...KeyTweakDesc) KeyAggOption { + return func(o *keyAggOption) { + o.tweaks = tweaks + } +} + +// WithTaprootKeyTweak specifies that within this context, the final key should +// use the taproot tweak as defined in BIP 341: outputKey = internalKey + +// h_tapTweak(internalKey || scriptRoot). In this case, the aggregated key +// before the tweak will be used as the internal key. +// +// This option should be used instead of WithKeyTweaks when the aggregated key +// is intended to be used as a taproot output key that commits to a script +// root. +func WithTaprootKeyTweak(scriptRoot []byte) KeyAggOption { + return func(o *keyAggOption) { + var tweak [32]byte + copy(tweak[:], scriptRoot[:]) + + o.tweaks = []KeyTweakDesc{ + { + Tweak: tweak, + IsXOnly: true, + }, + } + o.taprootTweak = true + } +} + +// WithBIP86KeyTweak specifies that then during key aggregation, the BIP 86 +// tweak which just commits to the hash of the serialized public key should be +// used. This option should be used when signing with a key that was derived +// using BIP 86. +func WithBIP86KeyTweak() KeyAggOption { + return func(o *keyAggOption) { + o.tweaks = []KeyTweakDesc{ + { + IsXOnly: true, + }, + } + o.taprootTweak = true + o.bip86Tweak = true + } +} + +// defaultKeyAggOptions returns the set of default arguments for key +// aggregation. +func defaultKeyAggOptions() *keyAggOption { + return &keyAggOption{} +} + +// hasEvenY returns true if the affine representation of the passed jacobian +// point has an even y coordinate. +// +// TODO(roasbeef): double check, can just check the y coord even not jacobian? +func hasEvenY(pJ btcec.JacobianPoint) bool { + pJ.ToAffine() + p := btcec.NewPublicKey(&pJ.X, &pJ.Y) + keyBytes := p.SerializeCompressed() + return keyBytes[0] == secp.PubKeyFormatCompressedEven +} + +// tweakKey applies a tweaks to the passed public key using the specified +// tweak. The parityAcc and tweakAcc are returned (in that order) which +// includes the accumulate ration of the parity factor and the tweak multiplied +// by the parity factor. The xOnly bool specifies if this is to be an x-only +// tweak or not. +func tweakKey(keyJ btcec.JacobianPoint, parityAcc btcec.ModNScalar, tweak [32]byte, + tweakAcc btcec.ModNScalar, + xOnly bool) (btcec.JacobianPoint, btcec.ModNScalar, btcec.ModNScalar, error) { + + // First we'll compute the new parity factor for this key. If the key has + // an odd y coordinate (not even), then we'll need to negate it (multiply + // by -1 mod n, in this case). + var parityFactor btcec.ModNScalar + if xOnly && !hasEvenY(keyJ) { + parityFactor.SetInt(1).Negate() + } else { + parityFactor.SetInt(1) + } + + // Next, map the tweak into a mod n integer so we can use it for + // manipulations below. + tweakInt := new(btcec.ModNScalar) + overflows := tweakInt.SetBytes(&tweak) + if overflows == 1 { + return keyJ, parityAcc, tweakAcc, ErrTweakedKeyOverflows + } + + // Next, we'll compute: Q_i = g*Q + t*G, where g is our parityFactor and t + // is the tweakInt above. We'll space things out a bit to make it easier to + // follow. + // + // First compute t*G: + var tweakedGenerator btcec.JacobianPoint + btcec.ScalarBaseMultNonConst(tweakInt, &tweakedGenerator) + + // Next compute g*Q: + btcec.ScalarMultNonConst(&parityFactor, &keyJ, &keyJ) + + // Finally add both of them together to get our final + // tweaked point. + btcec.AddNonConst(&tweakedGenerator, &keyJ, &keyJ) + + // As a sanity check, make sure that we didn't just end up with the + // point at infinity. + if keyJ == infinityPoint { + return keyJ, parityAcc, tweakAcc, ErrTweakedKeyIsInfinity + } + + // As a final wrap up step, we'll accumulate the parity + // factor and also this tweak into the final set of accumulators. + parityAcc.Mul(&parityFactor) + tweakAcc.Mul(&parityFactor).Add(tweakInt) + + return keyJ, parityAcc, tweakAcc, nil +} + +// AggregateKey is a final aggregated key along with a possible version of the +// key without any tweaks applied. +type AggregateKey struct { + // FinalKey is the final aggregated key which may include one or more + // tweaks applied to it. + FinalKey *btcec.PublicKey + + // PreTweakedKey is the aggregated *before* any tweaks have been + // applied. This should be used as the internal key in taproot + // contexts. + PreTweakedKey *btcec.PublicKey +} + +// AggregateKeys takes a list of possibly unsorted keys and returns a single +// aggregated key as specified by the musig2 key aggregation algorithm. A nil +// value can be passed for keyHash, which causes this function to re-derive it. +// In addition to the combined public key, the parity accumulator and the tweak +// accumulator are returned as well. +func AggregateKeys(keys []*btcec.PublicKey, sort bool, + keyOpts ...KeyAggOption) ( + *AggregateKey, *btcec.ModNScalar, *btcec.ModNScalar, error) { + + // First, parse the set of optional signing options. + opts := defaultKeyAggOptions() + for _, option := range keyOpts { + option(opts) + } + + // Sort the set of public key so we know we're working with them in + // sorted order for all the routines below. + if sort { + keys = sortKeys(keys) + } + + // The caller may provide the hash of all the keys as an optimization + // during signing, as it already needs to be computed. + if opts.keyHash == nil { + opts.keyHash = keyHashFingerprint(keys, sort) + } + + // A caller may also specify the unique key index themselves so we + // don't need to re-compute it. + if opts.uniqueKeyIndex == nil { + idx := secondUniqueKeyIndex(keys, sort) + opts.uniqueKeyIndex = &idx + } + + // For each key, we'll compute the intermediate blinded key: a_i*P_i, + // where a_i is the aggregation coefficient for that key, and P_i is + // the key itself, then accumulate that (addition) into the main final + // key: P = P_1 + P_2 ... P_N. + var finalKeyJ btcec.JacobianPoint + for _, key := range keys { + // Port the key over to Jacobian coordinates as we need it in + // this format for the routines below. + var keyJ btcec.JacobianPoint + key.AsJacobian(&keyJ) + + // Compute the aggregation coefficient for the key, then + // multiply it by the key itself: P_i' = a_i*P_i. + var tweakedKeyJ btcec.JacobianPoint + a := aggregationCoefficient( + keys, key, opts.keyHash, *opts.uniqueKeyIndex, + ) + btcec.ScalarMultNonConst(a, &keyJ, &tweakedKeyJ) + + // Finally accumulate this into the final key in an incremental + // fashion. + btcec.AddNonConst(&finalKeyJ, &tweakedKeyJ, &finalKeyJ) + } + + // We'll copy over the key at this point, since this represents the + // aggregated key before any tweaks have been applied. This'll be used + // as the internal key for script path proofs. + finalKeyJ.ToAffine() + combinedKey := btcec.NewPublicKey(&finalKeyJ.X, &finalKeyJ.Y) + + // At this point, if this is a taproot tweak, then we'll modify the + // base tweak value to use the BIP 341 tweak value. + if opts.taprootTweak { + // Emulate the same behavior as txscript.ComputeTaprootOutputKey + // which only operates on the x-only public key. + key, _ := schnorr.ParsePubKey(schnorr.SerializePubKey( + combinedKey, + )) + + // We only use the actual tweak bytes if we're not committing + // to a BIP-0086 key only spend output. Otherwise, we just + // commit to the internal key and an empty byte slice as the + // root hash. + tweakBytes := []byte{} + if !opts.bip86Tweak { + tweakBytes = opts.tweaks[0].Tweak[:] + } + + // Compute the taproot key tagged hash of: + // h_tapTweak(internalKey || scriptRoot). We only do this for + // the first one, as you can only specify a single tweak when + // using the taproot mode with this API. + tapTweakHash := chainhash.TaggedHash( + chainhash.TagTapTweak, schnorr.SerializePubKey(key), + tweakBytes, + ) + opts.tweaks[0].Tweak = *tapTweakHash + } + + var ( + err error + tweakAcc btcec.ModNScalar + parityAcc btcec.ModNScalar + ) + parityAcc.SetInt(1) + + // In this case we have a set of tweaks, so we'll incrementally apply + // each one, until we have our final tweaked key, and the related + // accumulators. + for i := 1; i <= len(opts.tweaks); i++ { + finalKeyJ, parityAcc, tweakAcc, err = tweakKey( + finalKeyJ, parityAcc, opts.tweaks[i-1].Tweak, tweakAcc, + opts.tweaks[i-1].IsXOnly, + ) + if err != nil { + return nil, nil, nil, err + } + } + + finalKeyJ.ToAffine() + finalKey := btcec.NewPublicKey(&finalKeyJ.X, &finalKeyJ.Y) + + return &AggregateKey{ + PreTweakedKey: combinedKey, + FinalKey: finalKey, + }, &parityAcc, &tweakAcc, nil +} diff --git a/btcec/schnorr/musig2/keys_test.go b/btcec/schnorr/musig2/keys_test.go new file mode 100644 index 0000000000..9eb16b537f --- /dev/null +++ b/btcec/schnorr/musig2/keys_test.go @@ -0,0 +1,394 @@ +// Copyright 2013-2022 The btcsuite developers + +package musig2 + +import ( + "encoding/hex" + "encoding/json" + "fmt" + "os" + "path" + "strings" + "testing" + + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcec/v2/schnorr" + secp "github.com/decred/dcrd/dcrec/secp256k1/v4" + "github.com/stretchr/testify/require" +) + +const ( + keySortTestVectorFileName = "key_sort_vectors.json" + + keyAggTestVectorFileName = "key_agg_vectors.json" + + keyTweakTestVectorFileName = "tweak_vectors.json" +) + +type keySortTestVector struct { + PubKeys []string `json:"pubkeys"` + + SortedKeys []string `json:"sorted_pubkeys"` +} + +// TestMusig2KeySort tests that keys are properly sorted according to the +// musig2 test vectors. +func TestMusig2KeySort(t *testing.T) { + t.Parallel() + + testVectorPath := path.Join( + testVectorBaseDir, keySortTestVectorFileName, + ) + testVectorBytes, err := os.ReadFile(testVectorPath) + require.NoError(t, err) + + var testCase keySortTestVector + require.NoError(t, json.Unmarshal(testVectorBytes, &testCase)) + + keys := make([]*btcec.PublicKey, len(testCase.PubKeys)) + for i, keyStr := range testCase.PubKeys { + pubKey, err := btcec.ParsePubKey(mustParseHex(keyStr)) + require.NoError(t, err) + + keys[i] = pubKey + } + + sortedKeys := sortKeys(keys) + + expectedKeys := make([]*btcec.PublicKey, len(testCase.PubKeys)) + for i, keyStr := range testCase.SortedKeys { + pubKey, err := btcec.ParsePubKey(mustParseHex(keyStr)) + require.NoError(t, err) + + expectedKeys[i] = pubKey + } + + require.Equal(t, sortedKeys, expectedKeys) +} + +type keyAggValidTest struct { + Indices []int `json:"key_indices"` + Expected string `json:"expected"` +} + +type keyAggError struct { + Type string `json:"type"` + Signer int `json:"signer"` + Contring string `json:"contrib"` +} + +type keyAggInvalidTest struct { + Indices []int `json:"key_indices"` + + TweakIndices []int `json:"tweak_indices"` + + IsXOnly []bool `json:"is_xonly"` + + Comment string `json:"comment"` +} + +type keyAggTestVectors struct { + PubKeys []string `json:"pubkeys"` + + Tweaks []string `json:"tweaks"` + + ValidCases []keyAggValidTest `json:"valid_test_cases"` + + InvalidCases []keyAggInvalidTest `json:"error_test_cases"` +} + +func keysFromIndices(t *testing.T, indices []int, + pubKeys []string) ([]*btcec.PublicKey, error) { + + t.Helper() + + inputKeys := make([]*btcec.PublicKey, len(indices)) + for i, keyIdx := range indices { + var err error + inputKeys[i], err = btcec.ParsePubKey( + mustParseHex(pubKeys[keyIdx]), + ) + if err != nil { + return nil, err + } + } + + return inputKeys, nil +} + +func tweaksFromIndices(t *testing.T, indices []int, + tweaks []string, isXonly []bool) []KeyTweakDesc { + + t.Helper() + + testTweaks := make([]KeyTweakDesc, len(indices)) + for i, idx := range indices { + var rawTweak [32]byte + copy(rawTweak[:], mustParseHex(tweaks[idx])) + + testTweaks[i] = KeyTweakDesc{ + Tweak: rawTweak, + IsXOnly: isXonly[i], + } + } + + return testTweaks +} + +// TestMuSig2KeyAggTestVectors tests that this implementation of musig2 key +// aggregation lines up with the secp256k1-zkp test vectors. +func TestMuSig2KeyAggTestVectors(t *testing.T) { + t.Parallel() + + testVectorPath := path.Join( + testVectorBaseDir, keyAggTestVectorFileName, + ) + testVectorBytes, err := os.ReadFile(testVectorPath) + require.NoError(t, err) + + var testCases keyAggTestVectors + require.NoError(t, json.Unmarshal(testVectorBytes, &testCases)) + + tweaks := make([][]byte, len(testCases.Tweaks)) + for i := range testCases.Tweaks { + tweaks[i] = mustParseHex(testCases.Tweaks[i]) + } + + for i, testCase := range testCases.ValidCases { + testCase := testCase + + // Assemble the set of keys we'll pass in based on their key + // index. We don't use sorting to ensure we send the keys in + // the exact same order as the test vectors do. + inputKeys, err := keysFromIndices( + t, testCase.Indices, testCases.PubKeys, + ) + require.NoError(t, err) + + t.Run(fmt.Sprintf("test_case=%v", i), func(t *testing.T) { + uniqueKeyIndex := secondUniqueKeyIndex(inputKeys, false) + opts := []KeyAggOption{WithUniqueKeyIndex(uniqueKeyIndex)} + + combinedKey, _, _, err := AggregateKeys( + inputKeys, false, opts..., + ) + require.NoError(t, err) + + require.Equal( + t, schnorr.SerializePubKey(combinedKey.FinalKey), + mustParseHex(testCase.Expected), + ) + }) + } + + for _, testCase := range testCases.InvalidCases { + testCase := testCase + + testName := fmt.Sprintf("invalid_%v", + strings.ToLower(testCase.Comment)) + t.Run(testName, func(t *testing.T) { + // For each test, we'll extract the set of input keys + // as well as the tweaks since this set of cases also + // exercises error cases related to the set of tweaks. + inputKeys, err := keysFromIndices( + t, testCase.Indices, testCases.PubKeys, + ) + + // In this set of test cases, we should only get this + // for the very first vector. + if err != nil { + switch testCase.Comment { + case "Invalid public key": + require.ErrorIs( + t, err, + secp.ErrPubKeyNotOnCurve, + ) + + case "Public key exceeds field size": + require.ErrorIs( + t, err, secp.ErrPubKeyXTooBig, + ) + + case "First byte of public key is not 2 or 3": + require.ErrorIs( + t, err, + secp.ErrPubKeyInvalidFormat, + ) + + default: + t.Fatalf("uncaught err: %v", err) + } + + return + } + + var tweaks []KeyTweakDesc + if len(testCase.TweakIndices) != 0 { + tweaks = tweaksFromIndices( + t, testCase.TweakIndices, testCases.Tweaks, + testCase.IsXOnly, + ) + } + + uniqueKeyIndex := secondUniqueKeyIndex(inputKeys, false) + opts := []KeyAggOption{ + WithUniqueKeyIndex(uniqueKeyIndex), + } + + if len(tweaks) != 0 { + opts = append(opts, WithKeyTweaks(tweaks...)) + } + + _, _, _, err = AggregateKeys( + inputKeys, false, opts..., + ) + require.Error(t, err) + + switch testCase.Comment { + case "Tweak is out of range": + require.ErrorIs(t, err, ErrTweakedKeyOverflows) + + case "Intermediate tweaking result is point at infinity": + + require.ErrorIs(t, err, ErrTweakedKeyIsInfinity) + + default: + t.Fatalf("uncaught err: %v", err) + } + }) + } +} + +type keyTweakInvalidTest struct { + Indices []int `json:"key_indices"` + + NonceIndices []int `json:"nonce_indices"` + + TweakIndices []int `json:"tweak_indices"` + + IsXOnly []bool `json:"is_only"` + + SignerIndex int `json:"signer_index"` + + Comment string `json:"comment"` +} + +type keyTweakValidTest struct { + Indices []int `json:"key_indices"` + + NonceIndices []int `json:"nonce_indices"` + + TweakIndices []int `json:"tweak_indices"` + + IsXOnly []bool `json:"is_xonly"` + + SignerIndex int `json:"signer_index"` + + Expected string `json:"expected"` + + Comment string `json:"comment"` +} + +type keyTweakVector struct { + PrivKey string `json:"sk"` + + PubKeys []string `json:"pubkeys"` + + PrivNonce string `json:"secnonce"` + + PubNonces []string `json:"pnonces"` + + AggNnoce string `json:"aggnonce"` + + Tweaks []string `json:"tweaks"` + + Msg string `json:"msg"` + + ValidCases []keyTweakValidTest `json:"valid_test_cases"` + + InvalidCases []keyTweakInvalidTest `json:"error_test_cases"` +} + +func pubNoncesFromIndices(t *testing.T, nonceIndices []int, pubNonces []string) [][PubNonceSize]byte { + + nonces := make([][PubNonceSize]byte, len(nonceIndices)) + + for i, idx := range nonceIndices { + var pubNonce [PubNonceSize]byte + copy(pubNonce[:], mustParseHex(pubNonces[idx])) + + nonces[i] = pubNonce + } + + return nonces +} + +// TestMuSig2TweakTestVectors tests that we properly handle the various edge +// cases related to tweaking public keys. +func TestMuSig2TweakTestVectors(t *testing.T) { + t.Parallel() + + testVectorPath := path.Join( + testVectorBaseDir, keyTweakTestVectorFileName, + ) + testVectorBytes, err := os.ReadFile(testVectorPath) + require.NoError(t, err) + + var testCases keyTweakVector + require.NoError(t, json.Unmarshal(testVectorBytes, &testCases)) + + privKey, _ := btcec.PrivKeyFromBytes(mustParseHex(testCases.PrivKey)) + + var msg [32]byte + copy(msg[:], mustParseHex(testCases.Msg)) + + var secNonce [SecNonceSize]byte + copy(secNonce[:], mustParseHex(testCases.PrivNonce)) + + for _, testCase := range testCases.ValidCases { + testCase := testCase + + testName := fmt.Sprintf("valid_%v", + strings.ToLower(testCase.Comment)) + t.Run(testName, func(t *testing.T) { + pubKeys, err := keysFromIndices( + t, testCase.Indices, testCases.PubKeys, + ) + require.NoError(t, err) + + var tweaks []KeyTweakDesc + if len(testCase.TweakIndices) != 0 { + tweaks = tweaksFromIndices( + t, testCase.TweakIndices, + testCases.Tweaks, testCase.IsXOnly, + ) + } + + pubNonces := pubNoncesFromIndices( + t, testCase.NonceIndices, testCases.PubNonces, + ) + + combinedNonce, err := AggregateNonces(pubNonces) + require.NoError(t, err) + + var opts []SignOption + if len(tweaks) != 0 { + opts = append(opts, WithTweaks(tweaks...)) + } + + partialSig, err := Sign( + secNonce, privKey, combinedNonce, pubKeys, + msg, opts..., + ) + + var partialSigBytes [32]byte + partialSig.S.PutBytesUnchecked(partialSigBytes[:]) + + require.Equal( + t, hex.EncodeToString(partialSigBytes[:]), + hex.EncodeToString(mustParseHex(testCase.Expected)), + ) + + }) + } +} diff --git a/btcec/schnorr/musig2/musig2_test.go b/btcec/schnorr/musig2/musig2_test.go new file mode 100644 index 0000000000..dfd48f3e82 --- /dev/null +++ b/btcec/schnorr/musig2/musig2_test.go @@ -0,0 +1,441 @@ +// Copyright 2013-2022 The btcsuite developers + +package musig2 + +import ( + "crypto/sha256" + "encoding/hex" + "errors" + "fmt" + "sync" + "testing" + + "github.com/btcsuite/btcd/btcec/v2" +) + +const ( + testVectorBaseDir = "data" +) + +func mustParseHex(str string) []byte { + b, err := hex.DecodeString(str) + if err != nil { + panic(fmt.Errorf("unable to parse hex: %v", err)) + } + + return b +} + +type signer struct { + privKey *btcec.PrivateKey + pubKey *btcec.PublicKey + + nonces *Nonces + + partialSig *PartialSignature +} + +type signerSet []signer + +func (s signerSet) keys() []*btcec.PublicKey { + keys := make([]*btcec.PublicKey, len(s)) + for i := 0; i < len(s); i++ { + keys[i] = s[i].pubKey + } + + return keys +} + +func (s signerSet) partialSigs() []*PartialSignature { + sigs := make([]*PartialSignature, len(s)) + for i := 0; i < len(s); i++ { + sigs[i] = s[i].partialSig + } + + return sigs +} + +func (s signerSet) pubNonces() [][PubNonceSize]byte { + nonces := make([][PubNonceSize]byte, len(s)) + for i := 0; i < len(s); i++ { + nonces[i] = s[i].nonces.PubNonce + } + + return nonces +} + +func (s signerSet) combinedKey() *btcec.PublicKey { + uniqueKeyIndex := secondUniqueKeyIndex(s.keys(), false) + key, _, _, _ := AggregateKeys( + s.keys(), false, WithUniqueKeyIndex(uniqueKeyIndex), + ) + return key.FinalKey +} + +// testMultiPartySign executes a multi-party signing context w/ 100 signers. +func testMultiPartySign(t *testing.T, taprootTweak []byte, + tweaks ...KeyTweakDesc) { + + const numSigners = 100 + + // First generate the set of signers along with their public keys. + signerKeys := make([]*btcec.PrivateKey, numSigners) + signSet := make([]*btcec.PublicKey, numSigners) + for i := 0; i < numSigners; i++ { + privKey, err := btcec.NewPrivateKey() + if err != nil { + t.Fatalf("unable to gen priv key: %v", err) + } + + pubKey := privKey.PubKey() + + signerKeys[i] = privKey + signSet[i] = pubKey + } + + var combinedKey *btcec.PublicKey + + var ctxOpts []ContextOption + switch { + case len(taprootTweak) == 0: + ctxOpts = append(ctxOpts, WithBip86TweakCtx()) + case taprootTweak != nil: + ctxOpts = append(ctxOpts, WithTaprootTweakCtx(taprootTweak)) + case len(tweaks) != 0: + ctxOpts = append(ctxOpts, WithTweakedContext(tweaks...)) + } + + ctxOpts = append(ctxOpts, WithKnownSigners(signSet)) + + // Now that we have all the signers, we'll make a new context, then + // generate a new session for each of them(which handles nonce + // generation). + signers := make([]*Session, numSigners) + for i, signerKey := range signerKeys { + signCtx, err := NewContext( + signerKey, false, ctxOpts..., + ) + if err != nil { + t.Fatalf("unable to generate context: %v", err) + } + + if combinedKey == nil { + combinedKey, err = signCtx.CombinedKey() + if err != nil { + t.Fatalf("combined key not available: %v", err) + } + } + + session, err := signCtx.NewSession() + if err != nil { + t.Fatalf("unable to generate new session: %v", err) + } + signers[i] = session + } + + // Next, in the pre-signing phase, we'll send all the nonces to each + // signer. + var wg sync.WaitGroup + for i, signCtx := range signers { + signCtx := signCtx + + wg.Add(1) + go func(idx int, signer *Session) { + defer wg.Done() + + for j, otherCtx := range signers { + if idx == j { + continue + } + + nonce := otherCtx.PublicNonce() + haveAll, err := signer.RegisterPubNonce(nonce) + if err != nil { + t.Fatalf("unable to add public nonce") + } + + if j == len(signers)-1 && !haveAll { + t.Fatalf("all public nonces should have been detected") + } + } + }(i, signCtx) + } + + wg.Wait() + + msg := sha256.Sum256([]byte("let's get taprooty")) + + // In the final step, we'll use the first signer as our combiner, and + // generate a signature for each signer, and then accumulate that with + // the combiner. + combiner := signers[0] + for i := range signers { + signer := signers[i] + partialSig, err := signer.Sign(msg) + if err != nil { + t.Fatalf("unable to generate partial sig: %v", err) + } + + // We don't need to combine the signature for the very first + // signer, as it already has that partial signature. + if i != 0 { + haveAll, err := combiner.CombineSig(partialSig) + if err != nil { + t.Fatalf("unable to combine sigs: %v", err) + } + + if i == len(signers)-1 && !haveAll { + t.Fatalf("final sig wasn't reconstructed") + } + } + } + + // Finally we'll combined all the nonces, and ensure that it validates + // as a single schnorr signature. + finalSig := combiner.FinalSig() + if !finalSig.Verify(msg[:], combinedKey) { + t.Fatalf("final sig is invalid!") + } + + // Verify that if we try to sign again with any of the existing + // signers, then we'll get an error as the nonces have already been + // used. + for _, signer := range signers { + _, err := signer.Sign(msg) + if err != ErrSigningContextReuse { + t.Fatalf("expected to get signing context reuse") + } + } +} + +// TestMuSigMultiParty tests that for a given set of 100 signers, we're able to +// properly generate valid sub signatures, which ultimately can be combined +// into a single valid signature. +func TestMuSigMultiParty(t *testing.T) { + t.Parallel() + + testTweak := [32]byte{ + 0xE8, 0xF7, 0x91, 0xFF, 0x92, 0x25, 0xA2, 0xAF, + 0x01, 0x02, 0xAF, 0xFF, 0x4A, 0x9A, 0x72, 0x3D, + 0x96, 0x12, 0xA6, 0x82, 0xA2, 0x5E, 0xBE, 0x79, + 0x80, 0x2B, 0x26, 0x3C, 0xDF, 0xCD, 0x83, 0xBB, + } + + t.Run("no_tweak", func(t *testing.T) { + t.Parallel() + + testMultiPartySign(t, nil) + }) + + t.Run("tweaked", func(t *testing.T) { + t.Parallel() + + testMultiPartySign(t, nil, KeyTweakDesc{ + Tweak: testTweak, + }) + }) + + t.Run("tweaked_x_only", func(t *testing.T) { + t.Parallel() + + testMultiPartySign(t, nil, KeyTweakDesc{ + Tweak: testTweak, + IsXOnly: true, + }) + }) + + t.Run("taproot_tweaked_x_only", func(t *testing.T) { + t.Parallel() + + testMultiPartySign(t, testTweak[:]) + }) + + t.Run("taproot_bip_86", func(t *testing.T) { + t.Parallel() + + testMultiPartySign(t, []byte{}) + }) +} + +// TestMuSigEarlyNonce tests that for protocols where nonces need to be +// exchanged before all signers are known, the context API works as expected. +func TestMuSigEarlyNonce(t *testing.T) { + t.Parallel() + + privKey1, err := btcec.NewPrivateKey() + if err != nil { + t.Fatalf("unable to gen priv key: %v", err) + } + privKey2, err := btcec.NewPrivateKey() + if err != nil { + t.Fatalf("unable to gen priv key: %v", err) + } + + // If we try to make a context, with just the private key and sorting + // value, we should get an error. + _, err = NewContext(privKey1, true) + if !errors.Is(err, ErrSignersNotSpecified) { + t.Fatalf("unexpected ctx error: %v", err) + } + + signers := []*btcec.PublicKey{privKey1.PubKey(), privKey2.PubKey()} + numSigners := len(signers) + + ctx1, err := NewContext( + privKey1, true, WithNumSigners(numSigners), WithEarlyNonceGen(), + ) + if err != nil { + t.Fatalf("unable to make ctx: %v", err) + } + pubKey1 := ctx1.PubKey() + + ctx2, err := NewContext( + privKey2, true, WithKnownSigners(signers), WithEarlyNonceGen(), + ) + if err != nil { + t.Fatalf("unable to make ctx: %v", err) + } + pubKey2 := ctx2.PubKey() + + // At this point, the combined key shouldn't be available for signer 1, + // but should be for signer 2, as they know about all signers. + if _, err := ctx1.CombinedKey(); !errors.Is(err, ErrNotEnoughSigners) { + t.Fatalf("unepxected error: %v", err) + } + _, err = ctx2.CombinedKey() + if err != nil { + t.Fatalf("unable to get combined key: %v", err) + } + + // The early nonces _should_ be available at this point. + nonce1, err := ctx1.EarlySessionNonce() + if err != nil { + t.Fatalf("session nonce not available: %v", err) + } + nonce2, err := ctx2.EarlySessionNonce() + if err != nil { + t.Fatalf("session nonce not available: %v", err) + } + + // The number of registered signers should still be 1 for both parties. + if ctx1.NumRegisteredSigners() != 1 { + t.Fatalf("expected 1 signer, instead have: %v", + ctx1.NumRegisteredSigners()) + } + if ctx2.NumRegisteredSigners() != 2 { + t.Fatalf("expected 2 signers, instead have: %v", + ctx2.NumRegisteredSigners()) + } + + // If we try to make a session, we should get an error since we dn't + // have all the signers yet. + if _, err := ctx1.NewSession(); !errors.Is(err, ErrNotEnoughSigners) { + t.Fatalf("unexpected session key error: %v", err) + } + + // The combined key should also be unavailable as well. + if _, err := ctx1.CombinedKey(); !errors.Is(err, ErrNotEnoughSigners) { + t.Fatalf("unexpected combined key error: %v", err) + } + + // We'll now register the other signer for party 1. + done, err := ctx1.RegisterSigner(&pubKey2) + if err != nil { + t.Fatalf("unable to register signer: %v", err) + } + if !done { + t.Fatalf("signer 1 doesn't have all keys") + } + + // If we try to register the signer again, we should get an error. + _, err = ctx2.RegisterSigner(&pubKey1) + if !errors.Is(err, ErrAlreadyHaveAllSigners) { + t.Fatalf("should not be able to register too many signers") + } + + // We should be able to create the session at this point. + session1, err := ctx1.NewSession() + if err != nil { + t.Fatalf("unable to create new session: %v", err) + } + session2, err := ctx2.NewSession() + if err != nil { + t.Fatalf("unable to create new session: %v", err) + } + + msg := sha256.Sum256([]byte("let's get taprooty, LN style")) + + // If we try to sign before we have the combined nonce, we should get + // an error. + _, err = session1.Sign(msg) + if !errors.Is(err, ErrCombinedNonceUnavailable) { + t.Fatalf("unable to gen sig: %v", err) + } + + // Now we can exchange nonces to continue with the rest of the signing + // process as normal. + done, err = session1.RegisterPubNonce(nonce2.PubNonce) + if err != nil { + t.Fatalf("unable to register nonce: %v", err) + } + if !done { + t.Fatalf("signer 1 doesn't have all nonces") + } + done, err = session2.RegisterPubNonce(nonce1.PubNonce) + if err != nil { + t.Fatalf("unable to register nonce: %v", err) + } + if !done { + t.Fatalf("signer 2 doesn't have all nonces") + } + + // Registering the nonce again should error out. + _, err = session2.RegisterPubNonce(nonce1.PubNonce) + if !errors.Is(err, ErrAlredyHaveAllNonces) { + t.Fatalf("shouldn't be able to register nonces twice") + } + + // Sign the message and combine the two partial sigs into one. + _, err = session1.Sign(msg) + if err != nil { + t.Fatalf("unable to gen sig: %v", err) + } + sig2, err := session2.Sign(msg) + if err != nil { + t.Fatalf("unable to gen sig: %v", err) + } + done, err = session1.CombineSig(sig2) + if err != nil { + t.Fatalf("unable to combine sig: %v", err) + } + if !done { + t.Fatalf("all sigs should be known now: %v", err) + } + + // If we try to combine another sig, then we should get an error. + _, err = session1.CombineSig(sig2) + if !errors.Is(err, ErrAlredyHaveAllSigs) { + t.Fatalf("shouldn't be able to combine again") + } + + // Finally, verify that the final signature is valid. + combinedKey, err := ctx1.CombinedKey() + if err != nil { + t.Fatalf("unexpected combined key error: %v", err) + } + finalSig := session1.FinalSig() + if !finalSig.Verify(msg[:], combinedKey) { + t.Fatalf("final sig is invalid!") + } +} + +type memsetRandReader struct { + i int +} + +func (mr *memsetRandReader) Read(buf []byte) (n int, err error) { + for i := range buf { + buf[i] = byte(mr.i) + } + return len(buf), nil +} diff --git a/btcec/schnorr/musig2/nonces.go b/btcec/schnorr/musig2/nonces.go new file mode 100644 index 0000000000..dbe39ef3db --- /dev/null +++ b/btcec/schnorr/musig2/nonces.go @@ -0,0 +1,447 @@ +// Copyright 2013-2022 The btcsuite developers + +package musig2 + +import ( + "bytes" + "crypto/rand" + "encoding/binary" + "errors" + "io" + + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcec/v2/schnorr" + "github.com/btcsuite/btcd/chaincfg/chainhash" +) + +const ( + // PubNonceSize is the size of the public nonces. Each public nonce is + // serialized the full compressed encoding, which uses 32 bytes for each + // nonce. + PubNonceSize = 66 + + // SecNonceSize is the size of the secret nonces for musig2. The secret + // nonces are the corresponding private keys to the public nonce points. + SecNonceSize = 97 +) + +var ( + // NonceAuxTag is the tag used to optionally mix in the secret key with + // the set of aux randomness. + NonceAuxTag = []byte("MuSig/aux") + + // NonceGenTag is used to generate the value (from a set of required an + // optional field) that will be used as the part of the secret nonce. + NonceGenTag = []byte("MuSig/nonce") + + byteOrder = binary.BigEndian + + // ErrPubkeyInvalid is returned when the pubkey of the WithPublicKey + // option is not passed or of invalid length. + ErrPubkeyInvalid = errors.New("nonce generation requires a valid pubkey") +) + +// zeroSecNonce is a secret nonce that's all zeroes. This is used to check that +// we're not attempting to re-use a nonce, and also protect callers from it. +var zeroSecNonce [SecNonceSize]byte + +// Nonces holds the public and secret nonces required for musig2. +// +// TODO(roasbeef): methods on this to help w/ parsing, etc? +type Nonces struct { + // PubNonce holds the two 33-byte compressed encoded points that serve + // as the public set of nonces. + PubNonce [PubNonceSize]byte + + // SecNonce holds the two 32-byte scalar values that are the private + // keys to the two public nonces. + SecNonce [SecNonceSize]byte +} + +// secNonceToPubNonce takes our two secrete nonces, and produces their two +// corresponding EC points, serialized in compressed format. +func secNonceToPubNonce(secNonce [SecNonceSize]byte) [PubNonceSize]byte { + var k1Mod, k2Mod btcec.ModNScalar + k1Mod.SetByteSlice(secNonce[:btcec.PrivKeyBytesLen]) + k2Mod.SetByteSlice(secNonce[btcec.PrivKeyBytesLen:]) + + var r1, r2 btcec.JacobianPoint + btcec.ScalarBaseMultNonConst(&k1Mod, &r1) + btcec.ScalarBaseMultNonConst(&k2Mod, &r2) + + // Next, we'll convert the key in jacobian format to a normal public + // key expressed in affine coordinates. + r1.ToAffine() + r2.ToAffine() + r1Pub := btcec.NewPublicKey(&r1.X, &r1.Y) + r2Pub := btcec.NewPublicKey(&r2.X, &r2.Y) + + var pubNonce [PubNonceSize]byte + + // The public nonces are serialized as: R1 || R2, where both keys are + // serialized in compressed format. + copy(pubNonce[:], r1Pub.SerializeCompressed()) + copy( + pubNonce[btcec.PubKeyBytesLenCompressed:], + r2Pub.SerializeCompressed(), + ) + + return pubNonce +} + +// NonceGenOption is a function option that allows callers to modify how nonce +// generation happens. +type NonceGenOption func(*nonceGenOpts) + +// nonceGenOpts is the set of options that control how nonce generation +// happens. +type nonceGenOpts struct { + // randReader is what we'll use to generate a set of random bytes. If + // unspecified, then the normal crypto/rand rand.Read method will be + // used in place. + randReader io.Reader + + // publicKey is the mandatory public key that will be mixed into the nonce + // generation. + publicKey []byte + + // secretKey is an optional argument that's used to further augment the + // generated nonce by xor'ing it with this secret key. + secretKey []byte + + // combinedKey is an optional argument that if specified, will be + // combined along with the nonce generation. + combinedKey []byte + + // msg is an optional argument that will be mixed into the nonce + // derivation algorithm. + msg []byte + + // auxInput is an optional argument that will be mixed into the nonce + // derivation algorithm. + auxInput []byte +} + +// cryptoRandAdapter is an adapter struct that allows us to pass in the package +// level Read function from crypto/rand into a context that accepts an +// io.Reader. +type cryptoRandAdapter struct { +} + +// Read implements the io.Reader interface for the crypto/rand package. By +// default, we always use the crypto/rand reader, but the caller is able to +// specify their own generation, which can be useful for deterministic tests. +func (c *cryptoRandAdapter) Read(p []byte) (n int, err error) { + return rand.Read(p) +} + +// defaultNonceGenOpts returns the default set of nonce generation options. +func defaultNonceGenOpts() *nonceGenOpts { + return &nonceGenOpts{ + randReader: &cryptoRandAdapter{}, + } +} + +// WithCustomRand allows a caller to use a custom random number generator in +// place for crypto/rand. This should only really be used to generate +// deterministic tests. +func WithCustomRand(r io.Reader) NonceGenOption { + return func(o *nonceGenOpts) { + o.randReader = r + } +} + +// WithPublicKey is the mandatory public key that will be mixed into the nonce +// generation. +func WithPublicKey(pubKey *btcec.PublicKey) NonceGenOption { + return func(o *nonceGenOpts) { + o.publicKey = pubKey.SerializeCompressed() + } +} + +// WithNonceSecretKeyAux allows a caller to optionally specify a secret key +// that should be used to augment the randomness used to generate the nonces. +func WithNonceSecretKeyAux(secKey *btcec.PrivateKey) NonceGenOption { + return func(o *nonceGenOpts) { + o.secretKey = secKey.Serialize() + } +} + +// WithNonceCombinedKeyAux allows a caller to optionally specify the combined +// key used in this signing session to further augment the randomness used to +// generate nonces. +func WithNonceCombinedKeyAux(combinedKey *btcec.PublicKey) NonceGenOption { + return func(o *nonceGenOpts) { + o.combinedKey = schnorr.SerializePubKey(combinedKey) + } +} + +// WithNonceMessageAux allows a caller to optionally specify a message to be +// mixed into the randomness generated to create the nonce. +func WithNonceMessageAux(msg [32]byte) NonceGenOption { + return func(o *nonceGenOpts) { + o.msg = msg[:] + } +} + +// WithNonceAuxInput is a set of auxiliary randomness, similar to BIP 340 that +// can be used to further augment the nonce generation process. +func WithNonceAuxInput(aux []byte) NonceGenOption { + return func(o *nonceGenOpts) { + o.auxInput = aux + } +} + +// withCustomOptions allows a caller to pass a complete set of custom +// nonceGenOpts, without needing to create custom and checked structs such as +// *btcec.PrivateKey. This is mainly used to match the testcases provided by +// the MuSig2 BIP. +func withCustomOptions(customOpts nonceGenOpts) NonceGenOption { + return func(o *nonceGenOpts) { + o.randReader = customOpts.randReader + o.secretKey = customOpts.secretKey + o.combinedKey = customOpts.combinedKey + o.auxInput = customOpts.auxInput + o.msg = customOpts.msg + o.publicKey = customOpts.publicKey + } +} + +// lengthWriter is a function closure that allows a caller to control how the +// length prefix of a byte slice is written. +// +// TODO(roasbeef): use type params once we bump repo version +type lengthWriter func(w io.Writer, b []byte) error + +// uint8Writer is an implementation of lengthWriter that writes the length of +// the byte slice using 1 byte. +func uint8Writer(w io.Writer, b []byte) error { + return binary.Write(w, byteOrder, uint8(len(b))) +} + +// uint32Writer is an implementation of lengthWriter that writes the length of +// the byte slice using 4 bytes. +func uint32Writer(w io.Writer, b []byte) error { + return binary.Write(w, byteOrder, uint32(len(b))) +} + +// uint32Writer is an implementation of lengthWriter that writes the length of +// the byte slice using 8 bytes. +func uint64Writer(w io.Writer, b []byte) error { + return binary.Write(w, byteOrder, uint64(len(b))) +} + +// writeBytesPrefix is used to write out: len(b) || b, to the passed io.Writer. +// The lengthWriter function closure is used to allow the caller to specify the +// precise byte packing of the length. +func writeBytesPrefix(w io.Writer, b []byte, lenWriter lengthWriter) error { + // Write out the length of the byte first, followed by the set of bytes + // itself. + if err := lenWriter(w, b); err != nil { + return err + } + + if _, err := w.Write(b); err != nil { + return err + } + + return nil +} + +// genNonceAuxBytes writes out the full byte string used to derive a secret +// nonce based on some initial randomness as well as the series of optional +// fields. The byte string used for derivation is: +// - tagged_hash("MuSig/nonce", rand || len(pk) || pk || +// len(aggpk) || aggpk || m_prefixed || len(in) || in || i). +// +// where i is the ith secret nonce being generated and m_prefixed is: +// - bytes(1, 0) if the message is blank +// - bytes(1, 1) || bytes(8, len(m)) || m if the message is present. +func genNonceAuxBytes(rand []byte, pubkey []byte, i int, + opts *nonceGenOpts) (*chainhash.Hash, error) { + + var w bytes.Buffer + + // First, write out the randomness generated in the prior step. + if _, err := w.Write(rand); err != nil { + return nil, err + } + + // Next, we'll write out: len(pk) || pk + err := writeBytesPrefix(&w, pubkey, uint8Writer) + if err != nil { + return nil, err + } + + // Next, we'll write out: len(aggpk) || aggpk. + err = writeBytesPrefix(&w, opts.combinedKey, uint8Writer) + if err != nil { + return nil, err + } + + switch { + // If the message isn't present, then we'll just write out a single + // uint8 of a zero byte: m_prefixed = bytes(1, 0). + case opts.msg == nil: + if _, err := w.Write([]byte{0x00}); err != nil { + return nil, err + } + + // Otherwise, we'll write a single byte of 0x01 with a 1 byte length + // prefix, followed by the message itself with an 8 byte length prefix: + // m_prefixed = bytes(1, 1) || bytes(8, len(m)) || m. + case len(opts.msg) == 0: + fallthrough + default: + if _, err := w.Write([]byte{0x01}); err != nil { + return nil, err + } + + err = writeBytesPrefix(&w, opts.msg, uint64Writer) + if err != nil { + return nil, err + } + } + + // Finally we'll write out the auxiliary input. + err = writeBytesPrefix(&w, opts.auxInput, uint32Writer) + if err != nil { + return nil, err + } + + // Next we'll write out the interaction/index number which will + // uniquely generate two nonces given the rest of the possibly static + // parameters. + if err := binary.Write(&w, byteOrder, uint8(i)); err != nil { + return nil, err + } + + // With the message buffer complete, we'll now derive the tagged hash + // using our set of params. + return chainhash.TaggedHash(NonceGenTag, w.Bytes()), nil +} + +// GenNonces generates the secret nonces, as well as the public nonces which +// correspond to an EC point generated using the secret nonce as a private key. +func GenNonces(options ...NonceGenOption) (*Nonces, error) { + opts := defaultNonceGenOpts() + for _, opt := range options { + opt(opts) + } + + // We require the pubkey option. + if opts.publicKey == nil || len(opts.publicKey) != 33 { + return nil, ErrPubkeyInvalid + } + + // First, we'll start out by generating 32 random bytes drawn from our + // CSPRNG. + var randBytes [32]byte + if _, err := opts.randReader.Read(randBytes[:]); err != nil { + return nil, err + } + + // If the options contain a secret key, we XOR it with with the tagged + // random bytes. + if len(opts.secretKey) == 32 { + taggedHash := chainhash.TaggedHash(NonceAuxTag, randBytes[:]) + + for i := 0; i < chainhash.HashSize; i++ { + randBytes[i] = opts.secretKey[i] ^ taggedHash[i] + } + } + + // Using our randomness, pubkey and the set of optional params, generate our + // two secret nonces: k1 and k2. + k1, err := genNonceAuxBytes(randBytes[:], opts.publicKey, 0, opts) + if err != nil { + return nil, err + } + k2, err := genNonceAuxBytes(randBytes[:], opts.publicKey, 1, opts) + if err != nil { + return nil, err + } + + var k1Mod, k2Mod btcec.ModNScalar + k1Mod.SetBytes((*[32]byte)(k1)) + k2Mod.SetBytes((*[32]byte)(k2)) + + // The secret nonces are serialized as the concatenation of the two 32 + // byte secret nonce values and the pubkey. + var nonces Nonces + k1Mod.PutBytesUnchecked(nonces.SecNonce[:]) + k2Mod.PutBytesUnchecked(nonces.SecNonce[btcec.PrivKeyBytesLen:]) + copy(nonces.SecNonce[btcec.PrivKeyBytesLen*2:], opts.publicKey) + + // Next, we'll generate R_1 = k_1*G and R_2 = k_2*G. Along the way we + // need to map our nonce values into mod n scalars so we can work with + // the btcec API. + nonces.PubNonce = secNonceToPubNonce(nonces.SecNonce) + + return &nonces, nil +} + +// AggregateNonces aggregates the set of a pair of public nonces for each party +// into a single aggregated nonces to be used for multi-signing. +func AggregateNonces(pubNonces [][PubNonceSize]byte) ([PubNonceSize]byte, error) { + // combineNonces is a helper function that aggregates (adds) up a + // series of nonces encoded in compressed format. It uses a slicing + // function to extra 33 bytes at a time from the packed 2x public + // nonces. + type nonceSlicer func([PubNonceSize]byte) []byte + combineNonces := func(slicer nonceSlicer) (btcec.JacobianPoint, error) { + // Convert the set of nonces into jacobian coordinates we can + // use to accumulate them all into each other. + pubNonceJs := make([]*btcec.JacobianPoint, len(pubNonces)) + for i, pubNonceBytes := range pubNonces { + // Using the slicer, extract just the bytes we need to + // decode. + var nonceJ btcec.JacobianPoint + + nonceJ, err := btcec.ParseJacobian(slicer(pubNonceBytes)) + if err != nil { + return btcec.JacobianPoint{}, err + } + + pubNonceJs[i] = &nonceJ + } + + // Now that we have the set of complete nonces, we'll aggregate + // them: R = R_i + R_i+1 + ... + R_i+n. + var aggregateNonce btcec.JacobianPoint + for _, pubNonceJ := range pubNonceJs { + btcec.AddNonConst( + &aggregateNonce, pubNonceJ, &aggregateNonce, + ) + } + + aggregateNonce.ToAffine() + return aggregateNonce, nil + } + + // The final nonce public nonce is actually two nonces, one that + // aggregate the first nonce of all the parties, and the other that + // aggregates the second nonce of all the parties. + var finalNonce [PubNonceSize]byte + combinedNonce1, err := combineNonces(func(n [PubNonceSize]byte) []byte { + return n[:btcec.PubKeyBytesLenCompressed] + }) + if err != nil { + return finalNonce, err + } + + combinedNonce2, err := combineNonces(func(n [PubNonceSize]byte) []byte { + return n[btcec.PubKeyBytesLenCompressed:] + }) + if err != nil { + return finalNonce, err + } + + copy(finalNonce[:], btcec.JacobianToByteSlice(combinedNonce1)) + copy( + finalNonce[btcec.PubKeyBytesLenCompressed:], + btcec.JacobianToByteSlice(combinedNonce2), + ) + + return finalNonce, nil +} diff --git a/btcec/schnorr/musig2/nonces_test.go b/btcec/schnorr/musig2/nonces_test.go new file mode 100644 index 0000000000..074fe7363a --- /dev/null +++ b/btcec/schnorr/musig2/nonces_test.go @@ -0,0 +1,166 @@ +// Copyright 2013-2022 The btcsuite developers + +package musig2 + +import ( + "bytes" + "encoding/hex" + "encoding/json" + "fmt" + "os" + "path" + "testing" + + "github.com/stretchr/testify/require" +) + +type nonceGenTestCase struct { + Rand string `json:"rand_"` + Sk string `json:"sk"` + AggPk string `json:"aggpk"` + Msg *string `json:"msg"` + ExtraIn string `json:"extra_in"` + Pk string `json:"pk"` + + Expected string `json:"expected"` +} + +type nonceGenTestCases struct { + TestCases []nonceGenTestCase `json:"test_cases"` +} + +const ( + nonceGenTestVectorsFileName = "nonce_gen_vectors.json" + nonceAggTestVectorsFileName = "nonce_agg_vectors.json" +) + +// TestMusig2NonceGenTestVectors tests the nonce generation function with the +// testvectors defined in the Musig2 BIP. +func TestMusig2NonceGenTestVectors(t *testing.T) { + t.Parallel() + + testVectorPath := path.Join( + testVectorBaseDir, nonceGenTestVectorsFileName, + ) + testVectorBytes, err := os.ReadFile(testVectorPath) + require.NoError(t, err) + + var testCases nonceGenTestCases + require.NoError(t, json.Unmarshal(testVectorBytes, &testCases)) + + for i, testCase := range testCases.TestCases { + testCase := testCase + + customOpts := nonceGenOpts{ + randReader: &memsetRandReader{i: 0}, + secretKey: mustParseHex(testCase.Sk), + combinedKey: mustParseHex(testCase.AggPk), + auxInput: mustParseHex(testCase.ExtraIn), + publicKey: mustParseHex(testCase.Pk), + } + if testCase.Msg != nil { + customOpts.msg = mustParseHex(*testCase.Msg) + } + + t.Run(fmt.Sprintf("test_case=%v", i), func(t *testing.T) { + nonce, err := GenNonces(withCustomOptions(customOpts)) + if err != nil { + t.Fatalf("err gen nonce aux bytes %v", err) + } + + expectedBytes, _ := hex.DecodeString(testCase.Expected) + if !bytes.Equal(nonce.SecNonce[:], expectedBytes) { + + t.Fatalf("nonces don't match: expected %x, got %x", + expectedBytes, nonce.SecNonce[:]) + } + }) + } +} + +type nonceAggError struct { + Type string `json:"type"` + Signer int `json:"signer"` + Contrib string `json:"contrib"` +} + +type nonceAggValidCase struct { + Indices []int `json:"pnonce_indices"` + + Expected string `json:"expected"` + + Comment string `json:"comment"` +} + +type nonceAggInvalidCase struct { + Indices []int `json:"pnonce_indices"` + + Error nonceAggError `json:"error"` + + Comment string `json:"comment"` + + ExpectedErr string `json:"btcec_err"` +} + +type nonceAggTestCases struct { + Nonces []string `json:"pnonces"` + + ValidCases []nonceAggValidCase `json:"valid_test_cases"` + + InvalidCases []nonceAggInvalidCase `json:"error_test_cases"` +} + +// TestMusig2AggregateNoncesTestVectors tests that the musig2 implementation +// passes the nonce aggregation test vectors for musig2 1.0. +func TestMusig2AggregateNoncesTestVectors(t *testing.T) { + t.Parallel() + + testVectorPath := path.Join( + testVectorBaseDir, nonceAggTestVectorsFileName, + ) + testVectorBytes, err := os.ReadFile(testVectorPath) + require.NoError(t, err) + + var testCases nonceAggTestCases + require.NoError(t, json.Unmarshal(testVectorBytes, &testCases)) + + nonces := make([][PubNonceSize]byte, len(testCases.Nonces)) + for i := range testCases.Nonces { + var nonce [PubNonceSize]byte + copy(nonce[:], mustParseHex(testCases.Nonces[i])) + + nonces[i] = nonce + } + + for i, testCase := range testCases.ValidCases { + testCase := testCase + + var testNonces [][PubNonceSize]byte + for _, idx := range testCase.Indices { + testNonces = append(testNonces, nonces[idx]) + } + + t.Run(fmt.Sprintf("valid_case=%v", i), func(t *testing.T) { + aggregatedNonce, err := AggregateNonces(testNonces) + require.NoError(t, err) + + var expectedNonce [PubNonceSize]byte + copy(expectedNonce[:], mustParseHex(testCase.Expected)) + + require.Equal(t, aggregatedNonce[:], expectedNonce[:]) + }) + } + + for i, testCase := range testCases.InvalidCases { + var testNonces [][PubNonceSize]byte + for _, idx := range testCase.Indices { + testNonces = append(testNonces, nonces[idx]) + } + + t.Run(fmt.Sprintf("invalid_case=%v", i), func(t *testing.T) { + _, err := AggregateNonces(testNonces) + require.True(t, err != nil) + require.Equal(t, testCase.ExpectedErr, err.Error()) + }) + } +} diff --git a/btcec/schnorr/musig2/sign.go b/btcec/schnorr/musig2/sign.go new file mode 100644 index 0000000000..9204611dd6 --- /dev/null +++ b/btcec/schnorr/musig2/sign.go @@ -0,0 +1,738 @@ +// Copyright 2013-2022 The btcsuite developers + +package musig2 + +import ( + "bytes" + "fmt" + "io" + + secp "github.com/decred/dcrd/dcrec/secp256k1/v4" + + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcec/v2/schnorr" + "github.com/btcsuite/btcd/chaincfg/chainhash" +) + +var ( + // NonceBlindTag is that tag used to construct the value b, which + // blinds the second public nonce of each party. + NonceBlindTag = []byte("MuSig/noncecoef") + + // ChallengeHashTag is the tag used to construct the challenge hash + ChallengeHashTag = []byte("BIP0340/challenge") + + // ErrNoncePointAtInfinity is returned if during signing, the fully + // combined public nonce is the point at infinity. + ErrNoncePointAtInfinity = fmt.Errorf("signing nonce is the infinity " + + "point") + + // ErrPrivKeyZero is returned when the private key for signing is + // actually zero. + ErrPrivKeyZero = fmt.Errorf("priv key is zero") + + // ErrPartialSigInvalid is returned when a partial is found to be + // invalid. + ErrPartialSigInvalid = fmt.Errorf("partial signature is invalid") + + // ErrSecretNonceZero is returned when a secret nonce is passed in a + // zero. + ErrSecretNonceZero = fmt.Errorf("secret nonce is blank") + + // ErrSecNoncePubkey is returned when the signing key does not match the + // sec nonce pubkey + ErrSecNoncePubkey = fmt.Errorf("public key does not match secnonce") + + // ErrPubkeyNotIncluded is returned when the signers pubkey is not included + // in the list of pubkeys. + ErrPubkeyNotIncluded = fmt.Errorf("signer's pubkey must be included" + + " in the list of pubkeys") +) + +// infinityPoint is the jacobian representation of the point at infinity. +var infinityPoint btcec.JacobianPoint + +// PartialSignature reprints a partial (s-only) musig2 multi-signature. This +// isn't a valid schnorr signature by itself, as it needs to be aggregated +// along with the other partial signatures to be completed. +type PartialSignature struct { + S *btcec.ModNScalar + + R *btcec.PublicKey +} + +// NewPartialSignature returns a new instances of the partial sig struct. +func NewPartialSignature(s *btcec.ModNScalar, + r *btcec.PublicKey) PartialSignature { + + return PartialSignature{ + S: s, + R: r, + } +} + +// Encode writes a serialized version of the partial signature to the passed +// io.Writer +func (p *PartialSignature) Encode(w io.Writer) error { + var sBytes [32]byte + p.S.PutBytes(&sBytes) + + if _, err := w.Write(sBytes[:]); err != nil { + return err + } + + return nil +} + +// Decode attempts to parse a serialized PartialSignature stored in the passed +// io reader. +func (p *PartialSignature) Decode(r io.Reader) error { + p.S = new(btcec.ModNScalar) + + var sBytes [32]byte + if _, err := io.ReadFull(r, sBytes[:]); err != nil { + return nil + } + + overflows := p.S.SetBytes(&sBytes) + if overflows == 1 { + return ErrPartialSigInvalid + } + + return nil +} + +// SignOption is a functional option argument that allows callers to modify the +// way we generate musig2 schnorr signatures. +type SignOption func(*signOptions) + +// signOptions houses the set of functional options that can be used to modify +// the method used to generate the musig2 partial signature. +type signOptions struct { + // fastSign determines if we'll skip the check at the end of the + // routine where we attempt to verify the produced signature. + fastSign bool + + // sortKeys determines if the set of keys should be sorted before doing + // key aggregation. + sortKeys bool + + // tweaks specifies a series of tweaks to be applied to the aggregated + // public key, which also partially carries over into the signing + // process. + tweaks []KeyTweakDesc + + // taprootTweak specifies a taproot specific tweak. of the tweaks + // specified above. Normally we'd just apply the raw 32 byte tweak, but + // for taproot, we first need to compute the aggregated key before + // tweaking, and then use it as the internal key. This is required as + // the taproot tweak also commits to the public key, which in this case + // is the aggregated key before the tweak. + taprootTweak []byte + + // bip86Tweak specifies that the taproot tweak should be done in a BIP + // 86 style, where we don't expect an actual tweak and instead just + // commit to the public key itself. + bip86Tweak bool +} + +// defaultSignOptions returns the default set of signing operations. +func defaultSignOptions() *signOptions { + return &signOptions{} +} + +// WithFastSign forces signing to skip the extra verification step at the end. +// Performance sensitive applications may opt to use this option to speed up +// the signing operation. +func WithFastSign() SignOption { + return func(o *signOptions) { + o.fastSign = true + } +} + +// WithSortedKeys determines if the set of signing public keys are to be sorted +// or not before doing key aggregation. +func WithSortedKeys() SignOption { + return func(o *signOptions) { + o.sortKeys = true + } +} + +// WithTweaks determines if the aggregated public key used should apply a +// series of tweaks before key aggregation. +func WithTweaks(tweaks ...KeyTweakDesc) SignOption { + return func(o *signOptions) { + o.tweaks = tweaks + } +} + +// WithTaprootSignTweak allows a caller to specify a tweak that should be used +// in a bip 340 manner when signing. This differs from WithTweaks as the tweak +// will be assumed to always be x-only and the intermediate aggregate key +// before tweaking will be used to generate part of the tweak (as the taproot +// tweak also commits to the internal key). +// +// This option should be used in the taproot context to create a valid +// signature for the keypath spend for taproot, when the output key is actually +// committing to a script path, or some other data. +func WithTaprootSignTweak(scriptRoot []byte) SignOption { + return func(o *signOptions) { + o.taprootTweak = scriptRoot + } +} + +// WithBip86SignTweak allows a caller to specify a tweak that should be used in +// a bip 340 manner when signing, factoring in BIP 86 as well. This differs +// from WithTaprootSignTweak as no true script root will be committed to, +// instead we just commit to the internal key. +// +// This option should be used in the taproot context to create a valid +// signature for the keypath spend for taproot, when the output key was +// generated using BIP 86. +func WithBip86SignTweak() SignOption { + return func(o *signOptions) { + o.bip86Tweak = true + } +} + +// computeSigningNonce calculates the final nonce used for signing. This will +// be the R value used in the final signature. +func computeSigningNonce(combinedNonce [PubNonceSize]byte, + combinedKey *btcec.PublicKey, msg [32]byte) ( + *btcec.JacobianPoint, *btcec.ModNScalar, error) { + + // Next we'll compute the value b, that blinds our second public + // nonce: + // * b = h(tag=NonceBlindTag, combinedNonce || combinedKey || m). + var ( + nonceMsgBuf bytes.Buffer + nonceBlinder btcec.ModNScalar + ) + nonceMsgBuf.Write(combinedNonce[:]) + nonceMsgBuf.Write(schnorr.SerializePubKey(combinedKey)) + nonceMsgBuf.Write(msg[:]) + nonceBlindHash := chainhash.TaggedHash( + NonceBlindTag, nonceMsgBuf.Bytes(), + ) + nonceBlinder.SetByteSlice(nonceBlindHash[:]) + + // Next, we'll parse the public nonces into R1 and R2. + r1J, err := btcec.ParseJacobian( + combinedNonce[:btcec.PubKeyBytesLenCompressed], + ) + if err != nil { + return nil, nil, err + } + r2J, err := btcec.ParseJacobian( + combinedNonce[btcec.PubKeyBytesLenCompressed:], + ) + if err != nil { + return nil, nil, err + } + + // With our nonce blinding value, we'll now combine both the public + // nonces, using the blinding factor to tweak the second nonce: + // * R = R_1 + b*R_2 + var nonce btcec.JacobianPoint + btcec.ScalarMultNonConst(&nonceBlinder, &r2J, &r2J) + btcec.AddNonConst(&r1J, &r2J, &nonce) + + // If the combined nonce is the point at infinity, we'll use the + // generator point instead. + if nonce == infinityPoint { + G := btcec.Generator() + G.AsJacobian(&nonce) + } + + return &nonce, &nonceBlinder, nil +} + +// Sign generates a musig2 partial signature given the passed key set, secret +// nonce, public nonce, and private keys. This method returns an error if the +// generated nonces are either too large, or end up mapping to the point at +// infinity. +func Sign(secNonce [SecNonceSize]byte, privKey *btcec.PrivateKey, + combinedNonce [PubNonceSize]byte, pubKeys []*btcec.PublicKey, + msg [32]byte, signOpts ...SignOption) (*PartialSignature, error) { + + // First, parse the set of optional signing options. + opts := defaultSignOptions() + for _, option := range signOpts { + option(opts) + } + + // Check that our signing key belongs to the secNonce + if !bytes.Equal(secNonce[btcec.PrivKeyBytesLen*2:], + privKey.PubKey().SerializeCompressed()) { + + return nil, ErrSecNoncePubkey + } + + // Check that the key set contains the public key to our private key. + var containsPrivKey bool + for _, pk := range pubKeys { + if privKey.PubKey().IsEqual(pk) { + containsPrivKey = true + } + } + + if !containsPrivKey { + return nil, ErrPubkeyNotIncluded + } + + // Compute the hash of all the keys here as we'll need it do aggregate + // the keys and also at the final step of signing. + keysHash := keyHashFingerprint(pubKeys, opts.sortKeys) + uniqueKeyIndex := secondUniqueKeyIndex(pubKeys, opts.sortKeys) + + keyAggOpts := []KeyAggOption{ + WithKeysHash(keysHash), WithUniqueKeyIndex(uniqueKeyIndex), + } + switch { + case opts.bip86Tweak: + keyAggOpts = append( + keyAggOpts, WithBIP86KeyTweak(), + ) + case opts.taprootTweak != nil: + keyAggOpts = append( + keyAggOpts, WithTaprootKeyTweak(opts.taprootTweak), + ) + case len(opts.tweaks) != 0: + keyAggOpts = append(keyAggOpts, WithKeyTweaks(opts.tweaks...)) + } + + // Next we'll construct the aggregated public key based on the set of + // signers. + combinedKey, parityAcc, _, err := AggregateKeys( + pubKeys, opts.sortKeys, keyAggOpts..., + ) + if err != nil { + return nil, err + } + + // We'll now combine both the public nonces, using the blinding factor + // to tweak the second nonce: + // * R = R_1 + b*R_2 + nonce, nonceBlinder, err := computeSigningNonce( + combinedNonce, combinedKey.FinalKey, msg, + ) + if err != nil { + return nil, err + } + + // Next we'll parse out our two secret nonces, which we'll be using in + // the core signing process below. + var k1, k2 btcec.ModNScalar + k1.SetByteSlice(secNonce[:btcec.PrivKeyBytesLen]) + k2.SetByteSlice(secNonce[btcec.PrivKeyBytesLen:]) + + if k1.IsZero() || k2.IsZero() { + return nil, ErrSecretNonceZero + } + + nonce.ToAffine() + + nonceKey := btcec.NewPublicKey(&nonce.X, &nonce.Y) + + // If the nonce R has an odd y coordinate, then we'll negate both our + // secret nonces. + if nonce.Y.IsOdd() { + k1.Negate() + k2.Negate() + } + + privKeyScalar := privKey.Key + if privKeyScalar.IsZero() { + return nil, ErrPrivKeyZero + } + + pubKey := privKey.PubKey() + combinedKeyYIsOdd := func() bool { + combinedKeyBytes := combinedKey.FinalKey.SerializeCompressed() + return combinedKeyBytes[0] == secp.PubKeyFormatCompressedOdd + }() + + // Next we'll compute the two parity factors for Q, the combined key. + // If the key is odd, then we'll negate it. + parityCombinedKey := new(btcec.ModNScalar).SetInt(1) + if combinedKeyYIsOdd { + parityCombinedKey.Negate() + } + + // Before we sign below, we'll multiply by our various parity factors + // to ensure that the signing key is properly negated (if necessary): + // * d = g⋅gacc⋅d' + privKeyScalar.Mul(parityCombinedKey).Mul(parityAcc) + + // Next we'll create the challenge hash that commits to the combined + // nonce, combined public key and also the message: + // * e = H(tag=ChallengeHashTag, R || Q || m) mod n + var challengeMsg bytes.Buffer + challengeMsg.Write(schnorr.SerializePubKey(nonceKey)) + challengeMsg.Write(schnorr.SerializePubKey(combinedKey.FinalKey)) + challengeMsg.Write(msg[:]) + challengeBytes := chainhash.TaggedHash( + ChallengeHashTag, challengeMsg.Bytes(), + ) + var e btcec.ModNScalar + e.SetByteSlice(challengeBytes[:]) + + // Next, we'll compute a, our aggregation coefficient for the key that + // we're signing with. + a := aggregationCoefficient(pubKeys, pubKey, keysHash, uniqueKeyIndex) + + // With mu constructed, we can finally generate our partial signature + // as: s = (k1_1 + b*k_2 + e*a*d) mod n. + s := new(btcec.ModNScalar) + s.Add(&k1).Add(k2.Mul(nonceBlinder)).Add(e.Mul(a).Mul(&privKeyScalar)) + + sig := NewPartialSignature(s, nonceKey) + + // If we're not in fast sign mode, then we'll also validate our partial + // signature. + if !opts.fastSign { + pubNonce := secNonceToPubNonce(secNonce) + sigValid := sig.Verify( + pubNonce, combinedNonce, pubKeys, pubKey, msg, + signOpts..., + ) + if !sigValid { + return nil, fmt.Errorf("sig is invalid!") + } + } + + return &sig, nil +} + +// Verify implements partial signature verification given the public nonce for +// the signer, aggregate nonce, signer set and finally the message being +// signed. +func (p *PartialSignature) Verify(pubNonce [PubNonceSize]byte, + combinedNonce [PubNonceSize]byte, keySet []*btcec.PublicKey, + signingKey *btcec.PublicKey, msg [32]byte, signOpts ...SignOption) bool { + + pubKey := signingKey.SerializeCompressed() + + return verifyPartialSig( + p, pubNonce, combinedNonce, keySet, pubKey, msg, signOpts..., + ) == nil +} + +// verifyPartialSig attempts to verify a partial schnorr signature given the +// necessary parameters. This is the internal version of Verify that returns +// detailed errors. signed. +func verifyPartialSig(partialSig *PartialSignature, pubNonce [PubNonceSize]byte, + combinedNonce [PubNonceSize]byte, keySet []*btcec.PublicKey, + pubKey []byte, msg [32]byte, signOpts ...SignOption) error { + + opts := defaultSignOptions() + for _, option := range signOpts { + option(opts) + } + + // First we'll map the internal partial signature back into something + // we can manipulate. + s := partialSig.S + + // Next we'll parse out the two public nonces into something we can + // use. + // + // Compute the hash of all the keys here as we'll need it do aggregate + // the keys and also at the final step of verification. + keysHash := keyHashFingerprint(keySet, opts.sortKeys) + uniqueKeyIndex := secondUniqueKeyIndex(keySet, opts.sortKeys) + + keyAggOpts := []KeyAggOption{ + WithKeysHash(keysHash), WithUniqueKeyIndex(uniqueKeyIndex), + } + switch { + case opts.bip86Tweak: + keyAggOpts = append( + keyAggOpts, WithBIP86KeyTweak(), + ) + case opts.taprootTweak != nil: + keyAggOpts = append( + keyAggOpts, WithTaprootKeyTweak(opts.taprootTweak), + ) + case len(opts.tweaks) != 0: + keyAggOpts = append(keyAggOpts, WithKeyTweaks(opts.tweaks...)) + } + + // Next we'll construct the aggregated public key based on the set of + // signers. + combinedKey, parityAcc, _, err := AggregateKeys( + keySet, opts.sortKeys, keyAggOpts..., + ) + if err != nil { + return err + } + + // Next we'll compute the value b, that blinds our second public + // nonce: + // * b = h(tag=NonceBlindTag, combinedNonce || combinedKey || m). + var ( + nonceMsgBuf bytes.Buffer + nonceBlinder btcec.ModNScalar + ) + nonceMsgBuf.Write(combinedNonce[:]) + nonceMsgBuf.Write(schnorr.SerializePubKey(combinedKey.FinalKey)) + nonceMsgBuf.Write(msg[:]) + nonceBlindHash := chainhash.TaggedHash(NonceBlindTag, nonceMsgBuf.Bytes()) + nonceBlinder.SetByteSlice(nonceBlindHash[:]) + + r1J, err := btcec.ParseJacobian( + combinedNonce[:btcec.PubKeyBytesLenCompressed], + ) + if err != nil { + return err + } + r2J, err := btcec.ParseJacobian( + combinedNonce[btcec.PubKeyBytesLenCompressed:], + ) + if err != nil { + return err + } + + // With our nonce blinding value, we'll now combine both the public + // nonces, using the blinding factor to tweak the second nonce: + // * R = R_1 + b*R_2 + var nonce btcec.JacobianPoint + btcec.ScalarMultNonConst(&nonceBlinder, &r2J, &r2J) + btcec.AddNonConst(&r1J, &r2J, &nonce) + + // Next, we'll parse out the set of public nonces this signer used to + // generate the signature. + pubNonce1J, err := btcec.ParseJacobian( + pubNonce[:btcec.PubKeyBytesLenCompressed], + ) + if err != nil { + return err + } + pubNonce2J, err := btcec.ParseJacobian( + pubNonce[btcec.PubKeyBytesLenCompressed:], + ) + if err != nil { + return err + } + + // If the nonce is the infinity point we set it to the Generator. + if nonce == infinityPoint { + btcec.GeneratorJacobian(&nonce) + } else { + nonce.ToAffine() + } + + // We'll perform a similar aggregation and blinding operator as we did + // above for the combined nonces: R' = R_1' + b*R_2'. + var pubNonceJ btcec.JacobianPoint + + btcec.ScalarMultNonConst(&nonceBlinder, &pubNonce2J, &pubNonce2J) + btcec.AddNonConst(&pubNonce1J, &pubNonce2J, &pubNonceJ) + + pubNonceJ.ToAffine() + + // If the combined nonce used in the challenge hash has an odd y + // coordinate, then we'll negate our final public nonce. + if nonce.Y.IsOdd() { + pubNonceJ.Y.Negate(1) + pubNonceJ.Y.Normalize() + } + + // Next we'll create the challenge hash that commits to the combined + // nonce, combined public key and also the message: + // * e = H(tag=ChallengeHashTag, R || Q || m) mod n + var challengeMsg bytes.Buffer + challengeMsg.Write(schnorr.SerializePubKey(btcec.NewPublicKey( + &nonce.X, &nonce.Y, + ))) + challengeMsg.Write(schnorr.SerializePubKey(combinedKey.FinalKey)) + challengeMsg.Write(msg[:]) + challengeBytes := chainhash.TaggedHash( + ChallengeHashTag, challengeMsg.Bytes(), + ) + var e btcec.ModNScalar + e.SetByteSlice(challengeBytes[:]) + + signingKey, err := btcec.ParsePubKey(pubKey) + if err != nil { + return err + } + + // Next, we'll compute a, our aggregation coefficient for the key that + // we're signing with. + a := aggregationCoefficient(keySet, signingKey, keysHash, uniqueKeyIndex) + + // If the combined key has an odd y coordinate, then we'll negate + // parity factor for the signing key. + parityCombinedKey := new(btcec.ModNScalar).SetInt(1) + combinedKeyBytes := combinedKey.FinalKey.SerializeCompressed() + if combinedKeyBytes[0] == secp.PubKeyFormatCompressedOdd { + parityCombinedKey.Negate() + } + + // Next, we'll construct the final parity factor by multiplying the + // sign key parity factor with the accumulated parity factor for all + // the keys. + finalParityFactor := parityCombinedKey.Mul(parityAcc) + + var signKeyJ btcec.JacobianPoint + signingKey.AsJacobian(&signKeyJ) + + // In the final set, we'll check that: s*G == R' + e*a*g*P. + var sG, rP btcec.JacobianPoint + btcec.ScalarBaseMultNonConst(s, &sG) + btcec.ScalarMultNonConst(e.Mul(a).Mul(finalParityFactor), &signKeyJ, &rP) + btcec.AddNonConst(&rP, &pubNonceJ, &rP) + + sG.ToAffine() + rP.ToAffine() + + if sG != rP { + return ErrPartialSigInvalid + } + + return nil +} + +// CombineOption is a functional option argument that allows callers to modify the +// way we combine musig2 schnorr signatures. +type CombineOption func(*combineOptions) + +// combineOptions houses the set of functional options that can be used to +// modify the method used to combine the musig2 partial signatures. +type combineOptions struct { + msg [32]byte + + combinedKey *btcec.PublicKey + + tweakAcc *btcec.ModNScalar +} + +// defaultCombineOptions returns the default set of signing operations. +func defaultCombineOptions() *combineOptions { + return &combineOptions{} +} + +// WithTweakedCombine is a functional option that allows callers to specify +// that the signature was produced using a tweaked aggregated public key. In +// order to properly aggregate the partial signatures, the caller must specify +// enough information to reconstruct the challenge, and also the final +// accumulated tweak value. +func WithTweakedCombine(msg [32]byte, keys []*btcec.PublicKey, + tweaks []KeyTweakDesc, sort bool) CombineOption { + + return func(o *combineOptions) { + combinedKey, _, tweakAcc, _ := AggregateKeys( + keys, sort, WithKeyTweaks(tweaks...), + ) + + o.msg = msg + o.combinedKey = combinedKey.FinalKey + o.tweakAcc = tweakAcc + } +} + +// WithTaprootTweakedCombine is similar to the WithTweakedCombine option, but +// assumes a BIP 341 context where the final tweaked key is to be used as the +// output key, where the internal key is the aggregated key pre-tweak. +// +// This option should be used over WithTweakedCombine when attempting to +// aggregate signatures for a top-level taproot keyspend, where the output key +// commits to a script root. +func WithTaprootTweakedCombine(msg [32]byte, keys []*btcec.PublicKey, + scriptRoot []byte, sort bool) CombineOption { + + return func(o *combineOptions) { + combinedKey, _, tweakAcc, _ := AggregateKeys( + keys, sort, WithTaprootKeyTweak(scriptRoot), + ) + + o.msg = msg + o.combinedKey = combinedKey.FinalKey + o.tweakAcc = tweakAcc + } +} + +// WithBip86TweakedCombine is similar to the WithTaprootTweakedCombine option, +// but assumes a BIP 341 + BIP 86 context where the final tweaked key is to be +// used as the output key, where the internal key is the aggregated key +// pre-tweak. +// +// This option should be used over WithTaprootTweakedCombine when attempting to +// aggregate signatures for a top-level taproot keyspend, where the output key +// was generated using BIP 86. +func WithBip86TweakedCombine(msg [32]byte, keys []*btcec.PublicKey, + sort bool) CombineOption { + + return func(o *combineOptions) { + combinedKey, _, tweakAcc, _ := AggregateKeys( + keys, sort, WithBIP86KeyTweak(), + ) + + o.msg = msg + o.combinedKey = combinedKey.FinalKey + o.tweakAcc = tweakAcc + } +} + +// CombineSigs combines the set of public keys given the final aggregated +// nonce, and the series of partial signatures for each nonce. +func CombineSigs(combinedNonce *btcec.PublicKey, + partialSigs []*PartialSignature, + combineOpts ...CombineOption) *schnorr.Signature { + + // First, parse the set of optional combine options. + opts := defaultCombineOptions() + for _, option := range combineOpts { + option(opts) + } + + // If signer keys and tweaks are specified, then we need to carry out + // some intermediate steps before we can combine the signature. + var tweakProduct *btcec.ModNScalar + if opts.combinedKey != nil && opts.tweakAcc != nil { + // Next, we'll construct the parity factor of the combined key, + // negating it if the combined key has an even y coordinate. + parityFactor := new(btcec.ModNScalar).SetInt(1) + combinedKeyBytes := opts.combinedKey.SerializeCompressed() + if combinedKeyBytes[0] == secp.PubKeyFormatCompressedOdd { + parityFactor.Negate() + } + + // Next we'll reconstruct e the challenge has based on the + // nonce and combined public key. + // * e = H(tag=ChallengeHashTag, R || Q || m) mod n + var challengeMsg bytes.Buffer + challengeMsg.Write(schnorr.SerializePubKey(combinedNonce)) + challengeMsg.Write(schnorr.SerializePubKey(opts.combinedKey)) + challengeMsg.Write(opts.msg[:]) + challengeBytes := chainhash.TaggedHash( + ChallengeHashTag, challengeMsg.Bytes(), + ) + var e btcec.ModNScalar + e.SetByteSlice(challengeBytes[:]) + + tweakProduct = new(btcec.ModNScalar).Set(&e) + tweakProduct.Mul(opts.tweakAcc).Mul(parityFactor) + } + + // Finally, the tweak factor also needs to be re-computed as well. + var combinedSig btcec.ModNScalar + for _, partialSig := range partialSigs { + combinedSig.Add(partialSig.S) + } + + // If the tweak product was set above, then we'll need to add the value + // at the very end in order to produce a valid signature under the + // final tweaked key. + if tweakProduct != nil { + combinedSig.Add(tweakProduct) + } + + // TODO(roasbeef): less verbose way to get the x coord... + var nonceJ btcec.JacobianPoint + combinedNonce.AsJacobian(&nonceJ) + nonceJ.ToAffine() + + return schnorr.NewSignature(&nonceJ.X, &combinedSig) +} diff --git a/btcec/schnorr/musig2/sign_test.go b/btcec/schnorr/musig2/sign_test.go new file mode 100644 index 0000000000..a967cfe476 --- /dev/null +++ b/btcec/schnorr/musig2/sign_test.go @@ -0,0 +1,391 @@ +// Copyright 2013-2022 The btcsuite developers + +package musig2 + +import ( + "bytes" + "encoding/hex" + "encoding/json" + "fmt" + "os" + "path" + "strings" + "testing" + + "github.com/btcsuite/btcd/btcec/v2" + secp "github.com/decred/dcrd/dcrec/secp256k1/v4" + "github.com/stretchr/testify/require" +) + +const ( + signVerifyTestVectorFileName = "sign_verify_vectors.json" + + sigCombineTestVectorFileName = "sig_agg_vectors.json" +) + +type signVerifyValidCase struct { + Indices []int `json:"key_indices"` + + NonceIndices []int `json:"nonce_indices"` + + AggNonceIndex int `json:"aggnonce_index"` + + MsgIndex int `json:"msg_index"` + + SignerIndex int `json:"signer_index"` + + Expected string `json:"expected"` +} + +type signErrorCase struct { + Indices []int `json:"key_indices"` + + AggNonceIndex int `json:"aggnonce_index"` + + MsgIndex int `json:"msg_index"` + + SecNonceIndex int `json:"secnonce_index"` + + Comment string `json:"comment"` +} + +type verifyFailCase struct { + Sig string `json:"sig"` + + Indices []int `json:"key_indices"` + + NonceIndices []int `json:"nonce_indices"` + + MsgIndex int `json:"msg_index"` + + SignerIndex int `json:"signer_index"` + + Comment string `json:"comment"` +} + +type verifyErrorCase struct { + Sig string `json:"sig"` + + Indices []int `json:"key_indices"` + + NonceIndices []int `json:"nonce_indices"` + + MsgIndex int `json:"msg_index"` + + SignerIndex int `json:"signer_index"` + + Comment string `json:"comment"` +} + +type signVerifyTestVectors struct { + PrivKey string `json:"sk"` + + PubKeys []string `json:"pubkeys"` + + PrivNonces []string `json:"secnonces"` + + PubNonces []string `json:"pnonces"` + + AggNonces []string `json:"aggnonces"` + + Msgs []string `json:"msgs"` + + ValidCases []signVerifyValidCase `json:"valid_test_cases"` + + SignErrorCases []signErrorCase `json:"sign_error_test_cases"` + + VerifyFailCases []verifyFailCase `json:"verify_fail_test_cases"` + + VerifyErrorCases []verifyErrorCase `json:"verify_error_test_cases"` +} + +// TestMusig2SignVerify tests that we pass the musig2 verification tests. +func TestMusig2SignVerify(t *testing.T) { + t.Parallel() + + testVectorPath := path.Join( + testVectorBaseDir, signVerifyTestVectorFileName, + ) + testVectorBytes, err := os.ReadFile(testVectorPath) + require.NoError(t, err) + + var testCases signVerifyTestVectors + require.NoError(t, json.Unmarshal(testVectorBytes, &testCases)) + + privKey, _ := btcec.PrivKeyFromBytes(mustParseHex(testCases.PrivKey)) + + for i, testCase := range testCases.ValidCases { + testCase := testCase + + testName := fmt.Sprintf("valid_case_%v", i) + t.Run(testName, func(t *testing.T) { + pubKeys, err := keysFromIndices( + t, testCase.Indices, testCases.PubKeys, + ) + require.NoError(t, err) + + pubNonces := pubNoncesFromIndices( + t, testCase.NonceIndices, testCases.PubNonces, + ) + + combinedNonce, err := AggregateNonces(pubNonces) + require.NoError(t, err) + + var msg [32]byte + copy(msg[:], mustParseHex(testCases.Msgs[testCase.MsgIndex])) + + var secNonce [SecNonceSize]byte + copy(secNonce[:], mustParseHex(testCases.PrivNonces[0])) + + partialSig, err := Sign( + secNonce, privKey, combinedNonce, pubKeys, + msg, + ) + + var partialSigBytes [32]byte + partialSig.S.PutBytesUnchecked(partialSigBytes[:]) + + require.Equal( + t, hex.EncodeToString(partialSigBytes[:]), + hex.EncodeToString(mustParseHex(testCase.Expected)), + ) + }) + } + + for _, testCase := range testCases.SignErrorCases { + testCase := testCase + + testName := fmt.Sprintf("invalid_case_%v", + strings.ToLower(testCase.Comment)) + + t.Run(testName, func(t *testing.T) { + pubKeys, err := keysFromIndices( + t, testCase.Indices, testCases.PubKeys, + ) + if err != nil { + require.ErrorIs(t, err, secp.ErrPubKeyNotOnCurve) + return + } + + var aggNonce [PubNonceSize]byte + copy( + aggNonce[:], + mustParseHex( + testCases.AggNonces[testCase.AggNonceIndex], + ), + ) + + var msg [32]byte + copy(msg[:], mustParseHex(testCases.Msgs[testCase.MsgIndex])) + + var secNonce [SecNonceSize]byte + copy( + secNonce[:], + mustParseHex( + testCases.PrivNonces[testCase.SecNonceIndex], + ), + ) + + _, err = Sign( + secNonce, privKey, aggNonce, pubKeys, + msg, + ) + require.Error(t, err) + }) + } + + for _, testCase := range testCases.VerifyFailCases { + testCase := testCase + + testName := fmt.Sprintf("verify_fail_%v", + strings.ToLower(testCase.Comment)) + t.Run(testName, func(t *testing.T) { + pubKeys, err := keysFromIndices( + t, testCase.Indices, testCases.PubKeys, + ) + require.NoError(t, err) + + pubNonces := pubNoncesFromIndices( + t, testCase.NonceIndices, testCases.PubNonces, + ) + + combinedNonce, err := AggregateNonces(pubNonces) + require.NoError(t, err) + + var msg [32]byte + copy( + msg[:], + mustParseHex(testCases.Msgs[testCase.MsgIndex]), + ) + + var secNonce [SecNonceSize]byte + copy(secNonce[:], mustParseHex(testCases.PrivNonces[0])) + + signerNonce := secNonceToPubNonce(secNonce) + + var partialSig PartialSignature + err = partialSig.Decode( + bytes.NewReader(mustParseHex(testCase.Sig)), + ) + if err != nil && strings.Contains(testCase.Comment, "group size") { + require.ErrorIs(t, err, ErrPartialSigInvalid) + } + + err = verifyPartialSig( + &partialSig, signerNonce, combinedNonce, + pubKeys, privKey.PubKey().SerializeCompressed(), + msg, + ) + require.Error(t, err) + }) + } + + for _, testCase := range testCases.VerifyErrorCases { + testCase := testCase + + testName := fmt.Sprintf("verify_error_%v", + strings.ToLower(testCase.Comment)) + t.Run(testName, func(t *testing.T) { + switch testCase.Comment { + case "Invalid pubnonce": + pubNonces := pubNoncesFromIndices( + t, testCase.NonceIndices, testCases.PubNonces, + ) + _, err := AggregateNonces(pubNonces) + require.ErrorIs(t, err, secp.ErrPubKeyNotOnCurve) + + case "Invalid pubkey": + _, err := keysFromIndices( + t, testCase.Indices, testCases.PubKeys, + ) + require.ErrorIs(t, err, secp.ErrPubKeyNotOnCurve) + + default: + t.Fatalf("unhandled case: %v", testCase.Comment) + } + }) + } + +} + +type sigCombineValidCase struct { + AggNonce string `json:"aggnonce"` + + NonceIndices []int `json:"nonce_indices"` + + Indices []int `json:"key_indices"` + + TweakIndices []int `json:"tweak_indices"` + + IsXOnly []bool `json:"is_xonly"` + + PSigIndices []int `json:"psig_indices"` + + Expected string `json:"expected"` +} + +type sigCombineTestVectors struct { + PubKeys []string `json:"pubkeys"` + + PubNonces []string `json:"pnonces"` + + Tweaks []string `json:"tweaks"` + + Psigs []string `json:"psigs"` + + Msg string `json:"msg"` + + ValidCases []sigCombineValidCase `json:"valid_test_cases"` +} + +func pSigsFromIndices(t *testing.T, sigs []string, indices []int) []*PartialSignature { + pSigs := make([]*PartialSignature, len(indices)) + for i, idx := range indices { + var pSig PartialSignature + err := pSig.Decode(bytes.NewReader(mustParseHex(sigs[idx]))) + require.NoError(t, err) + + pSigs[i] = &pSig + } + + return pSigs +} + +// TestMusig2SignCombine tests that we pass the musig2 sig combination tests. +func TestMusig2SignCombine(t *testing.T) { + t.Parallel() + + testVectorPath := path.Join( + testVectorBaseDir, sigCombineTestVectorFileName, + ) + testVectorBytes, err := os.ReadFile(testVectorPath) + require.NoError(t, err) + + var testCases sigCombineTestVectors + require.NoError(t, json.Unmarshal(testVectorBytes, &testCases)) + + var msg [32]byte + copy(msg[:], mustParseHex(testCases.Msg)) + + for i, testCase := range testCases.ValidCases { + testCase := testCase + + testName := fmt.Sprintf("valid_case_%v", i) + t.Run(testName, func(t *testing.T) { + pubKeys, err := keysFromIndices( + t, testCase.Indices, testCases.PubKeys, + ) + require.NoError(t, err) + + pubNonces := pubNoncesFromIndices( + t, testCase.NonceIndices, testCases.PubNonces, + ) + + partialSigs := pSigsFromIndices( + t, testCases.Psigs, testCase.PSigIndices, + ) + + var ( + combineOpts []CombineOption + keyOpts []KeyAggOption + ) + if len(testCase.TweakIndices) > 0 { + tweaks := tweaksFromIndices( + t, testCase.TweakIndices, + testCases.Tweaks, testCase.IsXOnly, + ) + + combineOpts = append(combineOpts, WithTweakedCombine( + msg, pubKeys, tweaks, false, + )) + + keyOpts = append(keyOpts, WithKeyTweaks(tweaks...)) + } + + combinedKey, _, _, err := AggregateKeys( + pubKeys, false, keyOpts..., + ) + require.NoError(t, err) + + combinedNonce, err := AggregateNonces(pubNonces) + require.NoError(t, err) + + finalNonceJ, _, err := computeSigningNonce( + combinedNonce, combinedKey.FinalKey, msg, + ) + + finalNonceJ.ToAffine() + finalNonce := btcec.NewPublicKey( + &finalNonceJ.X, &finalNonceJ.Y, + ) + + combinedSig := CombineSigs( + finalNonce, partialSigs, combineOpts..., + ) + require.Equal(t, + strings.ToLower(testCase.Expected), + hex.EncodeToString(combinedSig.Serialize()), + ) + }) + } +} diff --git a/btcec/schnorr/pubkey.go b/btcec/schnorr/pubkey.go new file mode 100644 index 0000000000..f5d2ca4bd5 --- /dev/null +++ b/btcec/schnorr/pubkey.go @@ -0,0 +1,49 @@ +// Copyright (c) 2013-2017 The btcsuite developers +// Copyright (c) 2015-2021 The Decred developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package schnorr + +import ( + "fmt" + + "github.com/btcsuite/btcd/btcec/v2" + secp "github.com/decred/dcrd/dcrec/secp256k1/v4" +) + +// These constants define the lengths of serialized public keys. +const ( + PubKeyBytesLen = 32 +) + +// ParsePubKey parses a public key for a koblitz curve from a bytestring into a +// btcec.Publickey, verifying that it is valid. It only supports public keys in +// the BIP-340 32-byte format. +func ParsePubKey(pubKeyStr []byte) (*btcec.PublicKey, error) { + if pubKeyStr == nil { + err := fmt.Errorf("nil pubkey byte string") + return nil, err + } + if len(pubKeyStr) != PubKeyBytesLen { + err := fmt.Errorf("bad pubkey byte string size (want %v, have %v)", + PubKeyBytesLen, len(pubKeyStr)) + return nil, err + } + + // We'll manually prepend the compressed byte so we can re-use the + // existing pubkey parsing routine of the main btcec package. + var keyCompressed [btcec.PubKeyBytesLenCompressed]byte + keyCompressed[0] = secp.PubKeyFormatCompressedEven + copy(keyCompressed[1:], pubKeyStr) + + return btcec.ParsePubKey(keyCompressed[:]) +} + +// SerializePubKey serializes a public key as specified by BIP 340. Public keys +// in this format are 32 bytes in length, and are assumed to have an even y +// coordinate. +func SerializePubKey(pub *btcec.PublicKey) []byte { + pBytes := pub.SerializeCompressed() + return pBytes[1:] +} diff --git a/btcec/schnorr/signature.go b/btcec/schnorr/signature.go new file mode 100644 index 0000000000..8876a6070d --- /dev/null +++ b/btcec/schnorr/signature.go @@ -0,0 +1,538 @@ +// Copyright (c) 2013-2022 The btcsuite developers + +package schnorr + +import ( + "fmt" + + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/chaincfg/chainhash" + secp "github.com/decred/dcrd/dcrec/secp256k1/v4" + ecdsa_schnorr "github.com/decred/dcrd/dcrec/secp256k1/v4/schnorr" +) + +const ( + // SignatureSize is the size of an encoded Schnorr signature. + SignatureSize = 64 + + // scalarSize is the size of an encoded big endian scalar. + scalarSize = 32 +) + +var ( + // rfc6979ExtraDataV0 is the extra data to feed to RFC6979 when + // generating the deterministic nonce for the BIP-340 scheme. This + // ensures the same nonce is not generated for the same message and key + // as for other signing algorithms such as ECDSA. + // + // It is equal to SHA-256([]byte("BIP-340")). + rfc6979ExtraDataV0 = [32]uint8{ + 0xa3, 0xeb, 0x4c, 0x18, 0x2f, 0xae, 0x7e, 0xf4, + 0xe8, 0x10, 0xc6, 0xee, 0x13, 0xb0, 0xe9, 0x26, + 0x68, 0x6d, 0x71, 0xe8, 0x7f, 0x39, 0x4f, 0x79, + 0x9c, 0x00, 0xa5, 0x21, 0x03, 0xcb, 0x4e, 0x17, + } +) + +// Signature is a type representing a Schnorr signature. +type Signature struct { + r btcec.FieldVal + s btcec.ModNScalar +} + +// NewSignature instantiates a new signature given some r and s values. +func NewSignature(r *btcec.FieldVal, s *btcec.ModNScalar) *Signature { + var sig Signature + sig.r.Set(r).Normalize() + sig.s.Set(s) + return &sig +} + +// Serialize returns the Schnorr signature in the more strict format. +// +// The signatures are encoded as +// +// sig[0:32] x coordinate of the point R, encoded as a big-endian uint256 +// sig[32:64] s, encoded also as big-endian uint256 +func (sig Signature) Serialize() []byte { + // Total length of returned signature is the length of r and s. + var b [SignatureSize]byte + sig.r.PutBytesUnchecked(b[0:32]) + sig.s.PutBytesUnchecked(b[32:64]) + return b[:] +} + +// ParseSignature parses a signature according to the BIP-340 specification and +// enforces the following additional restrictions specific to secp256k1: +// +// - The r component must be in the valid range for secp256k1 field elements +// - The s component must be in the valid range for secp256k1 scalars +func ParseSignature(sig []byte) (*Signature, error) { + // The signature must be the correct length. + sigLen := len(sig) + if sigLen < SignatureSize { + str := fmt.Sprintf("malformed signature: too short: %d < %d", sigLen, + SignatureSize) + return nil, signatureError(ecdsa_schnorr.ErrSigTooShort, str) + } + if sigLen > SignatureSize { + str := fmt.Sprintf("malformed signature: too long: %d > %d", sigLen, + SignatureSize) + return nil, signatureError(ecdsa_schnorr.ErrSigTooLong, str) + } + + // The signature is validly encoded at this point, however, enforce + // additional restrictions to ensure r is in the range [0, p-1], and s is in + // the range [0, n-1] since valid Schnorr signatures are required to be in + // that range per spec. + var r btcec.FieldVal + if overflow := r.SetByteSlice(sig[0:32]); overflow { + str := "invalid signature: r >= field prime" + return nil, signatureError(ecdsa_schnorr.ErrSigRTooBig, str) + } + var s btcec.ModNScalar + s.SetByteSlice(sig[32:64]) + + // Return the signature. + return NewSignature(&r, &s), nil +} + +// IsEqual compares this Signature instance to the one passed, returning true +// if both Signatures are equivalent. A signature is equivalent to another, if +// they both have the same scalar value for R and S. +func (sig Signature) IsEqual(otherSig *Signature) bool { + return sig.r.Equals(&otherSig.r) && sig.s.Equals(&otherSig.s) +} + +// schnorrVerify attempt to verify the signature for the provided hash and +// secp256k1 public key and either returns nil if successful or a specific error +// indicating why it failed if not successful. +// +// This differs from the exported Verify method in that it returns a specific +// error to support better testing while the exported method simply returns a +// bool indicating success or failure. +func schnorrVerify(sig *Signature, hash []byte, pubKeyBytes []byte) error { + // The algorithm for producing a BIP-340 signature is described in + // README.md and is reproduced here for reference: + // + // 1. Fail if m is not 32 bytes + // 2. P = lift_x(int(pk)). + // 3. r = int(sig[0:32]); fail is r >= p. + // 4. s = int(sig[32:64]); fail if s >= n. + // 5. e = int(tagged_hash("BIP0340/challenge", bytes(r) || bytes(P) || M)) mod n. + // 6. R = s*G - e*P + // 7. Fail if is_infinite(R) + // 8. Fail if not hash_even_y(R) + // 9. Fail is x(R) != r. + // 10. Return success iff failure did not occur before reaching this point. + + // Step 1. + // + // Fail if m is not 32 bytes + if len(hash) != scalarSize { + str := fmt.Sprintf("wrong size for message (got %v, want %v)", + len(hash), scalarSize) + return signatureError(ecdsa_schnorr.ErrInvalidHashLen, str) + } + + // Step 2. + // + // P = lift_x(int(pk)) + // + // Fail if P is not a point on the curve + pubKey, err := ParsePubKey(pubKeyBytes) + if err != nil { + return err + } + if !pubKey.IsOnCurve() { + str := "pubkey point is not on curve" + return signatureError(ecdsa_schnorr.ErrPubKeyNotOnCurve, str) + } + + // Step 3. + // + // Fail if r >= p + // + // Note this is already handled by the fact r is a field element. + + // Step 4. + // + // Fail if s >= n + // + // Note this is already handled by the fact s is a mod n scalar. + + // Step 5. + // + // e = int(tagged_hash("BIP0340/challenge", bytes(r) || bytes(P) || M)) mod n. + var rBytes [32]byte + sig.r.PutBytesUnchecked(rBytes[:]) + pBytes := SerializePubKey(pubKey) + + commitment := chainhash.TaggedHash( + chainhash.TagBIP0340Challenge, rBytes[:], pBytes, hash, + ) + + var e btcec.ModNScalar + e.SetBytes((*[32]byte)(commitment)) + + // Negate e here so we can use AddNonConst below to subtract the s*G + // point from e*P. + e.Negate() + + // Step 6. + // + // R = s*G - e*P + var P, R, sG, eP btcec.JacobianPoint + pubKey.AsJacobian(&P) + btcec.ScalarBaseMultNonConst(&sig.s, &sG) + btcec.ScalarMultNonConst(&e, &P, &eP) + btcec.AddNonConst(&sG, &eP, &R) + + // Step 7. + // + // Fail if R is the point at infinity + if (R.X.IsZero() && R.Y.IsZero()) || R.Z.IsZero() { + str := "calculated R point is the point at infinity" + return signatureError(ecdsa_schnorr.ErrSigRNotOnCurve, str) + } + + // Step 8. + // + // Fail if R.y is odd + // + // Note that R must be in affine coordinates for this check. + R.ToAffine() + if R.Y.IsOdd() { + str := "calculated R y-value is odd" + return signatureError(ecdsa_schnorr.ErrSigRYIsOdd, str) + } + + // Step 9. + // + // Verified if R.x == r + // + // Note that R must be in affine coordinates for this check. + if !sig.r.Equals(&R.X) { + str := "calculated R point was not given R" + return signatureError(ecdsa_schnorr.ErrUnequalRValues, str) + } + + // Step 10. + // + // Return success iff failure did not occur before reaching this point. + return nil +} + +// Verify returns whether or not the signature is valid for the provided hash +// and secp256k1 public key. +func (sig *Signature) Verify(hash []byte, pubKey *btcec.PublicKey) bool { + pubkeyBytes := SerializePubKey(pubKey) + return schnorrVerify(sig, hash, pubkeyBytes) == nil +} + +// zeroArray zeroes the memory of a scalar array. +func zeroArray(a *[scalarSize]byte) { + for i := 0; i < scalarSize; i++ { + a[i] = 0x00 + } +} + +// schnorrSign generates a BIP-340 signature over the secp256k1 curve for the +// provided hash (which should be the result of hashing a larger message) using +// the given nonce and private key. The produced signature is deterministic +// (same message, nonce, and key yield the same signature) and canonical. +// +// WARNING: The hash MUST be 32 bytes and both the nonce and private keys must +// NOT be 0. Since this is an internal use function, these preconditions MUST +// be satisfied by the caller. +func schnorrSign(privKey, nonce *btcec.ModNScalar, pubKey *btcec.PublicKey, hash []byte, + opts *signOptions) (*Signature, error) { + + // The algorithm for producing a BIP-340 signature is described in + // README.md and is reproduced here for reference: + // + // G = curve generator + // n = curve order + // d = private key + // m = message + // a = input randomness + // r, s = signature + // + // 1. d' = int(d) + // 2. Fail if m is not 32 bytes + // 3. Fail if d = 0 or d >= n + // 4. P = d'*G + // 5. Negate d if P.y is odd + // 6. t = bytes(d) xor tagged_hash("BIP0340/aux", t || bytes(P) || m) + // 7. rand = tagged_hash("BIP0340/nonce", a) + // 8. k' = int(rand) mod n + // 9. Fail if k' = 0 + // 10. R = 'k*G + // 11. Negate k if R.y id odd + // 12. e = tagged_hash("BIP0340/challenge", bytes(R) || bytes(P) || m) mod n + // 13. sig = bytes(R) || bytes((k + e*d)) mod n + // 14. If Verify(bytes(P), m, sig) fails, abort. + // 15. return sig. + // + // Note that the set of functional options passed in may modify the + // above algorithm. Namely if CustomNonce is used, then steps 6-8 are + // replaced with a process that generates the nonce using rfc6979. If + // FastSign is passed, then we skip set 14. + + // NOTE: Steps 1-9 are performed by the caller. + + // + // Step 10. + // + // R = kG + var R btcec.JacobianPoint + k := *nonce + btcec.ScalarBaseMultNonConst(&k, &R) + + // Step 11. + // + // Negate nonce k if R.y is odd (R.y is the y coordinate of the point R) + // + // Note that R must be in affine coordinates for this check. + R.ToAffine() + if R.Y.IsOdd() { + k.Negate() + } + + // Step 12. + // + // e = tagged_hash("BIP0340/challenge", bytes(R) || bytes(P) || m) mod n + pBytes := SerializePubKey(pubKey) + commitment := chainhash.TaggedHash( + chainhash.TagBIP0340Challenge, R.X.Bytes()[:], pBytes, hash, + ) + + var e btcec.ModNScalar + if overflow := e.SetBytes((*[32]byte)(commitment)); overflow != 0 { + k.Zero() + str := "hash of (r || P || m) too big" + return nil, signatureError(ecdsa_schnorr.ErrSchnorrHashValue, str) + } + + // Step 13. + // + // s = k + e*d mod n + s := new(btcec.ModNScalar).Mul2(&e, privKey).Add(&k) + k.Zero() + + sig := NewSignature(&R.X, s) + + // Step 14. + // + // If Verify(bytes(P), m, sig) fails, abort. + if !opts.fastSign { + if err := schnorrVerify(sig, hash, pBytes); err != nil { + return nil, err + } + } + + // Step 15. + // + // Return (r, s) + return sig, nil +} + +// SignOption is a functional option argument that allows callers to modify the +// way we generate BIP-340 schnorr signatures. +type SignOption func(*signOptions) + +// signOptions houses the set of functional options that can be used to modify +// the method used to generate the BIP-340 signature. +type signOptions struct { + // fastSign determines if we'll skip the check at the end of the routine + // where we attempt to verify the produced signature. + fastSign bool + + // authNonce allows the user to pass in their own nonce information, which + // is useful for schemes like mu-sig. + authNonce *[32]byte +} + +// defaultSignOptions returns the default set of signing operations. +func defaultSignOptions() *signOptions { + return &signOptions{} +} + +// FastSign forces signing to skip the extra verification step at the end. +// Performance sensitive applications may opt to use this option to speed up the +// signing operation. +func FastSign() SignOption { + return func(o *signOptions) { + o.fastSign = true + } +} + +// CustomNonce allows users to pass in a custom set of auxData that's used as +// input randomness to generate the nonce used during signing. Users may want +// to specify this custom value when using multi-signatures schemes such as +// Mu-Sig2. If this option isn't set, then rfc6979 will be used to generate the +// nonce material. +func CustomNonce(auxData [32]byte) SignOption { + return func(o *signOptions) { + o.authNonce = &auxData + } +} + +// Sign generates an BIP-340 signature over the secp256k1 curve for the +// provided hash (which should be the result of hashing a larger message) using +// the given private key. The produced signature is deterministic (same +// message and same key yield the same signature) and canonical. +// +// Note that the current signing implementation has a few remaining variable +// time aspects which make use of the private key and the generated nonce, +// which can expose the signer to constant time attacks. As a result, this +// function should not be used in situations where there is the possibility of +// someone having EM field/cache/etc access. +func Sign(privKey *btcec.PrivateKey, hash []byte, + signOpts ...SignOption) (*Signature, error) { + + // First, parse the set of optional signing options. + opts := defaultSignOptions() + for _, option := range signOpts { + option(opts) + } + + // The algorithm for producing a BIP-340 signature is described in + // README.md and is reproduced here for reference: + // + // G = curve generator + // n = curve order + // d = private key + // m = message + // a = input randomness + // r, s = signature + // + // 1. d' = int(d) + // 2. Fail if m is not 32 bytes + // 3. Fail if d = 0 or d >= n + // 4. P = d'*G + // 5. Negate d if P.y is odd + // 6. t = bytes(d) xor tagged_hash("BIP0340/aux", t || bytes(P) || m) + // 7. rand = tagged_hash("BIP0340/nonce", a) + // 8. k' = int(rand) mod n + // 9. Fail if k' = 0 + // 10. R = 'k*G + // 11. Negate k if R.y id odd + // 12. e = tagged_hash("BIP0340/challenge", bytes(R) || bytes(P) || mod) mod n + // 13. sig = bytes(R) || bytes((k + e*d)) mod n + // 14. If Verify(bytes(P), m, sig) fails, abort. + // 15. return sig. + // + // Note that the set of functional options passed in may modify the + // above algorithm. Namely if CustomNonce is used, then steps 6-8 are + // replaced with a process that generates the nonce using rfc6979. If + // FastSign is passed, then we skip set 14. + + // Step 1. + // + // d' = int(d) + var privKeyScalar btcec.ModNScalar + privKeyScalar.Set(&privKey.Key) + + // Step 2. + // + // Fail if m is not 32 bytes + if len(hash) != scalarSize { + str := fmt.Sprintf("wrong size for message hash (got %v, want %v)", + len(hash), scalarSize) + return nil, signatureError(ecdsa_schnorr.ErrInvalidHashLen, str) + } + + // Step 3. + // + // Fail if d = 0 or d >= n + if privKeyScalar.IsZero() { + str := "private key is zero" + return nil, signatureError(ecdsa_schnorr.ErrPrivateKeyIsZero, str) + } + + // Step 4. + // + // P = 'd*G + pub := privKey.PubKey() + + // Step 5. + // + // Negate d if P.y is odd. + pubKeyBytes := pub.SerializeCompressed() + if pubKeyBytes[0] == secp.PubKeyFormatCompressedOdd { + privKeyScalar.Negate() + } + + // At this point, we check to see if a CustomNonce has been passed in, + // and if so, then we'll deviate from the main routine here by + // generating the nonce value as specified by BIP-0340. + if opts.authNonce != nil { + // Step 6. + // + // t = bytes(d) xor tagged_hash("BIP0340/aux", a) + privBytes := privKeyScalar.Bytes() + t := chainhash.TaggedHash( + chainhash.TagBIP0340Aux, (*opts.authNonce)[:], + ) + for i := 0; i < len(t); i++ { + t[i] ^= privBytes[i] + } + + // Step 7. + // + // rand = tagged_hash("BIP0340/nonce", t || bytes(P) || m) + // + // We snip off the first byte of the serialized pubkey, as we + // only need the x coordinate and not the market byte. + rand := chainhash.TaggedHash( + chainhash.TagBIP0340Nonce, t[:], pubKeyBytes[1:], hash, + ) + + // Step 8. + // + // k'= int(rand) mod n + var kPrime btcec.ModNScalar + kPrime.SetBytes((*[32]byte)(rand)) + + // Step 9. + // + // Fail if k' = 0 + if kPrime.IsZero() { + str := fmt.Sprintf("generated nonce is zero") + return nil, signatureError(ecdsa_schnorr.ErrSchnorrHashValue, str) + } + + sig, err := schnorrSign(&privKeyScalar, &kPrime, pub, hash, opts) + kPrime.Zero() + if err != nil { + return nil, err + } + + return sig, nil + } + + var privKeyBytes [scalarSize]byte + privKeyScalar.PutBytes(&privKeyBytes) + defer zeroArray(&privKeyBytes) + for iteration := uint32(0); ; iteration++ { + // Step 6-9. + // + // Use RFC6979 to generate a deterministic nonce k in [1, n-1] + // parameterized by the private key, message being signed, extra data + // that identifies the scheme, and an iteration count + k := btcec.NonceRFC6979( + privKeyBytes[:], hash, rfc6979ExtraDataV0[:], nil, iteration, + ) + + // Steps 10-15. + sig, err := schnorrSign(&privKeyScalar, k, pub, hash, opts) + k.Zero() + if err != nil { + // Try again with a new nonce. + continue + } + + return sig, nil + } +} diff --git a/btcec/schnorr/signature_test.go b/btcec/schnorr/signature_test.go new file mode 100644 index 0000000000..9e99bbe233 --- /dev/null +++ b/btcec/schnorr/signature_test.go @@ -0,0 +1,293 @@ +// Copyright (c) 2013-2017 The btcsuite developers +// Copyright (c) 2015-2021 The Decred developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package schnorr + +import ( + "encoding/hex" + "errors" + "strings" + "testing" + "testing/quick" + + "github.com/btcsuite/btcd/btcec/v2" + "github.com/davecgh/go-spew/spew" + secp_ecdsa "github.com/decred/dcrd/dcrec/secp256k1/v4" + ecdsa_schnorr "github.com/decred/dcrd/dcrec/secp256k1/v4/schnorr" +) + +type bip340Test struct { + secretKey string + publicKey string + auxRand string + message string + signature string + verifyResult bool + validPubKey bool + expectErr error + rfc6979 bool +} + +var bip340TestVectors = []bip340Test{ + { + secretKey: "0000000000000000000000000000000000000000000000000000000000000003", + publicKey: "F9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9", + auxRand: "0000000000000000000000000000000000000000000000000000000000000000", + message: "0000000000000000000000000000000000000000000000000000000000000000", + signature: "04E7F9037658A92AFEB4F25BAE5339E3DDCA81A353493827D26F16D92308E49E2A25E92208678A2DF86970DA91B03A8AF8815A8A60498B358DAF560B347AA557", + verifyResult: true, + validPubKey: true, + rfc6979: true, + }, + { + secretKey: "0000000000000000000000000000000000000000000000000000000000000003", + publicKey: "F9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9", + auxRand: "0000000000000000000000000000000000000000000000000000000000000000", + message: "0000000000000000000000000000000000000000000000000000000000000000", + signature: "E907831F80848D1069A5371B402410364BDF1C5F8307B0084C55F1CE2DCA821525F66A4A85EA8B71E482A74F382D2CE5EBEEE8FDB2172F477DF4900D310536C0", + verifyResult: true, + validPubKey: true, + }, + { + secretKey: "B7E151628AED2A6ABF7158809CF4F3C762E7160F38B4DA56A784D9045190CFEF", + publicKey: "DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659", + auxRand: "0000000000000000000000000000000000000000000000000000000000000001", + message: "243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89", + signature: "6896BD60EEAE296DB48A229FF71DFE071BDE413E6D43F917DC8DCF8C78DE33418906D11AC976ABCCB20B091292BFF4EA897EFCB639EA871CFA95F6DE339E4B0A", + verifyResult: true, + validPubKey: true, + }, + { + secretKey: "C90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B14E5C9", + publicKey: "DD308AFEC5777E13121FA72B9CC1B7CC0139715309B086C960E18FD969774EB8", + auxRand: "C87AA53824B4D7AE2EB035A2B5BBBCCC080E76CDC6D1692C4B0B62D798E6D906", + message: "7E2D58D8B3BCDF1ABADEC7829054F90DDA9805AAB56C77333024B9D0A508B75C", + signature: "5831AAEED7B44BB74E5EAB94BA9D4294C49BCF2A60728D8B4C200F50DD313C1BAB745879A5AD954A72C45A91C3A51D3C7ADEA98D82F8481E0E1E03674A6F3FB7", + verifyResult: true, + validPubKey: true, + }, + { + secretKey: "0B432B2677937381AEF05BB02A66ECD012773062CF3FA2549E44F58ED2401710", + publicKey: "25D1DFF95105F5253C4022F628A996AD3A0D95FBF21D468A1B33F8C160D8F517", + auxRand: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", + message: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", + signature: "7EB0509757E246F19449885651611CB965ECC1A187DD51B64FDA1EDC9637D5EC97582B9CB13DB3933705B32BA982AF5AF25FD78881EBB32771FC5922EFC66EA3", + verifyResult: true, + validPubKey: true, + }, + { + publicKey: "D69C3509BB99E412E68B0FE8544E72837DFA30746D8BE2AA65975F29D22DC7B9", + message: "4DF3C3F68FCC83B27E9D42C90431A72499F17875C81A599B566C9889B9696703", + signature: "00000000000000000000003B78CE563F89A0ED9414F5AA28AD0D96D6795F9C6376AFB1548AF603B3EB45C9F8207DEE1060CB71C04E80F593060B07D28308D7F4", + verifyResult: true, + validPubKey: true, + }, + { + publicKey: "EEFDEA4CDB677750A420FEE807EACF21EB9898AE79B9768766E4FAA04A2D4A34", + message: "243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89", + signature: "6CFF5C3BA86C69EA4B7376F31A9BCB4F74C1976089B2D9963DA2E5543E17776969E89B4C5564D00349106B8497785DD7D1D713A8AE82B32FA79D5F7FC407D39B", + verifyResult: false, + validPubKey: false, + expectErr: secp_ecdsa.ErrPubKeyNotOnCurve, + }, + { + publicKey: "DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659", + message: "243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89", + signature: "FFF97BD5755EEEA420453A14355235D382F6472F8568A18B2F057A14602975563CC27944640AC607CD107AE10923D9EF7A73C643E166BE5EBEAFA34B1AC553E2", + verifyResult: false, + validPubKey: true, + expectErr: ecdsa_schnorr.ErrSigRYIsOdd, + }, + { + publicKey: "DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659", + message: "243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89", + signature: "1FA62E331EDBC21C394792D2AB1100A7B432B013DF3F6FF4F99FCB33E0E1515F28890B3EDB6E7189B630448B515CE4F8622A954CFE545735AAEA5134FCCDB2BD", + verifyResult: false, + validPubKey: true, + expectErr: ecdsa_schnorr.ErrSigRYIsOdd, + }, + { + publicKey: "DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659", + message: "243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89", + signature: "6CFF5C3BA86C69EA4B7376F31A9BCB4F74C1976089B2D9963DA2E5543E177769961764B3AA9B2FFCB6EF947B6887A226E8D7C93E00C5ED0C1834FF0D0C2E6DA6", + verifyResult: false, + validPubKey: true, + expectErr: ecdsa_schnorr.ErrUnequalRValues, + }, + { + publicKey: "DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659", + message: "243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89", + signature: "0000000000000000000000000000000000000000000000000000000000000000123DDA8328AF9C23A94C1FEECFD123BA4FB73476F0D594DCB65C6425BD186051", + verifyResult: false, + validPubKey: true, + expectErr: ecdsa_schnorr.ErrSigRNotOnCurve, + }, + { + publicKey: "DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659", + message: "243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89", + signature: "00000000000000000000000000000000000000000000000000000000000000017615FBAF5AE28864013C099742DEADB4DBA87F11AC6754F93780D5A1837CF197", + verifyResult: false, + validPubKey: true, + expectErr: ecdsa_schnorr.ErrSigRNotOnCurve, + }, + { + publicKey: "DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659", + message: "243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89", + signature: "4A298DACAE57395A15D0795DDBFD1DCB564DA82B0F269BC70A74F8220429BA1D69E89B4C5564D00349106B8497785DD7D1D713A8AE82B32FA79D5F7FC407D39B", + verifyResult: false, + validPubKey: true, + expectErr: ecdsa_schnorr.ErrUnequalRValues, + }, + { + publicKey: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC30", + message: "243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89", + signature: "6CFF5C3BA86C69EA4B7376F31A9BCB4F74C1976089B2D9963DA2E5543E17776969E89B4C5564D00349106B8497785DD7D1D713A8AE82B32FA79D5F7FC407D39B", + verifyResult: false, + validPubKey: false, + expectErr: secp_ecdsa.ErrPubKeyXTooBig, + }, +} + +// decodeHex decodes the passed hex string and returns the resulting bytes. It +// panics if an error occurs. This is only used in the tests as a helper since +// the only way it can fail is if there is an error in the test source code. +func decodeHex(hexStr string) []byte { + b, err := hex.DecodeString(hexStr) + if err != nil { + panic("invalid hex string in test source: err " + err.Error() + + ", hex: " + hexStr) + } + + return b +} + +func TestSchnorrSign(t *testing.T) { + t.Parallel() + + for i, test := range bip340TestVectors { + if len(test.secretKey) == 0 { + continue + } + + d := decodeHex(test.secretKey) + privKey, _ := btcec.PrivKeyFromBytes(d) + + var auxBytes [32]byte + aux := decodeHex(test.auxRand) + copy(auxBytes[:], aux) + + msg := decodeHex(test.message) + + var signOpts []SignOption + if !test.rfc6979 { + signOpts = []SignOption{CustomNonce(auxBytes)} + } + + sig, err := Sign(privKey, msg, signOpts...) + if err != nil { + t.Fatalf("test #%v: sig generation failed: %v", i, err) + } + + if strings.ToUpper(hex.EncodeToString(sig.Serialize())) != test.signature { + t.Fatalf("test #%v: got signature %x : "+ + "want %s", i, sig.Serialize(), test.signature) + } + + pubKeyBytes := decodeHex(test.publicKey) + err = schnorrVerify(sig, msg, pubKeyBytes) + if err != nil { + t.Fail() + } + + verify := err == nil + if test.verifyResult != verify { + t.Fatalf("test #%v: verification mismatch: "+ + "expected %v, got %v", i, test.verifyResult, verify) + } + } +} + +func TestSchnorrVerify(t *testing.T) { + t.Parallel() + + for i, test := range bip340TestVectors { + + pubKeyBytes := decodeHex(test.publicKey) + + _, err := ParsePubKey(pubKeyBytes) + switch { + case !test.validPubKey && err != nil: + if !errors.Is(err, test.expectErr) { + t.Fatalf("test #%v: pubkey validation should "+ + "have failed, expected %v, got %v", i, + test.expectErr, err) + } + + continue + + case err != nil: + t.Fatalf("test #%v: unable to parse pubkey: %v", i, err) + } + + msg := decodeHex(test.message) + + sig, err := ParseSignature(decodeHex(test.signature)) + if err != nil { + t.Fatalf("unable to parse sig: %v", err) + } + + err = schnorrVerify(sig, msg, pubKeyBytes) + if err != nil && test.verifyResult { + t.Fatalf("test #%v: verification shouldn't have failed: %v", i, err) + } + + verify := err == nil + if test.verifyResult != verify { + t.Fatalf("test #%v: verification mismatch: expected "+ + "%v, got %v", i, test.verifyResult, verify) + } + + if !test.verifyResult && test.expectErr != nil { + if !errors.Is(err, test.expectErr) { + t.Fatalf("test #%v: expect error %v : got %v", i, test.expectErr, err) + } + } + } +} + +// TestSchnorrSignNoMutate tests that generating a schnorr signature doesn't +// modify/mutate the underlying private key. +func TestSchnorrSignNoMutate(t *testing.T) { + t.Parallel() + + // Assert that given a random private key and message, we can generate + // a signature from that w/o modifying the underlying private key. + f := func(privBytes, msg [32]byte) bool { + privBytesCopy := privBytes + privKey, _ := btcec.PrivKeyFromBytes(privBytesCopy[:]) + + // Generate a signature for private key with our message. + _, err := Sign(privKey, msg[:]) + if err != nil { + t.Logf("unable to gen sig: %v", err) + return false + } + + // We should be able to re-derive the private key from raw + // bytes and have that match up again. + privKeyCopy, _ := btcec.PrivKeyFromBytes(privBytes[:]) + if *privKey != *privKeyCopy { + t.Logf("private doesn't match: expected %v, got %v", + spew.Sdump(privKeyCopy), spew.Sdump(privKey)) + return false + } + + return true + } + + if err := quick.Check(f, nil); err != nil { + t.Fatalf("private key modified: %v", err) + } +} diff --git a/btcec/secp256k1.go b/btcec/secp256k1.go deleted file mode 100644 index 1b1b8179e1..0000000000 --- a/btcec/secp256k1.go +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) 2015 The btcsuite developers -// Use of this source code is governed by an ISC -// license that can be found in the LICENSE file. - -package btcec - -// Auto-generated file (see genprecomps.go) -// DO NOT EDIT - -var secp256k1BytePoints = "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" diff --git a/btcec/signature.go b/btcec/signature.go deleted file mode 100644 index deedd172d8..0000000000 --- a/btcec/signature.go +++ /dev/null @@ -1,540 +0,0 @@ -// Copyright (c) 2013-2017 The btcsuite developers -// Use of this source code is governed by an ISC -// license that can be found in the LICENSE file. - -package btcec - -import ( - "bytes" - "crypto/ecdsa" - "crypto/elliptic" - "crypto/hmac" - "crypto/sha256" - "errors" - "fmt" - "hash" - "math/big" -) - -// Errors returned by canonicalPadding. -var ( - errNegativeValue = errors.New("value may be interpreted as negative") - errExcessivelyPaddedValue = errors.New("value is excessively padded") -) - -// Signature is a type representing an ecdsa signature. -type Signature struct { - R *big.Int - S *big.Int -} - -var ( - // Used in RFC6979 implementation when testing the nonce for correctness - one = big.NewInt(1) - - // oneInitializer is used to fill a byte slice with byte 0x01. It is provided - // here to avoid the need to create it multiple times. - oneInitializer = []byte{0x01} -) - -// Serialize returns the ECDSA signature in the more strict DER format. Note -// that the serialized bytes returned do not include the appended hash type -// used in Bitcoin signature scripts. -// -// encoding/asn1 is broken so we hand roll this output: -// -// 0x30 0x02 r 0x02 s -func (sig *Signature) Serialize() []byte { - // low 'S' malleability breaker - sigS := sig.S - if sigS.Cmp(S256().halfOrder) == 1 { - sigS = new(big.Int).Sub(S256().N, sigS) - } - // Ensure the encoded bytes for the r and s values are canonical and - // thus suitable for DER encoding. - rb := canonicalizeInt(sig.R) - sb := canonicalizeInt(sigS) - - // total length of returned signature is 1 byte for each magic and - // length (6 total), plus lengths of r and s - length := 6 + len(rb) + len(sb) - b := make([]byte, length) - - b[0] = 0x30 - b[1] = byte(length - 2) - b[2] = 0x02 - b[3] = byte(len(rb)) - offset := copy(b[4:], rb) + 4 - b[offset] = 0x02 - b[offset+1] = byte(len(sb)) - copy(b[offset+2:], sb) - return b -} - -// Verify calls ecdsa.Verify to verify the signature of hash using the public -// key. It returns true if the signature is valid, false otherwise. -func (sig *Signature) Verify(hash []byte, pubKey *PublicKey) bool { - return ecdsa.Verify(pubKey.ToECDSA(), hash, sig.R, sig.S) -} - -// IsEqual compares this Signature instance to the one passed, returning true -// if both Signatures are equivalent. A signature is equivalent to another, if -// they both have the same scalar value for R and S. -func (sig *Signature) IsEqual(otherSig *Signature) bool { - return sig.R.Cmp(otherSig.R) == 0 && - sig.S.Cmp(otherSig.S) == 0 -} - -// MinSigLen is the minimum length of a DER encoded signature and is when both R -// and S are 1 byte each. -// 0x30 + <1-byte> + 0x02 + 0x01 + + 0x2 + 0x01 + -const MinSigLen = 8 - -func parseSig(sigStr []byte, curve elliptic.Curve, der bool) (*Signature, error) { - // Originally this code used encoding/asn1 in order to parse the - // signature, but a number of problems were found with this approach. - // Despite the fact that signatures are stored as DER, the difference - // between go's idea of a bignum (and that they have sign) doesn't agree - // with the openssl one (where they do not). The above is true as of - // Go 1.1. In the end it was simpler to rewrite the code to explicitly - // understand the format which is this: - // 0x30 <0x02> 0x2 - // . - - signature := &Signature{} - - if len(sigStr) < MinSigLen { - return nil, errors.New("malformed signature: too short") - } - // 0x30 - index := 0 - if sigStr[index] != 0x30 { - return nil, errors.New("malformed signature: no header magic") - } - index++ - // length of remaining message - siglen := sigStr[index] - index++ - - // siglen should be less than the entire message and greater than - // the minimal message size. - if int(siglen+2) > len(sigStr) || int(siglen+2) < MinSigLen { - return nil, errors.New("malformed signature: bad length") - } - // trim the slice we're working on so we only look at what matters. - sigStr = sigStr[:siglen+2] - - // 0x02 - if sigStr[index] != 0x02 { - return nil, - errors.New("malformed signature: no 1st int marker") - } - index++ - - // Length of signature R. - rLen := int(sigStr[index]) - // must be positive, must be able to fit in another 0x2, - // hence the -3. We assume that the length must be at least one byte. - index++ - if rLen <= 0 || rLen > len(sigStr)-index-3 { - return nil, errors.New("malformed signature: bogus R length") - } - - // Then R itself. - rBytes := sigStr[index : index+rLen] - if der { - switch err := canonicalPadding(rBytes); err { - case errNegativeValue: - return nil, errors.New("signature R is negative") - case errExcessivelyPaddedValue: - return nil, errors.New("signature R is excessively padded") - } - } - signature.R = new(big.Int).SetBytes(rBytes) - index += rLen - // 0x02. length already checked in previous if. - if sigStr[index] != 0x02 { - return nil, errors.New("malformed signature: no 2nd int marker") - } - index++ - - // Length of signature S. - sLen := int(sigStr[index]) - index++ - // S should be the rest of the string. - if sLen <= 0 || sLen > len(sigStr)-index { - return nil, errors.New("malformed signature: bogus S length") - } - - // Then S itself. - sBytes := sigStr[index : index+sLen] - if der { - switch err := canonicalPadding(sBytes); err { - case errNegativeValue: - return nil, errors.New("signature S is negative") - case errExcessivelyPaddedValue: - return nil, errors.New("signature S is excessively padded") - } - } - signature.S = new(big.Int).SetBytes(sBytes) - index += sLen - - // sanity check length parsing - if index != len(sigStr) { - return nil, fmt.Errorf("malformed signature: bad final length %v != %v", - index, len(sigStr)) - } - - // Verify also checks this, but we can be more sure that we parsed - // correctly if we verify here too. - // FWIW the ecdsa spec states that R and S must be | 1, N - 1 | - // but crypto/ecdsa only checks for Sign != 0. Mirror that. - if signature.R.Sign() != 1 { - return nil, errors.New("signature R isn't 1 or more") - } - if signature.S.Sign() != 1 { - return nil, errors.New("signature S isn't 1 or more") - } - if signature.R.Cmp(curve.Params().N) >= 0 { - return nil, errors.New("signature R is >= curve.N") - } - if signature.S.Cmp(curve.Params().N) >= 0 { - return nil, errors.New("signature S is >= curve.N") - } - - return signature, nil -} - -// ParseSignature parses a signature in BER format for the curve type `curve' -// into a Signature type, perfoming some basic sanity checks. If parsing -// according to the more strict DER format is needed, use ParseDERSignature. -func ParseSignature(sigStr []byte, curve elliptic.Curve) (*Signature, error) { - return parseSig(sigStr, curve, false) -} - -// ParseDERSignature parses a signature in DER format for the curve type -// `curve` into a Signature type. If parsing according to the less strict -// BER format is needed, use ParseSignature. -func ParseDERSignature(sigStr []byte, curve elliptic.Curve) (*Signature, error) { - return parseSig(sigStr, curve, true) -} - -// canonicalizeInt returns the bytes for the passed big integer adjusted as -// necessary to ensure that a big-endian encoded integer can't possibly be -// misinterpreted as a negative number. This can happen when the most -// significant bit is set, so it is padded by a leading zero byte in this case. -// Also, the returned bytes will have at least a single byte when the passed -// value is 0. This is required for DER encoding. -func canonicalizeInt(val *big.Int) []byte { - b := val.Bytes() - if len(b) == 0 { - b = []byte{0x00} - } - if b[0]&0x80 != 0 { - paddedBytes := make([]byte, len(b)+1) - copy(paddedBytes[1:], b) - b = paddedBytes - } - return b -} - -// canonicalPadding checks whether a big-endian encoded integer could -// possibly be misinterpreted as a negative number (even though OpenSSL -// treats all numbers as unsigned), or if there is any unnecessary -// leading zero padding. -func canonicalPadding(b []byte) error { - switch { - case b[0]&0x80 == 0x80: - return errNegativeValue - case len(b) > 1 && b[0] == 0x00 && b[1]&0x80 != 0x80: - return errExcessivelyPaddedValue - default: - return nil - } -} - -// hashToInt converts a hash value to an integer. There is some disagreement -// about how this is done. [NSA] suggests that this is done in the obvious -// manner, but [SECG] truncates the hash to the bit-length of the curve order -// first. We follow [SECG] because that's what OpenSSL does. Additionally, -// OpenSSL right shifts excess bits from the number if the hash is too large -// and we mirror that too. -// This is borrowed from crypto/ecdsa. -func hashToInt(hash []byte, c elliptic.Curve) *big.Int { - orderBits := c.Params().N.BitLen() - orderBytes := (orderBits + 7) / 8 - if len(hash) > orderBytes { - hash = hash[:orderBytes] - } - - ret := new(big.Int).SetBytes(hash) - excess := len(hash)*8 - orderBits - if excess > 0 { - ret.Rsh(ret, uint(excess)) - } - return ret -} - -// recoverKeyFromSignature recovers a public key from the signature "sig" on the -// given message hash "msg". Based on the algorithm found in section 4.1.6 of -// SEC 1 Ver 2.0, page 47-48 (53 and 54 in the pdf). This performs the details -// in the inner loop in Step 1. The counter provided is actually the j parameter -// of the loop * 2 - on the first iteration of j we do the R case, else the -R -// case in step 1.6. This counter is used in the bitcoin compressed signature -// format and thus we match bitcoind's behaviour here. -func recoverKeyFromSignature(curve *KoblitzCurve, sig *Signature, msg []byte, - iter int, doChecks bool) (*PublicKey, error) { - // 1.1 x = (n * i) + r - Rx := new(big.Int).Mul(curve.Params().N, - new(big.Int).SetInt64(int64(iter/2))) - Rx.Add(Rx, sig.R) - if Rx.Cmp(curve.Params().P) != -1 { - return nil, errors.New("calculated Rx is larger than curve P") - } - - // convert 02 to point R. (step 1.2 and 1.3). If we are on an odd - // iteration then 1.6 will be done with -R, so we calculate the other - // term when uncompressing the point. - Ry, err := decompressPoint(curve, Rx, iter%2 == 1) - if err != nil { - return nil, err - } - - // 1.4 Check n*R is point at infinity - if doChecks { - nRx, nRy := curve.ScalarMult(Rx, Ry, curve.Params().N.Bytes()) - if nRx.Sign() != 0 || nRy.Sign() != 0 { - return nil, errors.New("n*R does not equal the point at infinity") - } - } - - // 1.5 calculate e from message using the same algorithm as ecdsa - // signature calculation. - e := hashToInt(msg, curve) - - // Step 1.6.1: - // We calculate the two terms sR and eG separately multiplied by the - // inverse of r (from the signature). We then add them to calculate - // Q = r^-1(sR-eG) - invr := new(big.Int).ModInverse(sig.R, curve.Params().N) - - // first term. - invrS := new(big.Int).Mul(invr, sig.S) - invrS.Mod(invrS, curve.Params().N) - sRx, sRy := curve.ScalarMult(Rx, Ry, invrS.Bytes()) - - // second term. - e.Neg(e) - e.Mod(e, curve.Params().N) - e.Mul(e, invr) - e.Mod(e, curve.Params().N) - minuseGx, minuseGy := curve.ScalarBaseMult(e.Bytes()) - - // TODO: this would be faster if we did a mult and add in one - // step to prevent the jacobian conversion back and forth. - Qx, Qy := curve.Add(sRx, sRy, minuseGx, minuseGy) - - return &PublicKey{ - Curve: curve, - X: Qx, - Y: Qy, - }, nil -} - -// SignCompact produces a compact signature of the data in hash with the given -// private key on the given koblitz curve. The isCompressed parameter should -// be used to detail if the given signature should reference a compressed -// public key or not. If successful the bytes of the compact signature will be -// returned in the format: -// <(byte of 27+public key solution)+4 if compressed >< padded bytes for signature R> -// where the R and S parameters are padde up to the bitlengh of the curve. -func SignCompact(curve *KoblitzCurve, key *PrivateKey, - hash []byte, isCompressedKey bool) ([]byte, error) { - sig, err := key.Sign(hash) - if err != nil { - return nil, err - } - - // bitcoind checks the bit length of R and S here. The ecdsa signature - // algorithm returns R and S mod N therefore they will be the bitsize of - // the curve, and thus correctly sized. - for i := 0; i < (curve.H+1)*2; i++ { - pk, err := recoverKeyFromSignature(curve, sig, hash, i, true) - if err == nil && pk.X.Cmp(key.X) == 0 && pk.Y.Cmp(key.Y) == 0 { - result := make([]byte, 1, 2*curve.byteSize+1) - result[0] = 27 + byte(i) - if isCompressedKey { - result[0] += 4 - } - // Not sure this needs rounding but safer to do so. - curvelen := (curve.BitSize + 7) / 8 - - // Pad R and S to curvelen if needed. - bytelen := (sig.R.BitLen() + 7) / 8 - if bytelen < curvelen { - result = append(result, - make([]byte, curvelen-bytelen)...) - } - result = append(result, sig.R.Bytes()...) - - bytelen = (sig.S.BitLen() + 7) / 8 - if bytelen < curvelen { - result = append(result, - make([]byte, curvelen-bytelen)...) - } - result = append(result, sig.S.Bytes()...) - - return result, nil - } - } - - return nil, errors.New("no valid solution for pubkey found") -} - -// RecoverCompact verifies the compact signature "signature" of "hash" for the -// Koblitz curve in "curve". If the signature matches then the recovered public -// key will be returned as well as a boolen if the original key was compressed -// or not, else an error will be returned. -func RecoverCompact(curve *KoblitzCurve, signature, - hash []byte) (*PublicKey, bool, error) { - bitlen := (curve.BitSize + 7) / 8 - if len(signature) != 1+bitlen*2 { - return nil, false, errors.New("invalid compact signature size") - } - - iteration := int((signature[0] - 27) & ^byte(4)) - - // format is
- sig := &Signature{ - R: new(big.Int).SetBytes(signature[1 : bitlen+1]), - S: new(big.Int).SetBytes(signature[bitlen+1:]), - } - // The iteration used here was encoded - key, err := recoverKeyFromSignature(curve, sig, hash, iteration, false) - if err != nil { - return nil, false, err - } - - return key, ((signature[0] - 27) & 4) == 4, nil -} - -// signRFC6979 generates a deterministic ECDSA signature according to RFC 6979 and BIP 62. -func signRFC6979(privateKey *PrivateKey, hash []byte) (*Signature, error) { - - privkey := privateKey.ToECDSA() - N := S256().N - halfOrder := S256().halfOrder - k := nonceRFC6979(privkey.D, hash) - inv := new(big.Int).ModInverse(k, N) - r, _ := privkey.Curve.ScalarBaseMult(k.Bytes()) - r.Mod(r, N) - - if r.Sign() == 0 { - return nil, errors.New("calculated R is zero") - } - - e := hashToInt(hash, privkey.Curve) - s := new(big.Int).Mul(privkey.D, r) - s.Add(s, e) - s.Mul(s, inv) - s.Mod(s, N) - - if s.Cmp(halfOrder) == 1 { - s.Sub(N, s) - } - if s.Sign() == 0 { - return nil, errors.New("calculated S is zero") - } - return &Signature{R: r, S: s}, nil -} - -// nonceRFC6979 generates an ECDSA nonce (`k`) deterministically according to RFC 6979. -// It takes a 32-byte hash as an input and returns 32-byte nonce to be used in ECDSA algorithm. -func nonceRFC6979(privkey *big.Int, hash []byte) *big.Int { - - curve := S256() - q := curve.Params().N - x := privkey - alg := sha256.New - - qlen := q.BitLen() - holen := alg().Size() - rolen := (qlen + 7) >> 3 - bx := append(int2octets(x, rolen), bits2octets(hash, curve, rolen)...) - - // Step B - v := bytes.Repeat(oneInitializer, holen) - - // Step C (Go zeroes the all allocated memory) - k := make([]byte, holen) - - // Step D - k = mac(alg, k, append(append(v, 0x00), bx...)) - - // Step E - v = mac(alg, k, v) - - // Step F - k = mac(alg, k, append(append(v, 0x01), bx...)) - - // Step G - v = mac(alg, k, v) - - // Step H - for { - // Step H1 - var t []byte - - // Step H2 - for len(t)*8 < qlen { - v = mac(alg, k, v) - t = append(t, v...) - } - - // Step H3 - secret := hashToInt(t, curve) - if secret.Cmp(one) >= 0 && secret.Cmp(q) < 0 { - return secret - } - k = mac(alg, k, append(v, 0x00)) - v = mac(alg, k, v) - } -} - -// mac returns an HMAC of the given key and message. -func mac(alg func() hash.Hash, k, m []byte) []byte { - h := hmac.New(alg, k) - h.Write(m) - return h.Sum(nil) -} - -// https://tools.ietf.org/html/rfc6979#section-2.3.3 -func int2octets(v *big.Int, rolen int) []byte { - out := v.Bytes() - - // left pad with zeros if it's too short - if len(out) < rolen { - out2 := make([]byte, rolen) - copy(out2[rolen-len(out):], out) - return out2 - } - - // drop most significant bytes if it's too long - if len(out) > rolen { - out2 := make([]byte, rolen) - copy(out2, out[len(out)-rolen:]) - return out2 - } - - return out -} - -// https://tools.ietf.org/html/rfc6979#section-2.3.4 -func bits2octets(in []byte, curve elliptic.Curve, rolen int) []byte { - z1 := hashToInt(in, curve) - z2 := new(big.Int).Sub(z1, curve.Params().N) - if z2.Sign() < 0 { - return int2octets(z1, rolen) - } - return int2octets(z2, rolen) -} diff --git a/btcjson/README.md b/btcjson/README.md index b643579543..48f322635e 100644 --- a/btcjson/README.md +++ b/btcjson/README.md @@ -1,9 +1,9 @@ btcjson ======= -[![Build Status](https://travis-ci.org/btcsuite/btcd.png?branch=master)](https://travis-ci.org/btcsuite/btcd) +[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions) [![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) -[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/btcsuite/btcd/btcjson) +[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/btcjson) Package btcjson implements concrete types for marshalling to and from the bitcoin JSON-RPC API. A comprehensive suite of tests is provided to ensure @@ -30,17 +30,17 @@ $ go get -u github.com/btcsuite/btcd/btcjson ## Examples -* [Marshal Command](http://godoc.org/github.com/btcsuite/btcd/btcjson#example-MarshalCmd) +* [Marshal Command](https://pkg.go.dev/github.com/btcsuite/btcd/btcjson#example-MarshalCmd) Demonstrates how to create and marshal a command into a JSON-RPC request. -* [Unmarshal Command](http://godoc.org/github.com/btcsuite/btcd/btcjson#example-UnmarshalCmd) +* [Unmarshal Command](https://pkg.go.dev/github.com/btcsuite/btcd/btcjson#example-UnmarshalCmd) Demonstrates how to unmarshal a JSON-RPC request and then unmarshal the concrete request into a concrete command. -* [Marshal Response](http://godoc.org/github.com/btcsuite/btcd/btcjson#example-MarshalResponse) +* [Marshal Response](https://pkg.go.dev/github.com/btcsuite/btcd/btcjson#example-MarshalResponse) Demonstrates how to marshal a JSON-RPC response. -* [Unmarshal Response](http://godoc.org/github.com/btcsuite/btcd/btcjson#example-package--UnmarshalResponse) +* [Unmarshal Response](https://pkg.go.dev/github.com/btcsuite/btcd/btcjson#example-package--UnmarshalResponse) Demonstrates how to unmarshal a JSON-RPC response and then unmarshal the result field in the response to a concrete type. diff --git a/btcjson/btcdextcmds.go b/btcjson/btcdextcmds.go index 963ccb3a3b..768dca4d3d 100644 --- a/btcjson/btcdextcmds.go +++ b/btcjson/btcdextcmds.go @@ -20,7 +20,7 @@ const ( // persistent peer. NRemove NodeSubCmd = "remove" - // NDisconnect indicates the specified peer should be disonnected. + // NDisconnect indicates the specified peer should be disconnected. NDisconnect NodeSubCmd = "disconnect" ) @@ -59,6 +59,23 @@ func NewDebugLevelCmd(levelSpec string) *DebugLevelCmd { } } +// GenerateToAddressCmd defines the generatetoaddress JSON-RPC command. +type GenerateToAddressCmd struct { + NumBlocks int64 + Address string + MaxTries *int64 `jsonrpcdefault:"1000000"` +} + +// NewGenerateToAddressCmd returns a new instance which can be used to issue a +// generatetoaddress JSON-RPC command. +func NewGenerateToAddressCmd(numBlocks int64, address string, maxTries *int64) *GenerateToAddressCmd { + return &GenerateToAddressCmd{ + NumBlocks: numBlocks, + Address: address, + MaxTries: maxTries, + } +} + // GenerateCmd defines the generate JSON-RPC command. type GenerateCmd struct { NumBlocks uint32 @@ -131,6 +148,7 @@ func init() { MustRegisterCmd("debuglevel", (*DebugLevelCmd)(nil), flags) MustRegisterCmd("node", (*NodeCmd)(nil), flags) MustRegisterCmd("generate", (*GenerateCmd)(nil), flags) + MustRegisterCmd("generatetoaddress", (*GenerateToAddressCmd)(nil), flags) MustRegisterCmd("getbestblock", (*GetBestBlockCmd)(nil), flags) MustRegisterCmd("getcurrentnet", (*GetCurrentNetCmd)(nil), flags) MustRegisterCmd("getheaders", (*GetHeadersCmd)(nil), flags) diff --git a/btcjson/btcdextcmds_test.go b/btcjson/btcdextcmds_test.go index 10e6da3896..aaa44144e4 100644 --- a/btcjson/btcdextcmds_test.go +++ b/btcjson/btcdextcmds_test.go @@ -114,6 +114,24 @@ func TestBtcdExtCmds(t *testing.T) { NumBlocks: 1, }, }, + { + name: "generatetoaddress", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("generatetoaddress", 1, "1Address") + }, + staticCmd: func() interface{} { + return btcjson.NewGenerateToAddressCmd(1, "1Address", nil) + }, + marshalled: `{"jsonrpc":"1.0","method":"generatetoaddress","params":[1,"1Address"],"id":1}`, + unmarshalled: &btcjson.GenerateToAddressCmd{ + NumBlocks: 1, + Address: "1Address", + MaxTries: func() *int64 { + var i int64 = 1000000 + return &i + }(), + }, + }, { name: "getbestblock", newCmd: func() (interface{}, error) { @@ -193,7 +211,7 @@ func TestBtcdExtCmds(t *testing.T) { for i, test := range tests { // Marshal the command as created by the new static command // creation function. - marshalled, err := btcjson.MarshalCmd(testID, test.staticCmd()) + marshalled, err := btcjson.MarshalCmd(btcjson.RpcVersion1, testID, test.staticCmd()) if err != nil { t.Errorf("MarshalCmd #%d (%s) unexpected error: %v", i, test.name, err) @@ -217,7 +235,7 @@ func TestBtcdExtCmds(t *testing.T) { // Marshal the command as created by the generic new command // creation function. - marshalled, err = btcjson.MarshalCmd(testID, cmd) + marshalled, err = btcjson.MarshalCmd(btcjson.RpcVersion1, testID, cmd) if err != nil { t.Errorf("MarshalCmd #%d (%s) unexpected error: %v", i, test.name, err) diff --git a/btcjson/btcdextresults_test.go b/btcjson/btcdextresults_test.go index 478f088cd3..9a8b9eedf7 100644 --- a/btcjson/btcdextresults_test.go +++ b/btcjson/btcdextresults_test.go @@ -13,7 +13,7 @@ import ( ) // TestBtcdExtCustomResults ensures any results that have custom marshalling -// work as inteded. +// work as intended. // and unmarshal code of results are as expected. func TestBtcdExtCustomResults(t *testing.T) { t.Parallel() diff --git a/btcjson/btcwalletextcmds_test.go b/btcjson/btcwalletextcmds_test.go index 58de1c81d0..dea1c61465 100644 --- a/btcjson/btcwalletextcmds_test.go +++ b/btcjson/btcwalletextcmds_test.go @@ -145,7 +145,7 @@ func TestBtcWalletExtCmds(t *testing.T) { for i, test := range tests { // Marshal the command as created by the new static command // creation function. - marshalled, err := btcjson.MarshalCmd(testID, test.staticCmd()) + marshalled, err := btcjson.MarshalCmd(btcjson.RpcVersion1, testID, test.staticCmd()) if err != nil { t.Errorf("MarshalCmd #%d (%s) unexpected error: %v", i, test.name, err) @@ -169,7 +169,7 @@ func TestBtcWalletExtCmds(t *testing.T) { // Marshal the command as created by the generic new command // creation function. - marshalled, err = btcjson.MarshalCmd(testID, cmd) + marshalled, err = btcjson.MarshalCmd(btcjson.RpcVersion1, testID, cmd) if err != nil { t.Errorf("MarshalCmd #%d (%s) unexpected error: %v", i, test.name, err) diff --git a/btcjson/chainsvrcmds.go b/btcjson/chainsvrcmds.go index 406357bd06..22552e7bcd 100644 --- a/btcjson/chainsvrcmds.go +++ b/btcjson/chainsvrcmds.go @@ -8,12 +8,18 @@ package btcjson import ( + "encoding/hex" "encoding/json" "fmt" + "reflect" "github.com/btcsuite/btcd/wire" ) +// BTCPerkvB is the units used to represent Bitcoin transaction fees. +// This unit represents the fee in BTC for a transaction size of 1 kB. +type BTCPerkvB = float64 + // AddNodeSubCmd defines the type used in the addnode JSON-RPC command for the // sub command field. type AddNodeSubCmd string @@ -63,10 +69,15 @@ type CreateRawTransactionCmd struct { // NewCreateRawTransactionCmd returns a new instance which can be used to issue // a createrawtransaction JSON-RPC command. // -// Amounts are in BTC. +// Amounts are in BTC. Passing in nil and the empty slice as inputs is equivalent, +// both gets interpreted as the empty slice. func NewCreateRawTransactionCmd(inputs []TransactionInput, amounts map[string]float64, lockTime *int64) *CreateRawTransactionCmd { - + // to make sure we're serializing this to the empty list and not null, we + // explicitly initialize the list + if inputs == nil { + inputs = []TransactionInput{} + } return &CreateRawTransactionCmd{ Inputs: inputs, Amounts: amounts, @@ -100,6 +111,66 @@ func NewDecodeScriptCmd(hexScript string) *DecodeScriptCmd { } } +// DeriveAddressesCmd defines the deriveaddresses JSON-RPC command. +type DeriveAddressesCmd struct { + Descriptor string + Range *DescriptorRange +} + +// NewDeriveAddressesCmd returns a new instance which can be used to issue a +// deriveaddresses JSON-RPC command. +func NewDeriveAddressesCmd(descriptor string, descriptorRange *DescriptorRange) *DeriveAddressesCmd { + return &DeriveAddressesCmd{ + Descriptor: descriptor, + Range: descriptorRange, + } +} + +// ChangeType defines the different output types to use for the change address +// of a transaction built by the node. +type ChangeType string + +var ( + // ChangeTypeLegacy indicates a P2PKH change address type. + ChangeTypeLegacy ChangeType = "legacy" + // ChangeTypeP2SHSegWit indicates a P2WPKH-in-P2SH change address type. + ChangeTypeP2SHSegWit ChangeType = "p2sh-segwit" + // ChangeTypeBech32 indicates a P2WPKH change address type. + ChangeTypeBech32 ChangeType = "bech32" +) + +// FundRawTransactionOpts are the different options that can be passed to rawtransaction +type FundRawTransactionOpts struct { + ChangeAddress *string `json:"changeAddress,omitempty"` + ChangePosition *int `json:"changePosition,omitempty"` + ChangeType *ChangeType `json:"change_type,omitempty"` + IncludeWatching *bool `json:"includeWatching,omitempty"` + LockUnspents *bool `json:"lockUnspents,omitempty"` + FeeRate *BTCPerkvB `json:"feeRate,omitempty"` // BTC/kB + SubtractFeeFromOutputs []int `json:"subtractFeeFromOutputs,omitempty"` + Replaceable *bool `json:"replaceable,omitempty"` + ConfTarget *int `json:"conf_target,omitempty"` + EstimateMode *EstimateSmartFeeMode `json:"estimate_mode,omitempty"` + IncludeUnsafe *bool `json:"include_unsafe,omitempty"` +} + +// FundRawTransactionCmd defines the fundrawtransaction JSON-RPC command +type FundRawTransactionCmd struct { + HexTx string + Options FundRawTransactionOpts + IsWitness *bool +} + +// NewFundRawTransactionCmd returns a new instance which can be used to issue +// a fundrawtransaction JSON-RPC command +func NewFundRawTransactionCmd(serializedTx []byte, opts FundRawTransactionOpts, isWitness *bool) *FundRawTransactionCmd { + return &FundRawTransactionCmd{ + HexTx: hex.EncodeToString(serializedTx), + Options: opts, + IsWitness: isWitness, + } +} + // GetAddedNodeInfoCmd defines the getaddednodeinfo JSON-RPC command. type GetAddedNodeInfoCmd struct { DNS bool @@ -130,8 +201,7 @@ func NewGetBestBlockHashCmd() *GetBestBlockHashCmd { // GetBlockCmd defines the getblock JSON-RPC command. type GetBlockCmd struct { Hash string - Verbose *bool `jsonrpcdefault:"true"` - VerboseTx *bool `jsonrpcdefault:"false"` + Verbosity *int `jsonrpcdefault:"1"` } // NewGetBlockCmd returns a new instance which can be used to issue a getblock @@ -139,11 +209,10 @@ type GetBlockCmd struct { // // The parameters which are pointers indicate they are optional. Passing nil // for optional parameters will use the default value. -func NewGetBlockCmd(hash string, verbose, verboseTx *bool) *GetBlockCmd { +func NewGetBlockCmd(hash string, verbosity *int) *GetBlockCmd { return &GetBlockCmd{ Hash: hash, - Verbose: verbose, - VerboseTx: verboseTx, + Verbosity: verbosity, } } @@ -165,6 +234,33 @@ func NewGetBlockCountCmd() *GetBlockCountCmd { return &GetBlockCountCmd{} } +// FilterTypeName defines the type used in the getblockfilter JSON-RPC command for the +// filter type field. +type FilterTypeName string + +const ( + // FilterTypeBasic is the basic filter type defined in BIP0158. + FilterTypeBasic FilterTypeName = "basic" +) + +// GetBlockFilterCmd defines the getblockfilter JSON-RPC command. +type GetBlockFilterCmd struct { + BlockHash string // The hash of the block + FilterType *FilterTypeName // The type name of the filter, default=basic +} + +// NewGetBlockFilterCmd returns a new instance which can be used to issue a +// getblockfilter JSON-RPC command. +// +// The parameters which are pointers indicate they are optional. Passing nil +// for optional parameters will use the default value. +func NewGetBlockFilterCmd(blockHash string, filterType *FilterTypeName) *GetBlockFilterCmd { + return &GetBlockFilterCmd{ + BlockHash: blockHash, + FilterType: filterType, + } +} + // GetBlockHashCmd defines the getblockhash JSON-RPC command. type GetBlockHashCmd struct { Index int64 @@ -193,6 +289,50 @@ func NewGetBlockHeaderCmd(hash string, verbose *bool) *GetBlockHeaderCmd { } } +// HashOrHeight defines a type that can be used as hash_or_height value in JSON-RPC commands. +type HashOrHeight struct { + Value interface{} +} + +// MarshalJSON implements the json.Marshaler interface +func (h HashOrHeight) MarshalJSON() ([]byte, error) { + return json.Marshal(h.Value) +} + +// UnmarshalJSON implements the json.Unmarshaler interface +func (h *HashOrHeight) UnmarshalJSON(data []byte) error { + var unmarshalled interface{} + if err := json.Unmarshal(data, &unmarshalled); err != nil { + return err + } + + switch v := unmarshalled.(type) { + case float64: + h.Value = int(v) + case string: + h.Value = v + default: + return fmt.Errorf("invalid hash_or_height value: %v", unmarshalled) + } + + return nil +} + +// GetBlockStatsCmd defines the getblockstats JSON-RPC command. +type GetBlockStatsCmd struct { + HashOrHeight HashOrHeight + Stats *[]string +} + +// NewGetBlockStatsCmd returns a new instance which can be used to issue a +// getblockstats JSON-RPC command. Either height or hash must be specified. +func NewGetBlockStatsCmd(hashOrHeight HashOrHeight, stats *[]string) *GetBlockStatsCmd { + return &GetBlockStatsCmd{ + HashOrHeight: hashOrHeight, + Stats: stats, + } +} + // TemplateRequest is a request object as defined in BIP22 // (https://en.bitcoin.it/wiki/BIP_0022), it is optionally provided as an // pointer argument to GetBlockTemplateCmd. @@ -216,6 +356,10 @@ type TemplateRequest struct { // "proposal". Data string `json:"data,omitempty"` WorkID string `json:"workid,omitempty"` + + // list of supported softfork deployments, by name + // Ref: https://en.bitcoin.it/wiki/BIP_0009#getblocktemplate_changes. + Rules []string `json:"rules,omitempty"` } // convertTemplateRequestField potentially converts the provided value as @@ -321,6 +465,24 @@ func NewGetChainTipsCmd() *GetChainTipsCmd { return &GetChainTipsCmd{} } +// GetChainTxStatsCmd defines the getchaintxstats JSON-RPC command. +type GetChainTxStatsCmd struct { + NBlocks *int32 + BlockHash *string +} + +// NewGetChainTxStatsCmd returns a new instance which can be used to issue a +// getchaintxstats JSON-RPC command. +// +// The parameters which are pointers indicate they are optional. Passing nil +// for optional parameters will use the default value. +func NewGetChainTxStatsCmd(nBlocks *int32, blockHash *string) *GetChainTxStatsCmd { + return &GetChainTxStatsCmd{ + NBlocks: nBlocks, + BlockHash: blockHash, + } +} + // GetConnectionCountCmd defines the getconnectioncount JSON-RPC command. type GetConnectionCountCmd struct{} @@ -330,6 +492,19 @@ func NewGetConnectionCountCmd() *GetConnectionCountCmd { return &GetConnectionCountCmd{} } +// GetDescriptorInfoCmd defines the getdescriptorinfo JSON-RPC command. +type GetDescriptorInfoCmd struct { + Descriptor string +} + +// NewGetDescriptorInfoCmd returns a new instance which can be used to issue a +// getdescriptorinfo JSON-RPC command. +func NewGetDescriptorInfoCmd(descriptor string) *GetDescriptorInfoCmd { + return &GetDescriptorInfoCmd{ + Descriptor: descriptor, + } +} + // GetDifficultyCmd defines the getdifficulty JSON-RPC command. type GetDifficultyCmd struct{} @@ -433,6 +608,22 @@ func NewGetNetworkHashPSCmd(numBlocks, height *int) *GetNetworkHashPSCmd { } } +// GetNodeAddressesCmd defines the getnodeaddresses JSON-RPC command. +type GetNodeAddressesCmd struct { + Count *int32 `jsonrpcdefault:"1"` +} + +// NewGetNodeAddressesCmd returns a new instance which can be used to issue a +// getnodeaddresses JSON-RPC command. +// +// The parameters which are pointers indicate they are optional. Passing nil +// for optional parameters will use the default value. +func NewGetNodeAddressesCmd(count *int32) *GetNodeAddressesCmd { + return &GetNodeAddressesCmd{ + Count: count, + } +} + // GetPeerInfoCmd defines the getpeerinfo JSON-RPC command. type GetPeerInfoCmd struct{} @@ -634,11 +825,60 @@ func NewSearchRawTransactionsCmd(address string, verbose, skip, count *int, vinE } } +// AllowHighFeesOrMaxFeeRate defines a type that can either be the legacy +// allowhighfees boolean field or the new maxfeerate float64 field. +type AllowHighFeesOrMaxFeeRate struct { + Value interface{} +} + +// String returns the string representation of this struct, used for printing +// the marshaled default value in the help text. +func (a AllowHighFeesOrMaxFeeRate) String() string { + b, _ := a.MarshalJSON() + return string(b) +} + +// MarshalJSON implements the json.Marshaler interface +func (a AllowHighFeesOrMaxFeeRate) MarshalJSON() ([]byte, error) { + // The default value is false which only works with the legacy versions. + if a.Value == nil || + (reflect.ValueOf(a.Value).Kind() == reflect.Ptr && + reflect.ValueOf(a.Value).IsNil()) { + + return json.Marshal(false) + } + + return json.Marshal(a.Value) +} + +// UnmarshalJSON implements the json.Unmarshaler interface +func (a *AllowHighFeesOrMaxFeeRate) UnmarshalJSON(data []byte) error { + if len(data) == 0 { + return nil + } + + var unmarshalled interface{} + if err := json.Unmarshal(data, &unmarshalled); err != nil { + return err + } + + switch v := unmarshalled.(type) { + case bool: + a.Value = Bool(v) + case float64: + a.Value = Float64(v) + default: + return fmt.Errorf("invalid allowhighfees or maxfeerate value: "+ + "%v", unmarshalled) + } + + return nil +} + // SendRawTransactionCmd defines the sendrawtransaction JSON-RPC command. type SendRawTransactionCmd struct { - HexTx string - AllowHighFees *bool `jsonrpcdefault:"false"` - MaxFeeRate *int32 + HexTx string + FeeSetting *AllowHighFeesOrMaxFeeRate `jsonrpcdefault:"false"` } // NewSendRawTransactionCmd returns a new instance which can be used to issue a @@ -648,19 +888,24 @@ type SendRawTransactionCmd struct { // for optional parameters will use the default value. func NewSendRawTransactionCmd(hexTx string, allowHighFees *bool) *SendRawTransactionCmd { return &SendRawTransactionCmd{ - HexTx: hexTx, - AllowHighFees: allowHighFees, + HexTx: hexTx, + FeeSetting: &AllowHighFeesOrMaxFeeRate{ + Value: allowHighFees, + }, } } // NewSendRawTransactionCmd returns a new instance which can be used to issue a // sendrawtransaction JSON-RPC command to a bitcoind node. +// maxFeeRate is the maximum fee rate for the transaction in BTC/kvB. // // A 0 maxFeeRate indicates that a maximum fee rate won't be enforced. -func NewBitcoindSendRawTransactionCmd(hexTx string, maxFeeRate int32) *SendRawTransactionCmd { +func NewBitcoindSendRawTransactionCmd(hexTx string, maxFeeRate BTCPerkvB) *SendRawTransactionCmd { return &SendRawTransactionCmd{ - HexTx: hexTx, - MaxFeeRate: &maxFeeRate, + HexTx: hexTx, + FeeSetting: &AllowHighFeesOrMaxFeeRate{ + Value: &maxFeeRate, + }, } } @@ -682,6 +927,24 @@ func NewSetGenerateCmd(generate bool, genProcLimit *int) *SetGenerateCmd { } } +// SignMessageWithPrivKeyCmd defines the signmessagewithprivkey JSON-RPC command. +type SignMessageWithPrivKeyCmd struct { + PrivKey string // base 58 Wallet Import format private key + Message string // Message to sign +} + +// NewSignMessageWithPrivKey returns a new instance which can be used to issue a +// signmessagewithprivkey JSON-RPC command. +// +// The first parameter is a private key in base 58 Wallet Import format. +// The second parameter is the message to sign. +func NewSignMessageWithPrivKey(privKey, message string) *SignMessageWithPrivKeyCmd { + return &SignMessageWithPrivKeyCmd{ + PrivKey: privKey, + Message: message, + } +} + // StopCmd defines the stop JSON-RPC command. type StopCmd struct{} @@ -785,6 +1048,59 @@ func NewVerifyTxOutProofCmd(proof string) *VerifyTxOutProofCmd { } } +// TestMempoolAcceptCmd defines the testmempoolaccept JSON-RPC command. +type TestMempoolAcceptCmd struct { + // An array of hex strings of raw transactions. + RawTxns []string + + // Reject transactions whose fee rate is higher than the specified + // value, expressed in BTC/kvB, optional, default="0.10". + MaxFeeRate BTCPerkvB `json:"omitempty"` +} + +// NewTestMempoolAcceptCmd returns a new instance which can be used to issue a +// testmempoolaccept JSON-RPC command. +func NewTestMempoolAcceptCmd(rawTxns []string, + maxFeeRate BTCPerkvB) *TestMempoolAcceptCmd { + + return &TestMempoolAcceptCmd{ + RawTxns: rawTxns, + MaxFeeRate: maxFeeRate, + } +} + +// GetTxSpendingPrevOutCmd defines the gettxspendingprevout JSON-RPC command. +type GetTxSpendingPrevOutCmd struct { + // Outputs is a list of transaction outputs to query. + Outputs []*GetTxSpendingPrevOutCmdOutput +} + +// GetTxSpendingPrevOutCmdOutput defines the output to query for the +// gettxspendingprevout JSON-RPC command. +type GetTxSpendingPrevOutCmdOutput struct { + Txid string `json:"txid"` + Vout uint32 `json:"vout"` +} + +// NewGetTxSpendingPrevOutCmd returns a new instance which can be used to issue +// a gettxspendingprevout JSON-RPC command. +func NewGetTxSpendingPrevOutCmd( + outpoints []wire.OutPoint) *GetTxSpendingPrevOutCmd { + + outputs := make([]*GetTxSpendingPrevOutCmdOutput, 0, len(outpoints)) + + for _, op := range outpoints { + outputs = append(outputs, &GetTxSpendingPrevOutCmdOutput{ + Txid: op.Hash.String(), + Vout: op.Index, + }) + } + + return &GetTxSpendingPrevOutCmd{ + Outputs: outputs, + } +} + func init() { // No special flags for commands in this file. flags := UsageFlag(0) @@ -793,18 +1109,24 @@ func init() { MustRegisterCmd("createrawtransaction", (*CreateRawTransactionCmd)(nil), flags) MustRegisterCmd("decoderawtransaction", (*DecodeRawTransactionCmd)(nil), flags) MustRegisterCmd("decodescript", (*DecodeScriptCmd)(nil), flags) + MustRegisterCmd("deriveaddresses", (*DeriveAddressesCmd)(nil), flags) + MustRegisterCmd("fundrawtransaction", (*FundRawTransactionCmd)(nil), flags) MustRegisterCmd("getaddednodeinfo", (*GetAddedNodeInfoCmd)(nil), flags) MustRegisterCmd("getbestblockhash", (*GetBestBlockHashCmd)(nil), flags) MustRegisterCmd("getblock", (*GetBlockCmd)(nil), flags) MustRegisterCmd("getblockchaininfo", (*GetBlockChainInfoCmd)(nil), flags) MustRegisterCmd("getblockcount", (*GetBlockCountCmd)(nil), flags) + MustRegisterCmd("getblockfilter", (*GetBlockFilterCmd)(nil), flags) MustRegisterCmd("getblockhash", (*GetBlockHashCmd)(nil), flags) MustRegisterCmd("getblockheader", (*GetBlockHeaderCmd)(nil), flags) + MustRegisterCmd("getblockstats", (*GetBlockStatsCmd)(nil), flags) MustRegisterCmd("getblocktemplate", (*GetBlockTemplateCmd)(nil), flags) MustRegisterCmd("getcfilter", (*GetCFilterCmd)(nil), flags) MustRegisterCmd("getcfilterheader", (*GetCFilterHeaderCmd)(nil), flags) MustRegisterCmd("getchaintips", (*GetChainTipsCmd)(nil), flags) + MustRegisterCmd("getchaintxstats", (*GetChainTxStatsCmd)(nil), flags) MustRegisterCmd("getconnectioncount", (*GetConnectionCountCmd)(nil), flags) + MustRegisterCmd("getdescriptorinfo", (*GetDescriptorInfoCmd)(nil), flags) MustRegisterCmd("getdifficulty", (*GetDifficultyCmd)(nil), flags) MustRegisterCmd("getgenerate", (*GetGenerateCmd)(nil), flags) MustRegisterCmd("gethashespersec", (*GetHashesPerSecCmd)(nil), flags) @@ -815,6 +1137,7 @@ func init() { MustRegisterCmd("getnetworkinfo", (*GetNetworkInfoCmd)(nil), flags) MustRegisterCmd("getnettotals", (*GetNetTotalsCmd)(nil), flags) MustRegisterCmd("getnetworkhashps", (*GetNetworkHashPSCmd)(nil), flags) + MustRegisterCmd("getnodeaddresses", (*GetNodeAddressesCmd)(nil), flags) MustRegisterCmd("getpeerinfo", (*GetPeerInfoCmd)(nil), flags) MustRegisterCmd("getrawmempool", (*GetRawMempoolCmd)(nil), flags) MustRegisterCmd("getrawtransaction", (*GetRawTransactionCmd)(nil), flags) @@ -830,6 +1153,7 @@ func init() { MustRegisterCmd("searchrawtransactions", (*SearchRawTransactionsCmd)(nil), flags) MustRegisterCmd("sendrawtransaction", (*SendRawTransactionCmd)(nil), flags) MustRegisterCmd("setgenerate", (*SetGenerateCmd)(nil), flags) + MustRegisterCmd("signmessagewithprivkey", (*SignMessageWithPrivKeyCmd)(nil), flags) MustRegisterCmd("stop", (*StopCmd)(nil), flags) MustRegisterCmd("submitblock", (*SubmitBlockCmd)(nil), flags) MustRegisterCmd("uptime", (*UptimeCmd)(nil), flags) @@ -837,4 +1161,6 @@ func init() { MustRegisterCmd("verifychain", (*VerifyChainCmd)(nil), flags) MustRegisterCmd("verifymessage", (*VerifyMessageCmd)(nil), flags) MustRegisterCmd("verifytxoutproof", (*VerifyTxOutProofCmd)(nil), flags) + MustRegisterCmd("testmempoolaccept", (*TestMempoolAcceptCmd)(nil), flags) + MustRegisterCmd("gettxspendingprevout", (*GetTxSpendingPrevOutCmd)(nil), flags) } diff --git a/btcjson/chainsvrcmds_test.go b/btcjson/chainsvrcmds_test.go index 8cb4ee765a..38113a687e 100644 --- a/btcjson/chainsvrcmds_test.go +++ b/btcjson/chainsvrcmds_test.go @@ -6,12 +6,14 @@ package btcjson_test import ( "bytes" + "encoding/hex" "encoding/json" "fmt" "reflect" "testing" "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/wire" ) @@ -60,6 +62,21 @@ func TestChainSvrCmds(t *testing.T) { Amounts: map[string]float64{"456": .0123}, }, }, + { + name: "createrawtransaction - no inputs", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("createrawtransaction", `[]`, `{"456":0.0123}`) + }, + staticCmd: func() interface{} { + amounts := map[string]float64{"456": .0123} + return btcjson.NewCreateRawTransactionCmd(nil, amounts, nil) + }, + marshalled: `{"jsonrpc":"1.0","method":"createrawtransaction","params":[[],{"456":0.0123}],"id":1}`, + unmarshalled: &btcjson.CreateRawTransactionCmd{ + Inputs: []btcjson.TransactionInput{}, + Amounts: map[string]float64{"456": .0123}, + }, + }, { name: "createrawtransaction optional", newCmd: func() (interface{}, error) { @@ -80,7 +97,108 @@ func TestChainSvrCmds(t *testing.T) { LockTime: btcjson.Int64(12312333333), }, }, + { + name: "fundrawtransaction - empty opts", + newCmd: func() (i interface{}, e error) { + return btcjson.NewCmd("fundrawtransaction", "deadbeef", "{}") + }, + staticCmd: func() interface{} { + deadbeef, err := hex.DecodeString("deadbeef") + if err != nil { + panic(err) + } + return btcjson.NewFundRawTransactionCmd(deadbeef, btcjson.FundRawTransactionOpts{}, nil) + }, + marshalled: `{"jsonrpc":"1.0","method":"fundrawtransaction","params":["deadbeef",{}],"id":1}`, + unmarshalled: &btcjson.FundRawTransactionCmd{ + HexTx: "deadbeef", + Options: btcjson.FundRawTransactionOpts{}, + IsWitness: nil, + }, + }, + { + name: "fundrawtransaction - full opts", + newCmd: func() (i interface{}, e error) { + return 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"}`) + }, + staticCmd: func() interface{} { + deadbeef, err := hex.DecodeString("deadbeef") + if err != nil { + panic(err) + } + changeAddress := "bcrt1qeeuctq9wutlcl5zatge7rjgx0k45228cxez655" + change := 1 + changeType := btcjson.ChangeTypeLegacy + watching := true + lockUnspents := true + feeRate := 0.7 + replaceable := true + confTarget := 8 + return btcjson.NewFundRawTransactionCmd(deadbeef, btcjson.FundRawTransactionOpts{ + ChangeAddress: &changeAddress, + ChangePosition: &change, + ChangeType: &changeType, + IncludeWatching: &watching, + LockUnspents: &lockUnspents, + FeeRate: &feeRate, + SubtractFeeFromOutputs: []int{0}, + Replaceable: &replaceable, + ConfTarget: &confTarget, + EstimateMode: &btcjson.EstimateModeEconomical, + }, nil) + }, + marshalled: `{"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}`, + unmarshalled: func() interface{} { + changeAddress := "bcrt1qeeuctq9wutlcl5zatge7rjgx0k45228cxez655" + change := 1 + changeType := btcjson.ChangeTypeLegacy + watching := true + lockUnspents := true + feeRate := 0.7 + replaceable := true + confTarget := 8 + return &btcjson.FundRawTransactionCmd{ + HexTx: "deadbeef", + Options: btcjson.FundRawTransactionOpts{ + ChangeAddress: &changeAddress, + ChangePosition: &change, + ChangeType: &changeType, + IncludeWatching: &watching, + LockUnspents: &lockUnspents, + FeeRate: &feeRate, + SubtractFeeFromOutputs: []int{0}, + Replaceable: &replaceable, + ConfTarget: &confTarget, + EstimateMode: &btcjson.EstimateModeEconomical, + }, + IsWitness: nil, + } + }(), + }, + { + name: "fundrawtransaction - iswitness", + newCmd: func() (i interface{}, e error) { + return btcjson.NewCmd("fundrawtransaction", "deadbeef", "{}", true) + }, + staticCmd: func() interface{} { + deadbeef, err := hex.DecodeString("deadbeef") + if err != nil { + panic(err) + } + t := true + return btcjson.NewFundRawTransactionCmd(deadbeef, btcjson.FundRawTransactionOpts{}, &t) + }, + marshalled: `{"jsonrpc":"1.0","method":"fundrawtransaction","params":["deadbeef",{},true],"id":1}`, + unmarshalled: &btcjson.FundRawTransactionCmd{ + HexTx: "deadbeef", + Options: btcjson.FundRawTransactionOpts{}, + IsWitness: func() *bool { + t := true + return &t + }(), + }, + }, { name: "decoderawtransaction", newCmd: func() (interface{}, error) { @@ -103,6 +221,51 @@ func TestChainSvrCmds(t *testing.T) { marshalled: `{"jsonrpc":"1.0","method":"decodescript","params":["00"],"id":1}`, unmarshalled: &btcjson.DecodeScriptCmd{HexScript: "00"}, }, + { + name: "deriveaddresses no range", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("deriveaddresses", "00") + }, + staticCmd: func() interface{} { + return btcjson.NewDeriveAddressesCmd("00", nil) + }, + marshalled: `{"jsonrpc":"1.0","method":"deriveaddresses","params":["00"],"id":1}`, + unmarshalled: &btcjson.DeriveAddressesCmd{Descriptor: "00"}, + }, + { + name: "deriveaddresses int range", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd( + "deriveaddresses", "00", btcjson.DescriptorRange{Value: 2}) + }, + staticCmd: func() interface{} { + return btcjson.NewDeriveAddressesCmd( + "00", &btcjson.DescriptorRange{Value: 2}) + }, + marshalled: `{"jsonrpc":"1.0","method":"deriveaddresses","params":["00",2],"id":1}`, + unmarshalled: &btcjson.DeriveAddressesCmd{ + Descriptor: "00", + Range: &btcjson.DescriptorRange{Value: 2}, + }, + }, + { + name: "deriveaddresses slice range", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd( + "deriveaddresses", "00", + btcjson.DescriptorRange{Value: []int{0, 2}}, + ) + }, + staticCmd: func() interface{} { + return btcjson.NewDeriveAddressesCmd( + "00", &btcjson.DescriptorRange{Value: []int{0, 2}}) + }, + marshalled: `{"jsonrpc":"1.0","method":"deriveaddresses","params":["00",[0,2]],"id":1}`, + unmarshalled: &btcjson.DeriveAddressesCmd{ + Descriptor: "00", + Range: &btcjson.DescriptorRange{Value: []int{0, 2}}, + }, + }, { name: "getaddednodeinfo", newCmd: func() (interface{}, error) { @@ -141,51 +304,58 @@ func TestChainSvrCmds(t *testing.T) { }, { name: "getblock", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("getblock", "123", btcjson.Int(0)) + }, + staticCmd: func() interface{} { + return btcjson.NewGetBlockCmd("123", btcjson.Int(0)) + }, + marshalled: `{"jsonrpc":"1.0","method":"getblock","params":["123",0],"id":1}`, + unmarshalled: &btcjson.GetBlockCmd{ + Hash: "123", + Verbosity: btcjson.Int(0), + }, + }, + { + name: "getblock default verbosity", newCmd: func() (interface{}, error) { return btcjson.NewCmd("getblock", "123") }, staticCmd: func() interface{} { - return btcjson.NewGetBlockCmd("123", nil, nil) + return btcjson.NewGetBlockCmd("123", nil) }, marshalled: `{"jsonrpc":"1.0","method":"getblock","params":["123"],"id":1}`, unmarshalled: &btcjson.GetBlockCmd{ Hash: "123", - Verbose: btcjson.Bool(true), - VerboseTx: btcjson.Bool(false), + Verbosity: btcjson.Int(1), }, }, { name: "getblock required optional1", newCmd: func() (interface{}, error) { - // Intentionally use a source param that is - // more pointers than the destination to - // exercise that path. - verbosePtr := btcjson.Bool(true) - return btcjson.NewCmd("getblock", "123", &verbosePtr) + return btcjson.NewCmd("getblock", "123", btcjson.Int(1)) }, staticCmd: func() interface{} { - return btcjson.NewGetBlockCmd("123", btcjson.Bool(true), nil) + return btcjson.NewGetBlockCmd("123", btcjson.Int(1)) }, - marshalled: `{"jsonrpc":"1.0","method":"getblock","params":["123",true],"id":1}`, + marshalled: `{"jsonrpc":"1.0","method":"getblock","params":["123",1],"id":1}`, unmarshalled: &btcjson.GetBlockCmd{ Hash: "123", - Verbose: btcjson.Bool(true), - VerboseTx: btcjson.Bool(false), + Verbosity: btcjson.Int(1), }, }, { name: "getblock required optional2", newCmd: func() (interface{}, error) { - return btcjson.NewCmd("getblock", "123", true, true) + return btcjson.NewCmd("getblock", "123", btcjson.Int(2)) }, staticCmd: func() interface{} { - return btcjson.NewGetBlockCmd("123", btcjson.Bool(true), btcjson.Bool(true)) + return btcjson.NewGetBlockCmd("123", btcjson.Int(2)) }, - marshalled: `{"jsonrpc":"1.0","method":"getblock","params":["123",true,true],"id":1}`, + marshalled: `{"jsonrpc":"1.0","method":"getblock","params":["123",2],"id":1}`, unmarshalled: &btcjson.GetBlockCmd{ Hash: "123", - Verbose: btcjson.Bool(true), - VerboseTx: btcjson.Bool(true), + Verbosity: btcjson.Int(2), }, }, { @@ -210,6 +380,28 @@ func TestChainSvrCmds(t *testing.T) { marshalled: `{"jsonrpc":"1.0","method":"getblockcount","params":[],"id":1}`, unmarshalled: &btcjson.GetBlockCountCmd{}, }, + { + name: "getblockfilter", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("getblockfilter", "0000afaf") + }, + staticCmd: func() interface{} { + return btcjson.NewGetBlockFilterCmd("0000afaf", nil) + }, + marshalled: `{"jsonrpc":"1.0","method":"getblockfilter","params":["0000afaf"],"id":1}`, + unmarshalled: &btcjson.GetBlockFilterCmd{"0000afaf", nil}, + }, + { + name: "getblockfilter optional filtertype", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("getblockfilter", "0000afaf", "basic") + }, + staticCmd: func() interface{} { + return btcjson.NewGetBlockFilterCmd("0000afaf", btcjson.NewFilterTypeName(btcjson.FilterTypeBasic)) + }, + marshalled: `{"jsonrpc":"1.0","method":"getblockfilter","params":["0000afaf","basic"],"id":1}`, + unmarshalled: &btcjson.GetBlockFilterCmd{"0000afaf", btcjson.NewFilterTypeName(btcjson.FilterTypeBasic)}, + }, { name: "getblockhash", newCmd: func() (interface{}, error) { @@ -235,6 +427,60 @@ func TestChainSvrCmds(t *testing.T) { Verbose: btcjson.Bool(true), }, }, + { + name: "getblockstats height", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("getblockstats", btcjson.HashOrHeight{Value: 123}) + }, + staticCmd: func() interface{} { + return btcjson.NewGetBlockStatsCmd(btcjson.HashOrHeight{Value: 123}, nil) + }, + marshalled: `{"jsonrpc":"1.0","method":"getblockstats","params":[123],"id":1}`, + unmarshalled: &btcjson.GetBlockStatsCmd{ + HashOrHeight: btcjson.HashOrHeight{Value: 123}, + }, + }, + { + name: "getblockstats hash", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("getblockstats", btcjson.HashOrHeight{Value: "deadbeef"}) + }, + staticCmd: func() interface{} { + return btcjson.NewGetBlockStatsCmd(btcjson.HashOrHeight{Value: "deadbeef"}, nil) + }, + marshalled: `{"jsonrpc":"1.0","method":"getblockstats","params":["deadbeef"],"id":1}`, + unmarshalled: &btcjson.GetBlockStatsCmd{ + HashOrHeight: btcjson.HashOrHeight{Value: "deadbeef"}, + }, + }, + { + name: "getblockstats height optional stats", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("getblockstats", btcjson.HashOrHeight{Value: 123}, []string{"avgfee", "maxfee"}) + }, + staticCmd: func() interface{} { + return btcjson.NewGetBlockStatsCmd(btcjson.HashOrHeight{Value: 123}, &[]string{"avgfee", "maxfee"}) + }, + marshalled: `{"jsonrpc":"1.0","method":"getblockstats","params":[123,["avgfee","maxfee"]],"id":1}`, + unmarshalled: &btcjson.GetBlockStatsCmd{ + HashOrHeight: btcjson.HashOrHeight{Value: 123}, + Stats: &[]string{"avgfee", "maxfee"}, + }, + }, + { + name: "getblockstats hash optional stats", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("getblockstats", btcjson.HashOrHeight{Value: "deadbeef"}, []string{"avgfee", "maxfee"}) + }, + staticCmd: func() interface{} { + return btcjson.NewGetBlockStatsCmd(btcjson.HashOrHeight{Value: "deadbeef"}, &[]string{"avgfee", "maxfee"}) + }, + marshalled: `{"jsonrpc":"1.0","method":"getblockstats","params":["deadbeef",["avgfee","maxfee"]],"id":1}`, + unmarshalled: &btcjson.GetBlockStatsCmd{ + HashOrHeight: btcjson.HashOrHeight{Value: "deadbeef"}, + Stats: &[]string{"avgfee", "maxfee"}, + }, + }, { name: "getblocktemplate", newCmd: func() (interface{}, error) { @@ -361,6 +607,44 @@ func TestChainSvrCmds(t *testing.T) { marshalled: `{"jsonrpc":"1.0","method":"getchaintips","params":[],"id":1}`, unmarshalled: &btcjson.GetChainTipsCmd{}, }, + { + name: "getchaintxstats", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("getchaintxstats") + }, + staticCmd: func() interface{} { + return btcjson.NewGetChainTxStatsCmd(nil, nil) + }, + marshalled: `{"jsonrpc":"1.0","method":"getchaintxstats","params":[],"id":1}`, + unmarshalled: &btcjson.GetChainTxStatsCmd{}, + }, + { + name: "getchaintxstats optional nblocks", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("getchaintxstats", btcjson.Int32(1000)) + }, + staticCmd: func() interface{} { + return btcjson.NewGetChainTxStatsCmd(btcjson.Int32(1000), nil) + }, + marshalled: `{"jsonrpc":"1.0","method":"getchaintxstats","params":[1000],"id":1}`, + unmarshalled: &btcjson.GetChainTxStatsCmd{ + NBlocks: btcjson.Int32(1000), + }, + }, + { + name: "getchaintxstats optional nblocks and blockhash", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("getchaintxstats", btcjson.Int32(1000), btcjson.String("0000afaf")) + }, + staticCmd: func() interface{} { + return btcjson.NewGetChainTxStatsCmd(btcjson.Int32(1000), btcjson.String("0000afaf")) + }, + marshalled: `{"jsonrpc":"1.0","method":"getchaintxstats","params":[1000,"0000afaf"],"id":1}`, + unmarshalled: &btcjson.GetChainTxStatsCmd{ + NBlocks: btcjson.Int32(1000), + BlockHash: btcjson.String("0000afaf"), + }, + }, { name: "getconnectioncount", newCmd: func() (interface{}, error) { @@ -515,6 +799,32 @@ func TestChainSvrCmds(t *testing.T) { Height: btcjson.Int(123), }, }, + { + name: "getnodeaddresses", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("getnodeaddresses") + }, + staticCmd: func() interface{} { + return btcjson.NewGetNodeAddressesCmd(nil) + }, + marshalled: `{"jsonrpc":"1.0","method":"getnodeaddresses","params":[],"id":1}`, + unmarshalled: &btcjson.GetNodeAddressesCmd{ + Count: btcjson.Int32(1), + }, + }, + { + name: "getnodeaddresses optional", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("getnodeaddresses", 10) + }, + staticCmd: func() interface{} { + return btcjson.NewGetNodeAddressesCmd(btcjson.Int32(10)) + }, + marshalled: `{"jsonrpc":"1.0","method":"getnodeaddresses","params":[10],"id":1}`, + unmarshalled: &btcjson.GetNodeAddressesCmd{ + Count: btcjson.Int32(10), + }, + }, { name: "getpeerinfo", newCmd: func() (interface{}, error) { @@ -892,32 +1202,72 @@ func TestChainSvrCmds(t *testing.T) { FilterAddrs: &[]string{"1Address"}, }, }, + { + name: "searchrawtransactions", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("searchrawtransactions", "1Address", 0, 5, 10, "null", true, []string{"1Address"}) + }, + staticCmd: func() interface{} { + return btcjson.NewSearchRawTransactionsCmd("1Address", + btcjson.Int(0), btcjson.Int(5), btcjson.Int(10), nil, btcjson.Bool(true), &[]string{"1Address"}) + }, + marshalled: `{"jsonrpc":"1.0","method":"searchrawtransactions","params":["1Address",0,5,10,null,true,["1Address"]],"id":1}`, + unmarshalled: &btcjson.SearchRawTransactionsCmd{ + Address: "1Address", + Verbose: btcjson.Int(0), + Skip: btcjson.Int(5), + Count: btcjson.Int(10), + VinExtra: nil, + Reverse: btcjson.Bool(true), + FilterAddrs: &[]string{"1Address"}, + }, + }, { name: "sendrawtransaction", newCmd: func() (interface{}, error) { - return btcjson.NewCmd("sendrawtransaction", "1122") + return btcjson.NewCmd("sendrawtransaction", "1122", &btcjson.AllowHighFeesOrMaxFeeRate{}) }, staticCmd: func() interface{} { return btcjson.NewSendRawTransactionCmd("1122", nil) }, - marshalled: `{"jsonrpc":"1.0","method":"sendrawtransaction","params":["1122"],"id":1}`, + marshalled: `{"jsonrpc":"1.0","method":"sendrawtransaction","params":["1122",false],"id":1}`, unmarshalled: &btcjson.SendRawTransactionCmd{ - HexTx: "1122", - AllowHighFees: btcjson.Bool(false), + HexTx: "1122", + FeeSetting: &btcjson.AllowHighFeesOrMaxFeeRate{ + Value: btcjson.Bool(false), + }, }, }, { name: "sendrawtransaction optional", newCmd: func() (interface{}, error) { - return btcjson.NewCmd("sendrawtransaction", "1122", false) + return btcjson.NewCmd("sendrawtransaction", "1122", &btcjson.AllowHighFeesOrMaxFeeRate{Value: btcjson.Bool(false)}) }, staticCmd: func() interface{} { return btcjson.NewSendRawTransactionCmd("1122", btcjson.Bool(false)) }, marshalled: `{"jsonrpc":"1.0","method":"sendrawtransaction","params":["1122",false],"id":1}`, unmarshalled: &btcjson.SendRawTransactionCmd{ - HexTx: "1122", - AllowHighFees: btcjson.Bool(false), + HexTx: "1122", + FeeSetting: &btcjson.AllowHighFeesOrMaxFeeRate{ + Value: btcjson.Bool(false), + }, + }, + }, + { + name: "sendrawtransaction optional, bitcoind >= 0.19.0", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("sendrawtransaction", "1122", &btcjson.AllowHighFeesOrMaxFeeRate{Value: btcjson.Float64(0.1234)}) + }, + staticCmd: func() interface{} { + return btcjson.NewBitcoindSendRawTransactionCmd("1122", 0.1234) + }, + marshalled: `{"jsonrpc":"1.0","method":"sendrawtransaction","params":["1122",0.1234],"id":1}`, + unmarshalled: &btcjson.SendRawTransactionCmd{ + HexTx: "1122", + FeeSetting: &btcjson.AllowHighFeesOrMaxFeeRate{ + Value: btcjson.Float64(0.1234), + }, }, }, { @@ -948,6 +1298,20 @@ func TestChainSvrCmds(t *testing.T) { GenProcLimit: btcjson.Int(6), }, }, + { + name: "signmessagewithprivkey", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("signmessagewithprivkey", "5Hue", "Hey") + }, + staticCmd: func() interface{} { + return btcjson.NewSignMessageWithPrivKey("5Hue", "Hey") + }, + marshalled: `{"jsonrpc":"1.0","method":"signmessagewithprivkey","params":["5Hue","Hey"],"id":1}`, + unmarshalled: &btcjson.SignMessageWithPrivKeyCmd{ + PrivKey: "5Hue", + Message: "Hey", + }, + }, { name: "stop", newCmd: func() (interface{}, error) { @@ -1086,13 +1450,87 @@ func TestChainSvrCmds(t *testing.T) { Proof: "test", }, }, + { + name: "getdescriptorinfo", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("getdescriptorinfo", "123") + }, + staticCmd: func() interface{} { + return btcjson.NewGetDescriptorInfoCmd("123") + }, + marshalled: `{"jsonrpc":"1.0","method":"getdescriptorinfo","params":["123"],"id":1}`, + unmarshalled: &btcjson.GetDescriptorInfoCmd{Descriptor: "123"}, + }, + { + name: "getzmqnotifications", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("getzmqnotifications") + }, + staticCmd: func() interface{} { + return btcjson.NewGetZmqNotificationsCmd() + }, + + marshalled: `{"jsonrpc":"1.0","method":"getzmqnotifications","params":[],"id":1}`, + unmarshalled: &btcjson.GetZmqNotificationsCmd{}, + }, + { + name: "testmempoolaccept", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("testmempoolaccept", []string{"rawhex"}, 0.1) + }, + staticCmd: func() interface{} { + return btcjson.NewTestMempoolAcceptCmd([]string{"rawhex"}, 0.1) + }, + marshalled: `{"jsonrpc":"1.0","method":"testmempoolaccept","params":[["rawhex"],0.1],"id":1}`, + unmarshalled: &btcjson.TestMempoolAcceptCmd{ + RawTxns: []string{"rawhex"}, + MaxFeeRate: 0.1, + }, + }, + { + name: "testmempoolaccept with maxfeerate", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("testmempoolaccept", []string{"rawhex"}, 0.01) + }, + staticCmd: func() interface{} { + return btcjson.NewTestMempoolAcceptCmd([]string{"rawhex"}, 0.01) + }, + marshalled: `{"jsonrpc":"1.0","method":"testmempoolaccept","params":[["rawhex"],0.01],"id":1}`, + unmarshalled: &btcjson.TestMempoolAcceptCmd{ + RawTxns: []string{"rawhex"}, + MaxFeeRate: 0.01, + }, + }, + { + name: "gettxspendingprevout", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd( + "gettxspendingprevout", + []*btcjson.GetTxSpendingPrevOutCmdOutput{ + {Txid: "0000000000000000000000000000000000000000000000000000000000000001", Vout: 0}, + }) + }, + staticCmd: func() interface{} { + outputs := []wire.OutPoint{ + {Hash: chainhash.Hash{1}, Index: 0}, + } + return btcjson.NewGetTxSpendingPrevOutCmd(outputs) + }, + marshalled: `{"jsonrpc":"1.0","method":"gettxspendingprevout","params":[[{"txid":"0000000000000000000000000000000000000000000000000000000000000001","vout":0}]],"id":1}`, + unmarshalled: &btcjson.GetTxSpendingPrevOutCmd{ + Outputs: []*btcjson.GetTxSpendingPrevOutCmdOutput{{ + Txid: "0000000000000000000000000000000000000000000000000000000000000001", + Vout: 0, + }}, + }, + }, } t.Logf("Running %d tests", len(tests)) for i, test := range tests { // Marshal the command as created by the new static command // creation function. - marshalled, err := btcjson.MarshalCmd(testID, test.staticCmd()) + marshalled, err := btcjson.MarshalCmd(btcjson.RpcVersion1, testID, test.staticCmd()) if err != nil { t.Errorf("MarshalCmd #%d (%s) unexpected error: %v", i, test.name, err) @@ -1117,7 +1555,7 @@ func TestChainSvrCmds(t *testing.T) { // Marshal the command as created by the generic new command // creation function. - marshalled, err = btcjson.MarshalCmd(testID, cmd) + marshalled, err = btcjson.MarshalCmd(btcjson.RpcVersion1, testID, cmd) if err != nil { t.Errorf("MarshalCmd #%d (%s) unexpected error: %v", i, test.name, err) diff --git a/btcjson/chainsvrresults.go b/btcjson/chainsvrresults.go index 7e6c710766..433bdda8eb 100644 --- a/btcjson/chainsvrresults.go +++ b/btcjson/chainsvrresults.go @@ -4,7 +4,17 @@ package btcjson -import "encoding/json" +import ( + "bytes" + "encoding/hex" + "encoding/json" + "fmt" + + "github.com/btcsuite/btcd/chaincfg/chainhash" + + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/wire" +) // GetBlockHeaderVerboseResult models the data from the getblockheader command when // the verbose flag is set. When the verbose flag is not set, getblockheader @@ -24,9 +34,44 @@ type GetBlockHeaderVerboseResult struct { NextHash string `json:"nextblockhash,omitempty"` } +// GetBlockStatsResult models the data from the getblockstats command. +type GetBlockStatsResult struct { + AverageFee int64 `json:"avgfee"` + AverageFeeRate int64 `json:"avgfeerate"` + AverageTxSize int64 `json:"avgtxsize"` + FeeratePercentiles []int64 `json:"feerate_percentiles"` + Hash string `json:"blockhash"` + Height int64 `json:"height"` + Ins int64 `json:"ins"` + MaxFee int64 `json:"maxfee"` + MaxFeeRate int64 `json:"maxfeerate"` + MaxTxSize int64 `json:"maxtxsize"` + MedianFee int64 `json:"medianfee"` + MedianTime int64 `json:"mediantime"` + MedianTxSize int64 `json:"mediantxsize"` + MinFee int64 `json:"minfee"` + MinFeeRate int64 `json:"minfeerate"` + MinTxSize int64 `json:"mintxsize"` + Outs int64 `json:"outs"` + SegWitTotalSize int64 `json:"swtotal_size"` + SegWitTotalWeight int64 `json:"swtotal_weight"` + SegWitTxs int64 `json:"swtxs"` + Subsidy int64 `json:"subsidy"` + Time int64 `json:"time"` + TotalOut int64 `json:"total_out"` + TotalSize int64 `json:"total_size"` + TotalWeight int64 `json:"total_weight"` + Txs int64 `json:"txs"` + UTXOIncrease int64 `json:"utxo_increase"` + UTXOSizeIncrease int64 `json:"utxo_size_inc"` +} + // GetBlockVerboseResult models the data from the getblock command when the -// verbose flag is set. When the verbose flag is not set, getblock returns a -// hex-encoded string. +// verbose flag is set to 1. When the verbose flag is set to 0, getblock returns a +// hex-encoded string. When the verbose flag is set to 1, getblock returns an object +// whose tx field is an array of transaction hashes. When the verbose flag is set to 2, +// getblock returns an object whose tx field is an array of raw transactions. +// Use GetBlockVerboseTxResult to unmarshal data received from passing verbose=2 to getblock. type GetBlockVerboseResult struct { Hash string `json:"hash"` Confirmations int64 `json:"confirmations"` @@ -38,7 +83,33 @@ type GetBlockVerboseResult struct { VersionHex string `json:"versionHex"` MerkleRoot string `json:"merkleroot"` Tx []string `json:"tx,omitempty"` - RawTx []TxRawResult `json:"rawtx,omitempty"` + RawTx []TxRawResult `json:"rawtx,omitempty"` // Note: this field is always empty when verbose != 2. + Time int64 `json:"time"` + Nonce uint32 `json:"nonce"` + Bits string `json:"bits"` + Difficulty float64 `json:"difficulty"` + PreviousHash string `json:"previousblockhash"` + NextHash string `json:"nextblockhash,omitempty"` +} + +// GetBlockVerboseTxResult models the data from the getblock command when the +// verbose flag is set to 2. When the verbose flag is set to 0, getblock returns a +// hex-encoded string. When the verbose flag is set to 1, getblock returns an object +// whose tx field is an array of transaction hashes. When the verbose flag is set to 2, +// getblock returns an object whose tx field is an array of raw transactions. +// Use GetBlockVerboseResult to unmarshal data received from passing verbose=1 to getblock. +type GetBlockVerboseTxResult struct { + Hash string `json:"hash"` + Confirmations int64 `json:"confirmations"` + StrippedSize int32 `json:"strippedsize"` + Size int32 `json:"size"` + Weight int32 `json:"weight"` + Height int64 `json:"height"` + Version int32 `json:"version"` + VersionHex string `json:"versionHex"` + MerkleRoot string `json:"merkleroot"` + Tx []TxRawResult `json:"tx,omitempty"` + RawTx []TxRawResult `json:"rawtx,omitempty"` // Deprecated: removed in Bitcoin Core Time int64 `json:"time"` Nonce uint32 `json:"nonce"` Bits string `json:"bits"` @@ -47,6 +118,26 @@ type GetBlockVerboseResult struct { NextHash string `json:"nextblockhash,omitempty"` } +// GetChainTipsResult models the data from the getchaintips command. +type GetChainTipsResult struct { + Height int32 `json:"height"` + Hash string `json:"hash"` + BranchLen int32 `json:"branchlen"` + Status string `json:"status"` +} + +// GetChainTxStatsResult models the data from the getchaintxstats command. +type GetChainTxStatsResult struct { + Time int64 `json:"time"` + TxCount int64 `json:"txcount"` + WindowFinalBlockHash string `json:"window_final_block_hash"` + WindowFinalBlockHeight int32 `json:"window_final_block_height"` + WindowBlockCount int32 `json:"window_block_count"` + WindowTxCount int32 `json:"window_tx_count"` + WindowInterval int32 `json:"window_interval"` + TxRate float64 `json:"txrate"` +} + // CreateMultiSigResult models the data returned from the createmultisig // command. type CreateMultiSigResult struct { @@ -57,9 +148,10 @@ type CreateMultiSigResult struct { // DecodeScriptResult models the data returned from the decodescript command. type DecodeScriptResult struct { Asm string `json:"asm"` - ReqSigs int32 `json:"reqSigs,omitempty"` + ReqSigs int32 `json:"reqSigs,omitempty"` // Deprecated: removed in Bitcoin Core Type string `json:"type"` - Addresses []string `json:"addresses,omitempty"` + Address string `json:"address,omitempty"` + Addresses []string `json:"addresses,omitempty"` // Deprecated: removed in Bitcoin Core P2sh string `json:"p2sh,omitempty"` } @@ -90,12 +182,13 @@ type SoftForkDescription struct { // Bip9SoftForkDescription describes the current state of a defined BIP0009 // version bits soft-fork. type Bip9SoftForkDescription struct { - Status string `json:"status"` - Bit uint8 `json:"bit"` - StartTime1 int64 `json:"startTime"` - StartTime2 int64 `json:"start_time"` - Timeout int64 `json:"timeout"` - Since int32 `json:"since"` + Status string `json:"status"` + Bit uint8 `json:"bit"` + StartTime1 int64 `json:"startTime"` + StartTime2 int64 `json:"start_time"` + Timeout int64 `json:"timeout"` + Since int32 `json:"since"` + MinActivationHeight int32 `json:"min_activation_height"` } // StartTime returns the starting time of the softfork as a Unix epoch. @@ -140,18 +233,28 @@ type GetBlockChainInfoResult struct { Difficulty float64 `json:"difficulty"` MedianTime int64 `json:"mediantime"` VerificationProgress float64 `json:"verificationprogress,omitempty"` + InitialBlockDownload bool `json:"initialblockdownload,omitempty"` Pruned bool `json:"pruned"` PruneHeight int32 `json:"pruneheight,omitempty"` ChainWork string `json:"chainwork,omitempty"` + SizeOnDisk int64 `json:"size_on_disk,omitempty"` *SoftForks *UnifiedSoftForks } +// GetBlockFilterResult models the data returned from the getblockfilter +// command. +type GetBlockFilterResult struct { + Filter string `json:"filter"` // the hex-encoded filter data + Header string `json:"header"` // the hex-encoded filter header +} + // GetBlockTemplateResultTx models the transactions field of the // getblocktemplate command. type GetBlockTemplateResultTx struct { Data string `json:"data"` Hash string `json:"hash"` + TxID string `json:"txid"` Depends []int64 `json:"depends"` Fee int64 `json:"fee"` SigOps int64 `json:"sigops"` @@ -202,27 +305,39 @@ type GetBlockTemplateResult struct { NonceRange string `json:"noncerange,omitempty"` // Block proposal from BIP 0023. - Capabilities []string `json:"capabilities,omitempty"` - RejectReasion string `json:"reject-reason,omitempty"` + Capabilities []string `json:"capabilities,omitempty"` + RejectReason string `json:"reject-reason,omitempty"` +} + +// GetMempoolEntryResult models the data returned from the getmempoolentry's +// fee field + +type MempoolFees struct { + Base float64 `json:"base"` + Modified float64 `json:"modified"` + Ancestor float64 `json:"ancestor"` + Descendant float64 `json:"descendant"` } // GetMempoolEntryResult models the data returned from the getmempoolentry // command. type GetMempoolEntryResult struct { - Size int32 `json:"size"` - Fee float64 `json:"fee"` - ModifiedFee float64 `json:"modifiedfee"` - Time int64 `json:"time"` - Height int64 `json:"height"` - StartingPriority float64 `json:"startingpriority"` - CurrentPriority float64 `json:"currentpriority"` - DescendantCount int64 `json:"descendantcount"` - DescendantSize int64 `json:"descendantsize"` - DescendantFees float64 `json:"descendantfees"` - AncestorCount int64 `json:"ancestorcount"` - AncestorSize int64 `json:"ancestorsize"` - AncestorFees float64 `json:"ancestorfees"` - Depends []string `json:"depends"` + VSize int32 `json:"vsize"` + Size int32 `json:"size"` + Weight int64 `json:"weight"` + Fee float64 `json:"fee"` + ModifiedFee float64 `json:"modifiedfee"` + Time int64 `json:"time"` + Height int64 `json:"height"` + DescendantCount int64 `json:"descendantcount"` + DescendantSize int64 `json:"descendantsize"` + DescendantFees float64 `json:"descendantfees"` + AncestorCount int64 `json:"ancestorcount"` + AncestorSize int64 `json:"ancestorsize"` + AncestorFees float64 `json:"ancestorfees"` + WTxId string `json:"wtxid"` + Fees MempoolFees `json:"fees"` + Depends []string `json:"depends"` } // GetMempoolInfoResult models the data returned from the getmempoolinfo @@ -249,6 +364,49 @@ type LocalAddressesResult struct { Score int32 `json:"score"` } +// StringOrArray defines a type that can be used as type that is either a single +// string value or a string array in JSON-RPC commands, depending on the version +// of the chain backend. +type StringOrArray []string + +// MarshalJSON implements the json.Marshaler interface. +func (h StringOrArray) MarshalJSON() ([]byte, error) { + return json.Marshal(h) +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (h *StringOrArray) UnmarshalJSON(data []byte) error { + var unmarshalled interface{} + if err := json.Unmarshal(data, &unmarshalled); err != nil { + return err + } + + switch v := unmarshalled.(type) { + case string: + *h = []string{v} + + case []interface{}: + s := make([]string, len(v)) + for i, e := range v { + str, ok := e.(string) + if !ok { + return fmt.Errorf("invalid string_or_array "+ + "value: %v", unmarshalled) + } + + s[i] = str + } + + *h = s + + default: + return fmt.Errorf("invalid string_or_array value: %v", + unmarshalled) + } + + return nil +} + // GetNetworkInfoResult models the data returned from the getnetworkinfo // command. type GetNetworkInfoResult struct { @@ -259,12 +417,24 @@ type GetNetworkInfoResult struct { LocalRelay bool `json:"localrelay"` TimeOffset int64 `json:"timeoffset"` Connections int32 `json:"connections"` + ConnectionsIn int32 `json:"connections_in"` + ConnectionsOut int32 `json:"connections_out"` NetworkActive bool `json:"networkactive"` Networks []NetworksResult `json:"networks"` RelayFee float64 `json:"relayfee"` IncrementalFee float64 `json:"incrementalfee"` LocalAddresses []LocalAddressesResult `json:"localaddresses"` - Warnings string `json:"warnings"` + Warnings StringOrArray `json:"warnings"` +} + +// GetNodeAddressesResult models the data returned from the getnodeaddresses +// command. +type GetNodeAddressesResult struct { + // Timestamp in seconds since epoch (Jan 1 1970 GMT) keeping track of when the node was last seen + Time int64 `json:"time"` + Services uint64 `json:"services"` // The services offered + Address string `json:"address"` // The address of the node + Port uint16 `json:"port"` // The port of the node } // GetPeerInfoResult models the data returned from the getpeerinfo command. @@ -312,9 +482,10 @@ type GetRawMempoolVerboseResult struct { type ScriptPubKeyResult struct { Asm string `json:"asm"` Hex string `json:"hex,omitempty"` - ReqSigs int32 `json:"reqSigs,omitempty"` + ReqSigs int32 `json:"reqSigs,omitempty"` // Deprecated: removed in Bitcoin Core Type string `json:"type"` - Addresses []string `json:"addresses,omitempty"` + Address string `json:"address,omitempty"` + Addresses []string `json:"addresses,omitempty"` // Deprecated: removed in Bitcoin Core } // GetTxOutResult models the data from the gettxout command. @@ -326,6 +497,64 @@ type GetTxOutResult struct { Coinbase bool `json:"coinbase"` } +// GetTxOutSetInfoResult models the data from the gettxoutsetinfo command. +type GetTxOutSetInfoResult struct { + Height int64 `json:"height"` + BestBlock chainhash.Hash `json:"bestblock"` + Transactions int64 `json:"transactions"` + TxOuts int64 `json:"txouts"` + BogoSize int64 `json:"bogosize"` + HashSerialized chainhash.Hash `json:"hash_serialized_2"` + DiskSize int64 `json:"disk_size"` + TotalAmount btcutil.Amount `json:"total_amount"` +} + +// UnmarshalJSON unmarshals the result of the gettxoutsetinfo JSON-RPC call +func (g *GetTxOutSetInfoResult) UnmarshalJSON(data []byte) error { + // Step 1: Create type aliases of the original struct. + type Alias GetTxOutSetInfoResult + + // Step 2: Create an anonymous struct with raw replacements for the special + // fields. + aux := &struct { + BestBlock string `json:"bestblock"` + HashSerialized string `json:"hash_serialized_2"` + TotalAmount float64 `json:"total_amount"` + *Alias + }{ + Alias: (*Alias)(g), + } + + // Step 3: Unmarshal the data into the anonymous struct. + if err := json.Unmarshal(data, &aux); err != nil { + return err + } + + // Step 4: Convert the raw fields to the desired types + blockHash, err := chainhash.NewHashFromStr(aux.BestBlock) + if err != nil { + return err + } + + g.BestBlock = *blockHash + + serializedHash, err := chainhash.NewHashFromStr(aux.HashSerialized) + if err != nil { + return err + } + + g.HashSerialized = *serializedHash + + amount, err := btcutil.NewAmount(aux.TotalAmount) + if err != nil { + return err + } + + g.TotalAmount = amount + + return nil +} + // GetNetTotalsResult models the data returned from the getnettotals command. type GetNetTotalsResult struct { TotalBytesRecv uint64 `json:"totalbytesrecv"` @@ -504,8 +733,8 @@ type GetMiningInfoResult struct { Errors string `json:"errors"` Generate bool `json:"generate"` GenProcLimit int32 `json:"genproclimit"` - HashesPerSec int64 `json:"hashespersec"` - NetworkHashPS int64 `json:"networkhashps"` + HashesPerSec float64 `json:"hashespersec"` + NetworkHashPS float64 `json:"networkhashps"` PooledTx uint64 `json:"pooledtx"` TestNet bool `json:"testnet"` } @@ -540,7 +769,7 @@ type TxRawResult struct { Size int32 `json:"size,omitempty"` Vsize int32 `json:"vsize,omitempty"` Weight int32 `json:"weight,omitempty"` - Version int32 `json:"version"` + Version uint32 `json:"version"` LockTime uint32 `json:"locktime"` Vin []Vin `json:"vin"` Vout []Vout `json:"vout"` @@ -580,7 +809,163 @@ type TxRawDecodeResult struct { // ValidateAddressChainResult models the data returned by the chain server // validateaddress command. +// +// Compared to the Bitcoin Core version, this struct lacks the scriptPubKey +// field since it requires wallet access, which is outside the scope of btcd. +// Ref: https://bitcoincore.org/en/doc/0.20.0/rpc/util/validateaddress/ type ValidateAddressChainResult struct { - IsValid bool `json:"isvalid"` - Address string `json:"address,omitempty"` + IsValid bool `json:"isvalid"` + Address string `json:"address,omitempty"` + IsScript *bool `json:"isscript,omitempty"` + IsWitness *bool `json:"iswitness,omitempty"` + WitnessVersion *int32 `json:"witness_version,omitempty"` + WitnessProgram *string `json:"witness_program,omitempty"` +} + +// EstimateSmartFeeResult models the data returned buy the chain server +// estimatesmartfee command +type EstimateSmartFeeResult struct { + FeeRate *float64 `json:"feerate,omitempty"` + Errors []string `json:"errors,omitempty"` + Blocks int64 `json:"blocks"` +} + +var _ json.Unmarshaler = &FundRawTransactionResult{} + +type rawFundRawTransactionResult struct { + Transaction string `json:"hex"` + Fee float64 `json:"fee"` + ChangePosition int `json:"changepos"` +} + +// FundRawTransactionResult is the result of the fundrawtransaction JSON-RPC call +type FundRawTransactionResult struct { + Transaction *wire.MsgTx + Fee btcutil.Amount + ChangePosition int // the position of the added change output, or -1 +} + +// UnmarshalJSON unmarshals the result of the fundrawtransaction JSON-RPC call +func (f *FundRawTransactionResult) UnmarshalJSON(data []byte) error { + var rawRes rawFundRawTransactionResult + if err := json.Unmarshal(data, &rawRes); err != nil { + return err + } + + txBytes, err := hex.DecodeString(rawRes.Transaction) + if err != nil { + return err + } + + var msgTx wire.MsgTx + witnessErr := msgTx.Deserialize(bytes.NewReader(txBytes)) + if witnessErr != nil { + legacyErr := msgTx.DeserializeNoWitness(bytes.NewReader(txBytes)) + if legacyErr != nil { + return legacyErr + } + } + + fee, err := btcutil.NewAmount(rawRes.Fee) + if err != nil { + return err + } + + f.Transaction = &msgTx + f.Fee = fee + f.ChangePosition = rawRes.ChangePosition + return nil +} + +// GetDescriptorInfoResult models the data from the getdescriptorinfo command. +type GetDescriptorInfoResult struct { + Descriptor string `json:"descriptor"` // descriptor in canonical form, without private keys + Checksum string `json:"checksum"` // checksum for the input descriptor + IsRange bool `json:"isrange"` // whether the descriptor is ranged + IsSolvable bool `json:"issolvable"` // whether the descriptor is solvable + HasPrivateKeys bool `json:"hasprivatekeys"` // whether the descriptor has at least one private key +} + +// DeriveAddressesResult models the data from the deriveaddresses command. +type DeriveAddressesResult []string + +// LoadWalletResult models the data from the loadwallet command +type LoadWalletResult struct { + Name string `json:"name"` + Warning string `json:"warning"` +} + +// DumpWalletResult models the data from the dumpwallet command +type DumpWalletResult struct { + Filename string `json:"filename"` +} + +// TestMempoolAcceptResult models the data from the testmempoolaccept command. +// The result of the mempool acceptance test for each raw transaction in the +// input array. Returns results for each transaction in the same order they +// were passed in. Transactions that cannot be fully validated due to failures +// in other transactions will not contain an 'allowed' result. +type TestMempoolAcceptResult struct { + // Txid is the transaction hash in hex. + Txid string `json:"txid"` + + // Wtxid is the transaction witness hash in hex. + Wtxid string `json:"wtxid"` + + // PackageError is the package validation error, if any (only possible + // if rawtxs had more than 1 transaction). + PackageError string `json:"package-error"` + + // Allowed specifies whether this tx would be accepted to the mempool + // and pass client-specified maxfeerate. If not present, the tx was not + // fully validated due to a failure in another tx in the list. + Allowed bool `json:"allowed,omitempty"` + + // Vsize is the virtual transaction size as defined in BIP 141. This is + // different from actual serialized size for witness transactions as + // witness data is discounted (only present when 'allowed' is true) + Vsize int32 `json:"vsize,omitempty"` + + // Fees specifies the transaction fees (only present if 'allowed' is + // true). + Fees *TestMempoolAcceptFees `json:"fees,omitempty"` + + // RejectReason is the rejection string (only present when 'allowed' is + // false). + RejectReason string `json:"reject-reason,omitempty"` +} + +// TestMempoolAcceptFees models the `fees` section from the testmempoolaccept +// command. +type TestMempoolAcceptFees struct { + // Base is the transaction fee in BTC. + Base float64 `json:"base"` + + // EffectiveFeeRate specifies the effective feerate in BTC per KvB. May + // differ from the base feerate if, for example, there are modified + // fees from prioritisetransaction or a package feerate was used. + // + // NOTE: this field only exists in bitcoind v25.0 and above. + EffectiveFeeRate float64 `json:"effective-feerate"` + + // EffectiveIncludes specifies transactions whose fees and vsizes are + // included in effective-feerate. Each item is a transaction wtxid in + // hex. + // + // NOTE: this field only exists in bitcoind v25.0 and above. + EffectiveIncludes []string `json:"effective-includes"` +} + +// GetTxSpendingPrevOutResult defines a single item returned from the +// gettxspendingprevout command. +type GetTxSpendingPrevOutResult struct { + // Txid is the transaction id of the checked output. + Txid string `json:"txid"` + + // Vout is the vout value of the checked output. + Vout uint32 `json:"vout"` + + // SpendingTxid is the transaction id of the mempool transaction + // spending this output (omitted if unspent). + SpendingTxid string `json:"spendingtxid,omitempty"` } diff --git a/btcjson/chainsvrresults_test.go b/btcjson/chainsvrresults_test.go index 1d568e2658..122af3dccc 100644 --- a/btcjson/chainsvrresults_test.go +++ b/btcjson/chainsvrresults_test.go @@ -6,13 +6,18 @@ package btcjson_test import ( "encoding/json" + "net/url" + "reflect" "testing" "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/davecgh/go-spew/spew" ) // TestChainSvrCustomResults ensures any results that have custom marshalling -// work as inteded. +// work as intended. // and unmarshal code of results are as expected. func TestChainSvrCustomResults(t *testing.T) { t.Parallel() @@ -68,6 +73,21 @@ func TestChainSvrCustomResults(t *testing.T) { }, expected: `{"txid":"123","vout":1,"scriptSig":{"asm":"0","hex":"00"},"prevOut":{"addresses":["addr1"],"value":0},"sequence":4294967295}`, }, + { + name: "zmq notification", + result: &btcjson.GetZmqNotificationResult{{ + Type: "pubrawblock", + Address: func() *url.URL { + u, err := url.Parse("tcp://127.0.0.1:1238") + if err != nil { + panic(err) + } + return u + }(), + HighWaterMark: 1337, + }}, + expected: `[{"address":"tcp://127.0.0.1:1238","hwm":1337,"type":"pubrawblock"}]`, + }, } t.Logf("Running %d tests", len(tests)) @@ -86,3 +106,160 @@ func TestChainSvrCustomResults(t *testing.T) { } } } + +// TestGetTxOutSetInfoResult ensures that custom unmarshalling of +// GetTxOutSetInfoResult works as intended. +func TestGetTxOutSetInfoResult(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + result string + want btcjson.GetTxOutSetInfoResult + }{ + { + name: "GetTxOutSetInfoResult - not scanning", + result: `{"height":123,"bestblock":"000000000000005f94116250e2407310463c0a7cf950f1af9ebe935b1c0687ab","transactions":1,"txouts":1,"bogosize":1,"hash_serialized_2":"9a0a561203ff052182993bc5d0cb2c620880bfafdbd80331f65fd9546c3e5c3e","disk_size":1,"total_amount":0.2}`, + want: btcjson.GetTxOutSetInfoResult{ + Height: 123, + BestBlock: func() chainhash.Hash { + h, err := chainhash.NewHashFromStr("000000000000005f94116250e2407310463c0a7cf950f1af9ebe935b1c0687ab") + if err != nil { + panic(err) + } + + return *h + }(), + Transactions: 1, + TxOuts: 1, + BogoSize: 1, + HashSerialized: func() chainhash.Hash { + h, err := chainhash.NewHashFromStr("9a0a561203ff052182993bc5d0cb2c620880bfafdbd80331f65fd9546c3e5c3e") + if err != nil { + panic(err) + } + + return *h + }(), + DiskSize: 1, + TotalAmount: func() btcutil.Amount { + a, err := btcutil.NewAmount(0.2) + if err != nil { + panic(err) + } + + return a + }(), + }, + }, + } + + t.Logf("Running %d tests", len(tests)) + for i, test := range tests { + var out btcjson.GetTxOutSetInfoResult + err := json.Unmarshal([]byte(test.result), &out) + if err != nil { + t.Errorf("Test #%d (%s) unexpected error: %v", i, + test.name, err) + continue + } + + if !reflect.DeepEqual(out, test.want) { + t.Errorf("Test #%d (%s) unexpected unmarshalled data - "+ + "got %v, want %v", i, test.name, spew.Sdump(out), + spew.Sdump(test.want)) + continue + } + } +} + +// TestChainSvrMiningInfoResults ensures GetMiningInfoResults are unmarshalled correctly +func TestChainSvrMiningInfoResults(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + result string + expected btcjson.GetMiningInfoResult + }{ + { + name: "mining info with integer networkhashps", + result: `{"networkhashps": 89790618491361}`, + expected: btcjson.GetMiningInfoResult{ + NetworkHashPS: 89790618491361, + }, + }, + { + name: "mining info with scientific notation networkhashps", + result: `{"networkhashps": 8.9790618491361e+13}`, + expected: btcjson.GetMiningInfoResult{ + NetworkHashPS: 89790618491361, + }, + }, + } + + t.Logf("Running %d tests", len(tests)) + for i, test := range tests { + var miningInfoResult btcjson.GetMiningInfoResult + err := json.Unmarshal([]byte(test.result), &miningInfoResult) + if err != nil { + t.Errorf("Test #%d (%s) unexpected error: %v", i, + test.name, err) + continue + } + if miningInfoResult != test.expected { + t.Errorf("Test #%d (%s) unexpected marhsalled data - "+ + "got %+v, want %+v", i, test.name, miningInfoResult, + test.expected) + continue + } + } +} + +// TestGetNetworkInfoWarnings tests that we can use both a single string value +// and an array of string values for the warnings field in GetNetworkInfoResult. +func TestGetNetworkInfoWarnings(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + result string + expected btcjson.GetNetworkInfoResult + }{ + { + name: "network info with single warning", + result: `{"warnings": "this is a warning"}`, + expected: btcjson.GetNetworkInfoResult{ + Warnings: btcjson.StringOrArray{ + "this is a warning", + }, + }, + }, + { + name: "network info with array of warnings", + result: `{"warnings": ["a", "or", "b"]}`, + expected: btcjson.GetNetworkInfoResult{ + Warnings: btcjson.StringOrArray{ + "a", "or", "b", + }, + }, + }, + } + + t.Logf("Running %d tests", len(tests)) + for i, test := range tests { + var infoResult btcjson.GetNetworkInfoResult + err := json.Unmarshal([]byte(test.result), &infoResult) + if err != nil { + t.Errorf("Test #%d (%s) unexpected error: %v", i, + test.name, err) + continue + } + if !reflect.DeepEqual(infoResult, test.expected) { + t.Errorf("Test #%d (%s) unexpected marhsalled data - "+ + "got %+v, want %+v", i, test.name, infoResult, + test.expected) + continue + } + } +} diff --git a/btcjson/chainsvrwscmds.go b/btcjson/chainsvrwscmds.go index bf973e2559..dfe499ec5d 100644 --- a/btcjson/chainsvrwscmds.go +++ b/btcjson/chainsvrwscmds.go @@ -80,7 +80,7 @@ func NewStopNotifyNewTransactionsCmd() *StopNotifyNewTransactionsCmd { // NotifyReceivedCmd defines the notifyreceived JSON-RPC command. // -// NOTE: Deprecated. Use LoadTxFilterCmd instead. +// Deprecated: Use LoadTxFilterCmd instead. type NotifyReceivedCmd struct { Addresses []string } @@ -88,7 +88,7 @@ type NotifyReceivedCmd struct { // NewNotifyReceivedCmd returns a new instance which can be used to issue a // notifyreceived JSON-RPC command. // -// NOTE: Deprecated. Use NewLoadTxFilterCmd instead. +// Deprecated: Use NewLoadTxFilterCmd instead. func NewNotifyReceivedCmd(addresses []string) *NotifyReceivedCmd { return &NotifyReceivedCmd{ Addresses: addresses, @@ -128,7 +128,7 @@ func NewLoadTxFilterCmd(reload bool, addresses []string, outPoints []OutPoint) * // NotifySpentCmd defines the notifyspent JSON-RPC command. // -// NOTE: Deprecated. Use LoadTxFilterCmd instead. +// Deprecated: Use LoadTxFilterCmd instead. type NotifySpentCmd struct { OutPoints []OutPoint } @@ -136,7 +136,7 @@ type NotifySpentCmd struct { // NewNotifySpentCmd returns a new instance which can be used to issue a // notifyspent JSON-RPC command. // -// NOTE: Deprecated. Use NewLoadTxFilterCmd instead. +// Deprecated: Use NewLoadTxFilterCmd instead. func NewNotifySpentCmd(outPoints []OutPoint) *NotifySpentCmd { return &NotifySpentCmd{ OutPoints: outPoints, @@ -145,7 +145,7 @@ func NewNotifySpentCmd(outPoints []OutPoint) *NotifySpentCmd { // StopNotifyReceivedCmd defines the stopnotifyreceived JSON-RPC command. // -// NOTE: Deprecated. Use LoadTxFilterCmd instead. +// Deprecated: Use LoadTxFilterCmd instead. type StopNotifyReceivedCmd struct { Addresses []string } @@ -153,7 +153,7 @@ type StopNotifyReceivedCmd struct { // NewStopNotifyReceivedCmd returns a new instance which can be used to issue a // stopnotifyreceived JSON-RPC command. // -// NOTE: Deprecated. Use NewLoadTxFilterCmd instead. +// Deprecated: Use NewLoadTxFilterCmd instead. func NewStopNotifyReceivedCmd(addresses []string) *StopNotifyReceivedCmd { return &StopNotifyReceivedCmd{ Addresses: addresses, @@ -162,7 +162,7 @@ func NewStopNotifyReceivedCmd(addresses []string) *StopNotifyReceivedCmd { // StopNotifySpentCmd defines the stopnotifyspent JSON-RPC command. // -// NOTE: Deprecated. Use LoadTxFilterCmd instead. +// Deprecated: Use LoadTxFilterCmd instead. type StopNotifySpentCmd struct { OutPoints []OutPoint } @@ -170,7 +170,7 @@ type StopNotifySpentCmd struct { // NewStopNotifySpentCmd returns a new instance which can be used to issue a // stopnotifyspent JSON-RPC command. // -// NOTE: Deprecated. Use NewLoadTxFilterCmd instead. +// Deprecated: Use NewLoadTxFilterCmd instead. func NewStopNotifySpentCmd(outPoints []OutPoint) *StopNotifySpentCmd { return &StopNotifySpentCmd{ OutPoints: outPoints, @@ -179,7 +179,7 @@ func NewStopNotifySpentCmd(outPoints []OutPoint) *StopNotifySpentCmd { // RescanCmd defines the rescan JSON-RPC command. // -// NOTE: Deprecated. Use RescanBlocksCmd instead. +// Deprecated: Use RescanBlocksCmd instead. type RescanCmd struct { BeginBlock string Addresses []string @@ -193,7 +193,7 @@ type RescanCmd struct { // The parameters which are pointers indicate they are optional. Passing nil // for optional parameters will use the default value. // -// NOTE: Deprecated. Use NewRescanBlocksCmd instead. +// Deprecated: Use NewRescanBlocksCmd instead. func NewRescanCmd(beginBlock string, addresses []string, outPoints []OutPoint, endBlock *string) *RescanCmd { return &RescanCmd{ BeginBlock: beginBlock, diff --git a/btcjson/chainsvrwscmds_test.go b/btcjson/chainsvrwscmds_test.go index b0cd63cc61..03fb22c8e0 100644 --- a/btcjson/chainsvrwscmds_test.go +++ b/btcjson/chainsvrwscmds_test.go @@ -233,7 +233,7 @@ func TestChainSvrWsCmds(t *testing.T) { for i, test := range tests { // Marshal the command as created by the new static command // creation function. - marshalled, err := btcjson.MarshalCmd(testID, test.staticCmd()) + marshalled, err := btcjson.MarshalCmd(btcjson.RpcVersion1, testID, test.staticCmd()) if err != nil { t.Errorf("MarshalCmd #%d (%s) unexpected error: %v", i, test.name, err) @@ -257,7 +257,7 @@ func TestChainSvrWsCmds(t *testing.T) { // Marshal the command as created by the generic new command // creation function. - marshalled, err = btcjson.MarshalCmd(testID, cmd) + marshalled, err = btcjson.MarshalCmd(btcjson.RpcVersion1, testID, cmd) if err != nil { t.Errorf("MarshalCmd #%d (%s) unexpected error: %v", i, test.name, err) diff --git a/btcjson/chainsvrwsntfns.go b/btcjson/chainsvrwsntfns.go index 1f1562343c..58b7a54491 100644 --- a/btcjson/chainsvrwsntfns.go +++ b/btcjson/chainsvrwsntfns.go @@ -12,14 +12,14 @@ const ( // BlockConnectedNtfnMethod is the legacy, deprecated method used for // notifications from the chain server that a block has been connected. // - // NOTE: Deprecated. Use FilteredBlockConnectedNtfnMethod instead. + // Deprecated: Use FilteredBlockConnectedNtfnMethod instead. BlockConnectedNtfnMethod = "blockconnected" // BlockDisconnectedNtfnMethod is the legacy, deprecated method used for // notifications from the chain server that a block has been // disconnected. // - // NOTE: Deprecated. Use FilteredBlockDisconnectedNtfnMethod instead. + // Deprecated: Use FilteredBlockDisconnectedNtfnMethod instead. BlockDisconnectedNtfnMethod = "blockdisconnected" // FilteredBlockConnectedNtfnMethod is the new method used for @@ -35,7 +35,7 @@ const ( // notifications from the chain server that a transaction which pays to // a registered address has been processed. // - // NOTE: Deprecated. Use RelevantTxAcceptedNtfnMethod and + // Deprecated: Use RelevantTxAcceptedNtfnMethod and // FilteredBlockConnectedNtfnMethod instead. RecvTxNtfnMethod = "recvtx" @@ -43,7 +43,7 @@ const ( // notifications from the chain server that a transaction which spends a // registered outpoint has been processed. // - // NOTE: Deprecated. Use RelevantTxAcceptedNtfnMethod and + // Deprecated: Use RelevantTxAcceptedNtfnMethod and // FilteredBlockConnectedNtfnMethod instead. RedeemingTxNtfnMethod = "redeemingtx" @@ -51,14 +51,14 @@ const ( // notifications from the chain server that a legacy, deprecated rescan // operation has finished. // - // NOTE: Deprecated. Not used with rescanblocks command. + // Deprecated: Not used with rescanblocks command. RescanFinishedNtfnMethod = "rescanfinished" // RescanProgressNtfnMethod is the legacy, deprecated method used for // notifications from the chain server that a legacy, deprecated rescan // operation this is underway has made progress. // - // NOTE: Deprecated. Not used with rescanblocks command. + // Deprecated: Not used with rescanblocks command. RescanProgressNtfnMethod = "rescanprogress" // TxAcceptedNtfnMethod is the method used for notifications from the @@ -79,7 +79,7 @@ const ( // BlockConnectedNtfn defines the blockconnected JSON-RPC notification. // -// NOTE: Deprecated. Use FilteredBlockConnectedNtfn instead. +// Deprecated: Use FilteredBlockConnectedNtfn instead. type BlockConnectedNtfn struct { Hash string Height int32 @@ -89,7 +89,7 @@ type BlockConnectedNtfn struct { // NewBlockConnectedNtfn returns a new instance which can be used to issue a // blockconnected JSON-RPC notification. // -// NOTE: Deprecated. Use NewFilteredBlockConnectedNtfn instead. +// Deprecated: Use NewFilteredBlockConnectedNtfn instead. func NewBlockConnectedNtfn(hash string, height int32, time int64) *BlockConnectedNtfn { return &BlockConnectedNtfn{ Hash: hash, @@ -100,7 +100,7 @@ func NewBlockConnectedNtfn(hash string, height int32, time int64) *BlockConnecte // BlockDisconnectedNtfn defines the blockdisconnected JSON-RPC notification. // -// NOTE: Deprecated. Use FilteredBlockDisconnectedNtfn instead. +// Deprecated: Use FilteredBlockDisconnectedNtfn instead. type BlockDisconnectedNtfn struct { Hash string Height int32 @@ -110,7 +110,7 @@ type BlockDisconnectedNtfn struct { // NewBlockDisconnectedNtfn returns a new instance which can be used to issue a // blockdisconnected JSON-RPC notification. // -// NOTE: Deprecated. Use NewFilteredBlockDisconnectedNtfn instead. +// Deprecated: Use NewFilteredBlockDisconnectedNtfn instead. func NewBlockDisconnectedNtfn(hash string, height int32, time int64) *BlockDisconnectedNtfn { return &BlockDisconnectedNtfn{ Hash: hash, @@ -163,7 +163,7 @@ type BlockDetails struct { // RecvTxNtfn defines the recvtx JSON-RPC notification. // -// NOTE: Deprecated. Use RelevantTxAcceptedNtfn and FilteredBlockConnectedNtfn +// Deprecated: Use RelevantTxAcceptedNtfn and FilteredBlockConnectedNtfn // instead. type RecvTxNtfn struct { HexTx string @@ -173,7 +173,7 @@ type RecvTxNtfn struct { // NewRecvTxNtfn returns a new instance which can be used to issue a recvtx // JSON-RPC notification. // -// NOTE: Deprecated. Use NewRelevantTxAcceptedNtfn and +// Deprecated: Use NewRelevantTxAcceptedNtfn and // NewFilteredBlockConnectedNtfn instead. func NewRecvTxNtfn(hexTx string, block *BlockDetails) *RecvTxNtfn { return &RecvTxNtfn{ @@ -184,7 +184,7 @@ func NewRecvTxNtfn(hexTx string, block *BlockDetails) *RecvTxNtfn { // RedeemingTxNtfn defines the redeemingtx JSON-RPC notification. // -// NOTE: Deprecated. Use RelevantTxAcceptedNtfn and FilteredBlockConnectedNtfn +// Deprecated: Use RelevantTxAcceptedNtfn and FilteredBlockConnectedNtfn // instead. type RedeemingTxNtfn struct { HexTx string @@ -194,7 +194,7 @@ type RedeemingTxNtfn struct { // NewRedeemingTxNtfn returns a new instance which can be used to issue a // redeemingtx JSON-RPC notification. // -// NOTE: Deprecated. Use NewRelevantTxAcceptedNtfn and +// Deprecated: Use NewRelevantTxAcceptedNtfn and // NewFilteredBlockConnectedNtfn instead. func NewRedeemingTxNtfn(hexTx string, block *BlockDetails) *RedeemingTxNtfn { return &RedeemingTxNtfn{ @@ -205,7 +205,7 @@ func NewRedeemingTxNtfn(hexTx string, block *BlockDetails) *RedeemingTxNtfn { // RescanFinishedNtfn defines the rescanfinished JSON-RPC notification. // -// NOTE: Deprecated. Not used with rescanblocks command. +// Deprecated: Not used with rescanblocks command. type RescanFinishedNtfn struct { Hash string Height int32 @@ -215,7 +215,7 @@ type RescanFinishedNtfn struct { // NewRescanFinishedNtfn returns a new instance which can be used to issue a // rescanfinished JSON-RPC notification. // -// NOTE: Deprecated. Not used with rescanblocks command. +// Deprecated: Not used with rescanblocks command. func NewRescanFinishedNtfn(hash string, height int32, time int64) *RescanFinishedNtfn { return &RescanFinishedNtfn{ Hash: hash, @@ -226,7 +226,7 @@ func NewRescanFinishedNtfn(hash string, height int32, time int64) *RescanFinishe // RescanProgressNtfn defines the rescanprogress JSON-RPC notification. // -// NOTE: Deprecated. Not used with rescanblocks command. +// Deprecated: Not used with rescanblocks command. type RescanProgressNtfn struct { Hash string Height int32 @@ -236,7 +236,7 @@ type RescanProgressNtfn struct { // NewRescanProgressNtfn returns a new instance which can be used to issue a // rescanprogress JSON-RPC notification. // -// NOTE: Deprecated. Not used with rescanblocks command. +// Deprecated: Not used with rescanblocks command. func NewRescanProgressNtfn(hash string, height int32, time int64) *RescanProgressNtfn { return &RescanProgressNtfn{ Hash: hash, diff --git a/btcjson/chainsvrwsntfns_test.go b/btcjson/chainsvrwsntfns_test.go index 2da1e7ad2f..e2b234c2a0 100644 --- a/btcjson/chainsvrwsntfns_test.go +++ b/btcjson/chainsvrwsntfns_test.go @@ -231,7 +231,7 @@ func TestChainSvrWsNtfns(t *testing.T) { for i, test := range tests { // Marshal the notification as created by the new static // creation function. The ID is nil for notifications. - marshalled, err := btcjson.MarshalCmd(nil, test.staticNtfn()) + marshalled, err := btcjson.MarshalCmd(btcjson.RpcVersion1, nil, test.staticNtfn()) if err != nil { t.Errorf("MarshalCmd #%d (%s) unexpected error: %v", i, test.name, err) @@ -256,7 +256,7 @@ func TestChainSvrWsNtfns(t *testing.T) { // Marshal the notification as created by the generic new // notification creation function. The ID is nil for // notifications. - marshalled, err = btcjson.MarshalCmd(nil, cmd) + marshalled, err = btcjson.MarshalCmd(btcjson.RpcVersion1, nil, cmd) if err != nil { t.Errorf("MarshalCmd #%d (%s) unexpected error: %v", i, test.name, err) diff --git a/btcjson/chainsvrwsresults_test.go b/btcjson/chainsvrwsresults_test.go index b1e17450c1..9e8c7676c1 100644 --- a/btcjson/chainsvrwsresults_test.go +++ b/btcjson/chainsvrwsresults_test.go @@ -13,7 +13,7 @@ import ( ) // TestChainSvrWsResults ensures any results that have custom marshalling -// work as inteded. +// work as intended. func TestChainSvrWsResults(t *testing.T) { t.Parallel() diff --git a/btcjson/cmdinfo_test.go b/btcjson/cmdinfo_test.go index 044040279a..9dc4567840 100644 --- a/btcjson/cmdinfo_test.go +++ b/btcjson/cmdinfo_test.go @@ -11,7 +11,7 @@ import ( "github.com/btcsuite/btcd/btcjson" ) -// TestCmdMethod tests the CmdMethod function to ensure it retunrs the expected +// TestCmdMethod tests the CmdMethod function to ensure it returns the expected // methods and errors. func TestCmdMethod(t *testing.T) { t.Parallel() @@ -151,7 +151,7 @@ func TestMethodUsageText(t *testing.T) { { name: "getblock", method: "getblock", - expected: `getblock "hash" (verbose=true verbosetx=false)`, + expected: `getblock "hash" (verbosity=1)`, }, } diff --git a/btcjson/cmdparse.go b/btcjson/cmdparse.go index 48c6278a61..c9b248e389 100644 --- a/btcjson/cmdparse.go +++ b/btcjson/cmdparse.go @@ -16,26 +16,27 @@ import ( func makeParams(rt reflect.Type, rv reflect.Value) []interface{} { numFields := rt.NumField() params := make([]interface{}, 0, numFields) + lastParam := -1 for i := 0; i < numFields; i++ { rtf := rt.Field(i) rvf := rv.Field(i) + params = append(params, rvf.Interface()) if rtf.Type.Kind() == reflect.Ptr { if rvf.IsNil() { - break + // Omit optional null params unless a non-null param follows + continue } - rvf.Elem() } - params = append(params, rvf.Interface()) + lastParam = i } - - return params + return params[:lastParam+1] } // MarshalCmd marshals the passed command to a JSON-RPC request byte slice that // is suitable for transmission to an RPC server. The provided command type // must be a registered type. All commands provided by this package are // registered by default. -func MarshalCmd(id interface{}, cmd interface{}) ([]byte, error) { +func MarshalCmd(rpcVersion RPCVersion, id interface{}, cmd interface{}) ([]byte, error) { // Look up the cmd type and error out if not registered. rt := reflect.TypeOf(cmd) registerLock.RLock() @@ -59,7 +60,7 @@ func MarshalCmd(id interface{}, cmd interface{}) ([]byte, error) { params := makeParams(rt.Elem(), rv.Elem()) // Generate and marshal the final JSON-RPC request. - rawCmd, err := NewRequest(id, method, params) + rawCmd, err := NewRequest(rpcVersion, id, method, params) if err != nil { return nil, err } @@ -231,7 +232,7 @@ func baseType(arg reflect.Type) (reflect.Type, int) { // assignField is the main workhorse for the NewCmd function which handles // assigning the provided source value to the destination field. It supports // direct type assignments, indirection, conversion of numeric types, and -// unmarshaling of strings into arrays, slices, structs, and maps via +// unmarshalling of strings into arrays, slices, structs, and maps via // json.Unmarshal. func assignField(paramNum int, fieldName string, dest reflect.Value, src reflect.Value) error { // Just error now when the types have no chance of being compatible. @@ -255,6 +256,11 @@ func assignField(paramNum int, fieldName string, dest reflect.Value, src reflect return nil } + // Optional variables can be set null using "null" string + if destIndirects > 0 && src.String() == "null" { + return nil + } + // When the destination has more indirects than the source, the extra // pointers have to be created. Only create enough pointers to reach // the same level of indirection as the source so the dest can simply be @@ -445,7 +451,7 @@ func assignField(paramNum int, fieldName string, dest reflect.Value, src reflect // String -> float of varying size. case reflect.Float32, reflect.Float64: - srcFloat, err := strconv.ParseFloat(src.String(), 0) + srcFloat, err := strconv.ParseFloat(src.String(), 64) if err != nil { str := fmt.Sprintf("parameter #%d '%s' must "+ "parse to a %v", paramNum, fieldName, @@ -489,7 +495,7 @@ func assignField(paramNum int, fieldName string, dest reflect.Value, src reflect // by this package are already registered by default. // // The arguments are most efficient when they are the exact same type as the -// underlying field in the command struct associated with the the method, +// underlying field in the command struct associated with the method, // however this function also will perform a variety of conversions to make it // more flexible. This allows, for example, command line args which are strings // to be passed unaltered. In particular, the following conversions are diff --git a/btcjson/cmdparse_test.go b/btcjson/cmdparse_test.go index 7c13a0bb44..f2585edf5c 100644 --- a/btcjson/cmdparse_test.go +++ b/btcjson/cmdparse_test.go @@ -162,6 +162,18 @@ func TestAssignField(t *testing.T) { src: `{"1Address":1.5}`, expected: map[string]float64{"1Address": 1.5}, }, + { + name: `null optional field - "null" -> *int32`, + dest: btcjson.Int32(0), + src: "null", + expected: nil, + }, + { + name: `null optional field - "null" -> *string`, + dest: btcjson.String(""), + src: "null", + expected: nil, + }, } t.Logf("Running %d tests", len(tests)) @@ -175,6 +187,15 @@ func TestAssignField(t *testing.T) { continue } + // Check case where null string is used on optional field + if dst.Kind() == reflect.Ptr && test.src == "null" { + if !dst.IsNil() { + t.Errorf("Test #%d (%s) unexpected value - got %v, "+ + "want nil", i, test.name, dst.Interface()) + } + continue + } + // Inidirect through to the base types to ensure their values // are the same. for dst.Kind() == reflect.Ptr { @@ -201,7 +222,7 @@ func TestAssignFieldErrors(t *testing.T) { }{ { name: "general incompatible int -> string", - dest: string(0), + dest: "\x00", src: int(0), err: btcjson.Error{ErrorCode: btcjson.ErrInvalidType}, }, @@ -401,6 +422,59 @@ func TestNewCmdErrors(t *testing.T) { } } +// TestMarshalCmd tests the MarshalCmd function. +func TestMarshalCmd(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + id interface{} + cmd interface{} + expected string + }{ + { + name: "include all parameters", + id: 1, + cmd: btcjson.NewGetNetworkHashPSCmd(btcjson.Int(100), btcjson.Int(2000)), + expected: `{"jsonrpc":"1.0","method":"getnetworkhashps","params":[100,2000],"id":1}`, + }, + { + name: "include padding null parameter", + id: 1, + cmd: btcjson.NewGetNetworkHashPSCmd(nil, btcjson.Int(2000)), + expected: `{"jsonrpc":"1.0","method":"getnetworkhashps","params":[null,2000],"id":1}`, + }, + { + name: "omit single unnecessary null parameter", + id: 1, + cmd: btcjson.NewGetNetworkHashPSCmd(btcjson.Int(100), nil), + expected: `{"jsonrpc":"1.0","method":"getnetworkhashps","params":[100],"id":1}`, + }, + { + name: "omit unnecessary null parameters", + id: 1, + cmd: btcjson.NewGetNetworkHashPSCmd(nil, nil), + expected: `{"jsonrpc":"1.0","method":"getnetworkhashps","params":[],"id":1}`, + }, + } + + t.Logf("Running %d tests", len(tests)) + for i, test := range tests { + bytes, err := btcjson.MarshalCmd(btcjson.RpcVersion1, test.id, test.cmd) + if err != nil { + t.Errorf("Test #%d (%s) wrong error - got %T (%v)", + i, test.name, err, err) + continue + } + marshalled := string(bytes) + if marshalled != test.expected { + t.Errorf("Test #%d (%s) mismatched marshall result - got "+ + "%v, want %v", i, test.name, marshalled, test.expected) + continue + } + } +} + // TestMarshalCmdErrors tests the error paths of the MarshalCmd function. func TestMarshalCmdErrors(t *testing.T) { t.Parallel() @@ -433,7 +507,7 @@ func TestMarshalCmdErrors(t *testing.T) { t.Logf("Running %d tests", len(tests)) for i, test := range tests { - _, err := btcjson.MarshalCmd(test.id, test.cmd) + _, err := btcjson.MarshalCmd(btcjson.RpcVersion1, test.id, test.cmd) if reflect.TypeOf(err) != reflect.TypeOf(test.err) { t.Errorf("Test #%d (%s) wrong error - got %T (%v), "+ "want %T", i, test.name, err, err, test.err) @@ -461,7 +535,7 @@ func TestUnmarshalCmdErrors(t *testing.T) { { name: "unregistered type", request: btcjson.Request{ - Jsonrpc: "1.0", + Jsonrpc: btcjson.RpcVersion1, Method: "bogusmethod", Params: nil, ID: nil, @@ -471,7 +545,7 @@ func TestUnmarshalCmdErrors(t *testing.T) { { name: "incorrect number of params", request: btcjson.Request{ - Jsonrpc: "1.0", + Jsonrpc: btcjson.RpcVersion1, Method: "getblockcount", Params: []json.RawMessage{[]byte(`"bogusparam"`)}, ID: nil, @@ -481,7 +555,7 @@ func TestUnmarshalCmdErrors(t *testing.T) { { name: "invalid type for a parameter", request: btcjson.Request{ - Jsonrpc: "1.0", + Jsonrpc: btcjson.RpcVersion1, Method: "getblock", Params: []json.RawMessage{[]byte("1")}, ID: nil, @@ -491,7 +565,7 @@ func TestUnmarshalCmdErrors(t *testing.T) { { name: "invalid JSON for a parameter", request: btcjson.Request{ - Jsonrpc: "1.0", + Jsonrpc: btcjson.RpcVersion1, Method: "getblock", Params: []json.RawMessage{[]byte(`"1`)}, ID: nil, diff --git a/btcjson/doc.go b/btcjson/doc.go index 165b9ef91c..f0456716b9 100644 --- a/btcjson/doc.go +++ b/btcjson/doc.go @@ -5,16 +5,16 @@ /* Package btcjson provides primitives for working with the bitcoin JSON-RPC API. -Overview +# Overview When communicating via the JSON-RPC protocol, all of the commands need to be -marshalled to and from the the wire in the appropriate format. This package +marshalled to and from the wire in the appropriate format. This package provides data structures and primitives to ease this process. In addition, it also provides some additional features such as custom command registration, command categorization, and reflection-based help generation. -JSON-RPC Protocol Overview +# JSON-RPC Protocol Overview This information is not necessary in order to use this package, but it does provide some intuition into what the marshalling and unmarshalling that is @@ -47,39 +47,39 @@ with it) doesn't always follow the spec and will sometimes return an error string in the result field with a null error for certain commands. However, for the most part, the error field will be set as described on failure. -Marshalling and Unmarshalling +# Marshalling and Unmarshalling Based upon the discussion above, it should be easy to see how the types of this package map into the required parts of the protocol - Request Objects (type Request) - - Commands (type Cmd) - - Notifications (type Ntfn) + 1. Commands (type Cmd) + 2. Notifications (type Ntfn) - Response Objects (type Response) - - Result (type Result) + 1. Result (type Result) To simplify the marshalling of the requests and responses, the MarshalCmd and MarshalResponse functions are provided. They return the raw bytes ready to be sent across the wire. Unmarshalling a received Request object is a two step process: - 1) Unmarshal the raw bytes into a Request struct instance via json.Unmarshal - 2) Use UnmarshalCmd on the Result field of the unmarshalled Request to create - a concrete command or notification instance with all struct fields set - accordingly + 1. Unmarshal the raw bytes into a Request struct instance via json.Unmarshal + 2. Use UnmarshalCmd on the Result field of the unmarshalled Request to create + a concrete command or notification instance with all struct fields set + accordingly This approach is used since it provides the caller with access to the additional fields in the request that are not part of the command such as the ID. Unmarshalling a received Response object is also a two step process: - 1) Unmarhsal the raw bytes into a Response struct instance via json.Unmarshal - 2) Depending on the ID, unmarshal the Result field of the unmarshalled - Response to create a concrete type instance + 1. Unmarhsal the raw bytes into a Response struct instance via json.Unmarshal + 2. Depending on the ID, unmarshal the Result field of the unmarshalled + Response to create a concrete type instance As above, this approach is used since it provides the caller with access to the fields in the response such as the ID and Error. -Command Creation +# Command Creation This package provides two approaches for creating a new command. This first, and preferred, method is to use one of the NewCmd functions. This allows @@ -93,7 +93,7 @@ obviously, run-time which means any mistakes won't be found until the code is actually executed. However, it is quite useful for user-supplied commands that are intentionally dynamic. -Custom Command Registration +# Custom Command Registration The command handling of this package is built around the concept of registered commands. This is true for the wide variety of commands already provided by the @@ -104,7 +104,7 @@ function for this purpose. A list of all registered methods can be obtained with the RegisteredCmdMethods function. -Command Inspection +# Command Inspection All registered commands are registered with flags that identify information such as whether the command applies to a chain server, wallet server, or is a @@ -112,7 +112,7 @@ notification along with the method name to use. These flags can be obtained with the MethodUsageFlags flags, and the method can be obtained with the CmdMethod function. -Help Generation +# Help Generation To facilitate providing consistent help to users of the RPC server, this package exposes the GenerateHelp and function which uses reflection on registered @@ -122,7 +122,7 @@ generate the final help text. In addition, the MethodUsageText function is provided to generate consistent one-line usage for registered commands and notifications using reflection. -Errors +# Errors There are 2 distinct type of errors supported by this package: diff --git a/btcjson/error.go b/btcjson/error.go index 3d72329f91..66be0214d1 100644 --- a/btcjson/error.go +++ b/btcjson/error.go @@ -30,7 +30,7 @@ const ( // embedded type which is not not supported. ErrEmbeddedType - // ErrUnexportedField indiciates the provided command struct contains an + // ErrUnexportedField indicates the provided command struct contains an // unexported field which is not supported. ErrUnexportedField diff --git a/btcjson/example_test.go b/btcjson/example_test.go index 527252c7fb..74478e7482 100644 --- a/btcjson/example_test.go +++ b/btcjson/example_test.go @@ -21,13 +21,13 @@ func ExampleMarshalCmd() { // convenience function for creating a pointer out of a primitive for // optional parameters. blockHash := "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f" - gbCmd := btcjson.NewGetBlockCmd(blockHash, btcjson.Bool(false), nil) + gbCmd := btcjson.NewGetBlockCmd(blockHash, btcjson.Int(0)) // Marshal the command to the format suitable for sending to the RPC // server. Typically the client would increment the id here which is // request so the response can be identified. id := 1 - marshalledBytes, err := btcjson.MarshalCmd(id, gbCmd) + marshalledBytes, err := btcjson.MarshalCmd(btcjson.RpcVersion1, id, gbCmd) if err != nil { fmt.Println(err) return @@ -38,7 +38,7 @@ func ExampleMarshalCmd() { fmt.Printf("%s\n", marshalledBytes) // Output: - // {"jsonrpc":"1.0","method":"getblock","params":["000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",false],"id":1} + // {"jsonrpc":"1.0","method":"getblock","params":["000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",0],"id":1} } // This example demonstrates how to unmarshal a JSON-RPC request and then @@ -46,7 +46,7 @@ func ExampleMarshalCmd() { func ExampleUnmarshalCmd() { // Ordinarily this would be read from the wire, but for this example, // it is hard coded here for clarity. - data := []byte(`{"jsonrpc":"1.0","method":"getblock","params":["000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",false],"id":1}`) + data := []byte(`{"jsonrpc":"1.0","method":"getblock","params":["000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",0],"id":1}`) // Unmarshal the raw bytes from the wire into a JSON-RPC request. var request btcjson.Request @@ -84,20 +84,18 @@ func ExampleUnmarshalCmd() { // Display the fields in the concrete command. fmt.Println("Hash:", gbCmd.Hash) - fmt.Println("Verbose:", *gbCmd.Verbose) - fmt.Println("VerboseTx:", *gbCmd.VerboseTx) + fmt.Println("Verbosity:", *gbCmd.Verbosity) // Output: // Hash: 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f - // Verbose: false - // VerboseTx: false + // Verbosity: 0 } // This example demonstrates how to marshal a JSON-RPC response. func ExampleMarshalResponse() { // Marshal a new JSON-RPC response. For example, this is a response // to a getblockheight request. - marshalledBytes, err := btcjson.MarshalResponse(1, 350001, nil) + marshalledBytes, err := btcjson.MarshalResponse(btcjson.RpcVersion1, 1, 350001, nil) if err != nil { fmt.Println(err) return @@ -109,7 +107,7 @@ func ExampleMarshalResponse() { fmt.Printf("%s\n", marshalledBytes) // Output: - // {"result":350001,"error":null,"id":1} + // {"jsonrpc":"1.0","result":350001,"error":null,"id":1} } // This example demonstrates how to unmarshal a JSON-RPC response and then @@ -118,7 +116,7 @@ func Example_unmarshalResponse() { // Ordinarily this would be read from the wire, but for this example, // it is hard coded here for clarity. This is an example response to a // getblockheight request. - data := []byte(`{"result":350001,"error":null,"id":1}`) + data := []byte(`{"jsonrpc":"1.0","result":350001,"error":null,"id":1}`) // Unmarshal the raw bytes from the wire into a JSON-RPC response. var response btcjson.Response diff --git a/btcjson/help.go b/btcjson/help.go index f502d09fd8..2cc55b8410 100644 --- a/btcjson/help.go +++ b/btcjson/help.go @@ -476,11 +476,12 @@ func isValidResultType(kind reflect.Kind) bool { // an error will use the key in place of the description. // // The following outlines the required keys: -// "--synopsis" Synopsis for the command -// "-" Description for each command argument -// "-" Description for each object field -// "--condition<#>" Description for each result condition -// "--result<#>" Description for each primitive result num +// +// "--synopsis" Synopsis for the command +// "-" Description for each command argument +// "-" Description for each object field +// "--condition<#>" Description for each result condition +// "--result<#>" Description for each primitive result num // // Notice that the "special" keys synopsis, condition<#>, and result<#> are // preceded by a double dash to ensure they don't conflict with field names. @@ -492,16 +493,17 @@ func isValidResultType(kind reflect.Kind) bool { // For example, consider the 'help' command itself. There are two possible // returns depending on the provided parameters. So, the help would be // generated by calling the function as follows: -// GenerateHelp("help", descs, (*string)(nil), (*string)(nil)). +// +// GenerateHelp("help", descs, (*string)(nil), (*string)(nil)). // // The following keys would then be required in the provided descriptions map: // -// "help--synopsis": "Returns a list of all commands or help for ...." -// "help-command": "The command to retrieve help for", -// "help--condition0": "no command provided" -// "help--condition1": "command specified" -// "help--result0": "List of commands" -// "help--result1": "Help for specified command" +// "help--synopsis": "Returns a list of all commands or help for ...." +// "help-command": "The command to retrieve help for", +// "help--condition0": "no command provided" +// "help--condition1": "command specified" +// "help--result0": "List of commands" +// "help--result1": "Help for specified command" func GenerateHelp(method string, descs map[string]string, resultTypes ...interface{}) (string, error) { // Look up details about the provided method and error out if not // registered. diff --git a/btcjson/helpers.go b/btcjson/helpers.go index d9b452e7c3..eda26cb885 100644 --- a/btcjson/helpers.go +++ b/btcjson/helpers.go @@ -75,3 +75,11 @@ func String(v string) *string { *p = v return p } + +// NewFilterTypeName is a helper routine that allocates a new FilterTypeName value to store v and +// returns a pointer to it. This is useful when assigning optional parameters. +func NewFilterTypeName(v FilterTypeName) *FilterTypeName { + p := new(FilterTypeName) + *p = v + return p +} diff --git a/btcjson/jsonrpc.go b/btcjson/jsonrpc.go index e99d9f4265..ea4a213bca 100644 --- a/btcjson/jsonrpc.go +++ b/btcjson/jsonrpc.go @@ -9,6 +9,33 @@ import ( "fmt" ) +// RPCVersion is a type to indicate RPC versions. +type RPCVersion string + +const ( + // version 1 of rpc + RpcVersion1 RPCVersion = RPCVersion("1.0") + // version 2 of rpc + RpcVersion2 RPCVersion = RPCVersion("2.0") +) + +var validRpcVersions = []RPCVersion{RpcVersion1, RpcVersion2} + +// check if the rpc version is a valid version +func (r RPCVersion) IsValid() bool { + for _, version := range validRpcVersions { + if version == r { + return true + } + } + return false +} + +// cast rpc version to a string +func (r RPCVersion) String() string { + return string(r) +} + // RPCErrorCode represents an error code to be used as a part of an RPCError // which is in turn used in a JSON-RPC Response object. // @@ -22,10 +49,10 @@ type RPCError struct { Message string `json:"message,omitempty"` } -// Guarantee RPCError satisifies the builtin error interface. +// Guarantee RPCError satisfies the builtin error interface. var _, _ error = RPCError{}, (*RPCError)(nil) -// Error returns a string describing the RPC error. This satisifies the +// Error returns a string describing the RPC error. This satisfies the // builtin error interface. func (e RPCError) Error() string { return fmt.Sprintf("%d: %s", e.Code, e.Message) @@ -67,21 +94,77 @@ func IsValidIDType(id interface{}) bool { // requests, however this struct it being exported in case the caller wants to // construct raw requests for some reason. type Request struct { - Jsonrpc string `json:"jsonrpc"` + Jsonrpc RPCVersion `json:"jsonrpc"` Method string `json:"method"` Params []json.RawMessage `json:"params"` ID interface{} `json:"id"` } -// NewRequest returns a new JSON-RPC 1.0 request object given the provided id, -// method, and parameters. The parameters are marshalled into a json.RawMessage -// for the Params field of the returned request object. This function is only -// provided in case the caller wants to construct raw requests for some reason. -// -// Typically callers will instead want to create a registered concrete command -// type with the NewCmd or NewCmd functions and call the MarshalCmd -// function with that command to generate the marshalled JSON-RPC request. -func NewRequest(id interface{}, method string, params []interface{}) (*Request, error) { +// UnmarshalJSON is a custom unmarshal func for the Request struct. The param +// field defaults to an empty json.RawMessage array it is omitted by the request +// or nil if the supplied value is invalid. +func (request *Request) UnmarshalJSON(b []byte) error { + // Step 1: Create a type alias of the original struct. + type Alias Request + + // Step 2: Create an anonymous struct with raw replacements for the special + // fields. + aux := &struct { + Jsonrpc string `json:"jsonrpc"` + Params []interface{} `json:"params"` + *Alias + }{ + Alias: (*Alias)(request), + } + + // Step 3: Unmarshal the data into the anonymous struct. + err := json.Unmarshal(b, &aux) + if err != nil { + return err + } + + // Step 4: Convert the raw fields to the desired types + + version := RPCVersion(aux.Jsonrpc) + if version.IsValid() { + request.Jsonrpc = version + } + + rawParams := make([]json.RawMessage, 0) + + for _, param := range aux.Params { + marshalledParam, err := json.Marshal(param) + if err != nil { + return err + } + + rawMessage := json.RawMessage(marshalledParam) + rawParams = append(rawParams, rawMessage) + } + + request.Params = rawParams + + return nil +} + +// NewRequest returns a new JSON-RPC request object given the provided rpc +// version, id, method, and parameters. The parameters are marshalled into a +// json.RawMessage for the Params field of the returned request object. This +// function is only provided in case the caller wants to construct raw requests +// for some reason. Typically callers will instead want to create a registered +// concrete command type with the NewCmd or NewCmd functions and call the +// MarshalCmd function with that command to generate the marshalled JSON-RPC +// request. +func NewRequest(rpcVersion RPCVersion, id interface{}, method string, params []interface{}) (*Request, error) { + // default to JSON-RPC 1.0 if RPC type is not specified + if rpcVersion == "" { + rpcVersion = RpcVersion1 + } + if !rpcVersion.IsValid() { + str := fmt.Sprintf("rpcversion '%s' is invalid", rpcVersion) + return nil, makeError(ErrInvalidType, str) + } + if !IsValidIDType(id) { str := fmt.Sprintf("the id of type '%T' is invalid", id) return nil, makeError(ErrInvalidType, str) @@ -98,30 +181,35 @@ func NewRequest(id interface{}, method string, params []interface{}) (*Request, } return &Request{ - Jsonrpc: "1.0", + Jsonrpc: rpcVersion, ID: id, Method: method, Params: rawParams, }, nil } -// Response is the general form of a JSON-RPC response. The type of the Result -// field varies from one command to the next, so it is implemented as an -// interface. The ID field has to be a pointer for Go to put a null in it when +// Response is the general form of a JSON-RPC response. The type of the +// Result field varies from one command to the next, so it is implemented as an +// interface. The ID field has to be a pointer to allow for a nil value when // empty. type Response struct { - Result json.RawMessage `json:"result"` - Error *RPCError `json:"error"` - ID *interface{} `json:"id"` + Jsonrpc RPCVersion `json:"jsonrpc"` + Result json.RawMessage `json:"result"` + Error *RPCError `json:"error"` + ID *interface{} `json:"id"` } -// NewResponse returns a new JSON-RPC response object given the provided id, -// marshalled result, and RPC error. This function is only provided in case the -// caller wants to construct raw responses for some reason. -// +// NewResponse returns a new JSON-RPC response object given the provided rpc +// version, id, marshalled result, and RPC error. This function is only +// provided in case the caller wants to construct raw responses for some reason. // Typically callers will instead want to create the fully marshalled JSON-RPC // response to send over the wire with the MarshalResponse function. -func NewResponse(id interface{}, marshalledResult []byte, rpcErr *RPCError) (*Response, error) { +func NewResponse(rpcVersion RPCVersion, id interface{}, marshalledResult []byte, rpcErr *RPCError) (*Response, error) { + if !rpcVersion.IsValid() { + str := fmt.Sprintf("rpcversion '%s' is invalid", rpcVersion) + return nil, makeError(ErrInvalidType, str) + } + if !IsValidIDType(id) { str := fmt.Sprintf("the id of type '%T' is invalid", id) return nil, makeError(ErrInvalidType, str) @@ -129,20 +217,27 @@ func NewResponse(id interface{}, marshalledResult []byte, rpcErr *RPCError) (*Re pid := &id return &Response{ - Result: marshalledResult, - Error: rpcErr, - ID: pid, + Jsonrpc: rpcVersion, + Result: marshalledResult, + Error: rpcErr, + ID: pid, }, nil } -// MarshalResponse marshals the passed id, result, and RPCError to a JSON-RPC -// response byte slice that is suitable for transmission to a JSON-RPC client. -func MarshalResponse(id interface{}, result interface{}, rpcErr *RPCError) ([]byte, error) { +// MarshalResponse marshals the passed rpc version, id, result, and RPCError to +// a JSON-RPC response byte slice that is suitable for transmission to a +// JSON-RPC client. +func MarshalResponse(rpcVersion RPCVersion, id interface{}, result interface{}, rpcErr *RPCError) ([]byte, error) { + if !rpcVersion.IsValid() { + str := fmt.Sprintf("rpcversion '%s' is invalid", rpcVersion) + return nil, makeError(ErrInvalidType, str) + } + marshalledResult, err := json.Marshal(result) if err != nil { return nil, err } - response, err := NewResponse(id, marshalledResult, rpcErr) + response, err := NewResponse(rpcVersion, id, marshalledResult, rpcErr) if err != nil { return nil, err } diff --git a/btcjson/jsonrpc_test.go b/btcjson/jsonrpc_test.go index 7a5d75618c..13d98e89f5 100644 --- a/btcjson/jsonrpc_test.go +++ b/btcjson/jsonrpc_test.go @@ -68,7 +68,7 @@ func TestMarshalResponse(t *testing.T) { name: "ordinary bool result with no error", result: true, jsonErr: nil, - expected: []byte(`{"result":true,"error":null,"id":1}`), + expected: []byte(`{"jsonrpc":"1.0","result":true,"error":null,"id":1}`), }, { name: "result with error", @@ -76,14 +76,14 @@ func TestMarshalResponse(t *testing.T) { jsonErr: func() *btcjson.RPCError { return btcjson.NewRPCError(btcjson.ErrRPCBlockNotFound, "123 not found") }(), - expected: []byte(`{"result":null,"error":{"code":-5,"message":"123 not found"},"id":1}`), + expected: []byte(`{"jsonrpc":"1.0","result":null,"error":{"code":-5,"message":"123 not found"},"id":1}`), }, } t.Logf("Running %d tests", len(tests)) for i, test := range tests { _, _ = i, test - marshalled, err := btcjson.MarshalResponse(testID, test.result, test.jsonErr) + marshalled, err := btcjson.MarshalResponse(btcjson.RpcVersion1, testID, test.result, test.jsonErr) if err != nil { t.Errorf("Test #%d (%s) unexpected error: %v", i, test.name, err) @@ -104,7 +104,7 @@ func TestMiscErrors(t *testing.T) { // Force an error in NewRequest by giving it a parameter type that is // not supported. - _, err := btcjson.NewRequest(nil, "test", []interface{}{make(chan int)}) + _, err := btcjson.NewRequest(btcjson.RpcVersion1, nil, "test", []interface{}{make(chan int)}) if err == nil { t.Error("NewRequest: did not receive error") return @@ -113,7 +113,7 @@ func TestMiscErrors(t *testing.T) { // Force an error in MarshalResponse by giving it an id type that is not // supported. wantErr := btcjson.Error{ErrorCode: btcjson.ErrInvalidType} - _, err = btcjson.MarshalResponse(make(chan int), nil, nil) + _, err = btcjson.MarshalResponse(btcjson.RpcVersion1, make(chan int), nil, nil) if jerr, ok := err.(btcjson.Error); !ok || jerr.ErrorCode != wantErr.ErrorCode { t.Errorf("MarshalResult: did not receive expected error - got "+ "%v (%[1]T), want %v (%[2]T)", err, wantErr) @@ -122,7 +122,7 @@ func TestMiscErrors(t *testing.T) { // Force an error in MarshalResponse by giving it a result type that // can't be marshalled. - _, err = btcjson.MarshalResponse(1, make(chan int), nil) + _, err = btcjson.MarshalResponse(btcjson.RpcVersion1, 1, make(chan int), nil) if _, ok := err.(*json.UnsupportedTypeError); !ok { wantErr := &json.UnsupportedTypeError{} t.Errorf("MarshalResult: did not receive expected error - got "+ diff --git a/btcjson/jsonrpcerr.go b/btcjson/jsonrpcerr.go index 8996c47461..e5872bc51b 100644 --- a/btcjson/jsonrpcerr.go +++ b/btcjson/jsonrpcerr.go @@ -30,35 +30,136 @@ var ( // General application defined JSON errors. const ( - ErrRPCMisc RPCErrorCode = -1 + // ErrRPCMisc indicates an exception thrown during command handling. + ErrRPCMisc RPCErrorCode = -1 + + // ErrRPCForbiddenBySafeMode indicates that server is in safe mode, and + // command is not allowed in safe mode. ErrRPCForbiddenBySafeMode RPCErrorCode = -2 - ErrRPCType RPCErrorCode = -3 + + // ErrRPCType indicates that an unexpected type was passed as parameter. + ErrRPCType RPCErrorCode = -3 + + // ErrRPCInvalidAddressOrKey indicates an invalid address or key. ErrRPCInvalidAddressOrKey RPCErrorCode = -5 - ErrRPCOutOfMemory RPCErrorCode = -7 - ErrRPCInvalidParameter RPCErrorCode = -8 - ErrRPCDatabase RPCErrorCode = -20 - ErrRPCDeserialization RPCErrorCode = -22 - ErrRPCVerify RPCErrorCode = -25 + + // ErrRPCOutOfMemory indicates that the server ran out of memory during + // operation. + ErrRPCOutOfMemory RPCErrorCode = -7 + + // ErrRPCInvalidParameter indicates an invalid, missing, or duplicate + // parameter. + ErrRPCInvalidParameter RPCErrorCode = -8 + + // ErrRPCDatabase indicates a database error. + ErrRPCDatabase RPCErrorCode = -20 + + // ErrRPCDeserialization indicates an error parsing or validating structure + // in raw format. + ErrRPCDeserialization RPCErrorCode = -22 + + // ErrRPCVerify indicates a general error during transaction or block + // submission. + ErrRPCVerify RPCErrorCode = -25 + + // ErrRPCVerifyRejected indicates that transaction or block was rejected by + // network rules. + ErrRPCVerifyRejected RPCErrorCode = -26 + + // ErrRPCVerifyAlreadyInChain indicates that submitted transaction is + // already in chain. + ErrRPCVerifyAlreadyInChain RPCErrorCode = -27 + + // ErrRPCInWarmup indicates that client is still warming up. + ErrRPCInWarmup RPCErrorCode = -28 + + // ErrRPCInWarmup indicates that the RPC error is deprecated. + ErrRPCMethodDeprecated RPCErrorCode = -32 ) // Peer-to-peer client errors. const ( - ErrRPCClientNotConnected RPCErrorCode = -9 + // ErrRPCClientNotConnected indicates that Bitcoin is not connected. + ErrRPCClientNotConnected RPCErrorCode = -9 + + // ErrRPCClientInInitialDownload indicates that client is still downloading + // initial blocks. ErrRPCClientInInitialDownload RPCErrorCode = -10 - ErrRPCClientNodeNotAdded RPCErrorCode = -24 + + // ErrRPCClientNodeAlreadyAdded indicates that node is already added. + ErrRPCClientNodeAlreadyAdded RPCErrorCode = -23 + + // ErrRPCClientNodeNotAdded indicates that node has not been added before. + ErrRPCClientNodeNotAdded RPCErrorCode = -24 + + // ErrRPCClientNodeNotConnected indicates that node to disconnect was not + // found in connected nodes. + ErrRPCClientNodeNotConnected RPCErrorCode = -29 + + // ErrRPCClientInvalidIPOrSubnet indicates an invalid IP/Subnet. + ErrRPCClientInvalidIPOrSubnet RPCErrorCode = -30 + + // ErrRPCClientP2PDisabled indicates that no valid connection manager + // instance was found. + ErrRPCClientP2PDisabled RPCErrorCode = -31 +) + +// Chain errors +const ( + // ErrRPCClientMempoolDisabled indicates that no mempool instance was + // found. + ErrRPCClientMempoolDisabled RPCErrorCode = -33 ) // Wallet JSON errors const ( - ErrRPCWallet RPCErrorCode = -4 - ErrRPCWalletInsufficientFunds RPCErrorCode = -6 - ErrRPCWalletInvalidAccountName RPCErrorCode = -11 - ErrRPCWalletKeypoolRanOut RPCErrorCode = -12 - ErrRPCWalletUnlockNeeded RPCErrorCode = -13 + // ErrRPCWallet indicates an unspecified problem with wallet, for + // example, key not found, etc. + ErrRPCWallet RPCErrorCode = -4 + + // ErrRPCWalletInvalidAddressType indicates an invalid address type. + ErrRPCWalletInvalidAddressType RPCErrorCode = -5 + + // ErrRPCWalletInsufficientFunds indicates that there are not enough + // funds in wallet or account. + ErrRPCWalletInsufficientFunds RPCErrorCode = -6 + + // ErrRPCWalletInvalidAccountName indicates an invalid label name. + ErrRPCWalletInvalidAccountName RPCErrorCode = -11 + + // ErrRPCWalletKeypoolRanOut indicates that the keypool ran out, and that + // keypoolrefill must be called first. + ErrRPCWalletKeypoolRanOut RPCErrorCode = -12 + + // ErrRPCWalletUnlockNeeded indicates that the wallet passphrase must be + // entered first with the walletpassphrase RPC. + ErrRPCWalletUnlockNeeded RPCErrorCode = -13 + + // ErrRPCWalletPassphraseIncorrect indicates that the wallet passphrase + // that was entered was incorrect. ErrRPCWalletPassphraseIncorrect RPCErrorCode = -14 - ErrRPCWalletWrongEncState RPCErrorCode = -15 - ErrRPCWalletEncryptionFailed RPCErrorCode = -16 - ErrRPCWalletAlreadyUnlocked RPCErrorCode = -17 + + // ErrRPCWalletWrongEncState indicates that a command was given in wrong + // wallet encryption state, for example, encrypting an encrypted wallet. + ErrRPCWalletWrongEncState RPCErrorCode = -15 + + // ErrRPCWalletEncryptionFailed indicates a failure to encrypt the wallet. + ErrRPCWalletEncryptionFailed RPCErrorCode = -16 + + // ErrRPCWalletAlreadyUnlocked indicates an attempt to unlock a wallet + // that was already unlocked. + ErrRPCWalletAlreadyUnlocked RPCErrorCode = -17 + + // ErrRPCWalletNotFound indicates that an invalid wallet was specified, + // which does not exist. It can also indicate an attempt to unload a + // wallet that was not previously loaded. + // + // Not to be confused with ErrRPCNoWallet, which is specific to btcd. + ErrRPCWalletNotFound RPCErrorCode = -18 + + // ErrRPCWalletNotSpecified indicates that no wallet was specified, for + // example, when there are multiple wallets loaded. + ErrRPCWalletNotSpecified RPCErrorCode = -19 ) // Specific Errors related to commands. These are the ones a user of the RPC diff --git a/btcjson/register.go b/btcjson/register.go index 5de001c91e..10cd0f9a86 100644 --- a/btcjson/register.go +++ b/btcjson/register.go @@ -287,6 +287,6 @@ func RegisteredCmdMethods() []string { methods = append(methods, k) } - sort.Sort(sort.StringSlice(methods)) + sort.Strings(methods) return methods } diff --git a/btcjson/register_test.go b/btcjson/register_test.go index 3832678aaf..2d3ab10f3e 100644 --- a/btcjson/register_test.go +++ b/btcjson/register_test.go @@ -256,7 +256,7 @@ func TestRegisteredCmdMethods(t *testing.T) { // Ensure the returned methods are sorted. sortedMethods := make([]string, len(methods)) copy(sortedMethods, methods) - sort.Sort(sort.StringSlice(sortedMethods)) + sort.Strings(sortedMethods) if !reflect.DeepEqual(sortedMethods, methods) { t.Fatal("RegisteredCmdMethods: methods are not sorted") } diff --git a/btcjson/walletsvrcmds.go b/btcjson/walletsvrcmds.go index 6697555172..2613acf8a4 100644 --- a/btcjson/walletsvrcmds.go +++ b/btcjson/walletsvrcmds.go @@ -1,4 +1,4 @@ -// Copyright (c) 2014 The btcsuite developers +// Copyright (c) 2014-2020 The btcsuite developers // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. @@ -7,6 +7,14 @@ package btcjson +import ( + "encoding/hex" + "encoding/json" + "fmt" + + "github.com/btcsuite/btcd/btcutil" +) + // AddMultisigAddressCmd defines the addmutisigaddress JSON-RPC command. type AddMultisigAddressCmd struct { NRequired int @@ -55,6 +63,28 @@ func NewCreateMultisigCmd(nRequired int, keys []string) *CreateMultisigCmd { } } +// CreateWalletCmd defines the createwallet JSON-RPC command. +type CreateWalletCmd struct { + WalletName string + DisablePrivateKeys *bool `jsonrpcdefault:"false"` + Blank *bool `jsonrpcdefault:"false"` + Passphrase *string `jsonrpcdefault:"\"\""` + AvoidReuse *bool `jsonrpcdefault:"false"` +} + +// NewCreateWalletCmd returns a new instance which can be used to issue a +// createwallet JSON-RPC command. +func NewCreateWalletCmd(walletName string, disablePrivateKeys *bool, + blank *bool, passphrase *string, avoidReuse *bool) *CreateWalletCmd { + return &CreateWalletCmd{ + WalletName: walletName, + DisablePrivateKeys: disablePrivateKeys, + Blank: blank, + Passphrase: passphrase, + AvoidReuse: avoidReuse, + } +} + // DumpPrivKeyCmd defines the dumpprivkey JSON-RPC command. type DumpPrivKeyCmd struct { Address string @@ -81,6 +111,30 @@ func NewEncryptWalletCmd(passphrase string) *EncryptWalletCmd { } } +// EstimateSmartFeeMode defines the different fee estimation modes available +// for the estimatesmartfee JSON-RPC command. +type EstimateSmartFeeMode string + +var ( + EstimateModeUnset EstimateSmartFeeMode = "UNSET" + EstimateModeEconomical EstimateSmartFeeMode = "ECONOMICAL" + EstimateModeConservative EstimateSmartFeeMode = "CONSERVATIVE" +) + +// EstimateSmartFeeCmd defines the estimatesmartfee JSON-RPC command. +type EstimateSmartFeeCmd struct { + ConfTarget int64 + EstimateMode *EstimateSmartFeeMode `jsonrpcdefault:"\"CONSERVATIVE\""` +} + +// NewEstimateSmartFeeCmd returns a new instance which can be used to issue a +// estimatesmartfee JSON-RPC command. +func NewEstimateSmartFeeCmd(confTarget int64, mode *EstimateSmartFeeMode) *EstimateSmartFeeCmd { + return &EstimateSmartFeeCmd{ + ConfTarget: confTarget, EstimateMode: mode, + } +} + // EstimateFeeCmd defines the estimatefee JSON-RPC command. type EstimateFeeCmd struct { NumBlocks int64 @@ -146,6 +200,19 @@ func NewGetAddressesByAccountCmd(account string) *GetAddressesByAccountCmd { } } +// GetAddressInfoCmd defines the getaddressinfo JSON-RPC command. +type GetAddressInfoCmd struct { + Address string +} + +// NewGetAddressInfoCmd returns a new instance which can be used to issue a +// getaddressinfo JSON-RPC command. +func NewGetAddressInfoCmd(address string) *GetAddressInfoCmd { + return &GetAddressInfoCmd{ + Address: address, + } +} + // GetBalanceCmd defines the getbalance JSON-RPC command. type GetBalanceCmd struct { Account *string @@ -164,9 +231,19 @@ func NewGetBalanceCmd(account *string, minConf *int) *GetBalanceCmd { } } +// GetBalancesCmd defines the getbalances JSON-RPC command. +type GetBalancesCmd struct{} + +// NewGetBalancesCmd returns a new instance which can be used to issue a +// getbalances JSON-RPC command. +func NewGetBalancesCmd() *GetBalancesCmd { + return &GetBalancesCmd{} +} + // GetNewAddressCmd defines the getnewaddress JSON-RPC command. type GetNewAddressCmd struct { - Account *string + Account *string + AddressType *string } // NewGetNewAddressCmd returns a new instance which can be used to issue a @@ -174,15 +251,17 @@ type GetNewAddressCmd struct { // // The parameters which are pointers indicate they are optional. Passing nil // for optional parameters will use the default value. -func NewGetNewAddressCmd(account *string) *GetNewAddressCmd { +func NewGetNewAddressCmd(account, addrType *string) *GetNewAddressCmd { return &GetNewAddressCmd{ - Account: account, + Account: account, + AddressType: addrType, } } // GetRawChangeAddressCmd defines the getrawchangeaddress JSON-RPC command. type GetRawChangeAddressCmd struct { - Account *string + Account *string + AddressType *string } // NewGetRawChangeAddressCmd returns a new instance which can be used to issue a @@ -190,9 +269,10 @@ type GetRawChangeAddressCmd struct { // // The parameters which are pointers indicate they are optional. Passing nil // for optional parameters will use the default value. -func NewGetRawChangeAddressCmd(account *string) *GetRawChangeAddressCmd { +func NewGetRawChangeAddressCmd(account, addrType *string) *GetRawChangeAddressCmd { return &GetRawChangeAddressCmd{ - Account: account, + Account: account, + AddressType: addrType, } } @@ -259,6 +339,39 @@ func NewGetWalletInfoCmd() *GetWalletInfoCmd { return &GetWalletInfoCmd{} } +// BackupWalletCmd defines the backupwallet JSON-RPC command +type BackupWalletCmd struct { + Destination string +} + +// NewBackupWalletCmd returns a new instance which can be used to issue a +// backupwallet JSON-RPC command +func NewBackupWalletCmd(destination string) *BackupWalletCmd { + return &BackupWalletCmd{Destination: destination} +} + +// UnloadWalletCmd defines the unloadwallet JSON-RPC command +type UnloadWalletCmd struct { + WalletName *string +} + +// NewUnloadWalletCmd returns a new instance which can be used to issue a +// unloadwallet JSON-RPC command. +func NewUnloadWalletCmd(walletName *string) *UnloadWalletCmd { + return &UnloadWalletCmd{WalletName: walletName} +} + +// LoadWalletCmd defines the loadwallet JSON-RPC command +type LoadWalletCmd struct { + WalletName string +} + +// NewLoadWalletCmd returns a new instance which can be used to issue a +// loadwallet JSON-RPC command +func NewLoadWalletCmd(walletName string) *LoadWalletCmd { + return &LoadWalletCmd{WalletName: walletName} +} + // ImportPrivKeyCmd defines the importprivkey JSON-RPC command. type ImportPrivKeyCmd struct { PrivKey string @@ -614,6 +727,39 @@ func NewSignRawTransactionCmd(hexEncodedTx string, inputs *[]RawTxInput, privKey } } +// RawTxWitnessInput models the data needed for raw transaction input that is used in +// the SignRawTransactionWithWalletCmd struct. The RedeemScript is required for P2SH inputs, +// the WitnessScript is required for P2WSH or P2SH-P2WSH witness scripts, and the Amount is +// required for Segwit inputs. Otherwise, those fields can be left blank. +type RawTxWitnessInput struct { + Txid string `json:"txid"` + Vout uint32 `json:"vout"` + ScriptPubKey string `json:"scriptPubKey"` + RedeemScript *string `json:"redeemScript,omitempty"` + WitnessScript *string `json:"witnessScript,omitempty"` + Amount *float64 `json:"amount,omitempty"` // In BTC +} + +// SignRawTransactionWithWalletCmd defines the signrawtransactionwithwallet JSON-RPC command. +type SignRawTransactionWithWalletCmd struct { + RawTx string + Inputs *[]RawTxWitnessInput + SigHashType *string `jsonrpcdefault:"\"ALL\""` +} + +// NewSignRawTransactionWithWalletCmd returns a new instance which can be used to issue a +// signrawtransactionwithwallet JSON-RPC command. +// +// The parameters which are pointers indicate they are optional. Passing nil +// for optional parameters will use the default value. +func NewSignRawTransactionWithWalletCmd(hexEncodedTx string, inputs *[]RawTxWitnessInput, sigHashType *string) *SignRawTransactionWithWalletCmd { + return &SignRawTransactionWithWalletCmd{ + RawTx: hexEncodedTx, + Inputs: inputs, + SigHashType: sigHashType, + } +} + // WalletLockCmd defines the walletlock JSON-RPC command. type WalletLockCmd struct{} @@ -653,27 +799,323 @@ func NewWalletPassphraseChangeCmd(oldPassphrase, newPassphrase string) *WalletPa } } +// TimestampOrNow defines a type to represent a timestamp value in seconds, +// since epoch. +// +// The value can either be a integer, or the string "now". +// +// NOTE: Interpretation of the timestamp value depends upon the specific +// JSON-RPC command, where it is used. +type TimestampOrNow struct { + Value interface{} +} + +// MarshalJSON implements the json.Marshaler interface for TimestampOrNow +func (t TimestampOrNow) MarshalJSON() ([]byte, error) { + return json.Marshal(t.Value) +} + +// UnmarshalJSON implements the json.Unmarshaler interface for TimestampOrNow +func (t *TimestampOrNow) UnmarshalJSON(data []byte) error { + var unmarshalled interface{} + if err := json.Unmarshal(data, &unmarshalled); err != nil { + return err + } + + switch v := unmarshalled.(type) { + case float64: + t.Value = int(v) + case string: + if v != "now" { + return fmt.Errorf("invalid timestamp value: %v", unmarshalled) + } + t.Value = v + default: + return fmt.Errorf("invalid timestamp value: %v", unmarshalled) + } + return nil +} + +// ScriptPubKeyAddress represents an address, to be used in conjunction with +// ScriptPubKey. +type ScriptPubKeyAddress struct { + Address string `json:"address"` +} + +// ScriptPubKey represents a script (as a string) or an address +// (as a ScriptPubKeyAddress). +type ScriptPubKey struct { + Value interface{} +} + +// MarshalJSON implements the json.Marshaler interface for ScriptPubKey +func (s ScriptPubKey) MarshalJSON() ([]byte, error) { + return json.Marshal(s.Value) +} + +// UnmarshalJSON implements the json.Unmarshaler interface for ScriptPubKey +func (s *ScriptPubKey) UnmarshalJSON(data []byte) error { + var unmarshalled interface{} + if err := json.Unmarshal(data, &unmarshalled); err != nil { + return err + } + + switch v := unmarshalled.(type) { + case string: + s.Value = v + case map[string]interface{}: + s.Value = ScriptPubKeyAddress{Address: v["address"].(string)} + default: + return fmt.Errorf("invalid scriptPubKey value: %v", unmarshalled) + } + return nil +} + +// DescriptorRange specifies the limits of a ranged Descriptor. +// +// Descriptors are typically ranged when specified in the form of generic HD +// chain paths. +// +// Example of a ranged descriptor: pkh(tpub.../*) +// +// The value can be an int to specify the end of the range, or the range +// itself, as []int{begin, end}. +type DescriptorRange struct { + Value interface{} +} + +// MarshalJSON implements the json.Marshaler interface for DescriptorRange +func (r DescriptorRange) MarshalJSON() ([]byte, error) { + return json.Marshal(r.Value) +} + +// UnmarshalJSON implements the json.Unmarshaler interface for DescriptorRange +func (r *DescriptorRange) UnmarshalJSON(data []byte) error { + var unmarshalled interface{} + if err := json.Unmarshal(data, &unmarshalled); err != nil { + return err + } + + switch v := unmarshalled.(type) { + case float64: + r.Value = int(v) + case []interface{}: + if len(v) != 2 { + return fmt.Errorf("expected [begin,end] integer range, got: %v", unmarshalled) + } + begin, ok1 := v[0].(float64) + end, ok2 := v[1].(float64) + if !ok1 || !ok2 { + return fmt.Errorf("expected both begin and end to be numbers, got: %v", v) + } + r.Value = []int{ + int(begin), + int(end), + } + default: + return fmt.Errorf("invalid descriptor range value: %v", unmarshalled) + } + return nil +} + +// ImportMultiRequest defines the request struct to be passed to the +// ImportMultiCmd, as an array. +type ImportMultiRequest struct { + // Descriptor to import, in canonical form. If using Descriptor, do not + // also provide ScriptPubKey, RedeemScript, WitnessScript, PubKeys, or Keys. + Descriptor *string `json:"desc,omitempty"` + + // Script/address to import. Should not be provided if using Descriptor. + ScriptPubKey *ScriptPubKey `json:"scriptPubKey,omitempty"` + + // Creation time of the key in seconds since epoch (Jan 1 1970 GMT), or + // the string "now" to substitute the current synced blockchain time. + // + // The timestamp of the oldest key will determine how far back blockchain + // rescans need to begin for missing wallet transactions. + // + // Specifying "now" bypasses scanning. Useful for keys that are known to + // never have been used. + // + // Specifying 0 scans the entire blockchain. + Timestamp TimestampOrNow `json:"timestamp"` + + // Allowed only if the ScriptPubKey is a P2SH or P2SH-P2WSH + // address/scriptPubKey. + RedeemScript *string `json:"redeemscript,omitempty"` + + // Allowed only if the ScriptPubKey is a P2SH-P2WSH or P2WSH + // address/scriptPubKey. + WitnessScript *string `json:"witnessscript,omitempty"` + + // Array of strings giving pubkeys to import. They must occur in P2PKH or + // P2WPKH scripts. They are not required when the private key is also + // provided (see Keys). + PubKeys *[]string `json:"pubkeys,omitempty"` + + // Array of strings giving private keys to import. The corresponding + // public keys must occur in the output or RedeemScript. + Keys *[]string `json:"keys,omitempty"` + + // If the provided Descriptor is ranged, this specifies the end + // (as an int) or the range (as []int{begin, end}) to import. + Range *DescriptorRange `json:"range,omitempty"` + + // States whether matching outputs should be treated as not incoming + // payments (also known as change). + Internal *bool `json:"internal,omitempty"` + + // States whether matching outputs should be considered watchonly. + // + // If an address/script is imported without all of the private keys + // required to spend from that address, set this field to true. + // + // If all the private keys are provided and the address/script is + // spendable, set this field to false. + WatchOnly *bool `json:"watchonly,omitempty"` + + // Label to assign to the address. Only allowed when Internal is false. + Label *string `json:"label,omitempty"` + + // States whether imported public keys should be added to the keypool for + // when users request new addresses. Only allowed when wallet private keys + // are disabled. + KeyPool *bool `json:"keypool,omitempty"` +} + +// ImportMultiOptions defines the options struct, provided to the +// ImportMultiCmd as a pointer argument. +type ImportMultiOptions struct { + Rescan bool `json:"rescan"` // Rescan the blockchain after all imports +} + +// ImportMultiCmd defines the importmulti JSON-RPC command. +type ImportMultiCmd struct { + Requests []ImportMultiRequest + Options *ImportMultiOptions +} + +// NewImportMultiCmd returns a new instance which can be used to issue +// an importmulti JSON-RPC command. +// +// The parameters which are pointers indicate they are optional. Passing nil +// for optional parameters will use the default value. +func NewImportMultiCmd(requests []ImportMultiRequest, options *ImportMultiOptions) *ImportMultiCmd { + return &ImportMultiCmd{ + Requests: requests, + Options: options, + } +} + +// PsbtInput represents an input to include in the PSBT created by the +// WalletCreateFundedPsbtCmd command. +type PsbtInput struct { + Txid string `json:"txid"` + Vout uint32 `json:"vout"` + Sequence uint32 `json:"sequence"` +} + +// PsbtOutput represents an output to include in the PSBT created by the +// WalletCreateFundedPsbtCmd command. +type PsbtOutput map[string]interface{} + +// NewPsbtOutput returns a new instance of a PSBT output to use with the +// WalletCreateFundedPsbtCmd command. +func NewPsbtOutput(address string, amount btcutil.Amount) PsbtOutput { + return PsbtOutput{address: amount.ToBTC()} +} + +// NewPsbtDataOutput returns a new instance of a PSBT data output to use with +// the WalletCreateFundedPsbtCmd command. +func NewPsbtDataOutput(data []byte) PsbtOutput { + return PsbtOutput{"data": hex.EncodeToString(data)} +} + +// WalletCreateFundedPsbtOpts represents the optional options struct provided +// with a WalletCreateFundedPsbtCmd command. +type WalletCreateFundedPsbtOpts struct { + ChangeAddress *string `json:"changeAddress,omitempty"` + ChangePosition *int64 `json:"changePosition,omitempty"` + ChangeType *ChangeType `json:"change_type,omitempty"` + IncludeWatching *bool `json:"includeWatching,omitempty"` + LockUnspents *bool `json:"lockUnspents,omitempty"` + FeeRate *float64 `json:"feeRate,omitempty"` + SubtractFeeFromOutputs *[]int64 `json:"subtractFeeFromOutputs,omitempty"` + Replaceable *bool `json:"replaceable,omitempty"` + ConfTarget *int64 `json:"conf_target,omitempty"` + EstimateMode *string `json:"estimate_mode,omitempty"` +} + +// WalletCreateFundedPsbtCmd defines the walletcreatefundedpsbt JSON-RPC command. +type WalletCreateFundedPsbtCmd struct { + Inputs []PsbtInput + Outputs []PsbtOutput + Locktime *uint32 + Options *WalletCreateFundedPsbtOpts + Bip32Derivs *bool +} + +// NewWalletCreateFundedPsbtCmd returns a new instance which can be used to issue a +// walletcreatefundedpsbt JSON-RPC command. +func NewWalletCreateFundedPsbtCmd( + inputs []PsbtInput, outputs []PsbtOutput, locktime *uint32, + options *WalletCreateFundedPsbtOpts, bip32Derivs *bool, +) *WalletCreateFundedPsbtCmd { + return &WalletCreateFundedPsbtCmd{ + Inputs: inputs, + Outputs: outputs, + Locktime: locktime, + Options: options, + Bip32Derivs: bip32Derivs, + } +} + +// WalletProcessPsbtCmd defines the walletprocesspsbt JSON-RPC command. +type WalletProcessPsbtCmd struct { + Psbt string + Sign *bool `jsonrpcdefault:"true"` + SighashType *string `jsonrpcdefault:"\"ALL\""` + Bip32Derivs *bool +} + +// NewWalletProcessPsbtCmd returns a new instance which can be used to issue a +// walletprocesspsbt JSON-RPC command. +func NewWalletProcessPsbtCmd(psbt string, sign *bool, sighashType *string, bip32Derivs *bool) *WalletProcessPsbtCmd { + return &WalletProcessPsbtCmd{ + Psbt: psbt, + Sign: sign, + SighashType: sighashType, + Bip32Derivs: bip32Derivs, + } +} + func init() { // The commands in this file are only usable with a wallet server. flags := UFWalletOnly MustRegisterCmd("addmultisigaddress", (*AddMultisigAddressCmd)(nil), flags) MustRegisterCmd("addwitnessaddress", (*AddWitnessAddressCmd)(nil), flags) + MustRegisterCmd("backupwallet", (*BackupWalletCmd)(nil), flags) MustRegisterCmd("createmultisig", (*CreateMultisigCmd)(nil), flags) + MustRegisterCmd("createwallet", (*CreateWalletCmd)(nil), flags) MustRegisterCmd("dumpprivkey", (*DumpPrivKeyCmd)(nil), flags) MustRegisterCmd("encryptwallet", (*EncryptWalletCmd)(nil), flags) + MustRegisterCmd("estimatesmartfee", (*EstimateSmartFeeCmd)(nil), flags) MustRegisterCmd("estimatefee", (*EstimateFeeCmd)(nil), flags) MustRegisterCmd("estimatepriority", (*EstimatePriorityCmd)(nil), flags) MustRegisterCmd("getaccount", (*GetAccountCmd)(nil), flags) MustRegisterCmd("getaccountaddress", (*GetAccountAddressCmd)(nil), flags) MustRegisterCmd("getaddressesbyaccount", (*GetAddressesByAccountCmd)(nil), flags) + MustRegisterCmd("getaddressinfo", (*GetAddressInfoCmd)(nil), flags) MustRegisterCmd("getbalance", (*GetBalanceCmd)(nil), flags) + MustRegisterCmd("getbalances", (*GetBalancesCmd)(nil), flags) MustRegisterCmd("getnewaddress", (*GetNewAddressCmd)(nil), flags) MustRegisterCmd("getrawchangeaddress", (*GetRawChangeAddressCmd)(nil), flags) MustRegisterCmd("getreceivedbyaccount", (*GetReceivedByAccountCmd)(nil), flags) MustRegisterCmd("getreceivedbyaddress", (*GetReceivedByAddressCmd)(nil), flags) MustRegisterCmd("gettransaction", (*GetTransactionCmd)(nil), flags) MustRegisterCmd("getwalletinfo", (*GetWalletInfoCmd)(nil), flags) + MustRegisterCmd("importmulti", (*ImportMultiCmd)(nil), flags) MustRegisterCmd("importprivkey", (*ImportPrivKeyCmd)(nil), flags) MustRegisterCmd("keypoolrefill", (*KeyPoolRefillCmd)(nil), flags) MustRegisterCmd("listaccounts", (*ListAccountsCmd)(nil), flags) @@ -684,6 +1126,7 @@ func init() { MustRegisterCmd("listsinceblock", (*ListSinceBlockCmd)(nil), flags) MustRegisterCmd("listtransactions", (*ListTransactionsCmd)(nil), flags) MustRegisterCmd("listunspent", (*ListUnspentCmd)(nil), flags) + MustRegisterCmd("loadwallet", (*LoadWalletCmd)(nil), flags) MustRegisterCmd("lockunspent", (*LockUnspentCmd)(nil), flags) MustRegisterCmd("move", (*MoveCmd)(nil), flags) MustRegisterCmd("sendfrom", (*SendFromCmd)(nil), flags) @@ -693,7 +1136,11 @@ func init() { MustRegisterCmd("settxfee", (*SetTxFeeCmd)(nil), flags) MustRegisterCmd("signmessage", (*SignMessageCmd)(nil), flags) MustRegisterCmd("signrawtransaction", (*SignRawTransactionCmd)(nil), flags) + MustRegisterCmd("signrawtransactionwithwallet", (*SignRawTransactionWithWalletCmd)(nil), flags) + MustRegisterCmd("unloadwallet", (*UnloadWalletCmd)(nil), flags) MustRegisterCmd("walletlock", (*WalletLockCmd)(nil), flags) MustRegisterCmd("walletpassphrase", (*WalletPassphraseCmd)(nil), flags) MustRegisterCmd("walletpassphrasechange", (*WalletPassphraseChangeCmd)(nil), flags) + MustRegisterCmd("walletcreatefundedpsbt", (*WalletCreateFundedPsbtCmd)(nil), flags) + MustRegisterCmd("walletprocesspsbt", (*WalletProcessPsbtCmd)(nil), flags) } diff --git a/btcjson/walletsvrcmds_test.go b/btcjson/walletsvrcmds_test.go index efc08cc945..0b5355e511 100644 --- a/btcjson/walletsvrcmds_test.go +++ b/btcjson/walletsvrcmds_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2014 The btcsuite developers +// Copyright (c) 2014-2020 The btcsuite developers // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. @@ -12,6 +12,7 @@ import ( "testing" "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/btcutil" ) // TestWalletSvrCmds tests all of the wallet server commands marshal and @@ -61,6 +62,61 @@ func TestWalletSvrCmds(t *testing.T) { Account: btcjson.String("test"), }, }, + { + name: "createwallet", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("createwallet", "mywallet", true, true, "secret", true) + }, + staticCmd: func() interface{} { + return btcjson.NewCreateWalletCmd("mywallet", + btcjson.Bool(true), btcjson.Bool(true), + btcjson.String("secret"), btcjson.Bool(true)) + }, + marshalled: `{"jsonrpc":"1.0","method":"createwallet","params":["mywallet",true,true,"secret",true],"id":1}`, + unmarshalled: &btcjson.CreateWalletCmd{ + WalletName: "mywallet", + DisablePrivateKeys: btcjson.Bool(true), + Blank: btcjson.Bool(true), + Passphrase: btcjson.String("secret"), + AvoidReuse: btcjson.Bool(true), + }, + }, + { + name: "createwallet - optional1", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("createwallet", "mywallet") + }, + staticCmd: func() interface{} { + return btcjson.NewCreateWalletCmd("mywallet", + nil, nil, nil, nil) + }, + marshalled: `{"jsonrpc":"1.0","method":"createwallet","params":["mywallet"],"id":1}`, + unmarshalled: &btcjson.CreateWalletCmd{ + WalletName: "mywallet", + DisablePrivateKeys: btcjson.Bool(false), + Blank: btcjson.Bool(false), + Passphrase: btcjson.String(""), + AvoidReuse: btcjson.Bool(false), + }, + }, + { + name: "createwallet - optional2", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("createwallet", "mywallet", "null", "null", "secret") + }, + staticCmd: func() interface{} { + return btcjson.NewCreateWalletCmd("mywallet", + nil, nil, btcjson.String("secret"), nil) + }, + marshalled: `{"jsonrpc":"1.0","method":"createwallet","params":["mywallet",null,null,"secret"],"id":1}`, + unmarshalled: &btcjson.CreateWalletCmd{ + WalletName: "mywallet", + DisablePrivateKeys: nil, + Blank: nil, + Passphrase: btcjson.String("secret"), + AvoidReuse: btcjson.Bool(false), + }, + }, { name: "addwitnessaddress", newCmd: func() (interface{}, error) { @@ -74,6 +130,49 @@ func TestWalletSvrCmds(t *testing.T) { Address: "1address", }, }, + { + name: "backupwallet", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("backupwallet", "backup.dat") + }, + staticCmd: func() interface{} { + return btcjson.NewBackupWalletCmd("backup.dat") + }, + marshalled: `{"jsonrpc":"1.0","method":"backupwallet","params":["backup.dat"],"id":1}`, + unmarshalled: &btcjson.BackupWalletCmd{Destination: "backup.dat"}, + }, + { + name: "loadwallet", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("loadwallet", "wallet.dat") + }, + staticCmd: func() interface{} { + return btcjson.NewLoadWalletCmd("wallet.dat") + }, + marshalled: `{"jsonrpc":"1.0","method":"loadwallet","params":["wallet.dat"],"id":1}`, + unmarshalled: &btcjson.LoadWalletCmd{WalletName: "wallet.dat"}, + }, + { + name: "unloadwallet", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("unloadwallet", "default") + }, + staticCmd: func() interface{} { + return btcjson.NewUnloadWalletCmd(btcjson.String("default")) + }, + marshalled: `{"jsonrpc":"1.0","method":"unloadwallet","params":["default"],"id":1}`, + unmarshalled: &btcjson.UnloadWalletCmd{WalletName: btcjson.String("default")}, + }, + {name: "unloadwallet - nil arg", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("unloadwallet") + }, + staticCmd: func() interface{} { + return btcjson.NewUnloadWalletCmd(nil) + }, + marshalled: `{"jsonrpc":"1.0","method":"unloadwallet","params":[],"id":1}`, + unmarshalled: &btcjson.UnloadWalletCmd{WalletName: nil}, + }, { name: "createmultisig", newCmd: func() (interface{}, error) { @@ -128,6 +227,34 @@ func TestWalletSvrCmds(t *testing.T) { NumBlocks: 6, }, }, + { + name: "estimatesmartfee - no mode", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("estimatesmartfee", 6) + }, + staticCmd: func() interface{} { + return btcjson.NewEstimateSmartFeeCmd(6, nil) + }, + marshalled: `{"jsonrpc":"1.0","method":"estimatesmartfee","params":[6],"id":1}`, + unmarshalled: &btcjson.EstimateSmartFeeCmd{ + ConfTarget: 6, + EstimateMode: &btcjson.EstimateModeConservative, + }, + }, + { + name: "estimatesmartfee - economical mode", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("estimatesmartfee", 6, btcjson.EstimateModeEconomical) + }, + staticCmd: func() interface{} { + return btcjson.NewEstimateSmartFeeCmd(6, &btcjson.EstimateModeEconomical) + }, + marshalled: `{"jsonrpc":"1.0","method":"estimatesmartfee","params":[6,"ECONOMICAL"],"id":1}`, + unmarshalled: &btcjson.EstimateSmartFeeCmd{ + ConfTarget: 6, + EstimateMode: &btcjson.EstimateModeEconomical, + }, + }, { name: "estimatepriority", newCmd: func() (interface{}, error) { @@ -180,6 +307,19 @@ func TestWalletSvrCmds(t *testing.T) { Account: "acct", }, }, + { + name: "getaddressinfo", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("getaddressinfo", "1234") + }, + staticCmd: func() interface{} { + return btcjson.NewGetAddressInfoCmd("1234") + }, + marshalled: `{"jsonrpc":"1.0","method":"getaddressinfo","params":["1234"],"id":1}`, + unmarshalled: &btcjson.GetAddressInfoCmd{ + Address: "1234", + }, + }, { name: "getbalance", newCmd: func() (interface{}, error) { @@ -222,30 +362,57 @@ func TestWalletSvrCmds(t *testing.T) { MinConf: btcjson.Int(6), }, }, + { + name: "getbalances", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("getbalances") + }, + staticCmd: func() interface{} { + return btcjson.NewGetBalancesCmd() + }, + marshalled: `{"jsonrpc":"1.0","method":"getbalances","params":[],"id":1}`, + unmarshalled: &btcjson.GetBalancesCmd{}, + }, { name: "getnewaddress", newCmd: func() (interface{}, error) { return btcjson.NewCmd("getnewaddress") }, staticCmd: func() interface{} { - return btcjson.NewGetNewAddressCmd(nil) + return btcjson.NewGetNewAddressCmd(nil, nil) }, marshalled: `{"jsonrpc":"1.0","method":"getnewaddress","params":[],"id":1}`, unmarshalled: &btcjson.GetNewAddressCmd{ - Account: nil, + Account: nil, + AddressType: nil, }, }, { - name: "getnewaddress optional", + name: "getnewaddress optional acct", newCmd: func() (interface{}, error) { return btcjson.NewCmd("getnewaddress", "acct") }, staticCmd: func() interface{} { - return btcjson.NewGetNewAddressCmd(btcjson.String("acct")) + return btcjson.NewGetNewAddressCmd(btcjson.String("acct"), nil) }, marshalled: `{"jsonrpc":"1.0","method":"getnewaddress","params":["acct"],"id":1}`, unmarshalled: &btcjson.GetNewAddressCmd{ - Account: btcjson.String("acct"), + Account: btcjson.String("acct"), + AddressType: nil, + }, + }, + { + name: "getnewaddress optional acct and type", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("getnewaddress", "acct", "legacy") + }, + staticCmd: func() interface{} { + return btcjson.NewGetNewAddressCmd(btcjson.String("acct"), btcjson.String("legacy")) + }, + marshalled: `{"jsonrpc":"1.0","method":"getnewaddress","params":["acct","legacy"],"id":1}`, + unmarshalled: &btcjson.GetNewAddressCmd{ + Account: btcjson.String("acct"), + AddressType: btcjson.String("legacy"), }, }, { @@ -254,24 +421,40 @@ func TestWalletSvrCmds(t *testing.T) { return btcjson.NewCmd("getrawchangeaddress") }, staticCmd: func() interface{} { - return btcjson.NewGetRawChangeAddressCmd(nil) + return btcjson.NewGetRawChangeAddressCmd(nil, nil) }, marshalled: `{"jsonrpc":"1.0","method":"getrawchangeaddress","params":[],"id":1}`, unmarshalled: &btcjson.GetRawChangeAddressCmd{ - Account: nil, + Account: nil, + AddressType: nil, }, }, { - name: "getrawchangeaddress optional", + name: "getrawchangeaddress optional acct", newCmd: func() (interface{}, error) { return btcjson.NewCmd("getrawchangeaddress", "acct") }, staticCmd: func() interface{} { - return btcjson.NewGetRawChangeAddressCmd(btcjson.String("acct")) + return btcjson.NewGetRawChangeAddressCmd(btcjson.String("acct"), nil) }, marshalled: `{"jsonrpc":"1.0","method":"getrawchangeaddress","params":["acct"],"id":1}`, unmarshalled: &btcjson.GetRawChangeAddressCmd{ - Account: btcjson.String("acct"), + Account: btcjson.String("acct"), + AddressType: nil, + }, + }, + { + name: "getrawchangeaddress optional acct and type", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("getrawchangeaddress", "acct", "legacy") + }, + staticCmd: func() interface{} { + return btcjson.NewGetRawChangeAddressCmd(btcjson.String("acct"), btcjson.String("legacy")) + }, + marshalled: `{"jsonrpc":"1.0","method":"getrawchangeaddress","params":["acct","legacy"],"id":1}`, + unmarshalled: &btcjson.GetRawChangeAddressCmd{ + Account: btcjson.String("acct"), + AddressType: btcjson.String("legacy"), }, }, { @@ -668,6 +851,21 @@ func TestWalletSvrCmds(t *testing.T) { IncludeWatchOnly: btcjson.Bool(true), }, }, + { + name: "listsinceblock pad null", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("listsinceblock", "null", 1, false) + }, + staticCmd: func() interface{} { + return btcjson.NewListSinceBlockCmd(nil, btcjson.Int(1), btcjson.Bool(false)) + }, + marshalled: `{"jsonrpc":"1.0","method":"listsinceblock","params":[null,1,false],"id":1}`, + unmarshalled: &btcjson.ListSinceBlockCmd{ + BlockHash: nil, + TargetConfirmations: btcjson.Int(1), + IncludeWatchOnly: btcjson.Bool(false), + }, + }, { name: "listtransactions", newCmd: func() (interface{}, error) { @@ -1165,6 +1363,103 @@ func TestWalletSvrCmds(t *testing.T) { Flags: btcjson.String("ALL"), }, }, + { + name: "signrawtransactionwithwallet", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("signrawtransactionwithwallet", "001122") + }, + staticCmd: func() interface{} { + return btcjson.NewSignRawTransactionWithWalletCmd("001122", nil, nil) + }, + marshalled: `{"jsonrpc":"1.0","method":"signrawtransactionwithwallet","params":["001122"],"id":1}`, + unmarshalled: &btcjson.SignRawTransactionWithWalletCmd{ + RawTx: "001122", + Inputs: nil, + SigHashType: btcjson.String("ALL"), + }, + }, + { + name: "signrawtransactionwithwallet optional1", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("signrawtransactionwithwallet", "001122", `[{"txid":"123","vout":1,"scriptPubKey":"00","redeemScript":"01","witnessScript":"02","amount":1.5}]`) + }, + staticCmd: func() interface{} { + txInputs := []btcjson.RawTxWitnessInput{ + { + Txid: "123", + Vout: 1, + ScriptPubKey: "00", + RedeemScript: btcjson.String("01"), + WitnessScript: btcjson.String("02"), + Amount: btcjson.Float64(1.5), + }, + } + + return btcjson.NewSignRawTransactionWithWalletCmd("001122", &txInputs, nil) + }, + marshalled: `{"jsonrpc":"1.0","method":"signrawtransactionwithwallet","params":["001122",[{"txid":"123","vout":1,"scriptPubKey":"00","redeemScript":"01","witnessScript":"02","amount":1.5}]],"id":1}`, + unmarshalled: &btcjson.SignRawTransactionWithWalletCmd{ + RawTx: "001122", + Inputs: &[]btcjson.RawTxWitnessInput{ + { + Txid: "123", + Vout: 1, + ScriptPubKey: "00", + RedeemScript: btcjson.String("01"), + WitnessScript: btcjson.String("02"), + Amount: btcjson.Float64(1.5), + }, + }, + SigHashType: btcjson.String("ALL"), + }, + }, + { + name: "signrawtransactionwithwallet optional1 with blank fields in input", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("signrawtransactionwithwallet", "001122", `[{"txid":"123","vout":1,"scriptPubKey":"00","redeemScript":"01"}]`) + }, + staticCmd: func() interface{} { + txInputs := []btcjson.RawTxWitnessInput{ + { + Txid: "123", + Vout: 1, + ScriptPubKey: "00", + RedeemScript: btcjson.String("01"), + }, + } + + return btcjson.NewSignRawTransactionWithWalletCmd("001122", &txInputs, nil) + }, + marshalled: `{"jsonrpc":"1.0","method":"signrawtransactionwithwallet","params":["001122",[{"txid":"123","vout":1,"scriptPubKey":"00","redeemScript":"01"}]],"id":1}`, + unmarshalled: &btcjson.SignRawTransactionWithWalletCmd{ + RawTx: "001122", + Inputs: &[]btcjson.RawTxWitnessInput{ + { + Txid: "123", + Vout: 1, + ScriptPubKey: "00", + RedeemScript: btcjson.String("01"), + }, + }, + SigHashType: btcjson.String("ALL"), + }, + }, + { + name: "signrawtransactionwithwallet optional2", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd("signrawtransactionwithwallet", "001122", `[]`, "ALL") + }, + staticCmd: func() interface{} { + txInputs := []btcjson.RawTxWitnessInput{} + return btcjson.NewSignRawTransactionWithWalletCmd("001122", &txInputs, btcjson.String("ALL")) + }, + marshalled: `{"jsonrpc":"1.0","method":"signrawtransactionwithwallet","params":["001122",[],"ALL"],"id":1}`, + unmarshalled: &btcjson.SignRawTransactionWithWalletCmd{ + RawTx: "001122", + Inputs: &[]btcjson.RawTxWitnessInput{}, + SigHashType: btcjson.String("ALL"), + }, + }, { name: "walletlock", newCmd: func() (interface{}, error) { @@ -1204,13 +1499,340 @@ func TestWalletSvrCmds(t *testing.T) { NewPassphrase: "new", }, }, + { + name: "importmulti with descriptor + options", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd( + "importmulti", + // Cannot use a native string, due to special types like timestamp. + []btcjson.ImportMultiRequest{ + {Descriptor: btcjson.String("123"), Timestamp: btcjson.TimestampOrNow{Value: 0}}, + }, + `{"rescan": true}`, + ) + }, + staticCmd: func() interface{} { + requests := []btcjson.ImportMultiRequest{ + {Descriptor: btcjson.String("123"), Timestamp: btcjson.TimestampOrNow{Value: 0}}, + } + options := btcjson.ImportMultiOptions{Rescan: true} + return btcjson.NewImportMultiCmd(requests, &options) + }, + marshalled: `{"jsonrpc":"1.0","method":"importmulti","params":[[{"desc":"123","timestamp":0}],{"rescan":true}],"id":1}`, + unmarshalled: &btcjson.ImportMultiCmd{ + Requests: []btcjson.ImportMultiRequest{ + { + Descriptor: btcjson.String("123"), + Timestamp: btcjson.TimestampOrNow{Value: 0}, + }, + }, + Options: &btcjson.ImportMultiOptions{Rescan: true}, + }, + }, + { + name: "importmulti with descriptor + no options", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd( + "importmulti", + // Cannot use a native string, due to special types like timestamp. + []btcjson.ImportMultiRequest{ + { + Descriptor: btcjson.String("123"), + Timestamp: btcjson.TimestampOrNow{Value: 0}, + WatchOnly: btcjson.Bool(false), + Internal: btcjson.Bool(true), + Label: btcjson.String("aaa"), + KeyPool: btcjson.Bool(false), + }, + }, + ) + }, + staticCmd: func() interface{} { + requests := []btcjson.ImportMultiRequest{ + { + Descriptor: btcjson.String("123"), + Timestamp: btcjson.TimestampOrNow{Value: 0}, + WatchOnly: btcjson.Bool(false), + Internal: btcjson.Bool(true), + Label: btcjson.String("aaa"), + KeyPool: btcjson.Bool(false), + }, + } + return btcjson.NewImportMultiCmd(requests, nil) + }, + marshalled: `{"jsonrpc":"1.0","method":"importmulti","params":[[{"desc":"123","timestamp":0,"internal":true,"watchonly":false,"label":"aaa","keypool":false}]],"id":1}`, + unmarshalled: &btcjson.ImportMultiCmd{ + Requests: []btcjson.ImportMultiRequest{ + { + Descriptor: btcjson.String("123"), + Timestamp: btcjson.TimestampOrNow{Value: 0}, + WatchOnly: btcjson.Bool(false), + Internal: btcjson.Bool(true), + Label: btcjson.String("aaa"), + KeyPool: btcjson.Bool(false), + }, + }, + }, + }, + { + name: "importmulti with descriptor + string timestamp", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd( + "importmulti", + // Cannot use a native string, due to special types like timestamp. + []btcjson.ImportMultiRequest{ + { + Descriptor: btcjson.String("123"), + Timestamp: btcjson.TimestampOrNow{Value: "now"}, + }, + }, + ) + }, + staticCmd: func() interface{} { + requests := []btcjson.ImportMultiRequest{ + {Descriptor: btcjson.String("123"), Timestamp: btcjson.TimestampOrNow{Value: "now"}}, + } + return btcjson.NewImportMultiCmd(requests, nil) + }, + marshalled: `{"jsonrpc":"1.0","method":"importmulti","params":[[{"desc":"123","timestamp":"now"}]],"id":1}`, + unmarshalled: &btcjson.ImportMultiCmd{ + Requests: []btcjson.ImportMultiRequest{ + {Descriptor: btcjson.String("123"), Timestamp: btcjson.TimestampOrNow{Value: "now"}}, + }, + }, + }, + { + name: "importmulti with scriptPubKey script", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd( + "importmulti", + // Cannot use a native string, due to special types like timestamp and scriptPubKey + []btcjson.ImportMultiRequest{ + { + ScriptPubKey: &btcjson.ScriptPubKey{Value: "script"}, + RedeemScript: btcjson.String("123"), + Timestamp: btcjson.TimestampOrNow{Value: 0}, + PubKeys: &[]string{"aaa"}, + }, + }, + ) + }, + staticCmd: func() interface{} { + requests := []btcjson.ImportMultiRequest{ + { + ScriptPubKey: &btcjson.ScriptPubKey{Value: "script"}, + RedeemScript: btcjson.String("123"), + Timestamp: btcjson.TimestampOrNow{Value: 0}, + PubKeys: &[]string{"aaa"}, + }, + } + return btcjson.NewImportMultiCmd(requests, nil) + }, + marshalled: `{"jsonrpc":"1.0","method":"importmulti","params":[[{"scriptPubKey":"script","timestamp":0,"redeemscript":"123","pubkeys":["aaa"]}]],"id":1}`, + unmarshalled: &btcjson.ImportMultiCmd{ + Requests: []btcjson.ImportMultiRequest{ + { + ScriptPubKey: &btcjson.ScriptPubKey{Value: "script"}, + RedeemScript: btcjson.String("123"), + Timestamp: btcjson.TimestampOrNow{Value: 0}, + PubKeys: &[]string{"aaa"}, + }, + }, + }, + }, + { + name: "importmulti with scriptPubKey address", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd( + "importmulti", + // Cannot use a native string, due to special types like timestamp and scriptPubKey + []btcjson.ImportMultiRequest{ + { + ScriptPubKey: &btcjson.ScriptPubKey{Value: btcjson.ScriptPubKeyAddress{Address: "addr"}}, + WitnessScript: btcjson.String("123"), + Timestamp: btcjson.TimestampOrNow{Value: 0}, + Keys: &[]string{"aaa"}, + }, + }, + ) + }, + staticCmd: func() interface{} { + requests := []btcjson.ImportMultiRequest{ + { + ScriptPubKey: &btcjson.ScriptPubKey{Value: btcjson.ScriptPubKeyAddress{Address: "addr"}}, + WitnessScript: btcjson.String("123"), + Timestamp: btcjson.TimestampOrNow{Value: 0}, + Keys: &[]string{"aaa"}, + }, + } + return btcjson.NewImportMultiCmd(requests, nil) + }, + marshalled: `{"jsonrpc":"1.0","method":"importmulti","params":[[{"scriptPubKey":{"address":"addr"},"timestamp":0,"witnessscript":"123","keys":["aaa"]}]],"id":1}`, + unmarshalled: &btcjson.ImportMultiCmd{ + Requests: []btcjson.ImportMultiRequest{ + { + ScriptPubKey: &btcjson.ScriptPubKey{Value: btcjson.ScriptPubKeyAddress{Address: "addr"}}, + WitnessScript: btcjson.String("123"), + Timestamp: btcjson.TimestampOrNow{Value: 0}, + Keys: &[]string{"aaa"}, + }, + }, + }, + }, + { + name: "importmulti with ranged (int) descriptor", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd( + "importmulti", + // Cannot use a native string, due to special types like timestamp. + []btcjson.ImportMultiRequest{ + { + Descriptor: btcjson.String("123"), + Timestamp: btcjson.TimestampOrNow{Value: 0}, + Range: &btcjson.DescriptorRange{Value: 7}, + }, + }, + ) + }, + staticCmd: func() interface{} { + requests := []btcjson.ImportMultiRequest{ + { + Descriptor: btcjson.String("123"), + Timestamp: btcjson.TimestampOrNow{Value: 0}, + Range: &btcjson.DescriptorRange{Value: 7}, + }, + } + return btcjson.NewImportMultiCmd(requests, nil) + }, + marshalled: `{"jsonrpc":"1.0","method":"importmulti","params":[[{"desc":"123","timestamp":0,"range":7}]],"id":1}`, + unmarshalled: &btcjson.ImportMultiCmd{ + Requests: []btcjson.ImportMultiRequest{ + { + Descriptor: btcjson.String("123"), + Timestamp: btcjson.TimestampOrNow{Value: 0}, + Range: &btcjson.DescriptorRange{Value: 7}, + }, + }, + }, + }, + { + name: "importmulti with ranged (slice) descriptor", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd( + "importmulti", + // Cannot use a native string, due to special types like timestamp. + []btcjson.ImportMultiRequest{ + { + Descriptor: btcjson.String("123"), + Timestamp: btcjson.TimestampOrNow{Value: 0}, + Range: &btcjson.DescriptorRange{Value: []int{1, 7}}, + }, + }, + ) + }, + staticCmd: func() interface{} { + requests := []btcjson.ImportMultiRequest{ + { + Descriptor: btcjson.String("123"), + Timestamp: btcjson.TimestampOrNow{Value: 0}, + Range: &btcjson.DescriptorRange{Value: []int{1, 7}}, + }, + } + return btcjson.NewImportMultiCmd(requests, nil) + }, + marshalled: `{"jsonrpc":"1.0","method":"importmulti","params":[[{"desc":"123","timestamp":0,"range":[1,7]}]],"id":1}`, + unmarshalled: &btcjson.ImportMultiCmd{ + Requests: []btcjson.ImportMultiRequest{ + { + Descriptor: btcjson.String("123"), + Timestamp: btcjson.TimestampOrNow{Value: 0}, + Range: &btcjson.DescriptorRange{Value: []int{1, 7}}, + }, + }, + }, + }, + { + name: "walletcreatefundedpsbt", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd( + "walletcreatefundedpsbt", + []btcjson.PsbtInput{ + { + Txid: "1234", + Vout: 0, + Sequence: 0, + }, + }, + []btcjson.PsbtOutput{ + btcjson.NewPsbtOutput("1234", btcutil.Amount(1234)), + btcjson.NewPsbtDataOutput([]byte{1, 2, 3, 4}), + }, + btcjson.Uint32(1), + btcjson.WalletCreateFundedPsbtOpts{}, + btcjson.Bool(true), + ) + }, + staticCmd: func() interface{} { + return btcjson.NewWalletCreateFundedPsbtCmd( + []btcjson.PsbtInput{ + { + Txid: "1234", + Vout: 0, + Sequence: 0, + }, + }, + []btcjson.PsbtOutput{ + btcjson.NewPsbtOutput("1234", btcutil.Amount(1234)), + btcjson.NewPsbtDataOutput([]byte{1, 2, 3, 4}), + }, + btcjson.Uint32(1), + &btcjson.WalletCreateFundedPsbtOpts{}, + btcjson.Bool(true), + ) + }, + marshalled: `{"jsonrpc":"1.0","method":"walletcreatefundedpsbt","params":[[{"txid":"1234","vout":0,"sequence":0}],[{"1234":0.00001234},{"data":"01020304"}],1,{},true],"id":1}`, + unmarshalled: &btcjson.WalletCreateFundedPsbtCmd{ + Inputs: []btcjson.PsbtInput{ + { + Txid: "1234", + Vout: 0, + Sequence: 0, + }, + }, + Outputs: []btcjson.PsbtOutput{ + btcjson.NewPsbtOutput("1234", btcutil.Amount(1234)), + btcjson.NewPsbtDataOutput([]byte{1, 2, 3, 4}), + }, + Locktime: btcjson.Uint32(1), + Options: &btcjson.WalletCreateFundedPsbtOpts{}, + Bip32Derivs: btcjson.Bool(true), + }, + }, + { + name: "walletprocesspsbt", + newCmd: func() (interface{}, error) { + return btcjson.NewCmd( + "walletprocesspsbt", "1234", btcjson.Bool(true), btcjson.String("ALL"), btcjson.Bool(true)) + }, + staticCmd: func() interface{} { + return btcjson.NewWalletProcessPsbtCmd( + "1234", btcjson.Bool(true), btcjson.String("ALL"), btcjson.Bool(true)) + }, + marshalled: `{"jsonrpc":"1.0","method":"walletprocesspsbt","params":["1234",true,"ALL",true],"id":1}`, + unmarshalled: &btcjson.WalletProcessPsbtCmd{ + Psbt: "1234", + Sign: btcjson.Bool(true), + SighashType: btcjson.String("ALL"), + Bip32Derivs: btcjson.Bool(true), + }, + }, } t.Logf("Running %d tests", len(tests)) for i, test := range tests { // Marshal the command as created by the new static command // creation function. - marshalled, err := btcjson.MarshalCmd(testID, test.staticCmd()) + marshalled, err := btcjson.MarshalCmd(btcjson.RpcVersion1, testID, test.staticCmd()) if err != nil { t.Errorf("MarshalCmd #%d (%s) unexpected error: %v", i, test.name, err) @@ -1234,7 +1856,7 @@ func TestWalletSvrCmds(t *testing.T) { // Marshal the command as created by the generic new command // creation function. - marshalled, err = btcjson.MarshalCmd(testID, cmd) + marshalled, err = btcjson.MarshalCmd(btcjson.RpcVersion1, testID, cmd) if err != nil { t.Errorf("MarshalCmd #%d (%s) unexpected error: %v", i, test.name, err) diff --git a/btcjson/walletsvrresults.go b/btcjson/walletsvrresults.go index 9246d131ae..d85db0a6fa 100644 --- a/btcjson/walletsvrresults.go +++ b/btcjson/walletsvrresults.go @@ -1,9 +1,132 @@ -// Copyright (c) 2014 The btcsuite developers +// Copyright (c) 2014-2020 The btcsuite developers // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. package btcjson +import ( + "encoding/json" + "fmt" + + "github.com/btcsuite/btcd/txscript" +) + +// CreateWalletResult models the result of the createwallet command. +type CreateWalletResult struct { + Name string `json:"name"` + Warning string `json:"warning"` +} + +// embeddedAddressInfo includes all getaddressinfo output fields, excluding +// metadata and relation to the wallet. +// +// It represents the non-metadata/non-wallet fields for GetAddressInfo, as well +// as the precise fields for an embedded P2SH or P2WSH address. +type embeddedAddressInfo struct { + Address string `json:"address"` + ScriptPubKey string `json:"scriptPubKey"` + Solvable bool `json:"solvable"` + Descriptor *string `json:"desc,omitempty"` + IsScript bool `json:"isscript"` + IsChange bool `json:"ischange"` + IsWitness bool `json:"iswitness"` + WitnessVersion int `json:"witness_version,omitempty"` + WitnessProgram *string `json:"witness_program,omitempty"` + ScriptType *txscript.ScriptClass `json:"script,omitempty"` + Hex *string `json:"hex,omitempty"` + PubKeys *[]string `json:"pubkeys,omitempty"` + SignaturesRequired *int `json:"sigsrequired,omitempty"` + PubKey *string `json:"pubkey,omitempty"` + IsCompressed *bool `json:"iscompressed,omitempty"` + HDMasterFingerprint *string `json:"hdmasterfingerprint,omitempty"` + Labels []string `json:"labels"` +} + +// GetAddressInfoResult models the result of the getaddressinfo command. It +// contains information about a bitcoin address. +// +// Reference: https://bitcoincore.org/en/doc/0.20.0/rpc/wallet/getaddressinfo +// +// The GetAddressInfoResult has three segments: +// 1. General information about the address. +// 2. Metadata (Timestamp, HDKeyPath, HDSeedID) and wallet fields +// (IsMine, IsWatchOnly). +// 3. Information about the embedded address in case of P2SH or P2WSH. +// Same structure as (1). +type GetAddressInfoResult struct { + embeddedAddressInfo + IsMine bool `json:"ismine"` + IsWatchOnly bool `json:"iswatchonly"` + Timestamp *int `json:"timestamp,omitempty"` + HDKeyPath *string `json:"hdkeypath,omitempty"` + HDSeedID *string `json:"hdseedid,omitempty"` + Embedded *embeddedAddressInfo `json:"embedded,omitempty"` +} + +// UnmarshalJSON provides a custom unmarshaller for GetAddressInfoResult. +// It is adapted to avoid creating a duplicate raw struct for unmarshalling +// the JSON bytes into. +// +// Reference: http://choly.ca/post/go-json-marshalling +func (e *GetAddressInfoResult) UnmarshalJSON(data []byte) error { + // Step 1: Create type aliases of the original struct, including the + // embedded one. + type Alias GetAddressInfoResult + type EmbeddedAlias embeddedAddressInfo + + // Step 2: Create an anonymous struct with raw replacements for the special + // fields. + aux := &struct { + ScriptType *string `json:"script,omitempty"` + Embedded *struct { + ScriptType *string `json:"script,omitempty"` + *EmbeddedAlias + } `json:"embedded,omitempty"` + *Alias + }{ + Alias: (*Alias)(e), + } + + // Step 3: Unmarshal the data into the anonymous struct. + if err := json.Unmarshal(data, &aux); err != nil { + return err + } + + // Step 4: Convert the raw fields to the desired types + var ( + sc *txscript.ScriptClass + err error + ) + + if aux.ScriptType != nil { + sc, err = txscript.NewScriptClass(*aux.ScriptType) + if err != nil { + return err + } + } + + e.ScriptType = sc + + if aux.Embedded != nil { + var ( + embeddedSc *txscript.ScriptClass + err error + ) + + if aux.Embedded.ScriptType != nil { + embeddedSc, err = txscript.NewScriptClass(*aux.Embedded.ScriptType) + if err != nil { + return err + } + } + + e.Embedded = (*embeddedAddressInfo)(aux.Embedded.EmbeddedAlias) + e.Embedded.ScriptType = embeddedSc + } + + return nil +} + // GetTransactionDetailsResult models the details data from the gettransaction command. // // This models the "short" version of the ListTransactionsResult type, which @@ -35,6 +158,58 @@ type GetTransactionResult struct { Hex string `json:"hex"` } +type ScanningOrFalse struct { + Value interface{} +} + +type ScanProgress struct { + Duration int `json:"duration"` + Progress float64 `json:"progress"` +} + +// MarshalJSON implements the json.Marshaler interface +func (h ScanningOrFalse) MarshalJSON() ([]byte, error) { + return json.Marshal(h.Value) +} + +// UnmarshalJSON implements the json.Unmarshaler interface +func (h *ScanningOrFalse) UnmarshalJSON(data []byte) error { + var unmarshalled interface{} + if err := json.Unmarshal(data, &unmarshalled); err != nil { + return err + } + + switch v := unmarshalled.(type) { + case bool: + h.Value = v + case map[string]interface{}: + h.Value = ScanProgress{ + Duration: int(v["duration"].(float64)), + Progress: v["progress"].(float64), + } + default: + return fmt.Errorf("invalid scanning value: %v", unmarshalled) + } + + return nil +} + +// GetWalletInfoResult models the result of the getwalletinfo command. +type GetWalletInfoResult struct { + WalletName string `json:"walletname"` + WalletVersion int `json:"walletversion"` + TransactionCount int `json:"txcount"` + KeyPoolOldest int `json:"keypoololdest"` + KeyPoolSize int `json:"keypoolsize"` + KeyPoolSizeHDInternal *int `json:"keypoolsize_hd_internal,omitempty"` + UnlockedUntil *int `json:"unlocked_until,omitempty"` + PayTransactionFee float64 `json:"paytxfee"` + HDSeedID *string `json:"hdseedid,omitempty"` + PrivateKeysEnabled bool `json:"private_keys_enabled"` + AvoidReuse bool `json:"avoid_reuse"` + Scanning ScanningOrFalse `json:"scanning"` +} + // InfoWalletResult models the data returned by the wallet server getinfo // command. type InfoWalletResult struct { @@ -64,6 +239,7 @@ type ListTransactionsResult struct { Amount float64 `json:"amount"` BIP125Replaceable string `json:"bip125-replaceable,omitempty"` BlockHash string `json:"blockhash,omitempty"` + BlockHeight *int32 `json:"blockheight,omitempty"` BlockIndex *int64 `json:"blockindex,omitempty"` BlockTime int64 `json:"blocktime,omitempty"` Category string `json:"category"` @@ -71,6 +247,7 @@ type ListTransactionsResult struct { Fee *float64 `json:"fee,omitempty"` Generated bool `json:"generated,omitempty"` InvolvesWatchOnly bool `json:"involveswatchonly,omitempty"` + Label *string `json:"label,omitempty"` Time int64 `json:"time"` TimeReceived int64 `json:"timereceived"` Trusted bool `json:"trusted"` @@ -137,6 +314,14 @@ type SignRawTransactionResult struct { Errors []SignRawTransactionError `json:"errors,omitempty"` } +// SignRawTransactionWithWalletResult models the data from the +// signrawtransactionwithwallet command. +type SignRawTransactionWithWalletResult struct { + Hex string `json:"hex"` + Complete bool `json:"complete"` + Errors []SignRawTransactionError `json:"errors,omitempty"` +} + // ValidateAddressWalletResult models the data returned by the wallet server // validateaddress command. type ValidateAddressWalletResult struct { @@ -159,3 +344,43 @@ type GetBestBlockResult struct { Hash string `json:"hash"` Height int32 `json:"height"` } + +// BalanceDetailsResult models the details data from the `getbalances` command. +type BalanceDetailsResult struct { + Trusted float64 `json:"trusted"` + UntrustedPending float64 `json:"untrusted_pending"` + Immature float64 `json:"immature"` + Used *float64 `json:"used"` +} + +// GetBalancesResult models the data returned from the getbalances command. +type GetBalancesResult struct { + Mine BalanceDetailsResult `json:"mine"` + WatchOnly *BalanceDetailsResult `json:"watchonly"` +} + +// ImportMultiResults is a slice that models the result of the importmulti command. +// +// Each item in the slice contains the execution result corresponding to the input +// requests of type btcjson.ImportMultiRequest, passed to the ImportMulti[Async] +// function. +type ImportMultiResults []struct { + Success bool `json:"success"` + Error *RPCError `json:"error,omitempty"` + Warnings *[]string `json:"warnings,omitempty"` +} + +// WalletCreateFundedPsbtResult models the data returned from the +// walletcreatefundedpsbtresult command. +type WalletCreateFundedPsbtResult struct { + Psbt string `json:"psbt"` + Fee float64 `json:"fee"` + ChangePos int64 `json:"changepos"` +} + +// WalletProcessPsbtResult models the data returned from the +// walletprocesspsbtresult command. +type WalletProcessPsbtResult struct { + Psbt string `json:"psbt"` + Complete bool `json:"complete"` +} diff --git a/btcjson/walletsvrresults_test.go b/btcjson/walletsvrresults_test.go new file mode 100644 index 0000000000..fd44b066b8 --- /dev/null +++ b/btcjson/walletsvrresults_test.go @@ -0,0 +1,127 @@ +// Copyright (c) 2020 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package btcjson + +import ( + "encoding/json" + "errors" + "reflect" + "testing" + + "github.com/btcsuite/btcd/txscript" + "github.com/davecgh/go-spew/spew" +) + +// TestGetAddressInfoResult ensures that custom unmarshalling of +// GetAddressInfoResult works as intended. +func TestGetAddressInfoResult(t *testing.T) { + t.Parallel() + + // arbitrary script class to use in tests + nonStandard, _ := txscript.NewScriptClass("nonstandard") + + tests := []struct { + name string + result string + want GetAddressInfoResult + wantErr error + }{ + { + name: "GetAddressInfoResult - no ScriptType", + result: `{}`, + want: GetAddressInfoResult{}, + }, + { + name: "GetAddressInfoResult - ScriptType", + result: `{"script":"nonstandard","address":"1abc"}`, + want: GetAddressInfoResult{ + embeddedAddressInfo: embeddedAddressInfo{ + Address: "1abc", + ScriptType: nonStandard, + }, + }, + }, + { + name: "GetAddressInfoResult - embedded ScriptType", + result: `{"embedded": {"script":"nonstandard","address":"121313"}}`, + want: GetAddressInfoResult{ + Embedded: &embeddedAddressInfo{ + Address: "121313", + ScriptType: nonStandard, + }, + }, + }, + { + name: "GetAddressInfoResult - invalid ScriptType", + result: `{"embedded": {"script":"foo","address":"121313"}}`, + wantErr: txscript.ErrUnsupportedScriptType, + }, + } + + t.Logf("Running %d tests", len(tests)) + for i, test := range tests { + var out GetAddressInfoResult + err := json.Unmarshal([]byte(test.result), &out) + if err != nil && !errors.Is(err, test.wantErr) { + t.Errorf("Test #%d (%s) unexpected error: %v, want: %v", i, + test.name, err, test.wantErr) + continue + } + + if !reflect.DeepEqual(out, test.want) { + t.Errorf("Test #%d (%s) unexpected unmarshalled data - "+ + "got %v, want %v", i, test.name, spew.Sdump(out), + spew.Sdump(test.want)) + continue + } + } +} + +// TestGetWalletInfoResult ensures that custom unmarshalling of +// GetWalletInfoResult works as intended. +func TestGetWalletInfoResult(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + result string + want GetWalletInfoResult + }{ + { + name: "GetWalletInfoResult - not scanning", + result: `{"scanning":false}`, + want: GetWalletInfoResult{ + Scanning: ScanningOrFalse{Value: false}, + }, + }, + { + name: "GetWalletInfoResult - scanning", + result: `{"scanning":{"duration":10,"progress":1.0}}`, + want: GetWalletInfoResult{ + Scanning: ScanningOrFalse{ + Value: ScanProgress{Duration: 10, Progress: 1.0}, + }, + }, + }, + } + + t.Logf("Running %d tests", len(tests)) + for i, test := range tests { + var out GetWalletInfoResult + err := json.Unmarshal([]byte(test.result), &out) + if err != nil { + t.Errorf("Test #%d (%s) unexpected error: %v", i, + test.name, err) + continue + } + + if !reflect.DeepEqual(out, test.want) { + t.Errorf("Test #%d (%s) unexpected unmarshalled data - "+ + "got %v, want %v", i, test.name, spew.Sdump(out), + spew.Sdump(test.want)) + continue + } + } +} diff --git a/btcjson/walletsvrwscmds_test.go b/btcjson/walletsvrwscmds_test.go index 17144b6ea7..110a893b23 100644 --- a/btcjson/walletsvrwscmds_test.go +++ b/btcjson/walletsvrwscmds_test.go @@ -195,7 +195,7 @@ func TestWalletSvrWsCmds(t *testing.T) { for i, test := range tests { // Marshal the command as created by the new static command // creation function. - marshalled, err := btcjson.MarshalCmd(testID, test.staticCmd()) + marshalled, err := btcjson.MarshalCmd(btcjson.RpcVersion1, testID, test.staticCmd()) if err != nil { t.Errorf("MarshalCmd #%d (%s) unexpected error: %v", i, test.name, err) @@ -219,7 +219,7 @@ func TestWalletSvrWsCmds(t *testing.T) { // Marshal the command as created by the generic new command // creation function. - marshalled, err = btcjson.MarshalCmd(testID, cmd) + marshalled, err = btcjson.MarshalCmd(btcjson.RpcVersion1, testID, cmd) if err != nil { t.Errorf("MarshalCmd #%d (%s) unexpected error: %v", i, test.name, err) diff --git a/btcjson/walletsvrwsntfns_test.go b/btcjson/walletsvrwsntfns_test.go index 7662b3c2a1..111916627e 100644 --- a/btcjson/walletsvrwsntfns_test.go +++ b/btcjson/walletsvrwsntfns_test.go @@ -122,7 +122,7 @@ func TestWalletSvrWsNtfns(t *testing.T) { for i, test := range tests { // Marshal the notification as created by the new static // creation function. The ID is nil for notifications. - marshalled, err := btcjson.MarshalCmd(nil, test.staticNtfn()) + marshalled, err := btcjson.MarshalCmd(btcjson.RpcVersion1, nil, test.staticNtfn()) if err != nil { t.Errorf("MarshalCmd #%d (%s) unexpected error: %v", i, test.name, err) @@ -147,7 +147,7 @@ func TestWalletSvrWsNtfns(t *testing.T) { // Marshal the notification as created by the generic new // notification creation function. The ID is nil for // notifications. - marshalled, err = btcjson.MarshalCmd(nil, cmd) + marshalled, err = btcjson.MarshalCmd(btcjson.RpcVersion1, nil, cmd) if err != nil { t.Errorf("MarshalCmd #%d (%s) unexpected error: %v", i, test.name, err) diff --git a/btcjson/zmqsvrcmds.go b/btcjson/zmqsvrcmds.go new file mode 100644 index 0000000000..666ea2eb99 --- /dev/null +++ b/btcjson/zmqsvrcmds.go @@ -0,0 +1,16 @@ +package btcjson + +// GetZmqNotificationsCmd defines the getzmqnotifications JSON-RPC command. +type GetZmqNotificationsCmd struct{} + +// NewGetZmqNotificationsCmd returns a new instance which can be used to issue a +// getzmqnotifications JSON-RPC command. +func NewGetZmqNotificationsCmd() *GetZmqNotificationsCmd { + return &GetZmqNotificationsCmd{} +} + +func init() { + flags := UsageFlag(0) + + MustRegisterCmd("getzmqnotifications", (*GetZmqNotificationsCmd)(nil), flags) +} diff --git a/btcjson/zmqsvrresults.go b/btcjson/zmqsvrresults.go new file mode 100644 index 0000000000..a500b403ea --- /dev/null +++ b/btcjson/zmqsvrresults.go @@ -0,0 +1,63 @@ +package btcjson + +import ( + "encoding/json" + "net/url" +) + +// GetZmqNotificationResult models the data returned from the getzmqnotifications command. +type GetZmqNotificationResult []struct { + Type string // Type of notification + Address *url.URL // Address of the publisher + HighWaterMark int // Outbound message high water mark +} + +func (z *GetZmqNotificationResult) MarshalJSON() ([]byte, error) { + var out []map[string]interface{} + for _, notif := range *z { + out = append(out, + map[string]interface{}{ + "type": notif.Type, + "address": notif.Address.String(), + "hwm": notif.HighWaterMark, + }) + } + return json.Marshal(out) +} + +// UnmarshalJSON satisfies the json.Unmarshaller interface +func (z *GetZmqNotificationResult) UnmarshalJSON(bytes []byte) error { + type basicNotification struct { + Type string + Address string + Hwm int + } + + var basics []basicNotification + if err := json.Unmarshal(bytes, &basics); err != nil { + return err + } + + var notifications GetZmqNotificationResult + for _, basic := range basics { + + address, err := url.Parse(basic.Address) + if err != nil { + return err + } + + notifications = append(notifications, struct { + Type string + Address *url.URL + HighWaterMark int + }{ + Type: basic.Type, + Address: address, + HighWaterMark: basic.Hwm, + }) + } + + *z = notifications + + return nil +} diff --git a/btcutil/LICENSE b/btcutil/LICENSE new file mode 100644 index 0000000000..3e7b16791f --- /dev/null +++ b/btcutil/LICENSE @@ -0,0 +1,16 @@ +ISC License + +Copyright (c) 2013-2017 The btcsuite developers +Copyright (c) 2016-2017 The Lightning Network Developers + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/btcutil/README.md b/btcutil/README.md new file mode 100644 index 0000000000..ad32607ca5 --- /dev/null +++ b/btcutil/README.md @@ -0,0 +1,49 @@ +btcutil +======= + +[![Build Status](https://github.com/btcsuite/btcd/btcutil/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/btcutil/actions) +[![ISC License](https://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) +[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://godoc.org/github.com/btcsuite/btcd/btcutil) + +Package btcutil provides bitcoin-specific convenience functions and types. +A comprehensive suite of tests is provided to ensure proper functionality. See +`test_coverage.txt` for the gocov coverage report. Alternatively, if you are +running a POSIX OS, you can run the `cov_report.sh` script for a real-time +report. + +This package was developed for btcd, an alternative full-node implementation of +bitcoin which is under active development by Conformal. Although it was +primarily written for btcd, this package has intentionally been designed so it +can be used as a standalone package for any projects needing the functionality +provided. + +## Installation and Updating + +```bash +$ go get -u github.com/btcsuite/btcd/btcutil +``` + +## GPG Verification Key + +All official release tags are signed by Conformal so users can ensure the code +has not been tampered with and is coming from the btcsuite developers. To +verify the signature perform the following: + +- Download the public key from the Conformal website at + https://opensource.conformal.com/GIT-GPG-KEY-conformal.txt + +- Import the public key into your GPG keyring: + ```bash + gpg --import GIT-GPG-KEY-conformal.txt + ``` + +- Verify the release tag with the following command where `TAG_NAME` is a + placeholder for the specific tag: + ```bash + git tag -v TAG_NAME + ``` + +## License + +Package btcutil is licensed under the [copyfree](http://copyfree.org) ISC +License. diff --git a/btcutil/address.go b/btcutil/address.go new file mode 100644 index 0000000000..95d3e6c301 --- /dev/null +++ b/btcutil/address.go @@ -0,0 +1,711 @@ +// Copyright (c) 2013-2017 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package btcutil + +import ( + "bytes" + "encoding/hex" + "errors" + "fmt" + "strings" + + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcutil/base58" + "github.com/btcsuite/btcd/btcutil/bech32" + "github.com/btcsuite/btcd/chaincfg" + "golang.org/x/crypto/ripemd160" +) + +// UnsupportedWitnessVerError describes an error where a segwit address being +// decoded has an unsupported witness version. +type UnsupportedWitnessVerError byte + +func (e UnsupportedWitnessVerError) Error() string { + return fmt.Sprintf("unsupported witness version: %#x", byte(e)) +} + +// UnsupportedWitnessProgLenError describes an error where a segwit address +// being decoded has an unsupported witness program length. +type UnsupportedWitnessProgLenError int + +func (e UnsupportedWitnessProgLenError) Error() string { + return fmt.Sprintf("unsupported witness program length: %d", int(e)) +} + +var ( + // ErrChecksumMismatch describes an error where decoding failed due + // to a bad checksum. + ErrChecksumMismatch = errors.New("checksum mismatch") + + // ErrUnknownAddressType describes an error where an address can not + // decoded as a specific address type due to the string encoding + // beginning with an identifier byte unknown to any standard or + // registered (via chaincfg.Register) network. + ErrUnknownAddressType = errors.New("unknown address type") + + // ErrAddressCollision describes an error where an address can not + // be uniquely determined as either a pay-to-pubkey-hash or + // pay-to-script-hash address since the leading identifier is used for + // describing both address kinds, but for different networks. Rather + // than assuming or defaulting to one or the other, this error is + // returned and the caller must decide how to decode the address. + ErrAddressCollision = errors.New("address collision") +) + +// encodeAddress returns a human-readable payment address given a ripemd160 hash +// and netID which encodes the bitcoin network and address type. It is used +// in both pay-to-pubkey-hash (P2PKH) and pay-to-script-hash (P2SH) address +// encoding. +func encodeAddress(hash160 []byte, netID byte) string { + // Format is 1 byte for a network and address class (i.e. P2PKH vs + // P2SH), 20 bytes for a RIPEMD160 hash, and 4 bytes of checksum. + return base58.CheckEncode(hash160[:ripemd160.Size], netID) +} + +// encodeSegWitAddress creates a bech32 (or bech32m for SegWit v1) encoded +// address string representation from witness version and witness program. +func encodeSegWitAddress(hrp string, witnessVersion byte, witnessProgram []byte) (string, error) { + // Group the address bytes into 5 bit groups, as this is what is used to + // encode each character in the address string. + converted, err := bech32.ConvertBits(witnessProgram, 8, 5, true) + if err != nil { + return "", err + } + + // Concatenate the witness version and program, and encode the resulting + // bytes using bech32 encoding. + combined := make([]byte, len(converted)+1) + combined[0] = witnessVersion + copy(combined[1:], converted) + + var bech string + switch witnessVersion { + case 0: + bech, err = bech32.Encode(hrp, combined) + + case 1: + bech, err = bech32.EncodeM(hrp, combined) + + default: + return "", fmt.Errorf("unsupported witness version %d", + witnessVersion) + } + if err != nil { + return "", err + } + + // Check validity by decoding the created address. + version, program, err := decodeSegWitAddress(bech) + if err != nil { + return "", fmt.Errorf("invalid segwit address: %v", err) + } + + if version != witnessVersion || !bytes.Equal(program, witnessProgram) { + return "", fmt.Errorf("invalid segwit address") + } + + return bech, nil +} + +// Address is an interface type for any type of destination a transaction +// output may spend to. This includes pay-to-pubkey (P2PK), pay-to-pubkey-hash +// (P2PKH), and pay-to-script-hash (P2SH). Address is designed to be generic +// enough that other kinds of addresses may be added in the future without +// changing the decoding and encoding API. +type Address interface { + // String returns the string encoding of the transaction output + // destination. + // + // Please note that String differs subtly from EncodeAddress: String + // will return the value as a string without any conversion, while + // EncodeAddress may convert destination types (for example, + // converting pubkeys to P2PKH addresses) before encoding as a + // payment address string. + String() string + + // EncodeAddress returns the string encoding of the payment address + // associated with the Address value. See the comment on String + // for how this method differs from String. + EncodeAddress() string + + // ScriptAddress returns the raw bytes of the address to be used + // when inserting the address into a txout's script. + ScriptAddress() []byte + + // IsForNet returns whether or not the address is associated with the + // passed bitcoin network. + IsForNet(*chaincfg.Params) bool +} + +// DecodeAddress decodes the string encoding of an address and returns +// the Address if addr is a valid encoding for a known address type. +// +// The bitcoin network the address is associated with is extracted if possible. +// When the address does not encode the network, such as in the case of a raw +// public key, the address will be associated with the passed defaultNet. +func DecodeAddress(addr string, defaultNet *chaincfg.Params) (Address, error) { + // Bech32 encoded segwit addresses start with a human-readable part + // (hrp) followed by '1'. For Bitcoin mainnet the hrp is "bc", and for + // testnet it is "tb". If the address string has a prefix that matches + // one of the prefixes for the known networks, we try to decode it as + // a segwit address. + oneIndex := strings.LastIndexByte(addr, '1') + if oneIndex > 1 { + prefix := addr[:oneIndex+1] + if chaincfg.IsBech32SegwitPrefix(prefix) { + witnessVer, witnessProg, err := decodeSegWitAddress(addr) + if err != nil { + return nil, err + } + + // We currently only support P2WPKH and P2WSH, which is + // witness version 0 and P2TR which is witness version + // 1. + if witnessVer != 0 && witnessVer != 1 { + return nil, UnsupportedWitnessVerError(witnessVer) + } + + // The HRP is everything before the found '1'. + hrp := prefix[:len(prefix)-1] + + switch len(witnessProg) { + case 20: + return newAddressWitnessPubKeyHash(hrp, witnessProg) + case 32: + if witnessVer == 1 { + return newAddressTaproot(hrp, witnessProg) + } + + return newAddressWitnessScriptHash(hrp, witnessProg) + default: + return nil, UnsupportedWitnessProgLenError(len(witnessProg)) + } + } + } + + // Serialized public keys are either 65 bytes (130 hex chars) if + // uncompressed/hybrid or 33 bytes (66 hex chars) if compressed. + if len(addr) == 130 || len(addr) == 66 { + serializedPubKey, err := hex.DecodeString(addr) + if err != nil { + return nil, err + } + return NewAddressPubKey(serializedPubKey, defaultNet) + } + + // Switch on decoded length to determine the type. + decoded, netID, err := base58.CheckDecode(addr) + if err != nil { + if err == base58.ErrChecksum { + return nil, ErrChecksumMismatch + } + return nil, errors.New("decoded address is of unknown format") + } + switch len(decoded) { + case ripemd160.Size: // P2PKH or P2SH + isP2PKH := netID == defaultNet.PubKeyHashAddrID + isP2SH := netID == defaultNet.ScriptHashAddrID + switch hash160 := decoded; { + case isP2PKH && isP2SH: + return nil, ErrAddressCollision + case isP2PKH: + return newAddressPubKeyHash(hash160, netID) + case isP2SH: + return newAddressScriptHashFromHash(hash160, netID) + default: + return nil, ErrUnknownAddressType + } + + default: + return nil, errors.New("decoded address is of unknown size") + } +} + +// decodeSegWitAddress parses a bech32 encoded segwit address string and +// returns the witness version and witness program byte representation. +func decodeSegWitAddress(address string) (byte, []byte, error) { + // Decode the bech32 encoded address. + _, data, bech32version, err := bech32.DecodeGeneric(address) + if err != nil { + return 0, nil, err + } + + // The first byte of the decoded address is the witness version, it must + // exist. + if len(data) < 1 { + return 0, nil, fmt.Errorf("no witness version") + } + + // ...and be <= 16. + version := data[0] + if version > 16 { + return 0, nil, fmt.Errorf("invalid witness version: %v", version) + } + + // The remaining characters of the address returned are grouped into + // words of 5 bits. In order to restore the original witness program + // bytes, we'll need to regroup into 8 bit words. + regrouped, err := bech32.ConvertBits(data[1:], 5, 8, false) + if err != nil { + return 0, nil, err + } + + // The regrouped data must be between 2 and 40 bytes. + if len(regrouped) < 2 || len(regrouped) > 40 { + return 0, nil, fmt.Errorf("invalid data length") + } + + // For witness version 0, address MUST be exactly 20 or 32 bytes. + if version == 0 && len(regrouped) != 20 && len(regrouped) != 32 { + return 0, nil, fmt.Errorf("invalid data length for witness "+ + "version 0: %v", len(regrouped)) + } + + // For witness version 0, the bech32 encoding must be used. + if version == 0 && bech32version != bech32.Version0 { + return 0, nil, fmt.Errorf("invalid checksum expected bech32 " + + "encoding for address with witness version 0") + } + + // For witness version 1, the bech32m encoding must be used. + if version == 1 && bech32version != bech32.VersionM { + return 0, nil, fmt.Errorf("invalid checksum expected bech32m " + + "encoding for address with witness version 1") + } + + return version, regrouped, nil +} + +// AddressPubKeyHash is an Address for a pay-to-pubkey-hash (P2PKH) +// transaction. +type AddressPubKeyHash struct { + hash [ripemd160.Size]byte + netID byte +} + +// NewAddressPubKeyHash returns a new AddressPubKeyHash. pkHash mustbe 20 +// bytes. +func NewAddressPubKeyHash(pkHash []byte, net *chaincfg.Params) (*AddressPubKeyHash, error) { + return newAddressPubKeyHash(pkHash, net.PubKeyHashAddrID) +} + +// newAddressPubKeyHash is the internal API to create a pubkey hash address +// with a known leading identifier byte for a network, rather than looking +// it up through its parameters. This is useful when creating a new address +// structure from a string encoding where the identifier byte is already +// known. +func newAddressPubKeyHash(pkHash []byte, netID byte) (*AddressPubKeyHash, error) { + // Check for a valid pubkey hash length. + if len(pkHash) != ripemd160.Size { + return nil, errors.New("pkHash must be 20 bytes") + } + + addr := &AddressPubKeyHash{netID: netID} + copy(addr.hash[:], pkHash) + return addr, nil +} + +// EncodeAddress returns the string encoding of a pay-to-pubkey-hash +// address. Part of the Address interface. +func (a *AddressPubKeyHash) EncodeAddress() string { + return encodeAddress(a.hash[:], a.netID) +} + +// ScriptAddress returns the bytes to be included in a txout script to pay +// to a pubkey hash. Part of the Address interface. +func (a *AddressPubKeyHash) ScriptAddress() []byte { + return a.hash[:] +} + +// IsForNet returns whether or not the pay-to-pubkey-hash address is associated +// with the passed bitcoin network. +func (a *AddressPubKeyHash) IsForNet(net *chaincfg.Params) bool { + return a.netID == net.PubKeyHashAddrID +} + +// String returns a human-readable string for the pay-to-pubkey-hash address. +// This is equivalent to calling EncodeAddress, but is provided so the type can +// be used as a fmt.Stringer. +func (a *AddressPubKeyHash) String() string { + return a.EncodeAddress() +} + +// Hash160 returns the underlying array of the pubkey hash. This can be useful +// when an array is more appropriate than a slice (for example, when used as map +// keys). +func (a *AddressPubKeyHash) Hash160() *[ripemd160.Size]byte { + return &a.hash +} + +// AddressScriptHash is an Address for a pay-to-script-hash (P2SH) +// transaction. +type AddressScriptHash struct { + hash [ripemd160.Size]byte + netID byte +} + +// NewAddressScriptHash returns a new AddressScriptHash. +func NewAddressScriptHash(serializedScript []byte, net *chaincfg.Params) (*AddressScriptHash, error) { + scriptHash := Hash160(serializedScript) + return newAddressScriptHashFromHash(scriptHash, net.ScriptHashAddrID) +} + +// NewAddressScriptHashFromHash returns a new AddressScriptHash. scriptHash +// must be 20 bytes. +func NewAddressScriptHashFromHash(scriptHash []byte, net *chaincfg.Params) (*AddressScriptHash, error) { + return newAddressScriptHashFromHash(scriptHash, net.ScriptHashAddrID) +} + +// newAddressScriptHashFromHash is the internal API to create a script hash +// address with a known leading identifier byte for a network, rather than +// looking it up through its parameters. This is useful when creating a new +// address structure from a string encoding where the identifier byte is already +// known. +func newAddressScriptHashFromHash(scriptHash []byte, netID byte) (*AddressScriptHash, error) { + // Check for a valid script hash length. + if len(scriptHash) != ripemd160.Size { + return nil, errors.New("scriptHash must be 20 bytes") + } + + addr := &AddressScriptHash{netID: netID} + copy(addr.hash[:], scriptHash) + return addr, nil +} + +// EncodeAddress returns the string encoding of a pay-to-script-hash +// address. Part of the Address interface. +func (a *AddressScriptHash) EncodeAddress() string { + return encodeAddress(a.hash[:], a.netID) +} + +// ScriptAddress returns the bytes to be included in a txout script to pay +// to a script hash. Part of the Address interface. +func (a *AddressScriptHash) ScriptAddress() []byte { + return a.hash[:] +} + +// IsForNet returns whether or not the pay-to-script-hash address is associated +// with the passed bitcoin network. +func (a *AddressScriptHash) IsForNet(net *chaincfg.Params) bool { + return a.netID == net.ScriptHashAddrID +} + +// String returns a human-readable string for the pay-to-script-hash address. +// This is equivalent to calling EncodeAddress, but is provided so the type can +// be used as a fmt.Stringer. +func (a *AddressScriptHash) String() string { + return a.EncodeAddress() +} + +// Hash160 returns the underlying array of the script hash. This can be useful +// when an array is more appropriate than a slice (for example, when used as map +// keys). +func (a *AddressScriptHash) Hash160() *[ripemd160.Size]byte { + return &a.hash +} + +// PubKeyFormat describes what format to use for a pay-to-pubkey address. +type PubKeyFormat int + +const ( + // PKFUncompressed indicates the pay-to-pubkey address format is an + // uncompressed public key. + PKFUncompressed PubKeyFormat = iota + + // PKFCompressed indicates the pay-to-pubkey address format is a + // compressed public key. + PKFCompressed +) + +// AddressPubKey is an Address for a pay-to-pubkey transaction. +type AddressPubKey struct { + pubKeyFormat PubKeyFormat + pubKey *btcec.PublicKey + pubKeyHashID byte +} + +// NewAddressPubKey returns a new AddressPubKey which represents a pay-to-pubkey +// address. The serializedPubKey parameter must be a valid pubkey and can be +// uncompressed, compressed, or hybrid. +func NewAddressPubKey(serializedPubKey []byte, net *chaincfg.Params) (*AddressPubKey, error) { + pubKey, err := btcec.ParsePubKey(serializedPubKey) + if err != nil { + return nil, err + } + + // Set the format of the pubkey. This probably should be returned + // from btcec, but do it here to avoid API churn. We already know the + // pubkey is valid since it parsed above, so it's safe to simply examine + // the leading byte to get the format. + pkFormat := PKFUncompressed + switch serializedPubKey[0] { + case 0x02, 0x03: + pkFormat = PKFCompressed + } + + return &AddressPubKey{ + pubKeyFormat: pkFormat, + pubKey: pubKey, + pubKeyHashID: net.PubKeyHashAddrID, + }, nil +} + +// serialize returns the serialization of the public key according to the +// format associated with the address. +func (a *AddressPubKey) serialize() []byte { + switch a.pubKeyFormat { + default: + fallthrough + case PKFUncompressed: + return a.pubKey.SerializeUncompressed() + + case PKFCompressed: + return a.pubKey.SerializeCompressed() + } +} + +// EncodeAddress returns the string encoding of the public key as a +// pay-to-pubkey-hash. Note that the public key format (uncompressed, +// compressed, etc) will change the resulting address. This is expected since +// pay-to-pubkey-hash is a hash of the serialized public key which obviously +// differs with the format. At the time of this writing, most Bitcoin addresses +// are pay-to-pubkey-hash constructed from the uncompressed public key. +// +// Part of the Address interface. +func (a *AddressPubKey) EncodeAddress() string { + return encodeAddress(Hash160(a.serialize()), a.pubKeyHashID) +} + +// ScriptAddress returns the bytes to be included in a txout script to pay +// to a public key. Setting the public key format will affect the output of +// this function accordingly. Part of the Address interface. +func (a *AddressPubKey) ScriptAddress() []byte { + return a.serialize() +} + +// IsForNet returns whether or not the pay-to-pubkey address is associated +// with the passed bitcoin network. +func (a *AddressPubKey) IsForNet(net *chaincfg.Params) bool { + return a.pubKeyHashID == net.PubKeyHashAddrID +} + +// String returns the hex-encoded human-readable string for the pay-to-pubkey +// address. This is not the same as calling EncodeAddress. +func (a *AddressPubKey) String() string { + return hex.EncodeToString(a.serialize()) +} + +// Format returns the format (uncompressed, compressed, etc) of the +// pay-to-pubkey address. +func (a *AddressPubKey) Format() PubKeyFormat { + return a.pubKeyFormat +} + +// SetFormat sets the format (uncompressed, compressed, etc) of the +// pay-to-pubkey address. +func (a *AddressPubKey) SetFormat(pkFormat PubKeyFormat) { + a.pubKeyFormat = pkFormat +} + +// AddressPubKeyHash returns the pay-to-pubkey address converted to a +// pay-to-pubkey-hash address. Note that the public key format (uncompressed, +// compressed, etc) will change the resulting address. This is expected since +// pay-to-pubkey-hash is a hash of the serialized public key which obviously +// differs with the format. At the time of this writing, most Bitcoin addresses +// are pay-to-pubkey-hash constructed from the uncompressed public key. +func (a *AddressPubKey) AddressPubKeyHash() *AddressPubKeyHash { + addr := &AddressPubKeyHash{netID: a.pubKeyHashID} + copy(addr.hash[:], Hash160(a.serialize())) + return addr +} + +// PubKey returns the underlying public key for the address. +func (a *AddressPubKey) PubKey() *btcec.PublicKey { + return a.pubKey +} + +// AddressSegWit is the base address type for all SegWit addresses. +type AddressSegWit struct { + hrp string + witnessVersion byte + witnessProgram []byte +} + +// EncodeAddress returns the bech32 (or bech32m for SegWit v1) string encoding +// of an AddressSegWit. +// +// NOTE: This method is part of the Address interface. +func (a *AddressSegWit) EncodeAddress() string { + str, err := encodeSegWitAddress( + a.hrp, a.witnessVersion, a.witnessProgram[:], + ) + if err != nil { + return "" + } + return str +} + +// ScriptAddress returns the witness program for this address. +// +// NOTE: This method is part of the Address interface. +func (a *AddressSegWit) ScriptAddress() []byte { + return a.witnessProgram[:] +} + +// IsForNet returns whether the AddressSegWit is associated with the passed +// bitcoin network. +// +// NOTE: This method is part of the Address interface. +func (a *AddressSegWit) IsForNet(net *chaincfg.Params) bool { + return a.hrp == net.Bech32HRPSegwit +} + +// String returns a human-readable string for the AddressWitnessPubKeyHash. +// This is equivalent to calling EncodeAddress, but is provided so the type +// can be used as a fmt.Stringer. +// +// NOTE: This method is part of the Address interface. +func (a *AddressSegWit) String() string { + return a.EncodeAddress() +} + +// Hrp returns the human-readable part of the bech32 (or bech32m for SegWit v1) +// encoded AddressSegWit. +func (a *AddressSegWit) Hrp() string { + return a.hrp +} + +// WitnessVersion returns the witness version of the AddressSegWit. +func (a *AddressSegWit) WitnessVersion() byte { + return a.witnessVersion +} + +// WitnessProgram returns the witness program of the AddressSegWit. +func (a *AddressSegWit) WitnessProgram() []byte { + return a.witnessProgram[:] +} + +// AddressWitnessPubKeyHash is an Address for a pay-to-witness-pubkey-hash +// (P2WPKH) output. See BIP 173 for further details regarding native segregated +// witness address encoding: +// https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki +type AddressWitnessPubKeyHash struct { + AddressSegWit +} + +// NewAddressWitnessPubKeyHash returns a new AddressWitnessPubKeyHash. +func NewAddressWitnessPubKeyHash(witnessProg []byte, + net *chaincfg.Params) (*AddressWitnessPubKeyHash, error) { + + return newAddressWitnessPubKeyHash(net.Bech32HRPSegwit, witnessProg) +} + +// newAddressWitnessPubKeyHash is an internal helper function to create an +// AddressWitnessPubKeyHash with a known human-readable part, rather than +// looking it up through its parameters. +func newAddressWitnessPubKeyHash(hrp string, + witnessProg []byte) (*AddressWitnessPubKeyHash, error) { + + // Check for valid program length for witness version 0, which is 20 + // for P2WPKH. + if len(witnessProg) != 20 { + return nil, errors.New("witness program must be 20 " + + "bytes for p2wpkh") + } + + addr := &AddressWitnessPubKeyHash{ + AddressSegWit{ + hrp: strings.ToLower(hrp), + witnessVersion: 0x00, + witnessProgram: witnessProg, + }, + } + + return addr, nil +} + +// Hash160 returns the witness program of the AddressWitnessPubKeyHash as a +// byte array. +func (a *AddressWitnessPubKeyHash) Hash160() *[20]byte { + var pubKeyHashWitnessProgram [20]byte + copy(pubKeyHashWitnessProgram[:], a.witnessProgram) + return &pubKeyHashWitnessProgram +} + +// AddressWitnessScriptHash is an Address for a pay-to-witness-script-hash +// (P2WSH) output. See BIP 173 for further details regarding native segregated +// witness address encoding: +// https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki +type AddressWitnessScriptHash struct { + AddressSegWit +} + +// NewAddressWitnessScriptHash returns a new AddressWitnessPubKeyHash. +func NewAddressWitnessScriptHash(witnessProg []byte, + net *chaincfg.Params) (*AddressWitnessScriptHash, error) { + + return newAddressWitnessScriptHash(net.Bech32HRPSegwit, witnessProg) +} + +// newAddressWitnessScriptHash is an internal helper function to create an +// AddressWitnessScriptHash with a known human-readable part, rather than +// looking it up through its parameters. +func newAddressWitnessScriptHash(hrp string, + witnessProg []byte) (*AddressWitnessScriptHash, error) { + + // Check for valid program length for witness version 0, which is 32 + // for P2WSH. + if len(witnessProg) != 32 { + return nil, errors.New("witness program must be 32 " + + "bytes for p2wsh") + } + + addr := &AddressWitnessScriptHash{ + AddressSegWit{ + hrp: strings.ToLower(hrp), + witnessVersion: 0x00, + witnessProgram: witnessProg, + }, + } + + return addr, nil +} + +// AddressTaproot is an Address for a pay-to-taproot (P2TR) output. See BIP 341 +// for further details. +type AddressTaproot struct { + AddressSegWit +} + +// NewAddressTaproot returns a new AddressTaproot. +func NewAddressTaproot(witnessProg []byte, + net *chaincfg.Params) (*AddressTaproot, error) { + + return newAddressTaproot(net.Bech32HRPSegwit, witnessProg) +} + +// newAddressTaproot is an internal helper function to create an +// AddressTaproot with a known human-readable part, rather than +// looking it up through its parameters. +func newAddressTaproot(hrp string, + witnessProg []byte) (*AddressTaproot, error) { + + // Check for valid program length for witness version 1, which is 32 + // for P2TR. + if len(witnessProg) != 32 { + return nil, errors.New("witness program must be 32 bytes for " + + "p2tr") + } + + addr := &AddressTaproot{ + AddressSegWit{ + hrp: strings.ToLower(hrp), + witnessVersion: 0x01, + witnessProgram: witnessProg, + }, + } + + return addr, nil +} diff --git a/btcutil/address_test.go b/btcutil/address_test.go new file mode 100644 index 0000000000..f5ae2ac0d5 --- /dev/null +++ b/btcutil/address_test.go @@ -0,0 +1,896 @@ +// Copyright (c) 2013-2017 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package btcutil_test + +import ( + "bytes" + "encoding/hex" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/wire" + "golang.org/x/crypto/ripemd160" +) + +type CustomParamStruct struct { + Net wire.BitcoinNet + PubKeyHashAddrID byte + ScriptHashAddrID byte + Bech32HRPSegwit string +} + +var CustomParams = CustomParamStruct{ + Net: 0xdbb6c0fb, // litecoin mainnet HD version bytes + PubKeyHashAddrID: 0x30, // starts with L + ScriptHashAddrID: 0x32, // starts with M + Bech32HRPSegwit: "ltc", // starts with ltc +} + +// We use this function to be able to test functionality in DecodeAddress for +// defaultNet addresses +func applyCustomParams(params chaincfg.Params, customParams CustomParamStruct) chaincfg.Params { + params.Net = customParams.Net + params.PubKeyHashAddrID = customParams.PubKeyHashAddrID + params.ScriptHashAddrID = customParams.ScriptHashAddrID + params.Bech32HRPSegwit = customParams.Bech32HRPSegwit + return params +} + +var customParams = applyCustomParams(chaincfg.MainNetParams, CustomParams) + +func TestAddresses(t *testing.T) { + tests := []struct { + name string + addr string + encoded string + valid bool + result btcutil.Address + f func() (btcutil.Address, error) + net *chaincfg.Params + }{ + // Positive P2PKH tests. + { + name: "mainnet p2pkh", + addr: "1MirQ9bwyQcGVJPwKUgapu5ouK2E2Ey4gX", + encoded: "1MirQ9bwyQcGVJPwKUgapu5ouK2E2Ey4gX", + valid: true, + result: btcutil.TstAddressPubKeyHash( + [ripemd160.Size]byte{ + 0xe3, 0x4c, 0xce, 0x70, 0xc8, 0x63, 0x73, 0x27, 0x3e, 0xfc, + 0xc5, 0x4c, 0xe7, 0xd2, 0xa4, 0x91, 0xbb, 0x4a, 0x0e, 0x84}, + chaincfg.MainNetParams.PubKeyHashAddrID), + f: func() (btcutil.Address, error) { + pkHash := []byte{ + 0xe3, 0x4c, 0xce, 0x70, 0xc8, 0x63, 0x73, 0x27, 0x3e, 0xfc, + 0xc5, 0x4c, 0xe7, 0xd2, 0xa4, 0x91, 0xbb, 0x4a, 0x0e, 0x84} + return btcutil.NewAddressPubKeyHash(pkHash, &chaincfg.MainNetParams) + }, + net: &chaincfg.MainNetParams, + }, + { + name: "mainnet p2pkh 2", + addr: "12MzCDwodF9G1e7jfwLXfR164RNtx4BRVG", + encoded: "12MzCDwodF9G1e7jfwLXfR164RNtx4BRVG", + valid: true, + result: btcutil.TstAddressPubKeyHash( + [ripemd160.Size]byte{ + 0x0e, 0xf0, 0x30, 0x10, 0x7f, 0xd2, 0x6e, 0x0b, 0x6b, 0xf4, + 0x05, 0x12, 0xbc, 0xa2, 0xce, 0xb1, 0xdd, 0x80, 0xad, 0xaa}, + chaincfg.MainNetParams.PubKeyHashAddrID), + f: func() (btcutil.Address, error) { + pkHash := []byte{ + 0x0e, 0xf0, 0x30, 0x10, 0x7f, 0xd2, 0x6e, 0x0b, 0x6b, 0xf4, + 0x05, 0x12, 0xbc, 0xa2, 0xce, 0xb1, 0xdd, 0x80, 0xad, 0xaa} + return btcutil.NewAddressPubKeyHash(pkHash, &chaincfg.MainNetParams) + }, + net: &chaincfg.MainNetParams, + }, + { + name: "litecoin mainnet p2pkh", + addr: "LM2WMpR1Rp6j3Sa59cMXMs1SPzj9eXpGc1", + encoded: "LM2WMpR1Rp6j3Sa59cMXMs1SPzj9eXpGc1", + valid: true, + result: btcutil.TstAddressPubKeyHash( + [ripemd160.Size]byte{ + 0x13, 0xc6, 0x0d, 0x8e, 0x68, 0xd7, 0x34, 0x9f, 0x5b, 0x4c, + 0xa3, 0x62, 0xc3, 0x95, 0x4b, 0x15, 0x04, 0x50, 0x61, 0xb1}, + CustomParams.PubKeyHashAddrID), + f: func() (btcutil.Address, error) { + pkHash := []byte{ + 0x13, 0xc6, 0x0d, 0x8e, 0x68, 0xd7, 0x34, 0x9f, 0x5b, 0x4c, + 0xa3, 0x62, 0xc3, 0x95, 0x4b, 0x15, 0x04, 0x50, 0x61, 0xb1} + return btcutil.NewAddressPubKeyHash(pkHash, &customParams) + }, + net: &customParams, + }, + { + name: "testnet p2pkh", + addr: "mrX9vMRYLfVy1BnZbc5gZjuyaqH3ZW2ZHz", + encoded: "mrX9vMRYLfVy1BnZbc5gZjuyaqH3ZW2ZHz", + valid: true, + result: btcutil.TstAddressPubKeyHash( + [ripemd160.Size]byte{ + 0x78, 0xb3, 0x16, 0xa0, 0x86, 0x47, 0xd5, 0xb7, 0x72, 0x83, + 0xe5, 0x12, 0xd3, 0x60, 0x3f, 0x1f, 0x1c, 0x8d, 0xe6, 0x8f}, + chaincfg.TestNet3Params.PubKeyHashAddrID), + f: func() (btcutil.Address, error) { + pkHash := []byte{ + 0x78, 0xb3, 0x16, 0xa0, 0x86, 0x47, 0xd5, 0xb7, 0x72, 0x83, + 0xe5, 0x12, 0xd3, 0x60, 0x3f, 0x1f, 0x1c, 0x8d, 0xe6, 0x8f} + return btcutil.NewAddressPubKeyHash(pkHash, &chaincfg.TestNet3Params) + }, + net: &chaincfg.TestNet3Params, + }, + + // Negative P2PKH tests. + { + name: "p2pkh wrong hash length", + addr: "", + valid: false, + f: func() (btcutil.Address, error) { + pkHash := []byte{ + 0x00, 0x0e, 0xf0, 0x30, 0x10, 0x7f, 0xd2, 0x6e, 0x0b, 0x6b, + 0xf4, 0x05, 0x12, 0xbc, 0xa2, 0xce, 0xb1, 0xdd, 0x80, 0xad, + 0xaa} + return btcutil.NewAddressPubKeyHash(pkHash, &chaincfg.MainNetParams) + }, + net: &chaincfg.MainNetParams, + }, + { + name: "p2pkh bad checksum", + addr: "1MirQ9bwyQcGVJPwKUgapu5ouK2E2Ey4gY", + valid: false, + net: &chaincfg.MainNetParams, + }, + + // Positive P2SH tests. + { + // Taken from transactions: + // output: 3c9018e8d5615c306d72397f8f5eef44308c98fb576a88e030c25456b4f3a7ac + // input: 837dea37ddc8b1e3ce646f1a656e79bbd8cc7f558ac56a169626d649ebe2a3ba. + name: "mainnet p2sh", + addr: "3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC", + encoded: "3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC", + valid: true, + result: btcutil.TstAddressScriptHash( + [ripemd160.Size]byte{ + 0xf8, 0x15, 0xb0, 0x36, 0xd9, 0xbb, 0xbc, 0xe5, 0xe9, 0xf2, + 0xa0, 0x0a, 0xbd, 0x1b, 0xf3, 0xdc, 0x91, 0xe9, 0x55, 0x10}, + chaincfg.MainNetParams.ScriptHashAddrID), + f: func() (btcutil.Address, error) { + script := []byte{ + 0x52, 0x41, 0x04, 0x91, 0xbb, 0xa2, 0x51, 0x09, 0x12, 0xa5, + 0xbd, 0x37, 0xda, 0x1f, 0xb5, 0xb1, 0x67, 0x30, 0x10, 0xe4, + 0x3d, 0x2c, 0x6d, 0x81, 0x2c, 0x51, 0x4e, 0x91, 0xbf, 0xa9, + 0xf2, 0xeb, 0x12, 0x9e, 0x1c, 0x18, 0x33, 0x29, 0xdb, 0x55, + 0xbd, 0x86, 0x8e, 0x20, 0x9a, 0xac, 0x2f, 0xbc, 0x02, 0xcb, + 0x33, 0xd9, 0x8f, 0xe7, 0x4b, 0xf2, 0x3f, 0x0c, 0x23, 0x5d, + 0x61, 0x26, 0xb1, 0xd8, 0x33, 0x4f, 0x86, 0x41, 0x04, 0x86, + 0x5c, 0x40, 0x29, 0x3a, 0x68, 0x0c, 0xb9, 0xc0, 0x20, 0xe7, + 0xb1, 0xe1, 0x06, 0xd8, 0xc1, 0x91, 0x6d, 0x3c, 0xef, 0x99, + 0xaa, 0x43, 0x1a, 0x56, 0xd2, 0x53, 0xe6, 0x92, 0x56, 0xda, + 0xc0, 0x9e, 0xf1, 0x22, 0xb1, 0xa9, 0x86, 0x81, 0x8a, 0x7c, + 0xb6, 0x24, 0x53, 0x2f, 0x06, 0x2c, 0x1d, 0x1f, 0x87, 0x22, + 0x08, 0x48, 0x61, 0xc5, 0xc3, 0x29, 0x1c, 0xcf, 0xfe, 0xf4, + 0xec, 0x68, 0x74, 0x41, 0x04, 0x8d, 0x24, 0x55, 0xd2, 0x40, + 0x3e, 0x08, 0x70, 0x8f, 0xc1, 0xf5, 0x56, 0x00, 0x2f, 0x1b, + 0x6c, 0xd8, 0x3f, 0x99, 0x2d, 0x08, 0x50, 0x97, 0xf9, 0x97, + 0x4a, 0xb0, 0x8a, 0x28, 0x83, 0x8f, 0x07, 0x89, 0x6f, 0xba, + 0xb0, 0x8f, 0x39, 0x49, 0x5e, 0x15, 0xfa, 0x6f, 0xad, 0x6e, + 0xdb, 0xfb, 0x1e, 0x75, 0x4e, 0x35, 0xfa, 0x1c, 0x78, 0x44, + 0xc4, 0x1f, 0x32, 0x2a, 0x18, 0x63, 0xd4, 0x62, 0x13, 0x53, + 0xae} + return btcutil.NewAddressScriptHash(script, &chaincfg.MainNetParams) + }, + net: &chaincfg.MainNetParams, + }, + { + name: "litecoin mainnet P2SH ", + addr: "MVcg9uEvtWuP5N6V48EHfEtbz48qR8TKZ9", + encoded: "MVcg9uEvtWuP5N6V48EHfEtbz48qR8TKZ9", + valid: true, + result: btcutil.TstAddressScriptHash( + [ripemd160.Size]byte{ + 0xee, 0x34, 0xac, 0x67, 0x6b, 0xda, 0xf6, 0xe3, 0x70, 0xc8, + 0xc8, 0x20, 0xb9, 0x48, 0xed, 0xfa, 0xd3, 0xa8, 0x73, 0xd8}, + CustomParams.ScriptHashAddrID), + f: func() (btcutil.Address, error) { + pkHash := []byte{ + 0xEE, 0x34, 0xAC, 0x67, 0x6B, 0xDA, 0xF6, 0xE3, 0x70, 0xC8, + 0xC8, 0x20, 0xB9, 0x48, 0xED, 0xFA, 0xD3, 0xA8, 0x73, 0xD8} + return btcutil.NewAddressScriptHashFromHash(pkHash, &customParams) + }, + net: &customParams, + }, + { + // Taken from transactions: + // output: b0539a45de13b3e0403909b8bd1a555b8cbe45fd4e3f3fda76f3a5f52835c29d + // input: (not yet redeemed at time test was written) + name: "mainnet p2sh 2", + addr: "3NukJ6fYZJ5Kk8bPjycAnruZkE5Q7UW7i8", + encoded: "3NukJ6fYZJ5Kk8bPjycAnruZkE5Q7UW7i8", + valid: true, + result: btcutil.TstAddressScriptHash( + [ripemd160.Size]byte{ + 0xe8, 0xc3, 0x00, 0xc8, 0x79, 0x86, 0xef, 0xa8, 0x4c, 0x37, + 0xc0, 0x51, 0x99, 0x29, 0x01, 0x9e, 0xf8, 0x6e, 0xb5, 0xb4}, + chaincfg.MainNetParams.ScriptHashAddrID), + f: func() (btcutil.Address, error) { + hash := []byte{ + 0xe8, 0xc3, 0x00, 0xc8, 0x79, 0x86, 0xef, 0xa8, 0x4c, 0x37, + 0xc0, 0x51, 0x99, 0x29, 0x01, 0x9e, 0xf8, 0x6e, 0xb5, 0xb4} + return btcutil.NewAddressScriptHashFromHash(hash, &chaincfg.MainNetParams) + }, + net: &chaincfg.MainNetParams, + }, + { + // Taken from bitcoind base58_keys_valid. + name: "testnet p2sh", + addr: "2NBFNJTktNa7GZusGbDbGKRZTxdK9VVez3n", + encoded: "2NBFNJTktNa7GZusGbDbGKRZTxdK9VVez3n", + valid: true, + result: btcutil.TstAddressScriptHash( + [ripemd160.Size]byte{ + 0xc5, 0x79, 0x34, 0x2c, 0x2c, 0x4c, 0x92, 0x20, 0x20, 0x5e, + 0x2c, 0xdc, 0x28, 0x56, 0x17, 0x04, 0x0c, 0x92, 0x4a, 0x0a}, + chaincfg.TestNet3Params.ScriptHashAddrID), + f: func() (btcutil.Address, error) { + hash := []byte{ + 0xc5, 0x79, 0x34, 0x2c, 0x2c, 0x4c, 0x92, 0x20, 0x20, 0x5e, + 0x2c, 0xdc, 0x28, 0x56, 0x17, 0x04, 0x0c, 0x92, 0x4a, 0x0a} + return btcutil.NewAddressScriptHashFromHash(hash, &chaincfg.TestNet3Params) + }, + net: &chaincfg.TestNet3Params, + }, + + // Negative P2SH tests. + { + name: "p2sh wrong hash length", + addr: "", + valid: false, + f: func() (btcutil.Address, error) { + hash := []byte{ + 0x00, 0xf8, 0x15, 0xb0, 0x36, 0xd9, 0xbb, 0xbc, 0xe5, 0xe9, + 0xf2, 0xa0, 0x0a, 0xbd, 0x1b, 0xf3, 0xdc, 0x91, 0xe9, 0x55, + 0x10} + return btcutil.NewAddressScriptHashFromHash(hash, &chaincfg.MainNetParams) + }, + net: &chaincfg.MainNetParams, + }, + + // Positive P2PK tests. + { + name: "mainnet p2pk compressed (0x02)", + addr: "02192d74d0cb94344c9569c2e77901573d8d7903c3ebec3a957724895dca52c6b4", + encoded: "13CG6SJ3yHUXo4Cr2RY4THLLJrNFuG3gUg", + valid: true, + result: btcutil.TstAddressPubKey( + []byte{ + 0x02, 0x19, 0x2d, 0x74, 0xd0, 0xcb, 0x94, 0x34, 0x4c, 0x95, + 0x69, 0xc2, 0xe7, 0x79, 0x01, 0x57, 0x3d, 0x8d, 0x79, 0x03, + 0xc3, 0xeb, 0xec, 0x3a, 0x95, 0x77, 0x24, 0x89, 0x5d, 0xca, + 0x52, 0xc6, 0xb4}, + btcutil.PKFCompressed, chaincfg.MainNetParams.PubKeyHashAddrID), + f: func() (btcutil.Address, error) { + serializedPubKey := []byte{ + 0x02, 0x19, 0x2d, 0x74, 0xd0, 0xcb, 0x94, 0x34, 0x4c, 0x95, + 0x69, 0xc2, 0xe7, 0x79, 0x01, 0x57, 0x3d, 0x8d, 0x79, 0x03, + 0xc3, 0xeb, 0xec, 0x3a, 0x95, 0x77, 0x24, 0x89, 0x5d, 0xca, + 0x52, 0xc6, 0xb4} + return btcutil.NewAddressPubKey(serializedPubKey, &chaincfg.MainNetParams) + }, + net: &chaincfg.MainNetParams, + }, + { + name: "mainnet p2pk compressed (0x03)", + addr: "03b0bd634234abbb1ba1e986e884185c61cf43e001f9137f23c2c409273eb16e65", + encoded: "15sHANNUBSh6nDp8XkDPmQcW6n3EFwmvE6", + valid: true, + result: btcutil.TstAddressPubKey( + []byte{ + 0x03, 0xb0, 0xbd, 0x63, 0x42, 0x34, 0xab, 0xbb, 0x1b, 0xa1, + 0xe9, 0x86, 0xe8, 0x84, 0x18, 0x5c, 0x61, 0xcf, 0x43, 0xe0, + 0x01, 0xf9, 0x13, 0x7f, 0x23, 0xc2, 0xc4, 0x09, 0x27, 0x3e, + 0xb1, 0x6e, 0x65}, + btcutil.PKFCompressed, chaincfg.MainNetParams.PubKeyHashAddrID), + f: func() (btcutil.Address, error) { + serializedPubKey := []byte{ + 0x03, 0xb0, 0xbd, 0x63, 0x42, 0x34, 0xab, 0xbb, 0x1b, 0xa1, + 0xe9, 0x86, 0xe8, 0x84, 0x18, 0x5c, 0x61, 0xcf, 0x43, 0xe0, + 0x01, 0xf9, 0x13, 0x7f, 0x23, 0xc2, 0xc4, 0x09, 0x27, 0x3e, + 0xb1, 0x6e, 0x65} + return btcutil.NewAddressPubKey(serializedPubKey, &chaincfg.MainNetParams) + }, + net: &chaincfg.MainNetParams, + }, + { + name: "mainnet p2pk uncompressed (0x04)", + addr: "0411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2" + + "e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3", + encoded: "12cbQLTFMXRnSzktFkuoG3eHoMeFtpTu3S", + valid: true, + result: btcutil.TstAddressPubKey( + []byte{ + 0x04, 0x11, 0xdb, 0x93, 0xe1, 0xdc, 0xdb, 0x8a, 0x01, 0x6b, + 0x49, 0x84, 0x0f, 0x8c, 0x53, 0xbc, 0x1e, 0xb6, 0x8a, 0x38, + 0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca, 0xd7, 0xb1, 0x48, 0xa6, + 0x90, 0x9a, 0x5c, 0xb2, 0xe0, 0xea, 0xdd, 0xfb, 0x84, 0xcc, + 0xf9, 0x74, 0x44, 0x64, 0xf8, 0x2e, 0x16, 0x0b, 0xfa, 0x9b, + 0x8b, 0x64, 0xf9, 0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, + 0xf6, 0x56, 0xb4, 0x12, 0xa3}, + btcutil.PKFUncompressed, chaincfg.MainNetParams.PubKeyHashAddrID), + f: func() (btcutil.Address, error) { + serializedPubKey := []byte{ + 0x04, 0x11, 0xdb, 0x93, 0xe1, 0xdc, 0xdb, 0x8a, 0x01, 0x6b, + 0x49, 0x84, 0x0f, 0x8c, 0x53, 0xbc, 0x1e, 0xb6, 0x8a, 0x38, + 0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca, 0xd7, 0xb1, 0x48, 0xa6, + 0x90, 0x9a, 0x5c, 0xb2, 0xe0, 0xea, 0xdd, 0xfb, 0x84, 0xcc, + 0xf9, 0x74, 0x44, 0x64, 0xf8, 0x2e, 0x16, 0x0b, 0xfa, 0x9b, + 0x8b, 0x64, 0xf9, 0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, + 0xf6, 0x56, 0xb4, 0x12, 0xa3} + return btcutil.NewAddressPubKey(serializedPubKey, &chaincfg.MainNetParams) + }, + net: &chaincfg.MainNetParams, + }, + { + name: "testnet p2pk compressed (0x02)", + addr: "02192d74d0cb94344c9569c2e77901573d8d7903c3ebec3a957724895dca52c6b4", + encoded: "mhiDPVP2nJunaAgTjzWSHCYfAqxxrxzjmo", + valid: true, + result: btcutil.TstAddressPubKey( + []byte{ + 0x02, 0x19, 0x2d, 0x74, 0xd0, 0xcb, 0x94, 0x34, 0x4c, 0x95, + 0x69, 0xc2, 0xe7, 0x79, 0x01, 0x57, 0x3d, 0x8d, 0x79, 0x03, + 0xc3, 0xeb, 0xec, 0x3a, 0x95, 0x77, 0x24, 0x89, 0x5d, 0xca, + 0x52, 0xc6, 0xb4}, + btcutil.PKFCompressed, chaincfg.TestNet3Params.PubKeyHashAddrID), + f: func() (btcutil.Address, error) { + serializedPubKey := []byte{ + 0x02, 0x19, 0x2d, 0x74, 0xd0, 0xcb, 0x94, 0x34, 0x4c, 0x95, + 0x69, 0xc2, 0xe7, 0x79, 0x01, 0x57, 0x3d, 0x8d, 0x79, 0x03, + 0xc3, 0xeb, 0xec, 0x3a, 0x95, 0x77, 0x24, 0x89, 0x5d, 0xca, + 0x52, 0xc6, 0xb4} + return btcutil.NewAddressPubKey(serializedPubKey, &chaincfg.TestNet3Params) + }, + net: &chaincfg.TestNet3Params, + }, + { + name: "testnet p2pk compressed (0x03)", + addr: "03b0bd634234abbb1ba1e986e884185c61cf43e001f9137f23c2c409273eb16e65", + encoded: "mkPETRTSzU8MZLHkFKBmbKppxmdw9qT42t", + valid: true, + result: btcutil.TstAddressPubKey( + []byte{ + 0x03, 0xb0, 0xbd, 0x63, 0x42, 0x34, 0xab, 0xbb, 0x1b, 0xa1, + 0xe9, 0x86, 0xe8, 0x84, 0x18, 0x5c, 0x61, 0xcf, 0x43, 0xe0, + 0x01, 0xf9, 0x13, 0x7f, 0x23, 0xc2, 0xc4, 0x09, 0x27, 0x3e, + 0xb1, 0x6e, 0x65}, + btcutil.PKFCompressed, chaincfg.TestNet3Params.PubKeyHashAddrID), + f: func() (btcutil.Address, error) { + serializedPubKey := []byte{ + 0x03, 0xb0, 0xbd, 0x63, 0x42, 0x34, 0xab, 0xbb, 0x1b, 0xa1, + 0xe9, 0x86, 0xe8, 0x84, 0x18, 0x5c, 0x61, 0xcf, 0x43, 0xe0, + 0x01, 0xf9, 0x13, 0x7f, 0x23, 0xc2, 0xc4, 0x09, 0x27, 0x3e, + 0xb1, 0x6e, 0x65} + return btcutil.NewAddressPubKey(serializedPubKey, &chaincfg.TestNet3Params) + }, + net: &chaincfg.TestNet3Params, + }, + { + name: "testnet p2pk uncompressed (0x04)", + addr: "0411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5" + + "cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3", + encoded: "mh8YhPYEAYs3E7EVyKtB5xrcfMExkkdEMF", + valid: true, + result: btcutil.TstAddressPubKey( + []byte{ + 0x04, 0x11, 0xdb, 0x93, 0xe1, 0xdc, 0xdb, 0x8a, 0x01, 0x6b, + 0x49, 0x84, 0x0f, 0x8c, 0x53, 0xbc, 0x1e, 0xb6, 0x8a, 0x38, + 0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca, 0xd7, 0xb1, 0x48, 0xa6, + 0x90, 0x9a, 0x5c, 0xb2, 0xe0, 0xea, 0xdd, 0xfb, 0x84, 0xcc, + 0xf9, 0x74, 0x44, 0x64, 0xf8, 0x2e, 0x16, 0x0b, 0xfa, 0x9b, + 0x8b, 0x64, 0xf9, 0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, + 0xf6, 0x56, 0xb4, 0x12, 0xa3}, + btcutil.PKFUncompressed, chaincfg.TestNet3Params.PubKeyHashAddrID), + f: func() (btcutil.Address, error) { + serializedPubKey := []byte{ + 0x04, 0x11, 0xdb, 0x93, 0xe1, 0xdc, 0xdb, 0x8a, 0x01, 0x6b, + 0x49, 0x84, 0x0f, 0x8c, 0x53, 0xbc, 0x1e, 0xb6, 0x8a, 0x38, + 0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca, 0xd7, 0xb1, 0x48, 0xa6, + 0x90, 0x9a, 0x5c, 0xb2, 0xe0, 0xea, 0xdd, 0xfb, 0x84, 0xcc, + 0xf9, 0x74, 0x44, 0x64, 0xf8, 0x2e, 0x16, 0x0b, 0xfa, 0x9b, + 0x8b, 0x64, 0xf9, 0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, + 0xf6, 0x56, 0xb4, 0x12, 0xa3} + return btcutil.NewAddressPubKey(serializedPubKey, &chaincfg.TestNet3Params) + }, + net: &chaincfg.TestNet3Params, + }, + // Segwit address tests. + { + name: "segwit mainnet p2wpkh v0", + addr: "BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4", + encoded: "bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4", + valid: true, + result: btcutil.TstAddressWitnessPubKeyHash( + 0, + [20]byte{ + 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, 0x94, + 0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6}, + chaincfg.MainNetParams.Bech32HRPSegwit), + f: func() (btcutil.Address, error) { + pkHash := []byte{ + 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, 0x94, + 0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6} + return btcutil.NewAddressWitnessPubKeyHash(pkHash, &chaincfg.MainNetParams) + }, + net: &chaincfg.MainNetParams, + }, + { + name: "segwit mainnet p2wsh v0", + addr: "bc1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3qccfmv3", + encoded: "bc1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3qccfmv3", + valid: true, + result: btcutil.TstAddressWitnessScriptHash( + 0, + [32]byte{ + 0x18, 0x63, 0x14, 0x3c, 0x14, 0xc5, 0x16, 0x68, + 0x04, 0xbd, 0x19, 0x20, 0x33, 0x56, 0xda, 0x13, + 0x6c, 0x98, 0x56, 0x78, 0xcd, 0x4d, 0x27, 0xa1, + 0xb8, 0xc6, 0x32, 0x96, 0x04, 0x90, 0x32, 0x62}, + chaincfg.MainNetParams.Bech32HRPSegwit), + f: func() (btcutil.Address, error) { + scriptHash := []byte{ + 0x18, 0x63, 0x14, 0x3c, 0x14, 0xc5, 0x16, 0x68, + 0x04, 0xbd, 0x19, 0x20, 0x33, 0x56, 0xda, 0x13, + 0x6c, 0x98, 0x56, 0x78, 0xcd, 0x4d, 0x27, 0xa1, + 0xb8, 0xc6, 0x32, 0x96, 0x04, 0x90, 0x32, 0x62} + return btcutil.NewAddressWitnessScriptHash(scriptHash, &chaincfg.MainNetParams) + }, + net: &chaincfg.MainNetParams, + }, + { + name: "segwit testnet p2wpkh v0", + addr: "tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx", + encoded: "tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx", + valid: true, + result: btcutil.TstAddressWitnessPubKeyHash( + 0, + [20]byte{ + 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, 0x94, + 0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6}, + chaincfg.TestNet3Params.Bech32HRPSegwit), + f: func() (btcutil.Address, error) { + pkHash := []byte{ + 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, 0x94, + 0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6} + return btcutil.NewAddressWitnessPubKeyHash(pkHash, &chaincfg.TestNet3Params) + }, + net: &chaincfg.TestNet3Params, + }, + { + name: "segwit testnet p2wsh v0", + addr: "tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7", + encoded: "tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7", + valid: true, + result: btcutil.TstAddressWitnessScriptHash( + 0, + [32]byte{ + 0x18, 0x63, 0x14, 0x3c, 0x14, 0xc5, 0x16, 0x68, + 0x04, 0xbd, 0x19, 0x20, 0x33, 0x56, 0xda, 0x13, + 0x6c, 0x98, 0x56, 0x78, 0xcd, 0x4d, 0x27, 0xa1, + 0xb8, 0xc6, 0x32, 0x96, 0x04, 0x90, 0x32, 0x62}, + chaincfg.TestNet3Params.Bech32HRPSegwit), + f: func() (btcutil.Address, error) { + scriptHash := []byte{ + 0x18, 0x63, 0x14, 0x3c, 0x14, 0xc5, 0x16, 0x68, + 0x04, 0xbd, 0x19, 0x20, 0x33, 0x56, 0xda, 0x13, + 0x6c, 0x98, 0x56, 0x78, 0xcd, 0x4d, 0x27, 0xa1, + 0xb8, 0xc6, 0x32, 0x96, 0x04, 0x90, 0x32, 0x62} + return btcutil.NewAddressWitnessScriptHash(scriptHash, &chaincfg.TestNet3Params) + }, + net: &chaincfg.TestNet3Params, + }, + { + name: "segwit testnet p2wsh witness v0", + addr: "tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy", + encoded: "tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy", + valid: true, + result: btcutil.TstAddressWitnessScriptHash( + 0, + [32]byte{ + 0x00, 0x00, 0x00, 0xc4, 0xa5, 0xca, 0xd4, 0x62, + 0x21, 0xb2, 0xa1, 0x87, 0x90, 0x5e, 0x52, 0x66, + 0x36, 0x2b, 0x99, 0xd5, 0xe9, 0x1c, 0x6c, 0xe2, + 0x4d, 0x16, 0x5d, 0xab, 0x93, 0xe8, 0x64, 0x33}, + chaincfg.TestNet3Params.Bech32HRPSegwit), + f: func() (btcutil.Address, error) { + scriptHash := []byte{ + 0x00, 0x00, 0x00, 0xc4, 0xa5, 0xca, 0xd4, 0x62, + 0x21, 0xb2, 0xa1, 0x87, 0x90, 0x5e, 0x52, 0x66, + 0x36, 0x2b, 0x99, 0xd5, 0xe9, 0x1c, 0x6c, 0xe2, + 0x4d, 0x16, 0x5d, 0xab, 0x93, 0xe8, 0x64, 0x33} + return btcutil.NewAddressWitnessScriptHash(scriptHash, &chaincfg.TestNet3Params) + }, + net: &chaincfg.TestNet3Params, + }, + { + name: "segwit litecoin mainnet p2wpkh v0", + addr: "LTC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KGMN4N9", + encoded: "ltc1qw508d6qejxtdg4y5r3zarvary0c5xw7kgmn4n9", + valid: true, + result: btcutil.TstAddressWitnessPubKeyHash( + 0, + [20]byte{ + 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, 0x94, + 0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6}, + CustomParams.Bech32HRPSegwit, + ), + f: func() (btcutil.Address, error) { + pkHash := []byte{ + 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, 0x94, + 0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6} + return btcutil.NewAddressWitnessPubKeyHash(pkHash, &customParams) + }, + net: &customParams, + }, + + // P2TR address tests. + { + name: "segwit v1 mainnet p2tr", + addr: "bc1paardr2nczq0rx5rqpfwnvpzm497zvux64y0f7wjgcs7xuuuh2nnqwr2d5c", + encoded: "bc1paardr2nczq0rx5rqpfwnvpzm497zvux64y0f7wjgcs7xuuuh2nnqwr2d5c", + valid: true, + result: btcutil.TstAddressTaproot( + 1, [32]byte{ + 0xef, 0x46, 0xd1, 0xaa, 0x78, 0x10, 0x1e, 0x33, + 0x50, 0x60, 0x0a, 0x5d, 0x36, 0x04, 0x5b, 0xa9, + 0x7c, 0x26, 0x70, 0xda, 0xa9, 0x1e, 0x9f, 0x3a, + 0x48, 0xc4, 0x3c, 0x6e, 0x73, 0x97, 0x54, 0xe6, + }, chaincfg.MainNetParams.Bech32HRPSegwit, + ), + f: func() (btcutil.Address, error) { + scriptHash := []byte{ + 0xef, 0x46, 0xd1, 0xaa, 0x78, 0x10, 0x1e, 0x33, + 0x50, 0x60, 0x0a, 0x5d, 0x36, 0x04, 0x5b, 0xa9, + 0x7c, 0x26, 0x70, 0xda, 0xa9, 0x1e, 0x9f, 0x3a, + 0x48, 0xc4, 0x3c, 0x6e, 0x73, 0x97, 0x54, 0xe6, + } + return btcutil.NewAddressTaproot( + scriptHash, &chaincfg.MainNetParams, + ) + }, + net: &chaincfg.MainNetParams, + }, + + // Invalid bech32m tests. Source: + // https://github.com/bitcoin/bips/blob/master/bip-0350.mediawiki + { + name: "segwit v1 invalid human-readable part", + addr: "tc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vq5zuyut", + valid: false, + net: &chaincfg.MainNetParams, + }, + { + name: "segwit v1 mainnet bech32 instead of bech32m", + addr: "bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqh2y7hd", + valid: false, + net: &chaincfg.MainNetParams, + }, + { + name: "segwit v1 testnet bech32 instead of bech32m", + addr: "tb1z0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqglt7rf", + valid: false, + net: &chaincfg.TestNet3Params, + }, + { + name: "segwit v1 mainnet bech32 instead of bech32m upper case", + addr: "BC1S0XLXVLHEMJA6C4DQV22UAPCTQUPFHLXM9H8Z3K2E72Q4K9HCZ7VQ54WELL", + valid: false, + net: &chaincfg.MainNetParams, + }, + { + name: "segwit v0 mainnet bech32m instead of bech32", + addr: "bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kemeawh", + valid: false, + net: &chaincfg.MainNetParams, + }, + { + name: "segwit v1 testnet bech32 instead of bech32m second test", + addr: "tb1q0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vq24jc47", + valid: false, + net: &chaincfg.TestNet3Params, + }, + { + name: "segwit v1 mainnet bech32m invalid character in checksum", + addr: "bc1p38j9r5y49hruaue7wxjce0updqjuyyx0kh56v8s25huc6995vvpql3jow4", + valid: false, + net: &chaincfg.MainNetParams, + }, + { + name: "segwit mainnet witness v17", + addr: "BC130XLXVLHEMJA6C4DQV22UAPCTQUPFHLXM9H8Z3K2E72Q4K9HCZ7VQ7ZWS8R", + valid: false, + net: &chaincfg.MainNetParams, + }, + { + name: "segwit v1 mainnet bech32m invalid program length (1 byte)", + addr: "bc1pw5dgrnzv", + valid: false, + net: &chaincfg.MainNetParams, + }, + { + name: "segwit v1 mainnet bech32m invalid program length (41 bytes)", + addr: "bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7v8n0nx0muaewav253zgeav", + valid: false, + net: &chaincfg.MainNetParams, + }, + { + name: "segwit v1 testnet bech32m mixed case", + addr: "tb1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vq47Zagq", + valid: false, + net: &chaincfg.TestNet3Params, + }, + { + name: "segwit v1 mainnet bech32m zero padding of more than 4 bits", + addr: "bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7v07qwwzcrf", + valid: false, + net: &chaincfg.MainNetParams, + }, + { + name: "segwit v1 mainnet bech32m non-zero padding in 8-to-5-conversion", + addr: "tb1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vpggkg4j", + valid: false, + net: &chaincfg.TestNet3Params, + }, + { + name: "segwit v1 mainnet bech32m empty data section", + addr: "bc1gmk9yu", + valid: false, + net: &chaincfg.MainNetParams, + }, + + // Unsupported witness versions (version 0 and 1 only supported at this point) + { + name: "segwit mainnet witness v16", + addr: "BC1SW50QA3JX3S", + valid: false, + net: &chaincfg.MainNetParams, + }, + { + name: "segwit mainnet witness v2", + addr: "bc1zw508d6qejxtdg4y5r3zarvaryvg6kdaj", + valid: false, + net: &chaincfg.MainNetParams, + }, + // Invalid segwit addresses + { + name: "segwit invalid hrp", + addr: "tc1qw508d6qejxtdg4y5r3zarvary0c5xw7kg3g4ty", + valid: false, + net: &chaincfg.TestNet3Params, + }, + { + name: "segwit invalid checksum", + addr: "bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t5", + valid: false, + net: &chaincfg.MainNetParams, + }, + { + name: "segwit invalid witness version", + addr: "BC13W508D6QEJXTDG4Y5R3ZARVARY0C5XW7KN40WF2", + valid: false, + net: &chaincfg.MainNetParams, + }, + { + name: "segwit invalid program length", + addr: "bc1rw5uspcuh", + valid: false, + net: &chaincfg.MainNetParams, + }, + { + name: "segwit invalid program length", + addr: "bc10w508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kw5rljs90", + valid: false, + net: &chaincfg.MainNetParams, + }, + { + name: "segwit invalid program length for witness version 0 (per BIP141)", + addr: "BC1QR508D6QEJXTDG4Y5R3ZARVARYV98GJ9P", + valid: false, + net: &chaincfg.MainNetParams, + }, + { + name: "segwit mixed case", + addr: "tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sL5k7", + valid: false, + net: &chaincfg.TestNet3Params, + }, + { + name: "segwit zero padding of more than 4 bits", + addr: "tb1pw508d6qejxtdg4y5r3zarqfsj6c3", + valid: false, + net: &chaincfg.TestNet3Params, + }, + { + name: "segwit non-zero padding in 8-to-5 conversion", + addr: "tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3pjxtptv", + valid: false, + net: &chaincfg.TestNet3Params, + }, + } + + if err := chaincfg.Register(&customParams); err != nil { + panic(err) + } + + for _, test := range tests { + // Decode addr and compare error against valid. + decoded, err := btcutil.DecodeAddress(test.addr, test.net) + if (err == nil) != test.valid { + t.Errorf("%v: decoding test failed: %v", test.name, err) + return + } + + if err == nil { + // Ensure the stringer returns the same address as the + // original. + if decodedStringer, ok := decoded.(fmt.Stringer); ok { + addr := test.addr + + // For Segwit addresses the string representation + // will always be lower case, so in that case we + // convert the original to lower case first. + if strings.Contains(test.name, "segwit") { + addr = strings.ToLower(addr) + } + + if addr != decodedStringer.String() { + t.Errorf("%v: String on decoded value does not match expected value: %v != %v", + test.name, test.addr, decodedStringer.String()) + return + } + } + + // Encode again and compare against the original. + encoded := decoded.EncodeAddress() + if test.encoded != encoded { + t.Errorf("%v: decoding and encoding produced different addresses: %v != %v", + test.name, test.encoded, encoded) + return + } + + // Perform type-specific calculations. + var saddr []byte + switch d := decoded.(type) { + case *btcutil.AddressPubKeyHash: + saddr = btcutil.TstAddressSAddr(encoded) + + case *btcutil.AddressScriptHash: + saddr = btcutil.TstAddressSAddr(encoded) + + case *btcutil.AddressPubKey: + // Ignore the error here since the script + // address is checked below. + saddr, _ = hex.DecodeString(d.String()) + case *btcutil.AddressWitnessPubKeyHash: + saddr = btcutil.TstAddressSegwitSAddr(encoded) + case *btcutil.AddressWitnessScriptHash: + saddr = btcutil.TstAddressSegwitSAddr(encoded) + case *btcutil.AddressTaproot: + saddr = btcutil.TstAddressTaprootSAddr(encoded) + } + + // Check script address, as well as the Hash160 method for P2PKH and + // P2SH addresses. + if !bytes.Equal(saddr, decoded.ScriptAddress()) { + t.Errorf("%v: script addresses do not match:\n%x != \n%x", + test.name, saddr, decoded.ScriptAddress()) + return + } + switch a := decoded.(type) { + case *btcutil.AddressPubKeyHash: + if h := a.Hash160()[:]; !bytes.Equal(saddr, h) { + t.Errorf("%v: hashes do not match:\n%x != \n%x", + test.name, saddr, h) + return + } + + case *btcutil.AddressScriptHash: + if h := a.Hash160()[:]; !bytes.Equal(saddr, h) { + t.Errorf("%v: hashes do not match:\n%x != \n%x", + test.name, saddr, h) + return + } + + case *btcutil.AddressWitnessPubKeyHash: + if hrp := a.Hrp(); test.net.Bech32HRPSegwit != hrp { + t.Errorf("%v: hrps do not match:\n%x != \n%x", + test.name, test.net.Bech32HRPSegwit, hrp) + return + } + + expVer := test.result.(*btcutil.AddressWitnessPubKeyHash).WitnessVersion() + if v := a.WitnessVersion(); v != expVer { + t.Errorf("%v: witness versions do not match:\n%x != \n%x", + test.name, expVer, v) + return + } + + if p := a.WitnessProgram(); !bytes.Equal(saddr, p) { + t.Errorf("%v: witness programs do not match:\n%x != \n%x", + test.name, saddr, p) + return + } + + case *btcutil.AddressWitnessScriptHash: + if hrp := a.Hrp(); test.net.Bech32HRPSegwit != hrp { + t.Errorf("%v: hrps do not match:\n%x != \n%x", + test.name, test.net.Bech32HRPSegwit, hrp) + return + } + + expVer := test.result.(*btcutil.AddressWitnessScriptHash).WitnessVersion() + if v := a.WitnessVersion(); v != expVer { + t.Errorf("%v: witness versions do not match:\n%x != \n%x", + test.name, expVer, v) + return + } + + if p := a.WitnessProgram(); !bytes.Equal(saddr, p) { + t.Errorf("%v: witness programs do not match:\n%x != \n%x", + test.name, saddr, p) + return + } + } + + // Ensure the address is for the expected network. + if !decoded.IsForNet(test.net) { + t.Errorf("%v: calculated network does not match expected", + test.name) + return + } + } else { + // If there is an error, make sure we can print it + // correctly. + errStr := err.Error() + if errStr == "" { + t.Errorf("%v: error was non-nil but message is"+ + "empty: %v", test.name, err) + } + } + + if !test.valid { + // If address is invalid, but a creation function exists, + // verify that it returns a nil addr and non-nil error. + if test.f != nil { + _, err := test.f() + if err == nil { + t.Errorf("%v: address is invalid but creating new address succeeded", + test.name) + return + } + } + continue + } + + // Valid test, compare address created with f against expected result. + addr, err := test.f() + if err != nil { + t.Errorf("%v: address is valid but creating new address failed with error %v", + test.name, err) + return + } + + if !reflect.DeepEqual(addr, test.result) { + t.Errorf("%v: created address does not match expected result", + test.name) + return + } + } +} diff --git a/btcutil/amount.go b/btcutil/amount.go new file mode 100644 index 0000000000..bb70c9b11d --- /dev/null +++ b/btcutil/amount.go @@ -0,0 +1,133 @@ +// Copyright (c) 2013, 2014 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package btcutil + +import ( + "errors" + "fmt" + "math" + "strconv" + "strings" +) + +// AmountUnit describes a method of converting an Amount to something +// other than the base unit of a bitcoin. The value of the AmountUnit +// is the exponent component of the decadic multiple to convert from +// an amount in bitcoin to an amount counted in units. +type AmountUnit int + +// These constants define various units used when describing a bitcoin +// monetary amount. +const ( + AmountMegaBTC AmountUnit = 6 + AmountKiloBTC AmountUnit = 3 + AmountBTC AmountUnit = 0 + AmountMilliBTC AmountUnit = -3 + AmountMicroBTC AmountUnit = -6 + AmountSatoshi AmountUnit = -8 +) + +// String returns the unit as a string. For recognized units, the SI +// prefix is used, or "Satoshi" for the base unit. For all unrecognized +// units, "1eN BTC" is returned, where N is the AmountUnit. +func (u AmountUnit) String() string { + switch u { + case AmountMegaBTC: + return "MBTC" + case AmountKiloBTC: + return "kBTC" + case AmountBTC: + return "BTC" + case AmountMilliBTC: + return "mBTC" + case AmountMicroBTC: + return "μBTC" + case AmountSatoshi: + return "Satoshi" + default: + return "1e" + strconv.FormatInt(int64(u), 10) + " BTC" + } +} + +// Amount represents the base bitcoin monetary unit (colloquially referred +// to as a `Satoshi'). A single Amount is equal to 1e-8 of a bitcoin. +type Amount int64 + +// round converts a floating point number, which may or may not be representable +// as an integer, to the Amount integer type by rounding to the nearest integer. +// This is performed by adding or subtracting 0.5 depending on the sign, and +// relying on integer truncation to round the value to the nearest Amount. +func round(f float64) Amount { + if f < 0 { + return Amount(f - 0.5) + } + return Amount(f + 0.5) +} + +// NewAmount creates an Amount from a floating point value representing +// some value in bitcoin. NewAmount errors if f is NaN or +-Infinity, but +// does not check that the amount is within the total amount of bitcoin +// producible as f may not refer to an amount at a single moment in time. +// +// NewAmount is for specifically for converting BTC to Satoshi. +// For creating a new Amount with an int64 value which denotes a quantity of Satoshi, +// do a simple type conversion from type int64 to Amount. +// See GoDoc for example: http://godoc.org/github.com/btcsuite/btcd/btcutil#example-Amount +func NewAmount(f float64) (Amount, error) { + // The amount is only considered invalid if it cannot be represented + // as an integer type. This may happen if f is NaN or +-Infinity. + switch { + case math.IsNaN(f): + fallthrough + case math.IsInf(f, 1): + fallthrough + case math.IsInf(f, -1): + return 0, errors.New("invalid bitcoin amount") + } + + return round(f * SatoshiPerBitcoin), nil +} + +// ToUnit converts a monetary amount counted in bitcoin base units to a +// floating point value representing an amount of bitcoin. +func (a Amount) ToUnit(u AmountUnit) float64 { + return float64(a) / math.Pow10(int(u+8)) +} + +// ToBTC is the equivalent of calling ToUnit with AmountBTC. +func (a Amount) ToBTC() float64 { + return a.ToUnit(AmountBTC) +} + +// Format formats a monetary amount counted in bitcoin base units as a +// string for a given unit. The conversion will succeed for any unit, +// however, known units will be formatted with an appended label describing +// the units with SI notation, or "Satoshi" for the base unit. +func (a Amount) Format(u AmountUnit) string { + units := " " + u.String() + formatted := strconv.FormatFloat(a.ToUnit(u), 'f', -int(u+8), 64) + + // When formatting full BTC, add trailing zeroes for numbers + // with decimal point to ease reading of sat amount. + if u == AmountBTC { + if strings.Contains(formatted, ".") { + return fmt.Sprintf("%.8f%s", a.ToUnit(u), units) + } + } + return formatted + units +} + +// String is the equivalent of calling Format with AmountBTC. +func (a Amount) String() string { + return a.Format(AmountBTC) +} + +// MulF64 multiplies an Amount by a floating point value. While this is not +// an operation that must typically be done by a full node or wallet, it is +// useful for services that build on top of bitcoin (for example, calculating +// a fee by multiplying by a percentage). +func (a Amount) MulF64(f float64) Amount { + return round(float64(a) * f) +} diff --git a/btcutil/amount_test.go b/btcutil/amount_test.go new file mode 100644 index 0000000000..69498b07e2 --- /dev/null +++ b/btcutil/amount_test.go @@ -0,0 +1,330 @@ +// Copyright (c) 2013, 2014 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package btcutil_test + +import ( + "math" + "testing" + + . "github.com/btcsuite/btcd/btcutil" +) + +func TestAmountCreation(t *testing.T) { + tests := []struct { + name string + amount float64 + valid bool + expected Amount + }{ + // Positive tests. + { + name: "zero", + amount: 0, + valid: true, + expected: 0, + }, + { + name: "max producible", + amount: 21e6, + valid: true, + expected: MaxSatoshi, + }, + { + name: "min producible", + amount: -21e6, + valid: true, + expected: -MaxSatoshi, + }, + { + name: "exceeds max producible", + amount: 21e6 + 1e-8, + valid: true, + expected: MaxSatoshi + 1, + }, + { + name: "exceeds min producible", + amount: -21e6 - 1e-8, + valid: true, + expected: -MaxSatoshi - 1, + }, + { + name: "one hundred", + amount: 100, + valid: true, + expected: 100 * SatoshiPerBitcoin, + }, + { + name: "fraction", + amount: 0.01234567, + valid: true, + expected: 1234567, + }, + { + name: "rounding up", + amount: 54.999999999999943157, + valid: true, + expected: 55 * SatoshiPerBitcoin, + }, + { + name: "rounding down", + amount: 55.000000000000056843, + valid: true, + expected: 55 * SatoshiPerBitcoin, + }, + + // Negative tests. + { + name: "not-a-number", + amount: math.NaN(), + valid: false, + }, + { + name: "-infinity", + amount: math.Inf(-1), + valid: false, + }, + { + name: "+infinity", + amount: math.Inf(1), + valid: false, + }, + } + + for _, test := range tests { + a, err := NewAmount(test.amount) + switch { + case test.valid && err != nil: + t.Errorf("%v: Positive test Amount creation failed with: %v", test.name, err) + continue + case !test.valid && err == nil: + t.Errorf("%v: Negative test Amount creation succeeded (value %v) when should fail", test.name, a) + continue + } + + if a != test.expected { + t.Errorf("%v: Created amount %v does not match expected %v", test.name, a, test.expected) + continue + } + } +} + +func TestAmountUnitConversions(t *testing.T) { + tests := []struct { + name string + amount Amount + unit AmountUnit + converted float64 + s string + }{ + { + name: "MBTC", + amount: MaxSatoshi, + unit: AmountMegaBTC, + converted: 21, + s: "21 MBTC", + }, + { + name: "kBTC", + amount: 44433322211100, + unit: AmountKiloBTC, + converted: 444.33322211100, + s: "444.333222111 kBTC", + }, + { + name: "BTC", + amount: 44433322211100, + unit: AmountBTC, + converted: 444333.222111, + s: "444333.22211100 BTC", + }, + { + name: "a thousand satoshi as BTC", + amount: 1000, + unit: AmountBTC, + converted: 0.00001, + s: "0.00001000 BTC", + }, + { + name: "a single satoshi as BTC", + amount: 1, + unit: AmountBTC, + converted: 0.00000001, + s: "0.00000001 BTC", + }, + { + name: "amount with trailing zero but no decimals", + amount: 1000000000, + unit: AmountBTC, + converted: 10, + s: "10 BTC", + }, + { + name: "mBTC", + amount: 44433322211100, + unit: AmountMilliBTC, + converted: 444333222.11100, + s: "444333222.111 mBTC", + }, + { + + name: "μBTC", + amount: 44433322211100, + unit: AmountMicroBTC, + converted: 444333222111.00, + s: "444333222111 μBTC", + }, + { + + name: "satoshi", + amount: 44433322211100, + unit: AmountSatoshi, + converted: 44433322211100, + s: "44433322211100 Satoshi", + }, + { + + name: "non-standard unit", + amount: 44433322211100, + unit: AmountUnit(-1), + converted: 4443332.2211100, + s: "4443332.22111 1e-1 BTC", + }, + } + + for _, test := range tests { + f := test.amount.ToUnit(test.unit) + if f != test.converted { + t.Errorf("%v: converted value %v does not match expected %v", test.name, f, test.converted) + continue + } + + s := test.amount.Format(test.unit) + if s != test.s { + t.Errorf("%v: format '%v' does not match expected '%v'", test.name, s, test.s) + continue + } + + // Verify that Amount.ToBTC works as advertised. + f1 := test.amount.ToUnit(AmountBTC) + f2 := test.amount.ToBTC() + if f1 != f2 { + t.Errorf("%v: ToBTC does not match ToUnit(AmountBTC): %v != %v", test.name, f1, f2) + } + + // Verify that Amount.String works as advertised. + s1 := test.amount.Format(AmountBTC) + s2 := test.amount.String() + if s1 != s2 { + t.Errorf("%v: String does not match Format(AmountBitcoin): %v != %v", test.name, s1, s2) + } + } +} + +func TestAmountMulF64(t *testing.T) { + tests := []struct { + name string + amt Amount + mul float64 + res Amount + }{ + { + name: "Multiply 0.1 BTC by 2", + amt: 100e5, // 0.1 BTC + mul: 2, + res: 200e5, // 0.2 BTC + }, + { + name: "Multiply 0.2 BTC by 0.02", + amt: 200e5, // 0.2 BTC + mul: 1.02, + res: 204e5, // 0.204 BTC + }, + { + name: "Multiply 0.1 BTC by -2", + amt: 100e5, // 0.1 BTC + mul: -2, + res: -200e5, // -0.2 BTC + }, + { + name: "Multiply 0.2 BTC by -0.02", + amt: 200e5, // 0.2 BTC + mul: -1.02, + res: -204e5, // -0.204 BTC + }, + { + name: "Multiply -0.1 BTC by 2", + amt: -100e5, // -0.1 BTC + mul: 2, + res: -200e5, // -0.2 BTC + }, + { + name: "Multiply -0.2 BTC by 0.02", + amt: -200e5, // -0.2 BTC + mul: 1.02, + res: -204e5, // -0.204 BTC + }, + { + name: "Multiply -0.1 BTC by -2", + amt: -100e5, // -0.1 BTC + mul: -2, + res: 200e5, // 0.2 BTC + }, + { + name: "Multiply -0.2 BTC by -0.02", + amt: -200e5, // -0.2 BTC + mul: -1.02, + res: 204e5, // 0.204 BTC + }, + { + name: "Round down", + amt: 49, // 49 Satoshis + mul: 0.01, + res: 0, + }, + { + name: "Round up", + amt: 50, // 50 Satoshis + mul: 0.01, + res: 1, // 1 Satoshi + }, + { + name: "Multiply by 0.", + amt: 1e8, // 1 BTC + mul: 0, + res: 0, // 0 BTC + }, + { + name: "Multiply 1 by 0.5.", + amt: 1, // 1 Satoshi + mul: 0.5, + res: 1, // 1 Satoshi + }, + { + name: "Multiply 100 by 66%.", + amt: 100, // 100 Satoshis + mul: 0.66, + res: 66, // 66 Satoshis + }, + { + name: "Multiply 100 by 66.6%.", + amt: 100, // 100 Satoshis + mul: 0.666, + res: 67, // 67 Satoshis + }, + { + name: "Multiply 100 by 2/3.", + amt: 100, // 100 Satoshis + mul: 2.0 / 3, + res: 67, // 67 Satoshis + }, + } + + for _, test := range tests { + a := test.amt.MulF64(test.mul) + if a != test.res { + t.Errorf("%v: expected %v got %v", test.name, test.res, a) + } + } +} diff --git a/btcutil/appdata.go b/btcutil/appdata.go new file mode 100644 index 0000000000..b6c63b9a29 --- /dev/null +++ b/btcutil/appdata.go @@ -0,0 +1,106 @@ +// Copyright (c) 2013-2017 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package btcutil + +import ( + "os" + "os/user" + "path/filepath" + "runtime" + "strings" + "unicode" +) + +// appDataDir returns an operating system specific directory to be used for +// storing application data for an application. See AppDataDir for more +// details. This unexported version takes an operating system argument +// primarily to enable the testing package to properly test the function by +// forcing an operating system that is not the currently one. +func appDataDir(goos, appName string, roaming bool) string { + if appName == "" || appName == "." { + return "." + } + + // The caller really shouldn't prepend the appName with a period, but + // if they do, handle it gracefully by trimming it. + appName = strings.TrimPrefix(appName, ".") + appNameUpper := string(unicode.ToUpper(rune(appName[0]))) + appName[1:] + appNameLower := string(unicode.ToLower(rune(appName[0]))) + appName[1:] + + // Get the OS specific home directory via the Go standard lib. + var homeDir string + usr, err := user.Current() + if err == nil { + homeDir = usr.HomeDir + } + + // Fall back to standard HOME environment variable that works + // for most POSIX OSes if the directory from the Go standard + // lib failed. + if err != nil || homeDir == "" { + homeDir = os.Getenv("HOME") + } + + switch goos { + // Attempt to use the LOCALAPPDATA or APPDATA environment variable on + // Windows. + case "windows": + // Windows XP and before didn't have a LOCALAPPDATA, so fallback + // to regular APPDATA when LOCALAPPDATA is not set. + appData := os.Getenv("LOCALAPPDATA") + if roaming || appData == "" { + appData = os.Getenv("APPDATA") + } + + if appData != "" { + return filepath.Join(appData, appNameUpper) + } + + case "darwin": + if homeDir != "" { + return filepath.Join(homeDir, "Library", + "Application Support", appNameUpper) + } + + case "plan9": + if homeDir != "" { + return filepath.Join(homeDir, appNameLower) + } + + default: + if homeDir != "" { + return filepath.Join(homeDir, "."+appNameLower) + } + } + + // Fall back to the current directory if all else fails. + return "." +} + +// AppDataDir returns an operating system specific directory to be used for +// storing application data for an application. +// +// The appName parameter is the name of the application the data directory is +// being requested for. This function will prepend a period to the appName for +// POSIX style operating systems since that is standard practice. An empty +// appName or one with a single dot is treated as requesting the current +// directory so only "." will be returned. Further, the first character +// of appName will be made lowercase for POSIX style operating systems and +// uppercase for Mac and Windows since that is standard practice. +// +// The roaming parameter only applies to Windows where it specifies the roaming +// application data profile (%APPDATA%) should be used instead of the local one +// (%LOCALAPPDATA%) that is used by default. +// +// Example results: +// +// dir := AppDataDir("myapp", false) +// POSIX (Linux/BSD): ~/.myapp +// Mac OS: $HOME/Library/Application Support/Myapp +// Windows: %LOCALAPPDATA%\Myapp +// Plan 9: $home/myapp +func AppDataDir(appName string, roaming bool) string { + return appDataDir(runtime.GOOS, appName, roaming) +} diff --git a/btcutil/appdata_test.go b/btcutil/appdata_test.go new file mode 100644 index 0000000000..061b1b5d80 --- /dev/null +++ b/btcutil/appdata_test.go @@ -0,0 +1,133 @@ +// Copyright (c) 2013-2014 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package btcutil_test + +import ( + "os" + "os/user" + "path/filepath" + "runtime" + "testing" + "unicode" + + "github.com/btcsuite/btcd/btcutil" +) + +// TestAppDataDir tests the API for AppDataDir to ensure it gives expected +// results for various operating systems. +func TestAppDataDir(t *testing.T) { + // App name plus upper and lowercase variants. + appName := "myapp" + appNameUpper := string(unicode.ToUpper(rune(appName[0]))) + appName[1:] + appNameLower := string(unicode.ToLower(rune(appName[0]))) + appName[1:] + + // When we're on Windows, set the expected local and roaming directories + // per the environment vars. When we aren't on Windows, the function + // should return the current directory when forced to provide the + // Windows path since the environment variables won't exist. + winLocal := "." + winRoaming := "." + if runtime.GOOS == "windows" { + localAppData := os.Getenv("LOCALAPPDATA") + roamingAppData := os.Getenv("APPDATA") + if localAppData == "" { + localAppData = roamingAppData + } + winLocal = filepath.Join(localAppData, appNameUpper) + winRoaming = filepath.Join(roamingAppData, appNameUpper) + } + + // Get the home directory to use for testing expected results. + var homeDir string + usr, err := user.Current() + if err != nil { + t.Errorf("user.Current: %v", err) + return + } + homeDir = usr.HomeDir + + // Mac app data directory. + macAppData := filepath.Join(homeDir, "Library", "Application Support") + + tests := []struct { + goos string + appName string + roaming bool + want string + }{ + // Various combinations of application name casing, leading + // period, operating system, and roaming flags. + {"windows", appNameLower, false, winLocal}, + {"windows", appNameUpper, false, winLocal}, + {"windows", "." + appNameLower, false, winLocal}, + {"windows", "." + appNameUpper, false, winLocal}, + {"windows", appNameLower, true, winRoaming}, + {"windows", appNameUpper, true, winRoaming}, + {"windows", "." + appNameLower, true, winRoaming}, + {"windows", "." + appNameUpper, true, winRoaming}, + {"linux", appNameLower, false, filepath.Join(homeDir, "."+appNameLower)}, + {"linux", appNameUpper, false, filepath.Join(homeDir, "."+appNameLower)}, + {"linux", "." + appNameLower, false, filepath.Join(homeDir, "."+appNameLower)}, + {"linux", "." + appNameUpper, false, filepath.Join(homeDir, "."+appNameLower)}, + {"darwin", appNameLower, false, filepath.Join(macAppData, appNameUpper)}, + {"darwin", appNameUpper, false, filepath.Join(macAppData, appNameUpper)}, + {"darwin", "." + appNameLower, false, filepath.Join(macAppData, appNameUpper)}, + {"darwin", "." + appNameUpper, false, filepath.Join(macAppData, appNameUpper)}, + {"openbsd", appNameLower, false, filepath.Join(homeDir, "."+appNameLower)}, + {"openbsd", appNameUpper, false, filepath.Join(homeDir, "."+appNameLower)}, + {"openbsd", "." + appNameLower, false, filepath.Join(homeDir, "."+appNameLower)}, + {"openbsd", "." + appNameUpper, false, filepath.Join(homeDir, "."+appNameLower)}, + {"freebsd", appNameLower, false, filepath.Join(homeDir, "."+appNameLower)}, + {"freebsd", appNameUpper, false, filepath.Join(homeDir, "."+appNameLower)}, + {"freebsd", "." + appNameLower, false, filepath.Join(homeDir, "."+appNameLower)}, + {"freebsd", "." + appNameUpper, false, filepath.Join(homeDir, "."+appNameLower)}, + {"netbsd", appNameLower, false, filepath.Join(homeDir, "."+appNameLower)}, + {"netbsd", appNameUpper, false, filepath.Join(homeDir, "."+appNameLower)}, + {"netbsd", "." + appNameLower, false, filepath.Join(homeDir, "."+appNameLower)}, + {"netbsd", "." + appNameUpper, false, filepath.Join(homeDir, "."+appNameLower)}, + {"plan9", appNameLower, false, filepath.Join(homeDir, appNameLower)}, + {"plan9", appNameUpper, false, filepath.Join(homeDir, appNameLower)}, + {"plan9", "." + appNameLower, false, filepath.Join(homeDir, appNameLower)}, + {"plan9", "." + appNameUpper, false, filepath.Join(homeDir, appNameLower)}, + {"unrecognized", appNameLower, false, filepath.Join(homeDir, "."+appNameLower)}, + {"unrecognized", appNameUpper, false, filepath.Join(homeDir, "."+appNameLower)}, + {"unrecognized", "." + appNameLower, false, filepath.Join(homeDir, "."+appNameLower)}, + {"unrecognized", "." + appNameUpper, false, filepath.Join(homeDir, "."+appNameLower)}, + + // No application name provided, so expect current directory. + {"windows", "", false, "."}, + {"windows", "", true, "."}, + {"linux", "", false, "."}, + {"darwin", "", false, "."}, + {"openbsd", "", false, "."}, + {"freebsd", "", false, "."}, + {"netbsd", "", false, "."}, + {"plan9", "", false, "."}, + {"unrecognized", "", false, "."}, + + // Single dot provided for application name, so expect current + // directory. + {"windows", ".", false, "."}, + {"windows", ".", true, "."}, + {"linux", ".", false, "."}, + {"darwin", ".", false, "."}, + {"openbsd", ".", false, "."}, + {"freebsd", ".", false, "."}, + {"netbsd", ".", false, "."}, + {"plan9", ".", false, "."}, + {"unrecognized", ".", false, "."}, + } + + t.Logf("Running %d tests", len(tests)) + for i, test := range tests { + ret := btcutil.TstAppDataDir(test.goos, test.appName, test.roaming) + if ret != test.want { + t.Errorf("appDataDir #%d (%s) does not match - "+ + "expected got %s, want %s", i, test.goos, ret, + test.want) + continue + } + } +} diff --git a/btcutil/base58/README.md b/btcutil/base58/README.md new file mode 100644 index 0000000000..abdb78155d --- /dev/null +++ b/btcutil/base58/README.md @@ -0,0 +1,34 @@ +base58 +========== + +[![Build Status](http://img.shields.io/travis/btcsuite/btcutil.svg)](https://travis-ci.org/btcsuite/btcutil) +[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) +[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/btcsuite/btcd/btcutil/base58) + +Package base58 provides an API for encoding and decoding to and from the +modified base58 encoding. It also provides an API to do Base58Check encoding, +as described [here](https://en.bitcoin.it/wiki/Base58Check_encoding). + +A comprehensive suite of tests is provided to ensure proper functionality. + +## Installation and Updating + +```bash +$ go get -u github.com/btcsuite/btcd/btcutil/base58 +``` + +## Examples + +* [Decode Example](http://godoc.org/github.com/btcsuite/btcd/btcutil/base58#example-Decode) + Demonstrates how to decode modified base58 encoded data. +* [Encode Example](http://godoc.org/github.com/btcsuite/btcd/btcutil/base58#example-Encode) + Demonstrates how to encode data using the modified base58 encoding scheme. +* [CheckDecode Example](http://godoc.org/github.com/btcsuite/btcd/btcutil/base58#example-CheckDecode) + Demonstrates how to decode Base58Check encoded data. +* [CheckEncode Example](http://godoc.org/github.com/btcsuite/btcd/btcutil/base58#example-CheckEncode) + Demonstrates how to encode data using the Base58Check encoding scheme. + +## License + +Package base58 is licensed under the [copyfree](http://copyfree.org) ISC +License. diff --git a/btcutil/base58/alphabet.go b/btcutil/base58/alphabet.go new file mode 100644 index 0000000000..6bb39fef11 --- /dev/null +++ b/btcutil/base58/alphabet.go @@ -0,0 +1,49 @@ +// Copyright (c) 2015 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +// AUTOGENERATED by genalphabet.go; do not edit. + +package base58 + +const ( + // alphabet is the modified base58 alphabet used by Bitcoin. + alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" + + alphabetIdx0 = '1' +) + +var b58 = [256]byte{ + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 0, 1, 2, 3, 4, 5, 6, + 7, 8, 255, 255, 255, 255, 255, 255, + 255, 9, 10, 11, 12, 13, 14, 15, + 16, 255, 17, 18, 19, 20, 21, 255, + 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 255, 255, 255, 255, 255, + 255, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 255, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, +} diff --git a/btcutil/base58/base58.go b/btcutil/base58/base58.go new file mode 100644 index 0000000000..bd0ea47cd9 --- /dev/null +++ b/btcutil/base58/base58.go @@ -0,0 +1,142 @@ +// Copyright (c) 2013-2015 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package base58 + +import ( + "math/big" +) + +//go:generate go run genalphabet.go + +var bigRadix = [...]*big.Int{ + big.NewInt(0), + big.NewInt(58), + big.NewInt(58 * 58), + big.NewInt(58 * 58 * 58), + big.NewInt(58 * 58 * 58 * 58), + big.NewInt(58 * 58 * 58 * 58 * 58), + big.NewInt(58 * 58 * 58 * 58 * 58 * 58), + big.NewInt(58 * 58 * 58 * 58 * 58 * 58 * 58), + big.NewInt(58 * 58 * 58 * 58 * 58 * 58 * 58 * 58), + big.NewInt(58 * 58 * 58 * 58 * 58 * 58 * 58 * 58 * 58), + bigRadix10, +} + +var bigRadix10 = big.NewInt(58 * 58 * 58 * 58 * 58 * 58 * 58 * 58 * 58 * 58) // 58^10 + +// Decode decodes a modified base58 string to a byte slice. +func Decode(b string) []byte { + answer := big.NewInt(0) + scratch := new(big.Int) + + // Calculating with big.Int is slow for each iteration. + // x += b58[b[i]] * j + // j *= 58 + // + // Instead we can try to do as much calculations on int64. + // We can represent a 10 digit base58 number using an int64. + // + // Hence we'll try to convert 10, base58 digits at a time. + // The rough idea is to calculate `t`, such that: + // + // t := b58[b[i+9]] * 58^9 ... + b58[b[i+1]] * 58^1 + b58[b[i]] * 58^0 + // x *= 58^10 + // x += t + // + // Of course, in addition, we'll need to handle boundary condition when `b` is not multiple of 58^10. + // In that case we'll use the bigRadix[n] lookup for the appropriate power. + for t := b; len(t) > 0; { + n := len(t) + if n > 10 { + n = 10 + } + + total := uint64(0) + for _, v := range t[:n] { + if v > 255 { + return []byte("") + } + + tmp := b58[v] + if tmp == 255 { + return []byte("") + } + total = total*58 + uint64(tmp) + } + + answer.Mul(answer, bigRadix[n]) + scratch.SetUint64(total) + answer.Add(answer, scratch) + + t = t[n:] + } + + tmpval := answer.Bytes() + + var numZeros int + for numZeros = 0; numZeros < len(b); numZeros++ { + if b[numZeros] != alphabetIdx0 { + break + } + } + flen := numZeros + len(tmpval) + val := make([]byte, flen) + copy(val[numZeros:], tmpval) + + return val +} + +// Encode encodes a byte slice to a modified base58 string. +func Encode(b []byte) string { + x := new(big.Int) + x.SetBytes(b) + + // maximum length of output is log58(2^(8*len(b))) == len(b) * 8 / log(58) + maxlen := int(float64(len(b))*1.365658237309761) + 1 + answer := make([]byte, 0, maxlen) + mod := new(big.Int) + for x.Sign() > 0 { + // Calculating with big.Int is slow for each iteration. + // x, mod = x / 58, x % 58 + // + // Instead we can try to do as much calculations on int64. + // x, mod = x / 58^10, x % 58^10 + // + // Which will give us mod, which is 10 digit base58 number. + // We'll loop that 10 times to convert to the answer. + + x.DivMod(x, bigRadix10, mod) + if x.Sign() == 0 { + // When x = 0, we need to ensure we don't add any extra zeros. + m := mod.Int64() + for m > 0 { + answer = append(answer, alphabet[m%58]) + m /= 58 + } + } else { + m := mod.Int64() + for i := 0; i < 10; i++ { + answer = append(answer, alphabet[m%58]) + m /= 58 + } + } + } + + // leading zero bytes + for _, i := range b { + if i != 0 { + break + } + answer = append(answer, alphabetIdx0) + } + + // reverse + alen := len(answer) + for i := 0; i < alen/2; i++ { + answer[i], answer[alen-1-i] = answer[alen-1-i], answer[i] + } + + return string(answer) +} diff --git a/btcutil/base58/base58_test.go b/btcutil/base58/base58_test.go new file mode 100644 index 0000000000..eb7e4d4bcf --- /dev/null +++ b/btcutil/base58/base58_test.go @@ -0,0 +1,103 @@ +// Copyright (c) 2013-2017 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package base58_test + +import ( + "bytes" + "encoding/hex" + "testing" + + "github.com/btcsuite/btcd/btcutil/base58" +) + +var stringTests = []struct { + in string + out string +}{ + {"", ""}, + {" ", "Z"}, + {"-", "n"}, + {"0", "q"}, + {"1", "r"}, + {"-1", "4SU"}, + {"11", "4k8"}, + {"abc", "ZiCa"}, + {"1234598760", "3mJr7AoUXx2Wqd"}, + {"abcdefghijklmnopqrstuvwxyz", "3yxU3u1igY8WkgtjK92fbJQCd4BZiiT1v25f"}, + {"00000000000000000000000000000000000000000000000000000000000000", "3sN2THZeE9Eh9eYrwkvZqNstbHGvrxSAM7gXUXvyFQP8XvQLUqNCS27icwUeDT7ckHm4FUHM2mTVh1vbLmk7y"}, +} + +var invalidStringTests = []struct { + in string + out string +}{ + {"0", ""}, + {"O", ""}, + {"I", ""}, + {"l", ""}, + {"3mJr0", ""}, + {"O3yxU", ""}, + {"3sNI", ""}, + {"4kl8", ""}, + {"0OIl", ""}, + {"!@#$%^&*()-_=+~`", ""}, + {"abcd\xd80", ""}, + {"abcd\U000020BF", ""}, +} + +var hexTests = []struct { + in string + out string +}{ + {"", ""}, + {"61", "2g"}, + {"626262", "a3gV"}, + {"636363", "aPEr"}, + {"73696d706c792061206c6f6e6720737472696e67", "2cFupjhnEsSn59qHXstmK2ffpLv2"}, + {"00eb15231dfceb60925886b67d065299925915aeb172c06647", "1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L"}, + {"516b6fcd0f", "ABnLTmg"}, + {"bf4f89001e670274dd", "3SEo3LWLoPntC"}, + {"572e4794", "3EFU7m"}, + {"ecac89cad93923c02321", "EJDM8drfXA6uyA"}, + {"10c8511e", "Rt5zm"}, + {"00000000000000000000", "1111111111"}, + {"000111d38e5fc9071ffcd20b4a763cc9ae4f252bb4e48fd66a835e252ada93ff480d6dd43dc62a641155a5", "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"}, + {"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", "1cWB5HCBdLjAuqGGReWE3R3CguuwSjw6RHn39s2yuDRTS5NsBgNiFpWgAnEx6VQi8csexkgYw3mdYrMHr8x9i7aEwP8kZ7vccXWqKDvGv3u1GxFKPuAkn8JCPPGDMf3vMMnbzm6Nh9zh1gcNsMvH3ZNLmP5fSG6DGbbi2tuwMWPthr4boWwCxf7ewSgNQeacyozhKDDQQ1qL5fQFUW52QKUZDZ5fw3KXNQJMcNTcaB723LchjeKun7MuGW5qyCBZYzA1KjofN1gYBV3NqyhQJ3Ns746GNuf9N2pQPmHz4xpnSrrfCvy6TVVz5d4PdrjeshsWQwpZsZGzvbdAdN8MKV5QsBDY"}, +} + +func TestBase58(t *testing.T) { + // Encode tests + for x, test := range stringTests { + tmp := []byte(test.in) + if res := base58.Encode(tmp); res != test.out { + t.Errorf("Encode test #%d failed: got: %s want: %s", + x, res, test.out) + continue + } + } + + // Decode tests + for x, test := range hexTests { + b, err := hex.DecodeString(test.in) + if err != nil { + t.Errorf("hex.DecodeString failed failed #%d: got: %s", x, test.in) + continue + } + if res := base58.Decode(test.out); !bytes.Equal(res, b) { + t.Errorf("Decode test #%d failed: got: %q want: %q", + x, res, test.in) + continue + } + } + + // Decode with invalid input + for x, test := range invalidStringTests { + if res := base58.Decode(test.in); string(res) != test.out { + t.Errorf("Decode invalidString test #%d failed: got: %q want: %q", + x, res, test.out) + continue + } + } +} diff --git a/btcutil/base58/base58bench_test.go b/btcutil/base58/base58bench_test.go new file mode 100644 index 0000000000..c7286e53c7 --- /dev/null +++ b/btcutil/base58/base58bench_test.go @@ -0,0 +1,47 @@ +// Copyright (c) 2013-2014 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package base58_test + +import ( + "bytes" + "testing" + + "github.com/btcsuite/btcd/btcutil/base58" +) + +var ( + raw5k = bytes.Repeat([]byte{0xff}, 5000) + raw100k = bytes.Repeat([]byte{0xff}, 100*1000) + encoded5k = base58.Encode(raw5k) + encoded100k = base58.Encode(raw100k) +) + +func BenchmarkBase58Encode_5K(b *testing.B) { + b.SetBytes(int64(len(raw5k))) + for i := 0; i < b.N; i++ { + base58.Encode(raw5k) + } +} + +func BenchmarkBase58Encode_100K(b *testing.B) { + b.SetBytes(int64(len(raw100k))) + for i := 0; i < b.N; i++ { + base58.Encode(raw100k) + } +} + +func BenchmarkBase58Decode_5K(b *testing.B) { + b.SetBytes(int64(len(encoded5k))) + for i := 0; i < b.N; i++ { + base58.Decode(encoded5k) + } +} + +func BenchmarkBase58Decode_100K(b *testing.B) { + b.SetBytes(int64(len(encoded100k))) + for i := 0; i < b.N; i++ { + base58.Decode(encoded100k) + } +} diff --git a/btcutil/base58/base58check.go b/btcutil/base58/base58check.go new file mode 100644 index 0000000000..402c3233f4 --- /dev/null +++ b/btcutil/base58/base58check.go @@ -0,0 +1,52 @@ +// Copyright (c) 2013-2014 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package base58 + +import ( + "crypto/sha256" + "errors" +) + +// ErrChecksum indicates that the checksum of a check-encoded string does not verify against +// the checksum. +var ErrChecksum = errors.New("checksum error") + +// ErrInvalidFormat indicates that the check-encoded string has an invalid format. +var ErrInvalidFormat = errors.New("invalid format: version and/or checksum bytes missing") + +// checksum: first four bytes of sha256^2 +func checksum(input []byte) (cksum [4]byte) { + h := sha256.Sum256(input) + h2 := sha256.Sum256(h[:]) + copy(cksum[:], h2[:4]) + return +} + +// CheckEncode prepends a version byte and appends a four byte checksum. +func CheckEncode(input []byte, version byte) string { + b := make([]byte, 0, 1+len(input)+4) + b = append(b, version) + b = append(b, input...) + cksum := checksum(b) + b = append(b, cksum[:]...) + return Encode(b) +} + +// CheckDecode decodes a string that was encoded with CheckEncode and verifies the checksum. +func CheckDecode(input string) (result []byte, version byte, err error) { + decoded := Decode(input) + if len(decoded) < 5 { + return nil, 0, ErrInvalidFormat + } + version = decoded[0] + var cksum [4]byte + copy(cksum[:], decoded[len(decoded)-4:]) + if checksum(decoded[:len(decoded)-4]) != cksum { + return nil, 0, ErrChecksum + } + payload := decoded[1 : len(decoded)-4] + result = append(result, payload...) + return +} diff --git a/btcutil/base58/base58check_test.go b/btcutil/base58/base58check_test.go new file mode 100644 index 0000000000..e180b16391 --- /dev/null +++ b/btcutil/base58/base58check_test.go @@ -0,0 +1,69 @@ +// Copyright (c) 2013-2014 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package base58_test + +import ( + "testing" + + "github.com/btcsuite/btcd/btcutil/base58" +) + +var checkEncodingStringTests = []struct { + version byte + in string + out string +}{ + {20, "", "3MNQE1X"}, + {20, " ", "B2Kr6dBE"}, + {20, "-", "B3jv1Aft"}, + {20, "0", "B482yuaX"}, + {20, "1", "B4CmeGAC"}, + {20, "-1", "mM7eUf6kB"}, + {20, "11", "mP7BMTDVH"}, + {20, "abc", "4QiVtDjUdeq"}, + {20, "1234598760", "ZmNb8uQn5zvnUohNCEPP"}, + {20, "abcdefghijklmnopqrstuvwxyz", "K2RYDcKfupxwXdWhSAxQPCeiULntKm63UXyx5MvEH2"}, + {20, "00000000000000000000000000000000000000000000000000000000000000", "bi1EWXwJay2udZVxLJozuTb8Meg4W9c6xnmJaRDjg6pri5MBAxb9XwrpQXbtnqEoRV5U2pixnFfwyXC8tRAVC8XxnjK"}, +} + +func TestBase58Check(t *testing.T) { + for x, test := range checkEncodingStringTests { + // test encoding + if res := base58.CheckEncode([]byte(test.in), test.version); res != test.out { + t.Errorf("CheckEncode test #%d failed: got %s, want: %s", x, res, test.out) + } + + // test decoding + res, version, err := base58.CheckDecode(test.out) + switch { + case err != nil: + t.Errorf("CheckDecode test #%d failed with err: %v", x, err) + + case version != test.version: + t.Errorf("CheckDecode test #%d failed: got version: %d want: %d", x, version, test.version) + + case string(res) != test.in: + t.Errorf("CheckDecode test #%d failed: got: %s want: %s", x, res, test.in) + } + } + + // test the two decoding failure cases + // case 1: checksum error + _, _, err := base58.CheckDecode("3MNQE1Y") + if err != base58.ErrChecksum { + t.Error("Checkdecode test failed, expected ErrChecksum") + } + // case 2: invalid formats (string lengths below 5 mean the version byte and/or the checksum + // bytes are missing). + testString := "" + for len := 0; len < 4; len++ { + testString += "x" + _, _, err = base58.CheckDecode(testString) + if err != base58.ErrInvalidFormat { + t.Error("Checkdecode test failed, expected ErrInvalidFormat") + } + } + +} diff --git a/btcutil/base58/cov_report.sh b/btcutil/base58/cov_report.sh new file mode 100644 index 0000000000..307f05b76c --- /dev/null +++ b/btcutil/base58/cov_report.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +# This script uses gocov to generate a test coverage report. +# The gocov tool my be obtained with the following command: +# go get github.com/axw/gocov/gocov +# +# It will be installed to $GOPATH/bin, so ensure that location is in your $PATH. + +# Check for gocov. +type gocov >/dev/null 2>&1 +if [ $? -ne 0 ]; then + echo >&2 "This script requires the gocov tool." + echo >&2 "You may obtain it with the following command:" + echo >&2 "go get github.com/axw/gocov/gocov" + exit 1 +fi +gocov test | gocov report diff --git a/btcutil/base58/doc.go b/btcutil/base58/doc.go new file mode 100644 index 0000000000..d657f050f7 --- /dev/null +++ b/btcutil/base58/doc.go @@ -0,0 +1,29 @@ +// Copyright (c) 2014 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +/* +Package base58 provides an API for working with modified base58 and Base58Check +encodings. + +# Modified Base58 Encoding + +Standard base58 encoding is similar to standard base64 encoding except, as the +name implies, it uses a 58 character alphabet which results in an alphanumeric +string and allows some characters which are problematic for humans to be +excluded. Due to this, there can be various base58 alphabets. + +The modified base58 alphabet used by Bitcoin, and hence this package, omits the +0, O, I, and l characters that look the same in many fonts and are therefore +hard to humans to distinguish. + +# Base58Check Encoding Scheme + +The Base58Check encoding scheme is primarily used for Bitcoin addresses at the +time of this writing, however it can be used to generically encode arbitrary +byte arrays into human-readable strings along with a version byte that can be +used to differentiate the same payload. For Bitcoin addresses, the extra +version is used to differentiate the network of otherwise identical public keys +which helps prevent using an address intended for one network on another. +*/ +package base58 diff --git a/btcutil/base58/example_test.go b/btcutil/base58/example_test.go new file mode 100644 index 0000000000..babb35d3f4 --- /dev/null +++ b/btcutil/base58/example_test.go @@ -0,0 +1,71 @@ +// Copyright (c) 2014 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package base58_test + +import ( + "fmt" + + "github.com/btcsuite/btcd/btcutil/base58" +) + +// This example demonstrates how to decode modified base58 encoded data. +func ExampleDecode() { + // Decode example modified base58 encoded data. + encoded := "25JnwSn7XKfNQ" + decoded := base58.Decode(encoded) + + // Show the decoded data. + fmt.Println("Decoded Data:", string(decoded)) + + // Output: + // Decoded Data: Test data +} + +// This example demonstrates how to encode data using the modified base58 +// encoding scheme. +func ExampleEncode() { + // Encode example data with the modified base58 encoding scheme. + data := []byte("Test data") + encoded := base58.Encode(data) + + // Show the encoded data. + fmt.Println("Encoded Data:", encoded) + + // Output: + // Encoded Data: 25JnwSn7XKfNQ +} + +// This example demonstrates how to decode Base58Check encoded data. +func ExampleCheckDecode() { + // Decode an example Base58Check encoded data. + encoded := "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa" + decoded, version, err := base58.CheckDecode(encoded) + if err != nil { + fmt.Println(err) + return + } + + // Show the decoded data. + fmt.Printf("Decoded data: %x\n", decoded) + fmt.Println("Version Byte:", version) + + // Output: + // Decoded data: 62e907b15cbf27d5425399ebf6f0fb50ebb88f18 + // Version Byte: 0 +} + +// This example demonstrates how to encode data using the Base58Check encoding +// scheme. +func ExampleCheckEncode() { + // Encode example data with the Base58Check encoding scheme. + data := []byte("Test data") + encoded := base58.CheckEncode(data, 0) + + // Show the encoded data. + fmt.Println("Encoded Data:", encoded) + + // Output: + // Encoded Data: 182iP79GRURMp7oMHDU +} diff --git a/btcutil/base58/genalphabet.go b/btcutil/base58/genalphabet.go new file mode 100644 index 0000000000..959f34d4e2 --- /dev/null +++ b/btcutil/base58/genalphabet.go @@ -0,0 +1,80 @@ +// Copyright (c) 2015 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import ( + "bytes" + "io" + "log" + "os" + "strconv" +) + +var ( + start = []byte(`// Copyright (c) 2015 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +// AUTOGENERATED by genalphabet.go; do not edit. + +package base58 + +const ( + // alphabet is the modified base58 alphabet used by Bitcoin. + alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" + + alphabetIdx0 = '1' +) + +var b58 = [256]byte{`) + + end = []byte(`}`) + + alphabet = []byte("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz") + tab = []byte("\t") + invalid = []byte("255") + comma = []byte(",") + space = []byte(" ") + nl = []byte("\n") +) + +func write(w io.Writer, b []byte) { + _, err := w.Write(b) + if err != nil { + log.Fatal(err) + } +} + +func main() { + fi, err := os.Create("alphabet.go") + if err != nil { + log.Fatal(err) + } + defer fi.Close() + + write(fi, start) + write(fi, nl) + for i := byte(0); i < 32; i++ { + write(fi, tab) + for j := byte(0); j < 8; j++ { + idx := bytes.IndexByte(alphabet, i*8+j) + if idx == -1 { + write(fi, invalid) + } else { + write(fi, strconv.AppendInt(nil, int64(idx), 10)) + } + write(fi, comma) + if j != 7 { + write(fi, space) + } + } + write(fi, nl) + } + write(fi, end) + write(fi, nl) +} diff --git a/btcutil/bech32/README.md b/btcutil/bech32/README.md new file mode 100644 index 0000000000..471cd50ee9 --- /dev/null +++ b/btcutil/bech32/README.md @@ -0,0 +1,29 @@ +bech32 +========== + +[![Build Status](http://img.shields.io/travis/btcsuite/btcutil.svg)](https://travis-ci.org/btcsuite/btcutil) +[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) +[![GoDoc](https://godoc.org/github.com/btcsuite/btcd/btcutil/bech32?status.png)](http://godoc.org/github.com/btcsuite/btcd/btcutil/bech32) + +Package bech32 provides a Go implementation of the bech32 format specified in +[BIP 173](https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki). + +Test vectors from BIP 173 are added to ensure compatibility with the BIP. + +## Installation and Updating + +```bash +$ go get -u github.com/btcsuite/btcd/btcutil/bech32 +``` + +## Examples + +* [Bech32 decode Example](http://godoc.org/github.com/btcsuite/btcd/btcutil/bech32#example-Bech32Decode) + Demonstrates how to decode a bech32 encoded string. +* [Bech32 encode Example](http://godoc.org/github.com/btcsuite/btcd/btcutil/bech32#example-BechEncode) + Demonstrates how to encode data into a bech32 string. + +## License + +Package bech32 is licensed under the [copyfree](http://copyfree.org) ISC +License. diff --git a/btcutil/bech32/bech32.go b/btcutil/bech32/bech32.go new file mode 100644 index 0000000000..92994b2881 --- /dev/null +++ b/btcutil/bech32/bech32.go @@ -0,0 +1,445 @@ +// Copyright (c) 2017 The btcsuite developers +// Copyright (c) 2019 The Decred developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package bech32 + +import ( + "strings" +) + +// charset is the set of characters used in the data section of bech32 strings. +// Note that this is ordered, such that for a given charset[i], i is the binary +// value of the character. +const charset = "qpzry9x8gf2tvdw0s3jn54khce6mua7l" + +// gen encodes the generator polynomial for the bech32 BCH checksum. +var gen = []int{0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3} + +// toBytes converts each character in the string 'chars' to the value of the +// index of the corresponding character in 'charset'. +func toBytes(chars string) ([]byte, error) { + decoded := make([]byte, 0, len(chars)) + for i := 0; i < len(chars); i++ { + index := strings.IndexByte(charset, chars[i]) + if index < 0 { + return nil, ErrNonCharsetChar(chars[i]) + } + decoded = append(decoded, byte(index)) + } + return decoded, nil +} + +// bech32Polymod calculates the BCH checksum for a given hrp, values and +// checksum data. Checksum is optional, and if nil a 0 checksum is assumed. +// +// Values and checksum (if provided) MUST be encoded as 5 bits per element (base +// 32), otherwise the results are undefined. +// +// For more details on the polymod calculation, please refer to BIP 173. +func bech32Polymod(hrp string, values, checksum []byte) int { + chk := 1 + + // Account for the high bits of the HRP in the checksum. + for i := 0; i < len(hrp); i++ { + b := chk >> 25 + hiBits := int(hrp[i]) >> 5 + chk = (chk&0x1ffffff)<<5 ^ hiBits + for i := 0; i < 5; i++ { + if (b>>uint(i))&1 == 1 { + chk ^= gen[i] + } + } + } + + // Account for the separator (0) between high and low bits of the HRP. + // x^0 == x, so we eliminate the redundant xor used in the other rounds. + b := chk >> 25 + chk = (chk & 0x1ffffff) << 5 + for i := 0; i < 5; i++ { + if (b>>uint(i))&1 == 1 { + chk ^= gen[i] + } + } + + // Account for the low bits of the HRP. + for i := 0; i < len(hrp); i++ { + b := chk >> 25 + loBits := int(hrp[i]) & 31 + chk = (chk&0x1ffffff)<<5 ^ loBits + for i := 0; i < 5; i++ { + if (b>>uint(i))&1 == 1 { + chk ^= gen[i] + } + } + } + + // Account for the values. + for _, v := range values { + b := chk >> 25 + chk = (chk&0x1ffffff)<<5 ^ int(v) + for i := 0; i < 5; i++ { + if (b>>uint(i))&1 == 1 { + chk ^= gen[i] + } + } + } + + if checksum == nil { + // A nil checksum is used during encoding, so assume all bytes are zero. + // x^0 == x, so we eliminate the redundant xor used in the other rounds. + for v := 0; v < 6; v++ { + b := chk >> 25 + chk = (chk & 0x1ffffff) << 5 + for i := 0; i < 5; i++ { + if (b>>uint(i))&1 == 1 { + chk ^= gen[i] + } + } + } + } else { + // Checksum is provided during decoding, so use it. + for _, v := range checksum { + b := chk >> 25 + chk = (chk&0x1ffffff)<<5 ^ int(v) + for i := 0; i < 5; i++ { + if (b>>uint(i))&1 == 1 { + chk ^= gen[i] + } + } + } + } + + return chk +} + +// writeBech32Checksum calculates the checksum data expected for a string that +// will have the given hrp and payload data and writes it to the provided string +// builder. +// +// The payload data MUST be encoded as a base 32 (5 bits per element) byte slice +// and the hrp MUST only use the allowed character set (ascii chars between 33 +// and 126), otherwise the results are undefined. +// +// For more details on the checksum calculation, please refer to BIP 173. +func writeBech32Checksum(hrp string, data []byte, bldr *strings.Builder, + version Version) { + + bech32Const := int(VersionToConsts[version]) + polymod := bech32Polymod(hrp, data, nil) ^ bech32Const + for i := 0; i < 6; i++ { + b := byte((polymod >> uint(5*(5-i))) & 31) + + // This can't fail, given we explicitly cap the previous b byte by the + // first 31 bits. + c := charset[b] + bldr.WriteByte(c) + } +} + +// bech32VerifyChecksum verifies whether the bech32 string specified by the +// provided hrp and payload data (encoded as 5 bits per element byte slice) has +// the correct checksum suffix. The version of bech32 used (bech32 OG, or +// bech32m) is also returned to allow the caller to perform proper address +// validation (segwitv0 should use bech32, v1+ should use bech32m). +// +// Data MUST have more than 6 elements, otherwise this function panics. +// +// For more details on the checksum verification, please refer to BIP 173. +func bech32VerifyChecksum(hrp string, data []byte) (Version, bool) { + checksum := data[len(data)-6:] + values := data[:len(data)-6] + polymod := bech32Polymod(hrp, values, checksum) + + // Before BIP-350, we'd always check this against a static constant of + // 1 to know if the checksum was computed properly. As we want to + // generically support decoding for bech32m as well as bech32, we'll + // look up the returned value and compare it to the set of defined + // constants. + bech32Version, ok := ConstsToVersion[ChecksumConst(polymod)] + if ok { + return bech32Version, true + } + + return VersionUnknown, false +} + +// DecodeNoLimitWithVersion is a bech32 checksum version aware arbitrary string +// length decoder. This function will return the version of the decoded +// checksum constant so higher level validation can be performed to ensure the +// correct version of bech32 was used when encoding. +// +// Note that the returned data is 5-bit (base32) encoded and the human-readable +// part will be lowercase. +func DecodeNoLimitWithVersion(bech string) (string, []byte, Version, error) { + // The minimum allowed size of a bech32 string is 8 characters, since it + // needs a non-empty HRP, a separator, and a 6 character checksum. + if len(bech) < 8 { + return "", nil, VersionUnknown, ErrInvalidLength(len(bech)) + } + + // Only ASCII characters between 33 and 126 are allowed. + var hasLower, hasUpper bool + for i := 0; i < len(bech); i++ { + if bech[i] < 33 || bech[i] > 126 { + return "", nil, VersionUnknown, ErrInvalidCharacter(bech[i]) + } + + // The characters must be either all lowercase or all uppercase. Testing + // directly with ascii codes is safe here, given the previous test. + hasLower = hasLower || (bech[i] >= 97 && bech[i] <= 122) + hasUpper = hasUpper || (bech[i] >= 65 && bech[i] <= 90) + if hasLower && hasUpper { + return "", nil, VersionUnknown, ErrMixedCase{} + } + } + + // Bech32 standard uses only the lowercase for of strings for checksum + // calculation. + if hasUpper { + bech = strings.ToLower(bech) + } + + // The string is invalid if the last '1' is non-existent, it is the + // first character of the string (no human-readable part) or one of the + // last 6 characters of the string (since checksum cannot contain '1'). + one := strings.LastIndexByte(bech, '1') + if one < 1 || one+7 > len(bech) { + return "", nil, VersionUnknown, ErrInvalidSeparatorIndex(one) + } + + // The human-readable part is everything before the last '1'. + hrp := bech[:one] + data := bech[one+1:] + + // Each character corresponds to the byte with value of the index in + // 'charset'. + decoded, err := toBytes(data) + if err != nil { + return "", nil, VersionUnknown, err + } + + // Verify if the checksum (stored inside decoded[:]) is valid, given the + // previously decoded hrp. + bech32Version, ok := bech32VerifyChecksum(hrp, decoded) + if !ok { + // Invalid checksum. Calculate what it should have been, so that the + // error contains this information. + + // Extract the payload bytes and actual checksum in the string. + actual := bech[len(bech)-6:] + payload := decoded[:len(decoded)-6] + + // Calculate the expected checksum, given the hrp and payload + // data. We'll actually compute _both_ possibly valid checksum + // to further aide in debugging. + var expectedBldr strings.Builder + expectedBldr.Grow(6) + writeBech32Checksum(hrp, payload, &expectedBldr, Version0) + expectedVersion0 := expectedBldr.String() + + var b strings.Builder + b.Grow(6) + writeBech32Checksum(hrp, payload, &expectedBldr, VersionM) + expectedVersionM := expectedBldr.String() + + err = ErrInvalidChecksum{ + Expected: expectedVersion0, + ExpectedM: expectedVersionM, + Actual: actual, + } + return "", nil, VersionUnknown, err + } + + // We exclude the last 6 bytes, which is the checksum. + return hrp, decoded[:len(decoded)-6], bech32Version, nil +} + +// DecodeNoLimit decodes a bech32 encoded string, returning the human-readable +// part and the data part excluding the checksum. This function does NOT +// validate against the BIP-173 maximum length allowed for bech32 strings and +// is meant for use in custom applications (such as lightning network payment +// requests), NOT on-chain addresses. +// +// Note that the returned data is 5-bit (base32) encoded and the human-readable +// part will be lowercase. +func DecodeNoLimit(bech string) (string, []byte, error) { + hrp, data, _, err := DecodeNoLimitWithVersion(bech) + return hrp, data, err +} + +// Decode decodes a bech32 encoded string, returning the human-readable part and +// the data part excluding the checksum. +// +// Note that the returned data is 5-bit (base32) encoded and the human-readable +// part will be lowercase. +func Decode(bech string) (string, []byte, error) { + // The maximum allowed length for a bech32 string is 90. + if len(bech) > 90 { + return "", nil, ErrInvalidLength(len(bech)) + } + + hrp, data, _, err := DecodeNoLimitWithVersion(bech) + return hrp, data, err +} + +// DecodeGeneric is identical to the existing Decode method, but will also +// return bech32 version that matches the decoded checksum. This method should +// be used when decoding segwit addresses, as it enables additional +// verification to ensure the proper checksum is used. +func DecodeGeneric(bech string) (string, []byte, Version, error) { + // The maximum allowed length for a bech32 string is 90. + if len(bech) > 90 { + return "", nil, VersionUnknown, ErrInvalidLength(len(bech)) + } + + return DecodeNoLimitWithVersion(bech) +} + +// encodeGeneric is the base bech32 encoding function that is aware of the +// existence of the checksum versions. This method is private, as the Encode +// and EncodeM methods are intended to be used instead. +func encodeGeneric(hrp string, data []byte, + version Version) (string, error) { + + // The resulting bech32 string is the concatenation of the lowercase + // hrp, the separator 1, data and the 6-byte checksum. + hrp = strings.ToLower(hrp) + var bldr strings.Builder + bldr.Grow(len(hrp) + 1 + len(data) + 6) + bldr.WriteString(hrp) + bldr.WriteString("1") + + // Write the data part, using the bech32 charset. + for _, b := range data { + if int(b) >= len(charset) { + return "", ErrInvalidDataByte(b) + } + bldr.WriteByte(charset[b]) + } + + // Calculate and write the checksum of the data. + writeBech32Checksum(hrp, data, &bldr, version) + + return bldr.String(), nil +} + +// Encode encodes a byte slice into a bech32 string with the given +// human-readable part (HRP). The HRP will be converted to lowercase if needed +// since mixed cased encodings are not permitted and lowercase is used for +// checksum purposes. Note that the bytes must each encode 5 bits (base32). +func Encode(hrp string, data []byte) (string, error) { + return encodeGeneric(hrp, data, Version0) +} + +// EncodeM is the exactly same as the Encode method, but it uses the new +// bech32m constant instead of the original one. It should be used whenever one +// attempts to encode a segwit address of v1 and beyond. +func EncodeM(hrp string, data []byte) (string, error) { + return encodeGeneric(hrp, data, VersionM) +} + +// ConvertBits converts a byte slice where each byte is encoding fromBits bits, +// to a byte slice where each byte is encoding toBits bits. +func ConvertBits(data []byte, fromBits, toBits uint8, pad bool) ([]byte, error) { + if fromBits < 1 || fromBits > 8 || toBits < 1 || toBits > 8 { + return nil, ErrInvalidBitGroups{} + } + + // Determine the maximum size the resulting array can have after base + // conversion, so that we can size it a single time. This might be off + // by a byte depending on whether padding is used or not and if the input + // data is a multiple of both fromBits and toBits, but we ignore that and + // just size it to the maximum possible. + maxSize := len(data)*int(fromBits)/int(toBits) + 1 + + // The final bytes, each byte encoding toBits bits. + regrouped := make([]byte, 0, maxSize) + + // Keep track of the next byte we create and how many bits we have + // added to it out of the toBits goal. + nextByte := byte(0) + filledBits := uint8(0) + + for _, b := range data { + + // Discard unused bits. + b <<= 8 - fromBits + + // How many bits remaining to extract from the input data. + remFromBits := fromBits + for remFromBits > 0 { + // How many bits remaining to be added to the next byte. + remToBits := toBits - filledBits + + // The number of bytes to next extract is the minimum of + // remFromBits and remToBits. + toExtract := remFromBits + if remToBits < toExtract { + toExtract = remToBits + } + + // Add the next bits to nextByte, shifting the already + // added bits to the left. + nextByte = (nextByte << toExtract) | (b >> (8 - toExtract)) + + // Discard the bits we just extracted and get ready for + // next iteration. + b <<= toExtract + remFromBits -= toExtract + filledBits += toExtract + + // If the nextByte is completely filled, we add it to + // our regrouped bytes and start on the next byte. + if filledBits == toBits { + regrouped = append(regrouped, nextByte) + filledBits = 0 + nextByte = 0 + } + } + } + + // We pad any unfinished group if specified. + if pad && filledBits > 0 { + nextByte <<= toBits - filledBits + regrouped = append(regrouped, nextByte) + filledBits = 0 + nextByte = 0 + } + + // Any incomplete group must be <= 4 bits, and all zeroes. + if filledBits > 0 && (filledBits > 4 || nextByte != 0) { + return nil, ErrInvalidIncompleteGroup{} + } + + return regrouped, nil +} + +// EncodeFromBase256 converts a base256-encoded byte slice into a base32-encoded +// byte slice and then encodes it into a bech32 string with the given +// human-readable part (HRP). The HRP will be converted to lowercase if needed +// since mixed cased encodings are not permitted and lowercase is used for +// checksum purposes. +func EncodeFromBase256(hrp string, data []byte) (string, error) { + converted, err := ConvertBits(data, 8, 5, true) + if err != nil { + return "", err + } + return Encode(hrp, converted) +} + +// DecodeToBase256 decodes a bech32-encoded string into its associated +// human-readable part (HRP) and base32-encoded data, converts that data to a +// base256-encoded byte slice and returns it along with the lowercase HRP. +func DecodeToBase256(bech string) (string, []byte, error) { + hrp, data, err := Decode(bech) + if err != nil { + return "", nil, err + } + converted, err := ConvertBits(data, 5, 8, false) + if err != nil { + return "", nil, err + } + return hrp, converted, nil +} diff --git a/btcutil/bech32/bech32_test.go b/btcutil/bech32/bech32_test.go new file mode 100644 index 0000000000..3f637c4034 --- /dev/null +++ b/btcutil/bech32/bech32_test.go @@ -0,0 +1,691 @@ +// Copyright (c) 2017-2020 The btcsuite developers +// Copyright (c) 2019 The Decred developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package bech32 + +import ( + "bytes" + "encoding/hex" + "fmt" + "strings" + "testing" +) + +// TestBech32 tests whether decoding and re-encoding the valid BIP-173 test +// vectors works and if decoding invalid test vectors fails for the correct +// reason. +func TestBech32(t *testing.T) { + tests := []struct { + str string + expectedError error + }{ + {"A12UEL5L", nil}, + {"a12uel5l", nil}, + {"an83characterlonghumanreadablepartthatcontainsthenumber1andtheexcludedcharactersbio1tt5tgs", nil}, + {"abcdef1qpzry9x8gf2tvdw0s3jn54khce6mua7lmqqqxw", nil}, + {"11qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqc8247j", nil}, + {"split1checkupstagehandshakeupstreamerranterredcaperred2y9e3w", nil}, + {"split1checkupstagehandshakeupstreamerranterredcaperred2y9e2w", ErrInvalidChecksum{"2y9e3w", "2y9e3wlc445v", "2y9e2w"}}, // invalid checksum + {"s lit1checkupstagehandshakeupstreamerranterredcaperredp8hs2p", ErrInvalidCharacter(' ')}, // invalid character (space) in hrp + {"spl\x7Ft1checkupstagehandshakeupstreamerranterredcaperred2y9e3w", ErrInvalidCharacter(127)}, // invalid character (DEL) in hrp + {"split1cheo2y9e2w", ErrNonCharsetChar('o')}, // invalid character (o) in data part + {"split1a2y9w", ErrInvalidSeparatorIndex(5)}, // too short data part + {"1checkupstagehandshakeupstreamerranterredcaperred2y9e3w", ErrInvalidSeparatorIndex(0)}, // empty hrp + {"11qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqsqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqc8247j", ErrInvalidLength(91)}, // too long + + // Additional test vectors used in bitcoin core + {" 1nwldj5", ErrInvalidCharacter(' ')}, + {"\x7f" + "1axkwrx", ErrInvalidCharacter(0x7f)}, + {"\x801eym55h", ErrInvalidCharacter(0x80)}, + {"an84characterslonghumanreadablepartthatcontainsthenumber1andtheexcludedcharactersbio1569pvx", ErrInvalidLength(91)}, + {"pzry9x0s0muk", ErrInvalidSeparatorIndex(-1)}, + {"1pzry9x0s0muk", ErrInvalidSeparatorIndex(0)}, + {"x1b4n0q5v", ErrNonCharsetChar(98)}, + {"li1dgmt3", ErrInvalidSeparatorIndex(2)}, + {"de1lg7wt\xff", ErrInvalidCharacter(0xff)}, + {"A1G7SGD8", ErrInvalidChecksum{"2uel5l", "2uel5llqfn3a", "g7sgd8"}}, + {"10a06t8", ErrInvalidLength(7)}, + {"1qzzfhee", ErrInvalidSeparatorIndex(0)}, + {"a12UEL5L", ErrMixedCase{}}, + {"A12uEL5L", ErrMixedCase{}}, + } + + for i, test := range tests { + str := test.str + hrp, decoded, err := Decode(str) + if test.expectedError != err { + t.Errorf("%d: expected decoding error %v "+ + "instead got %v", i, test.expectedError, err) + continue + } + + if err != nil { + // End test case here if a decoding error was expected. + continue + } + + // Check that it encodes to the same string + encoded, err := Encode(hrp, decoded) + if err != nil { + t.Errorf("encoding failed: %v", err) + } + + if encoded != strings.ToLower(str) { + t.Errorf("expected data to encode to %v, but got %v", + str, encoded) + } + + // Flip a bit in the string an make sure it is caught. + pos := strings.LastIndexAny(str, "1") + flipped := str[:pos+1] + string((str[pos+1] ^ 1)) + str[pos+2:] + _, _, err = Decode(flipped) + if err == nil { + t.Error("expected decoding to fail") + } + } +} + +// TestBech32M tests that the following set of strings, based on the test +// vectors in BIP-350 are either valid or invalid using the new bech32m +// checksum algo. Some of these strings are similar to the set of above test +// vectors, but end up with different checksums. +func TestBech32M(t *testing.T) { + tests := []struct { + str string + expectedError error + }{ + {"A1LQFN3A", nil}, + {"a1lqfn3a", nil}, + {"an83characterlonghumanreadablepartthatcontainsthetheexcludedcharactersbioandnumber11sg7hg6", nil}, + {"abcdef1l7aum6echk45nj3s0wdvt2fg8x9yrzpqzd3ryx", nil}, + {"11llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllludsr8", nil}, + {"split1checkupstagehandshakeupstreamerranterredcaperredlc445v", nil}, + {"?1v759aa", nil}, + + // Additional test vectors used in bitcoin core + {"\x201xj0phk", ErrInvalidCharacter('\x20')}, + {"\x7f1g6xzxy", ErrInvalidCharacter('\x7f')}, + {"\x801vctc34", ErrInvalidCharacter('\x80')}, + {"an84characterslonghumanreadablepartthatcontainsthetheexcludedcharactersbioandnumber11d6pts4", ErrInvalidLength(91)}, + {"qyrz8wqd2c9m", ErrInvalidSeparatorIndex(-1)}, + {"1qyrz8wqd2c9m", ErrInvalidSeparatorIndex(0)}, + {"y1b0jsk6g", ErrNonCharsetChar(98)}, + {"lt1igcx5c0", ErrNonCharsetChar(105)}, + {"in1muywd", ErrInvalidSeparatorIndex(2)}, + {"mm1crxm3i", ErrNonCharsetChar(105)}, + {"au1s5cgom", ErrNonCharsetChar(111)}, + {"M1VUXWEZ", ErrInvalidChecksum{"mzl49c", "mzl49cw70eq6", "vuxwez"}}, + {"16plkw9", ErrInvalidLength(7)}, + {"1p2gdwpf", ErrInvalidSeparatorIndex(0)}, + + {" 1nwldj5", ErrInvalidCharacter(' ')}, + {"\x7f" + "1axkwrx", ErrInvalidCharacter(0x7f)}, + {"\x801eym55h", ErrInvalidCharacter(0x80)}, + } + + for i, test := range tests { + str := test.str + hrp, decoded, err := Decode(str) + if test.expectedError != err { + t.Errorf("%d: (%v) expected decoding error %v "+ + "instead got %v", i, str, test.expectedError, + err) + continue + } + + if err != nil { + // End test case here if a decoding error was expected. + continue + } + + // Check that it encodes to the same string, using bech32 m. + encoded, err := EncodeM(hrp, decoded) + if err != nil { + t.Errorf("encoding failed: %v", err) + } + + if encoded != strings.ToLower(str) { + t.Errorf("expected data to encode to %v, but got %v", + str, encoded) + } + + // Flip a bit in the string an make sure it is caught. + pos := strings.LastIndexAny(str, "1") + flipped := str[:pos+1] + string((str[pos+1] ^ 1)) + str[pos+2:] + _, _, err = Decode(flipped) + if err == nil { + t.Error("expected decoding to fail") + } + } +} + +// TestBech32DecodeGeneric tests that given a bech32 string, or a bech32m +// string, the proper checksum version is returned so that callers can perform +// segwit addr validation. +func TestBech32DecodeGeneric(t *testing.T) { + tests := []struct { + str string + version Version + }{ + {"A1LQFN3A", VersionM}, + {"a1lqfn3a", VersionM}, + {"an83characterlonghumanreadablepartthatcontainsthetheexcludedcharactersbioandnumber11sg7hg6", VersionM}, + {"abcdef1l7aum6echk45nj3s0wdvt2fg8x9yrzpqzd3ryx", VersionM}, + {"11llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllludsr8", VersionM}, + {"split1checkupstagehandshakeupstreamerranterredcaperredlc445v", VersionM}, + {"?1v759aa", VersionM}, + + {"A12UEL5L", Version0}, + {"a12uel5l", Version0}, + {"an83characterlonghumanreadablepartthatcontainsthenumber1andtheexcludedcharactersbio1tt5tgs", Version0}, + {"abcdef1qpzry9x8gf2tvdw0s3jn54khce6mua7lmqqqxw", Version0}, + {"11qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqc8247j", Version0}, + {"split1checkupstagehandshakeupstreamerranterredcaperred2y9e3w", Version0}, + + {"BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4", Version0}, + {"tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7", Version0}, + {"bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kt5nd6y", VersionM}, + {"BC1SW50QGDZ25J", VersionM}, + {"bc1zw508d6qejxtdg4y5r3zarvaryvaxxpcs", VersionM}, + {"tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy", Version0}, + {"tb1pqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesf3hn0c", VersionM}, + {"bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqzk5jj0", VersionM}, + } + for i, test := range tests { + _, _, version, err := DecodeGeneric(test.str) + if err != nil { + t.Errorf("%d: (%v) unexpected error during "+ + "decoding: %v", i, test.str, err) + continue + } + + if version != test.version { + t.Errorf("(%v): invalid version: expected %v, got %v", + test.str, test.version, version) + } + } +} + +// TestMixedCaseEncode ensures mixed case HRPs are converted to lowercase as +// expected when encoding and that decoding the produced encoding when converted +// to all uppercase produces the lowercase HRP and original data. +func TestMixedCaseEncode(t *testing.T) { + tests := []struct { + name string + hrp string + data string + encoded string + }{{ + name: "all uppercase HRP with no data", + hrp: "A", + data: "", + encoded: "a12uel5l", + }, { + name: "all uppercase HRP with data", + hrp: "UPPERCASE", + data: "787878", + encoded: "uppercase10pu8sss7kmp", + }, { + name: "mixed case HRP even offsets uppercase", + hrp: "AbCdEf", + data: "00443214c74254b635cf84653a56d7c675be77df", + encoded: "abcdef1qpzry9x8gf2tvdw0s3jn54khce6mua7lmqqqxw", + }, { + name: "mixed case HRP odd offsets uppercase ", + hrp: "aBcDeF", + data: "00443214c74254b635cf84653a56d7c675be77df", + encoded: "abcdef1qpzry9x8gf2tvdw0s3jn54khce6mua7lmqqqxw", + }, { + name: "all lowercase HRP", + hrp: "abcdef", + data: "00443214c74254b635cf84653a56d7c675be77df", + encoded: "abcdef1qpzry9x8gf2tvdw0s3jn54khce6mua7lmqqqxw", + }} + + for _, test := range tests { + // Convert the text hex to bytes, convert those bytes from base256 to + // base32, then ensure the encoded result with the HRP provided in the + // test data is as expected. + data, err := hex.DecodeString(test.data) + if err != nil { + t.Errorf("%q: invalid hex %q: %v", test.name, test.data, err) + continue + } + convertedData, err := ConvertBits(data, 8, 5, true) + if err != nil { + t.Errorf("%q: unexpected convert bits error: %v", test.name, + err) + continue + } + gotEncoded, err := Encode(test.hrp, convertedData) + if err != nil { + t.Errorf("%q: unexpected encode error: %v", test.name, err) + continue + } + if gotEncoded != test.encoded { + t.Errorf("%q: mismatched encoding -- got %q, want %q", test.name, + gotEncoded, test.encoded) + continue + } + + // Ensure the decoding the expected lowercase encoding converted to all + // uppercase produces the lowercase HRP and original data. + gotHRP, gotData, err := Decode(strings.ToUpper(test.encoded)) + if err != nil { + t.Errorf("%q: unexpected decode error: %v", test.name, err) + continue + } + wantHRP := strings.ToLower(test.hrp) + if gotHRP != wantHRP { + t.Errorf("%q: mismatched decoded HRP -- got %q, want %q", test.name, + gotHRP, wantHRP) + continue + } + convertedGotData, err := ConvertBits(gotData, 5, 8, false) + if err != nil { + t.Errorf("%q: unexpected convert bits error: %v", test.name, + err) + continue + } + if !bytes.Equal(convertedGotData, data) { + t.Errorf("%q: mismatched data -- got %x, want %x", test.name, + convertedGotData, data) + continue + } + } +} + +// TestCanDecodeUnlimitedBech32 tests whether decoding a large bech32 string works +// when using the DecodeNoLimit version +func TestCanDecodeUnlimitedBech32(t *testing.T) { + input := "11qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqsqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq5kx0yd" + + // Sanity check that an input of this length errors on regular Decode() + _, _, err := Decode(input) + if err == nil { + t.Fatalf("Test vector not appropriate") + } + + // Try and decode it. + hrp, data, err := DecodeNoLimit(input) + if err != nil { + t.Fatalf("Expected decoding of large string to work. Got error: %v", err) + } + + // Verify data for correctness. + if hrp != "1" { + t.Fatalf("Unexpected hrp: %v", hrp) + } + decodedHex := fmt.Sprintf("%x", data) + expected := "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000" + if decodedHex != expected { + t.Fatalf("Unexpected decoded data: %s", decodedHex) + } +} + +// TestBech32Base256 ensures decoding and encoding various bech32, HRPs, and +// data produces the expected results when using EncodeFromBase256 and +// DecodeToBase256. It includes tests for proper handling of case +// manipulations. +func TestBech32Base256(t *testing.T) { + tests := []struct { + name string // test name + encoded string // bech32 string to decode + hrp string // expected human-readable part + data string // expected hex-encoded data + err error // expected error + }{{ + name: "all uppercase, no data", + encoded: "A12UEL5L", + hrp: "a", + data: "", + }, { + name: "long hrp with separator and excluded chars, no data", + encoded: "an83characterlonghumanreadablepartthatcontainsthenumber1andtheexcludedcharactersbio1tt5tgs", + hrp: "an83characterlonghumanreadablepartthatcontainsthenumber1andtheexcludedcharactersbio", + data: "", + }, { + name: "6 char hrp with data with leading zero", + encoded: "abcdef1qpzry9x8gf2tvdw0s3jn54khce6mua7lmqqqxw", + hrp: "abcdef", + data: "00443214c74254b635cf84653a56d7c675be77df", + }, { + name: "hrp same as separator and max length encoded string", + encoded: "11qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqc8247j", + hrp: "1", + data: "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + }, { + name: "5 char hrp with data chosen to produce human-readable data part", + encoded: "split1checkupstagehandshakeupstreamerranterredcaperred2y9e3w", + hrp: "split", + data: "c5f38b70305f519bf66d85fb6cf03058f3dde463ecd7918f2dc743918f2d", + }, { + name: "same as previous but with checksum invalidated", + encoded: "split1checkupstagehandshakeupstreamerranterredcaperred2y9e2w", + err: ErrInvalidChecksum{"2y9e3w", "2y9e3wlc445v", "2y9e2w"}, + }, { + name: "hrp with invalid character (space)", + encoded: "s lit1checkupstagehandshakeupstreamerranterredcaperredp8hs2p", + err: ErrInvalidCharacter(' '), + }, { + name: "hrp with invalid character (DEL)", + encoded: "spl\x7ft1checkupstagehandshakeupstreamerranterredcaperred2y9e3w", + err: ErrInvalidCharacter(127), + }, { + name: "data part with invalid character (o)", + encoded: "split1cheo2y9e2w", + err: ErrNonCharsetChar('o'), + }, { + name: "data part too short", + encoded: "split1a2y9w", + err: ErrInvalidSeparatorIndex(5), + }, { + name: "empty hrp", + encoded: "1checkupstagehandshakeupstreamerranterredcaperred2y9e3w", + err: ErrInvalidSeparatorIndex(0), + }, { + name: "no separator", + encoded: "pzry9x0s0muk", + err: ErrInvalidSeparatorIndex(-1), + }, { + name: "too long by one char", + encoded: "11qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqsqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqc8247j", + err: ErrInvalidLength(91), + }, { + name: "invalid due to mixed case in hrp", + encoded: "aBcdef1qpzry9x8gf2tvdw0s3jn54khce6mua7lmqqqxw", + err: ErrMixedCase{}, + }, { + name: "invalid due to mixed case in data part", + encoded: "abcdef1Qpzry9x8gf2tvdw0s3jn54khce6mua7lmqqqxw", + err: ErrMixedCase{}, + }} + + for _, test := range tests { + // Ensure the decode either produces an error or not as expected. + str := test.encoded + gotHRP, gotData, err := DecodeToBase256(str) + if test.err != err { + t.Errorf("%q: unexpected decode error -- got %v, want %v", + test.name, err, test.err) + continue + } + if err != nil { + // End test case here if a decoding error was expected. + continue + } + + // Ensure the expected HRP and original data are as expected. + if gotHRP != test.hrp { + t.Errorf("%q: mismatched decoded HRP -- got %q, want %q", test.name, + gotHRP, test.hrp) + continue + } + data, err := hex.DecodeString(test.data) + if err != nil { + t.Errorf("%q: invalid hex %q: %v", test.name, test.data, err) + continue + } + if !bytes.Equal(gotData, data) { + t.Errorf("%q: mismatched data -- got %x, want %x", test.name, + gotData, data) + continue + } + + // Encode the same data with the HRP converted to all uppercase and + // ensure the result is the lowercase version of the original encoded + // bech32 string. + gotEncoded, err := EncodeFromBase256(strings.ToUpper(test.hrp), data) + if err != nil { + t.Errorf("%q: unexpected uppercase HRP encode error: %v", test.name, + err) + } + wantEncoded := strings.ToLower(str) + if gotEncoded != wantEncoded { + t.Errorf("%q: mismatched encoding -- got %q, want %q", test.name, + gotEncoded, wantEncoded) + } + + // Encode the same data with the HRP converted to all lowercase and + // ensure the result is the lowercase version of the original encoded + // bech32 string. + gotEncoded, err = EncodeFromBase256(strings.ToLower(test.hrp), data) + if err != nil { + t.Errorf("%q: unexpected lowercase HRP encode error: %v", test.name, + err) + } + if gotEncoded != wantEncoded { + t.Errorf("%q: mismatched encoding -- got %q, want %q", test.name, + gotEncoded, wantEncoded) + } + + // Encode the same data with the HRP converted to mixed upper and + // lowercase and ensure the result is the lowercase version of the + // original encoded bech32 string. + var mixedHRPBuilder strings.Builder + for i, r := range test.hrp { + if i%2 == 0 { + mixedHRPBuilder.WriteString(strings.ToUpper(string(r))) + continue + } + mixedHRPBuilder.WriteRune(r) + } + gotEncoded, err = EncodeFromBase256(mixedHRPBuilder.String(), data) + if err != nil { + t.Errorf("%q: unexpected lowercase HRP encode error: %v", test.name, + err) + } + if gotEncoded != wantEncoded { + t.Errorf("%q: mismatched encoding -- got %q, want %q", test.name, + gotEncoded, wantEncoded) + } + + // Ensure a bit flip in the string is caught. + pos := strings.LastIndexAny(test.encoded, "1") + flipped := str[:pos+1] + string((str[pos+1] ^ 1)) + str[pos+2:] + _, _, err = DecodeToBase256(flipped) + if err == nil { + t.Error("expected decoding to fail") + } + } +} + +// BenchmarkEncodeDecodeCycle performs a benchmark for a full encode/decode +// cycle of a bech32 string. It also reports the allocation count, which we +// expect to be 2 for a fully optimized cycle. +func BenchmarkEncodeDecodeCycle(b *testing.B) { + // Use a fixed, 49-byte raw data for testing. + inputData, err := hex.DecodeString("cbe6365ddbcda9a9915422c3f091c13f8c7b2f263b8d34067bd12c274408473fa764871c9dd51b1bb34873b3473b633ed1") + if err != nil { + b.Fatalf("failed to initialize input data: %v", err) + } + + // Convert this into a 79-byte, base 32 byte slice. + base32Input, err := ConvertBits(inputData, 8, 5, true) + if err != nil { + b.Fatalf("failed to convert input to 32 bits-per-element: %v", err) + } + + // Use a fixed hrp for the tests. This should generate an encoded bech32 + // string of size 90 (the maximum allowed by BIP-173). + hrp := "bc" + + // Begin the benchmark. Given that we test one roundtrip per iteration + // (that is, one Encode() and one Decode() operation), we expect at most + // 2 allocations per reported test op. + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + str, err := Encode(hrp, base32Input) + if err != nil { + b.Fatalf("failed to encode input: %v", err) + } + + _, _, err = Decode(str) + if err != nil { + b.Fatalf("failed to decode string: %v", err) + } + } +} + +// TestConvertBits tests whether base conversion works using TestConvertBits(). +func TestConvertBits(t *testing.T) { + tests := []struct { + input string + output string + fromBits uint8 + toBits uint8 + pad bool + }{ + // Trivial empty conversions. + {"", "", 8, 5, false}, + {"", "", 8, 5, true}, + {"", "", 5, 8, false}, + {"", "", 5, 8, true}, + + // Conversions of 0 value with/without padding. + {"00", "00", 8, 5, false}, + {"00", "0000", 8, 5, true}, + {"0000", "00", 5, 8, false}, + {"0000", "0000", 5, 8, true}, + + // Testing when conversion ends exactly at the byte edge. This makes + // both padded and unpadded versions the same. + {"0000000000", "0000000000000000", 8, 5, false}, + {"0000000000", "0000000000000000", 8, 5, true}, + {"0000000000000000", "0000000000", 5, 8, false}, + {"0000000000000000", "0000000000", 5, 8, true}, + + // Conversions of full byte sequences. + {"ffffff", "1f1f1f1f1e", 8, 5, true}, + {"1f1f1f1f1e", "ffffff", 5, 8, false}, + {"1f1f1f1f1e", "ffffff00", 5, 8, true}, + + // Sample random conversions. + {"c9ca", "190705", 8, 5, false}, + {"c9ca", "19070500", 8, 5, true}, + {"19070500", "c9ca", 5, 8, false}, + {"19070500", "c9ca00", 5, 8, true}, + + // Test cases tested on TestConvertBitsFailures with their corresponding + // fixes. + {"ff", "1f1c", 8, 5, true}, + {"1f1c10", "ff20", 5, 8, true}, + + // Large conversions. + { + "cbe6365ddbcda9a9915422c3f091c13f8c7b2f263b8d34067bd12c274408473fa764871c9dd51b1bb34873b3473b633ed1", + "190f13030c170e1b1916141a13040a14040b011f01040e01071e0607160b1906070e06130801131b1a0416020e110008081c1f1a0e19040703120e1d0a06181b160d0407070c1a07070d11131d1408", + 8, 5, true, + }, + { + "190f13030c170e1b1916141a13040a14040b011f01040e01071e0607160b1906070e06130801131b1a0416020e110008081c1f1a0e19040703120e1d0a06181b160d0407070c1a07070d11131d1408", + "cbe6365ddbcda9a9915422c3f091c13f8c7b2f263b8d34067bd12c274408473fa764871c9dd51b1bb34873b3473b633ed100", + 5, 8, true, + }, + } + + for i, tc := range tests { + input, err := hex.DecodeString(tc.input) + if err != nil { + t.Fatalf("invalid test input data: %v", err) + } + + expected, err := hex.DecodeString(tc.output) + if err != nil { + t.Fatalf("invalid test output data: %v", err) + } + + actual, err := ConvertBits(input, tc.fromBits, tc.toBits, tc.pad) + if err != nil { + t.Fatalf("test case %d failed: %v", i, err) + } + + if !bytes.Equal(actual, expected) { + t.Fatalf("test case %d has wrong output; expected=%x actual=%x", + i, expected, actual) + } + } +} + +// TestConvertBitsFailures tests for the expected conversion failures of +// ConvertBits(). +func TestConvertBitsFailures(t *testing.T) { + tests := []struct { + input string + fromBits uint8 + toBits uint8 + pad bool + err error + }{ + // Not enough output bytes when not using padding. + {"ff", 8, 5, false, ErrInvalidIncompleteGroup{}}, + {"1f1c10", 5, 8, false, ErrInvalidIncompleteGroup{}}, + + // Unsupported bit conversions. + {"", 0, 5, false, ErrInvalidBitGroups{}}, + {"", 10, 5, false, ErrInvalidBitGroups{}}, + {"", 5, 0, false, ErrInvalidBitGroups{}}, + {"", 5, 10, false, ErrInvalidBitGroups{}}, + } + + for i, tc := range tests { + input, err := hex.DecodeString(tc.input) + if err != nil { + t.Fatalf("invalid test input data: %v", err) + } + + _, err = ConvertBits(input, tc.fromBits, tc.toBits, tc.pad) + if err != tc.err { + t.Fatalf("test case %d failure: expected '%v' got '%v'", i, + tc.err, err) + } + } + +} + +// BenchmarkConvertBitsDown benchmarks the speed and memory allocation behavior +// of ConvertBits when converting from a higher base into a lower base (e.g. 8 +// => 5). +// +// Only a single allocation is expected, which is used for the output array. +func BenchmarkConvertBitsDown(b *testing.B) { + // Use a fixed, 49-byte raw data for testing. + inputData, err := hex.DecodeString("cbe6365ddbcda9a9915422c3f091c13f8c7b2f263b8d34067bd12c274408473fa764871c9dd51b1bb34873b3473b633ed1") + if err != nil { + b.Fatalf("failed to initialize input data: %v", err) + } + + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := ConvertBits(inputData, 8, 5, true) + if err != nil { + b.Fatalf("error converting bits: %v", err) + } + } +} + +// BenchmarkConvertBitsUp benchmarks the speed and memory allocation behavior +// of ConvertBits when converting from a lower base into a higher base (e.g. 5 +// => 8). +// +// Only a single allocation is expected, which is used for the output array. +func BenchmarkConvertBitsUp(b *testing.B) { + // Use a fixed, 79-byte raw data for testing. + inputData, err := hex.DecodeString("190f13030c170e1b1916141a13040a14040b011f01040e01071e0607160b1906070e06130801131b1a0416020e110008081c1f1a0e19040703120e1d0a06181b160d0407070c1a07070d11131d1408") + if err != nil { + b.Fatalf("failed to initialize input data: %v", err) + } + + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := ConvertBits(inputData, 8, 5, true) + if err != nil { + b.Fatalf("error converting bits: %v", err) + } + } +} diff --git a/btcutil/bech32/doc.go b/btcutil/bech32/doc.go new file mode 100644 index 0000000000..2d64fbe0bf --- /dev/null +++ b/btcutil/bech32/doc.go @@ -0,0 +1,15 @@ +// Copyright (c) 2017 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +/* +Package bech32 provides a Go implementation of the bech32 format specified in +BIP 173. + +Bech32 strings consist of a human-readable part (hrp), followed by the +separator 1, then a checksummed data part encoded using the 32 characters +"qpzry9x8gf2tvdw0s3jn54khce6mua7l". + +More info: https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki +*/ +package bech32 diff --git a/btcutil/bech32/error.go b/btcutil/bech32/error.go new file mode 100644 index 0000000000..e8b1fe8c30 --- /dev/null +++ b/btcutil/bech32/error.go @@ -0,0 +1,87 @@ +// Copyright (c) 2019 The Decred developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package bech32 + +import ( + "fmt" +) + +// ErrMixedCase is returned when the bech32 string has both lower and uppercase +// characters. +type ErrMixedCase struct{} + +func (e ErrMixedCase) Error() string { + return "string not all lowercase or all uppercase" +} + +// ErrInvalidBitGroups is returned when conversion is attempted between byte +// slices using bit-per-element of unsupported value. +type ErrInvalidBitGroups struct{} + +func (e ErrInvalidBitGroups) Error() string { + return "only bit groups between 1 and 8 allowed" +} + +// ErrInvalidIncompleteGroup is returned when then byte slice used as input has +// data of wrong length. +type ErrInvalidIncompleteGroup struct{} + +func (e ErrInvalidIncompleteGroup) Error() string { + return "invalid incomplete group" +} + +// ErrInvalidLength is returned when the bech32 string has an invalid length +// given the BIP-173 defined restrictions. +type ErrInvalidLength int + +func (e ErrInvalidLength) Error() string { + return fmt.Sprintf("invalid bech32 string length %d", int(e)) +} + +// ErrInvalidCharacter is returned when the bech32 string has a character +// outside the range of the supported charset. +type ErrInvalidCharacter rune + +func (e ErrInvalidCharacter) Error() string { + return fmt.Sprintf("invalid character in string: '%c'", rune(e)) +} + +// ErrInvalidSeparatorIndex is returned when the separator character '1' is +// in an invalid position in the bech32 string. +type ErrInvalidSeparatorIndex int + +func (e ErrInvalidSeparatorIndex) Error() string { + return fmt.Sprintf("invalid separator index %d", int(e)) +} + +// ErrNonCharsetChar is returned when a character outside of the specific +// bech32 charset is used in the string. +type ErrNonCharsetChar rune + +func (e ErrNonCharsetChar) Error() string { + return fmt.Sprintf("invalid character not part of charset: %v", int(e)) +} + +// ErrInvalidChecksum is returned when the extracted checksum of the string +// is different than what was expected. Both the original version, as well as +// the new bech32m checksum may be specified. +type ErrInvalidChecksum struct { + Expected string + ExpectedM string + Actual string +} + +func (e ErrInvalidChecksum) Error() string { + return fmt.Sprintf("invalid checksum (expected (bech32=%v, "+ + "bech32m=%v), got %v)", e.Expected, e.ExpectedM, e.Actual) +} + +// ErrInvalidDataByte is returned when a byte outside the range required for +// conversion into a string was found. +type ErrInvalidDataByte byte + +func (e ErrInvalidDataByte) Error() string { + return fmt.Sprintf("invalid data byte: %v", byte(e)) +} diff --git a/btcutil/bech32/example_test.go b/btcutil/bech32/example_test.go new file mode 100644 index 0000000000..290baaed6c --- /dev/null +++ b/btcutil/bech32/example_test.go @@ -0,0 +1,49 @@ +// Copyright (c) 2017 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package bech32_test + +import ( + "encoding/hex" + "fmt" + + "github.com/btcsuite/btcd/btcutil/bech32" +) + +// This example demonstrates how to decode a bech32 encoded string. +func ExampleDecode() { + encoded := "bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7k7grplx" + hrp, decoded, err := bech32.Decode(encoded) + if err != nil { + fmt.Println("Error:", err) + } + + // Show the decoded data. + fmt.Println("Decoded human-readable part:", hrp) + fmt.Println("Decoded Data:", hex.EncodeToString(decoded)) + + // Output: + // Decoded human-readable part: bc + // Decoded Data: 010e140f070d1a001912060b0d081504140311021d030c1d03040f1814060e1e160e140f070d1a001912060b0d081504140311021d030c1d03040f1814060e1e16 +} + +// This example demonstrates how to encode data into a bech32 string. +func ExampleEncode() { + data := []byte("Test data") + // Convert test data to base32: + conv, err := bech32.ConvertBits(data, 8, 5, true) + if err != nil { + fmt.Println("Error:", err) + } + encoded, err := bech32.Encode("customHrp!11111q", conv) + if err != nil { + fmt.Println("Error:", err) + } + + // Show the encoded data. + fmt.Println("Encoded Data:", encoded) + + // Output: + // Encoded Data: customhrp!11111q123jhxapqv3shgcgkxpuhe +} diff --git a/btcutil/bech32/version.go b/btcutil/bech32/version.go new file mode 100644 index 0000000000..147037db9a --- /dev/null +++ b/btcutil/bech32/version.go @@ -0,0 +1,43 @@ +package bech32 + +// ChecksumConst is a type that represents the currently defined bech32 +// checksum constants. +type ChecksumConst int + +const ( + // Version0Const is the original constant used in the checksum + // verification for bech32. + Version0Const ChecksumConst = 1 + + // VersionMConst is the new constant used for bech32m checksum + // verification. + VersionMConst ChecksumConst = 0x2bc830a3 +) + +// Version defines the current set of bech32 versions. +type Version uint8 + +const ( + // Version0 defines the original bech version. + Version0 Version = iota + + // VersionM is the new bech32 version defined in BIP-350, also known as + // bech32m. + VersionM + + // VersionUnknown denotes an unknown bech version. + VersionUnknown +) + +// VersionToConsts maps bech32 versions to the checksum constant to be used +// when encoding, and asserting a particular version when decoding. +var VersionToConsts = map[Version]ChecksumConst{ + Version0: Version0Const, + VersionM: VersionMConst, +} + +// ConstsToVersion maps a bech32 constant to the version it's associated with. +var ConstsToVersion = map[ChecksumConst]Version{ + Version0Const: Version0, + VersionMConst: VersionM, +} diff --git a/btcutil/bench_test.go b/btcutil/bench_test.go new file mode 100644 index 0000000000..c1f52da5b7 --- /dev/null +++ b/btcutil/bench_test.go @@ -0,0 +1,80 @@ +package btcutil_test + +import ( + "testing" + + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg/chainhash" +) + +var ( + bencHash *chainhash.Hash +) + +// BenchmarkTxHash benchmarks the performance of calculating the hash of a +// transaction. +func BenchmarkTxHash(b *testing.B) { + // Make a new block from the test block, we'll then call the Bytes + // function to cache the serialized block. Afterwards we all + // Transactions to populate the serialization cache. + testBlock := btcutil.NewBlock(&Block100000) + _, _ = testBlock.Bytes() + + // The second transaction in the block has no witness data. The first + // does however. + testTx := testBlock.Transactions()[1] + testTx2 := testBlock.Transactions()[0] + + // Run a benchmark for the portion that needs to strip the non-witness + // data from the transaction. + b.Run("tx_hash_has_witness", func(b *testing.B) { + b.ResetTimer() + b.ReportAllocs() + + var txHash *chainhash.Hash + for i := 0; i < b.N; i++ { + txHash = testTx2.Hash() + } + + bencHash = txHash + }) + + // Next, run it for the portion that can just hash the bytes directly. + b.Run("tx_hash_no_witness", func(b *testing.B) { + b.ResetTimer() + b.ReportAllocs() + + var txHash *chainhash.Hash + for i := 0; i < b.N; i++ { + txHash = testTx.Hash() + } + + bencHash = txHash + }) + +} + +// BenchmarkTxWitnessHash benchmarks the performance of calculating the hash of +// a transaction. +func BenchmarkTxWitnessHash(b *testing.B) { + // Make a new block from the test block, we'll then call the Bytes + // function to cache the serialized block. Afterwards we all + // Transactions to populate the serialization cache. + testBlock := btcutil.NewBlock(&Block100000) + _, _ = testBlock.Bytes() + + // The first transaction in the block has been modified to have witness + // data. + testTx := testBlock.Transactions()[0] + + b.ResetTimer() + b.ReportAllocs() + + var txHash *chainhash.Hash + for i := 0; i < b.N; i++ { + txHash = testTx.WitnessHash() + } + + bencHash = txHash + +} diff --git a/btcutil/block.go b/btcutil/block.go new file mode 100644 index 0000000000..7f8d8786e3 --- /dev/null +++ b/btcutil/block.go @@ -0,0 +1,300 @@ +// Copyright (c) 2013-2016 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package btcutil + +import ( + "bytes" + "fmt" + "io" + + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/wire" +) + +// OutOfRangeError describes an error due to accessing an element that is out +// of range. +type OutOfRangeError string + +// BlockHeightUnknown is the value returned for a block height that is unknown. +// This is typically because the block has not been inserted into the main chain +// yet. +const BlockHeightUnknown = int32(-1) + +// Error satisfies the error interface and prints human-readable errors. +func (e OutOfRangeError) Error() string { + return string(e) +} + +// Block defines a bitcoin block that provides easier and more efficient +// manipulation of raw blocks. It also memoizes hashes for the block and its +// transactions on their first access so subsequent accesses don't have to +// repeat the relatively expensive hashing operations. +type Block struct { + msgBlock *wire.MsgBlock // Underlying MsgBlock + serializedBlock []byte // Serialized bytes for the block + serializedBlockNoWitness []byte // Serialized bytes for block w/o witness data + blockHash *chainhash.Hash // Cached block hash + blockHeight int32 // Height in the main block chain + transactions []*Tx // Transactions + txnsGenerated bool // ALL wrapped transactions generated +} + +// MsgBlock returns the underlying wire.MsgBlock for the Block. +func (b *Block) MsgBlock() *wire.MsgBlock { + // Return the cached block. + return b.msgBlock +} + +// Bytes returns the serialized bytes for the Block. This is equivalent to +// calling Serialize on the underlying wire.MsgBlock, however it caches the +// result so subsequent calls are more efficient. +func (b *Block) Bytes() ([]byte, error) { + // Return the cached serialized bytes if it has already been generated. + if len(b.serializedBlock) != 0 { + return b.serializedBlock, nil + } + + // Serialize the MsgBlock. + w := bytes.NewBuffer(make([]byte, 0, b.msgBlock.SerializeSize())) + err := b.msgBlock.Serialize(w) + if err != nil { + return nil, err + } + serializedBlock := w.Bytes() + + // Cache the serialized bytes and return them. + b.serializedBlock = serializedBlock + return serializedBlock, nil +} + +// BytesNoWitness returns the serialized bytes for the block with transactions +// encoded without any witness data. +func (b *Block) BytesNoWitness() ([]byte, error) { + // Return the cached serialized bytes if it has already been generated. + if len(b.serializedBlockNoWitness) != 0 { + return b.serializedBlockNoWitness, nil + } + + // Serialize the MsgBlock. + var w bytes.Buffer + err := b.msgBlock.SerializeNoWitness(&w) + if err != nil { + return nil, err + } + serializedBlock := w.Bytes() + + // Cache the serialized bytes and return them. + b.serializedBlockNoWitness = serializedBlock + return serializedBlock, nil +} + +// Hash returns the block identifier hash for the Block. This is equivalent to +// calling BlockHash on the underlying wire.MsgBlock, however it caches the +// result so subsequent calls are more efficient. +func (b *Block) Hash() *chainhash.Hash { + // Return the cached block hash if it has already been generated. + if b.blockHash != nil { + return b.blockHash + } + + // Cache the block hash and return it. + hash := b.msgBlock.BlockHash() + b.blockHash = &hash + return &hash +} + +// Tx returns a wrapped transaction (btcutil.Tx) for the transaction at the +// specified index in the Block. The supplied index is 0 based. That is to +// say, the first transaction in the block is txNum 0. This is nearly +// equivalent to accessing the raw transaction (wire.MsgTx) from the +// underlying wire.MsgBlock, however the wrapped transaction has some helpful +// properties such as caching the hash so subsequent calls are more efficient. +func (b *Block) Tx(txNum int) (*Tx, error) { + // Ensure the requested transaction is in range. + numTx := uint64(len(b.msgBlock.Transactions)) + if txNum < 0 || uint64(txNum) >= numTx { + str := fmt.Sprintf("transaction index %d is out of range - max %d", + txNum, numTx-1) + return nil, OutOfRangeError(str) + } + + // Generate slice to hold all of the wrapped transactions if needed. + if len(b.transactions) == 0 { + b.transactions = make([]*Tx, numTx) + } + + // Return the wrapped transaction if it has already been generated. + if b.transactions[txNum] != nil { + return b.transactions[txNum], nil + } + + // Generate and cache the wrapped transaction and return it. + newTx := NewTx(b.msgBlock.Transactions[txNum]) + newTx.SetIndex(txNum) + b.transactions[txNum] = newTx + return newTx, nil +} + +// Transactions returns a slice of wrapped transactions (btcutil.Tx) for all +// transactions in the Block. This is nearly equivalent to accessing the raw +// transactions (wire.MsgTx) in the underlying wire.MsgBlock, however it +// instead provides easy access to wrapped versions (btcutil.Tx) of them. +func (b *Block) Transactions() []*Tx { + // Return transactions if they have ALL already been generated. This + // flag is necessary because the wrapped transactions are lazily + // generated in a sparse fashion. + if b.txnsGenerated { + return b.transactions + } + + // Generate slice to hold all of the wrapped transactions if needed. + if len(b.transactions) == 0 { + b.transactions = make([]*Tx, len(b.msgBlock.Transactions)) + } + + // Offset of each tx. 80 accounts for the block header size. + offset := 80 + wire.VarIntSerializeSize( + uint64(len(b.msgBlock.Transactions)), + ) + + // Generate and cache the wrapped transactions for all that haven't + // already been done. + for i, tx := range b.transactions { + if tx == nil { + newTx := NewTx(b.msgBlock.Transactions[i]) + newTx.SetIndex(i) + + size := b.msgBlock.Transactions[i].SerializeSize() + + // The block may not always have the serializedBlock. + if len(b.serializedBlock) > 0 { + // This allows for the reuse of the already + // serialized tx. + newTx.setBytes( + b.serializedBlock[offset : offset+size], + ) + + // Increment offset for this block. + offset += size + } + + b.transactions[i] = newTx + } + } + + b.txnsGenerated = true + return b.transactions +} + +// TxHash returns the hash for the requested transaction number in the Block. +// The supplied index is 0 based. That is to say, the first transaction in the +// block is txNum 0. This is equivalent to calling TxHash on the underlying +// wire.MsgTx, however it caches the result so subsequent calls are more +// efficient. +func (b *Block) TxHash(txNum int) (*chainhash.Hash, error) { + // Attempt to get a wrapped transaction for the specified index. It + // will be created lazily if needed or simply return the cached version + // if it has already been generated. + tx, err := b.Tx(txNum) + if err != nil { + return nil, err + } + + // Defer to the wrapped transaction which will return the cached hash if + // it has already been generated. + return tx.Hash(), nil +} + +// TxLoc returns the offsets and lengths of each transaction in a raw block. +// It is used to allow fast indexing into transactions within the raw byte +// stream. +func (b *Block) TxLoc() ([]wire.TxLoc, error) { + rawMsg, err := b.Bytes() + if err != nil { + return nil, err + } + rbuf := bytes.NewBuffer(rawMsg) + + var mblock wire.MsgBlock + txLocs, err := mblock.DeserializeTxLoc(rbuf) + if err != nil { + return nil, err + } + return txLocs, err +} + +// Height returns the saved height of the block in the block chain. This value +// will be BlockHeightUnknown if it hasn't already explicitly been set. +func (b *Block) Height() int32 { + return b.blockHeight +} + +// SetHeight sets the height of the block in the block chain. +func (b *Block) SetHeight(height int32) { + b.blockHeight = height +} + +// NewBlock returns a new instance of a bitcoin block given an underlying +// wire.MsgBlock. See Block. +func NewBlock(msgBlock *wire.MsgBlock) *Block { + return &Block{ + msgBlock: msgBlock, + blockHeight: BlockHeightUnknown, + } +} + +// NewBlockFromBytes returns a new instance of a bitcoin block given the +// serialized bytes. See Block. +func NewBlockFromBytes(serializedBlock []byte) (*Block, error) { + br := bytes.NewReader(serializedBlock) + b, err := NewBlockFromReader(br) + if err != nil { + return nil, err + } + b.serializedBlock = serializedBlock + + // This initializes []btcutil.Tx to have the serialized raw + // transactions cached. Helps speed up things like generating the + // txhash. + b.Transactions() + + return b, nil +} + +// NewBlockFromReader returns a new instance of a bitcoin block given a +// Reader to deserialize the block. See Block. +func NewBlockFromReader(r io.Reader) (*Block, error) { + // Deserialize the bytes into a MsgBlock. + var msgBlock wire.MsgBlock + err := msgBlock.Deserialize(r) + if err != nil { + return nil, err + } + + b := Block{ + msgBlock: &msgBlock, + blockHeight: BlockHeightUnknown, + } + return &b, nil +} + +// NewBlockFromBlockAndBytes returns a new instance of a bitcoin block given +// an underlying wire.MsgBlock and the serialized bytes for it. See Block. +func NewBlockFromBlockAndBytes(msgBlock *wire.MsgBlock, + serializedBlock []byte) *Block { + + b := &Block{ + msgBlock: msgBlock, + serializedBlock: serializedBlock, + blockHeight: BlockHeightUnknown, + } + + // This initializes []btcutil.Tx to have the serialized raw + // transactions cached. Helps speed up things like generating the + // txhash. + b.Transactions() + + return b +} diff --git a/btcutil/block_test.go b/btcutil/block_test.go new file mode 100644 index 0000000000..06e0ad2803 --- /dev/null +++ b/btcutil/block_test.go @@ -0,0 +1,556 @@ +// Copyright (c) 2013-2016 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package btcutil_test + +import ( + "bytes" + "io" + "reflect" + "testing" + "time" + + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/wire" + "github.com/davecgh/go-spew/spew" +) + +// TestBlock tests the API for Block. +func TestBlock(t *testing.T) { + b := btcutil.NewBlock(&Block100000) + + // Ensure we get the same data back out. + if msgBlock := b.MsgBlock(); !reflect.DeepEqual(msgBlock, &Block100000) { + t.Errorf("MsgBlock: mismatched MsgBlock - got %v, want %v", + spew.Sdump(msgBlock), spew.Sdump(&Block100000)) + } + + // Ensure block height set and get work properly. + wantHeight := int32(100000) + b.SetHeight(wantHeight) + if gotHeight := b.Height(); gotHeight != wantHeight { + t.Errorf("Height: mismatched height - got %v, want %v", + gotHeight, wantHeight) + } + + // Hash for block 100,000. + wantHashStr := "3ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506" + wantHash, err := chainhash.NewHashFromStr(wantHashStr) + if err != nil { + t.Errorf("NewHashFromStr: %v", err) + } + + // Request the hash multiple times to test generation and caching. + for i := 0; i < 2; i++ { + hash := b.Hash() + if !hash.IsEqual(wantHash) { + t.Errorf("Hash #%d mismatched hash - got %v, want %v", + i, hash, wantHash) + } + } + + // Hashes for the transactions in Block100000. + wantTxHashes := []string{ + "8c14f0db3df150123e6f3dbbf30f8b955a8249b62ac1d1ff16284aefa3d06d87", + "fff2525b8931402dd09222c50775608f75787bd2b87e56995a7bdd30f79702c4", + "6359f0868171b1d194cbee1af2f16ea598ae8fad666d9b012c8ed2b79a236ec4", + "e9a66845e05d5abc0ad04ec80f774a7e585c6e8db975962d069a522137b80c1d", + } + + // Create a new block to nuke all cached data. + b = btcutil.NewBlock(&Block100000) + + // Request hash for all transactions one at a time via Tx. + for i, txHash := range wantTxHashes { + wantHash, err := chainhash.NewHashFromStr(txHash) + if err != nil { + t.Errorf("NewHashFromStr: %v", err) + } + + // Request the hash multiple times to test generation and + // caching. + for j := 0; j < 2; j++ { + tx, err := b.Tx(i) + if err != nil { + t.Errorf("Tx #%d: %v", i, err) + continue + } + + hash := tx.Hash() + if !hash.IsEqual(wantHash) { + t.Errorf("Hash #%d mismatched hash - got %v, "+ + "want %v", j, hash, wantHash) + continue + } + } + } + + // Create a new block to nuke all cached data. + b = btcutil.NewBlock(&Block100000) + + // Request slice of all transactions multiple times to test generation + // and caching. + for i := 0; i < 2; i++ { + transactions := b.Transactions() + + // Ensure we get the expected number of transactions. + if len(transactions) != len(wantTxHashes) { + t.Errorf("Transactions #%d mismatched number of "+ + "transactions - got %d, want %d", i, + len(transactions), len(wantTxHashes)) + continue + } + + // Ensure all of the hashes match. + for j, tx := range transactions { + wantHash, err := chainhash.NewHashFromStr(wantTxHashes[j]) + if err != nil { + t.Errorf("NewHashFromStr: %v", err) + } + + hash := tx.Hash() + if !hash.IsEqual(wantHash) { + t.Errorf("Transactions #%d mismatched hashes "+ + "- got %v, want %v", j, hash, wantHash) + continue + } + } + } + + // Serialize the test block. + var block100000Buf bytes.Buffer + err = Block100000.Serialize(&block100000Buf) + if err != nil { + t.Errorf("Serialize: %v", err) + } + block100000Bytes := block100000Buf.Bytes() + + // Request serialized bytes multiple times to test generation and + // caching. + for i := 0; i < 2; i++ { + serializedBytes, err := b.Bytes() + if err != nil { + t.Errorf("Bytes: %v", err) + continue + } + if !bytes.Equal(serializedBytes, block100000Bytes) { + t.Errorf("Bytes #%d wrong bytes - got %v, want %v", i, + spew.Sdump(serializedBytes), + spew.Sdump(block100000Bytes)) + continue + } + } + + // Transaction offsets and length for the transaction in Block100000. + wantTxLocs := []wire.TxLoc{ + {TxStart: 81, TxLen: 144}, + {TxStart: 225, TxLen: 259}, + {TxStart: 484, TxLen: 257}, + {TxStart: 741, TxLen: 225}, + } + + // Ensure the transaction location information is accurate. + txLocs, err := b.TxLoc() + if err != nil { + t.Errorf("TxLoc: %v", err) + return + } + if !reflect.DeepEqual(txLocs, wantTxLocs) { + t.Errorf("TxLoc: mismatched transaction location information "+ + "- got %v, want %v", spew.Sdump(txLocs), + spew.Sdump(wantTxLocs)) + } +} + +// TestNewBlockFromBytes tests creation of a Block from serialized bytes. +func TestNewBlockFromBytes(t *testing.T) { + // Serialize the test block. + var block100000Buf bytes.Buffer + err := Block100000.Serialize(&block100000Buf) + if err != nil { + t.Errorf("Serialize: %v", err) + } + block100000Bytes := block100000Buf.Bytes() + + // Create a new block from the serialized bytes. + b, err := btcutil.NewBlockFromBytes(block100000Bytes) + if err != nil { + t.Errorf("NewBlockFromBytes: %v", err) + return + } + + // Ensure we get the same data back out. + serializedBytes, err := b.Bytes() + if err != nil { + t.Errorf("Bytes: %v", err) + return + } + if !bytes.Equal(serializedBytes, block100000Bytes) { + t.Errorf("Bytes: wrong bytes - got %v, want %v", + spew.Sdump(serializedBytes), + spew.Sdump(block100000Bytes)) + } + + // Ensure the generated MsgBlock is correct. + if msgBlock := b.MsgBlock(); !reflect.DeepEqual(msgBlock, &Block100000) { + t.Errorf("MsgBlock: mismatched MsgBlock - got %v, want %v", + spew.Sdump(msgBlock), spew.Sdump(&Block100000)) + } +} + +// TestNewBlockFromBlockAndBytes tests creation of a Block from a MsgBlock and +// raw bytes. +func TestNewBlockFromBlockAndBytes(t *testing.T) { + // Serialize the test block. + var block100000Buf bytes.Buffer + err := Block100000.Serialize(&block100000Buf) + if err != nil { + t.Errorf("Serialize: %v", err) + } + block100000Bytes := block100000Buf.Bytes() + + // Create a new block from the serialized bytes. + b := btcutil.NewBlockFromBlockAndBytes(&Block100000, block100000Bytes) + + // Ensure we get the same data back out. + serializedBytes, err := b.Bytes() + if err != nil { + t.Errorf("Bytes: %v", err) + return + } + if !bytes.Equal(serializedBytes, block100000Bytes) { + t.Errorf("Bytes: wrong bytes - got %v, want %v", + spew.Sdump(serializedBytes), + spew.Sdump(block100000Bytes)) + } + if msgBlock := b.MsgBlock(); !reflect.DeepEqual(msgBlock, &Block100000) { + t.Errorf("MsgBlock: mismatched MsgBlock - got %v, want %v", + spew.Sdump(msgBlock), spew.Sdump(&Block100000)) + } +} + +// TestBlockErrors tests the error paths for the Block API. +func TestBlockErrors(t *testing.T) { + // Ensure out of range errors are as expected. + wantErr := "transaction index -1 is out of range - max 3" + testErr := btcutil.OutOfRangeError(wantErr) + if testErr.Error() != wantErr { + t.Errorf("OutOfRangeError: wrong error - got %v, want %v", + testErr.Error(), wantErr) + } + + // Serialize the test block. + var block100000Buf bytes.Buffer + err := Block100000.Serialize(&block100000Buf) + if err != nil { + t.Errorf("Serialize: %v", err) + } + block100000Bytes := block100000Buf.Bytes() + + // Create a new block from the serialized bytes. + b, err := btcutil.NewBlockFromBytes(block100000Bytes) + if err != nil { + t.Errorf("NewBlockFromBytes: %v", err) + return + } + + // Truncate the block byte buffer to force errors. + shortBytes := block100000Bytes[:80] + _, err = btcutil.NewBlockFromBytes(shortBytes) + if err != io.EOF { + t.Errorf("NewBlockFromBytes: did not get expected error - "+ + "got %v, want %v", err, io.EOF) + } + + // Ensure TxHash returns expected error on invalid indices. + _, err = b.TxHash(-1) + if _, ok := err.(btcutil.OutOfRangeError); !ok { + t.Errorf("TxHash: wrong error - got: %v <%T>, "+ + "want: <%T>", err, err, btcutil.OutOfRangeError("")) + } + _, err = b.TxHash(len(Block100000.Transactions)) + if _, ok := err.(btcutil.OutOfRangeError); !ok { + t.Errorf("TxHash: wrong error - got: %v <%T>, "+ + "want: <%T>", err, err, btcutil.OutOfRangeError("")) + } + + // Ensure Tx returns expected error on invalid indices. + _, err = b.Tx(-1) + if _, ok := err.(btcutil.OutOfRangeError); !ok { + t.Errorf("Tx: wrong error - got: %v <%T>, "+ + "want: <%T>", err, err, btcutil.OutOfRangeError("")) + } + _, err = b.Tx(len(Block100000.Transactions)) + if _, ok := err.(btcutil.OutOfRangeError); !ok { + t.Errorf("Tx: wrong error - got: %v <%T>, "+ + "want: <%T>", err, err, btcutil.OutOfRangeError("")) + } + + // Ensure TxLoc returns expected error with short byte buffer. + // This makes use of the test package only function, SetBlockBytes, to + // inject a short byte buffer. + b.SetBlockBytes(shortBytes) + _, err = b.TxLoc() + if err != io.EOF { + t.Errorf("TxLoc: did not get expected error - "+ + "got %v, want %v", err, io.EOF) + } +} + +// Block100000 defines block 100,000 of the block chain. It is used to +// test Block operations. +var Block100000 = wire.MsgBlock{ + Header: wire.BlockHeader{ + Version: 1, + PrevBlock: chainhash.Hash([32]byte{ // Make go vet happy. + 0x50, 0x12, 0x01, 0x19, 0x17, 0x2a, 0x61, 0x04, + 0x21, 0xa6, 0xc3, 0x01, 0x1d, 0xd3, 0x30, 0xd9, + 0xdf, 0x07, 0xb6, 0x36, 0x16, 0xc2, 0xcc, 0x1f, + 0x1c, 0xd0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + }), // 000000000002d01c1fccc21636b607dfd930d31d01c3a62104612a1719011250 + MerkleRoot: chainhash.Hash([32]byte{ // Make go vet happy. + 0x66, 0x57, 0xa9, 0x25, 0x2a, 0xac, 0xd5, 0xc0, + 0xb2, 0x94, 0x09, 0x96, 0xec, 0xff, 0x95, 0x22, + 0x28, 0xc3, 0x06, 0x7c, 0xc3, 0x8d, 0x48, 0x85, + 0xef, 0xb5, 0xa4, 0xac, 0x42, 0x47, 0xe9, 0xf3, + }), // f3e94742aca4b5ef85488dc37c06c3282295ffec960994b2c0d5ac2a25a95766 + Timestamp: time.Unix(1293623863, 0), // 2010-12-29 11:57:43 +0000 UTC + Bits: 0x1b04864c, // 453281356 + Nonce: 0x10572b0f, // 274148111 + }, + Transactions: []*wire.MsgTx{ + { + Version: 1, + TxIn: []*wire.TxIn{ + { + PreviousOutPoint: wire.OutPoint{ + Hash: chainhash.Hash{}, + Index: 0xffffffff, + }, + SignatureScript: []byte{ + 0x04, 0x4c, 0x86, 0x04, 0x1b, 0x02, 0x06, 0x02, + }, + Sequence: 0xffffffff, + Witness: [][]byte{ + {0x04, 0x31}, + {0x01, 0x43}, + }, + }, + }, + TxOut: []*wire.TxOut{ + { + Value: 0x12a05f200, // 5000000000 + PkScript: []byte{ + 0x41, // OP_DATA_65 + 0x04, 0x1b, 0x0e, 0x8c, 0x25, 0x67, 0xc1, 0x25, + 0x36, 0xaa, 0x13, 0x35, 0x7b, 0x79, 0xa0, 0x73, + 0xdc, 0x44, 0x44, 0xac, 0xb8, 0x3c, 0x4e, 0xc7, + 0xa0, 0xe2, 0xf9, 0x9d, 0xd7, 0x45, 0x75, 0x16, + 0xc5, 0x81, 0x72, 0x42, 0xda, 0x79, 0x69, 0x24, + 0xca, 0x4e, 0x99, 0x94, 0x7d, 0x08, 0x7f, 0xed, + 0xf9, 0xce, 0x46, 0x7c, 0xb9, 0xf7, 0xc6, 0x28, + 0x70, 0x78, 0xf8, 0x01, 0xdf, 0x27, 0x6f, 0xdf, + 0x84, // 65-byte signature + 0xac, // OP_CHECKSIG + }, + }, + }, + LockTime: 0, + }, + { + Version: 1, + TxIn: []*wire.TxIn{ + { + PreviousOutPoint: wire.OutPoint{ + Hash: chainhash.Hash([32]byte{ // Make go vet happy. + 0x03, 0x2e, 0x38, 0xe9, 0xc0, 0xa8, 0x4c, 0x60, + 0x46, 0xd6, 0x87, 0xd1, 0x05, 0x56, 0xdc, 0xac, + 0xc4, 0x1d, 0x27, 0x5e, 0xc5, 0x5f, 0xc0, 0x07, + 0x79, 0xac, 0x88, 0xfd, 0xf3, 0x57, 0xa1, 0x87, + }), // 87a157f3fd88ac7907c05fc55e271dc4acdc5605d187d646604ca8c0e9382e03 + Index: 0, + }, + SignatureScript: []byte{ + 0x49, // OP_DATA_73 + 0x30, 0x46, 0x02, 0x21, 0x00, 0xc3, 0x52, 0xd3, + 0xdd, 0x99, 0x3a, 0x98, 0x1b, 0xeb, 0xa4, 0xa6, + 0x3a, 0xd1, 0x5c, 0x20, 0x92, 0x75, 0xca, 0x94, + 0x70, 0xab, 0xfc, 0xd5, 0x7d, 0xa9, 0x3b, 0x58, + 0xe4, 0xeb, 0x5d, 0xce, 0x82, 0x02, 0x21, 0x00, + 0x84, 0x07, 0x92, 0xbc, 0x1f, 0x45, 0x60, 0x62, + 0x81, 0x9f, 0x15, 0xd3, 0x3e, 0xe7, 0x05, 0x5c, + 0xf7, 0xb5, 0xee, 0x1a, 0xf1, 0xeb, 0xcc, 0x60, + 0x28, 0xd9, 0xcd, 0xb1, 0xc3, 0xaf, 0x77, 0x48, + 0x01, // 73-byte signature + 0x41, // OP_DATA_65 + 0x04, 0xf4, 0x6d, 0xb5, 0xe9, 0xd6, 0x1a, 0x9d, + 0xc2, 0x7b, 0x8d, 0x64, 0xad, 0x23, 0xe7, 0x38, + 0x3a, 0x4e, 0x6c, 0xa1, 0x64, 0x59, 0x3c, 0x25, + 0x27, 0xc0, 0x38, 0xc0, 0x85, 0x7e, 0xb6, 0x7e, + 0xe8, 0xe8, 0x25, 0xdc, 0xa6, 0x50, 0x46, 0xb8, + 0x2c, 0x93, 0x31, 0x58, 0x6c, 0x82, 0xe0, 0xfd, + 0x1f, 0x63, 0x3f, 0x25, 0xf8, 0x7c, 0x16, 0x1b, + 0xc6, 0xf8, 0xa6, 0x30, 0x12, 0x1d, 0xf2, 0xb3, + 0xd3, // 65-byte pubkey + }, + Sequence: 0xffffffff, + }, + }, + TxOut: []*wire.TxOut{ + { + Value: 0x2123e300, // 556000000 + PkScript: []byte{ + 0x76, // OP_DUP + 0xa9, // OP_HASH160 + 0x14, // OP_DATA_20 + 0xc3, 0x98, 0xef, 0xa9, 0xc3, 0x92, 0xba, 0x60, + 0x13, 0xc5, 0xe0, 0x4e, 0xe7, 0x29, 0x75, 0x5e, + 0xf7, 0xf5, 0x8b, 0x32, + 0x88, // OP_EQUALVERIFY + 0xac, // OP_CHECKSIG + }, + }, + { + Value: 0x108e20f00, // 4444000000 + PkScript: []byte{ + 0x76, // OP_DUP + 0xa9, // OP_HASH160 + 0x14, // OP_DATA_20 + 0x94, 0x8c, 0x76, 0x5a, 0x69, 0x14, 0xd4, 0x3f, + 0x2a, 0x7a, 0xc1, 0x77, 0xda, 0x2c, 0x2f, 0x6b, + 0x52, 0xde, 0x3d, 0x7c, + 0x88, // OP_EQUALVERIFY + 0xac, // OP_CHECKSIG + }, + }, + }, + LockTime: 0, + }, + { + Version: 1, + TxIn: []*wire.TxIn{ + { + PreviousOutPoint: wire.OutPoint{ + Hash: chainhash.Hash([32]byte{ // Make go vet happy. + 0xc3, 0x3e, 0xbf, 0xf2, 0xa7, 0x09, 0xf1, 0x3d, + 0x9f, 0x9a, 0x75, 0x69, 0xab, 0x16, 0xa3, 0x27, + 0x86, 0xaf, 0x7d, 0x7e, 0x2d, 0xe0, 0x92, 0x65, + 0xe4, 0x1c, 0x61, 0xd0, 0x78, 0x29, 0x4e, 0xcf, + }), // cf4e2978d0611ce46592e02d7e7daf8627a316ab69759a9f3df109a7f2bf3ec3 + Index: 1, + }, + SignatureScript: []byte{ + 0x47, // OP_DATA_71 + 0x30, 0x44, 0x02, 0x20, 0x03, 0x2d, 0x30, 0xdf, + 0x5e, 0xe6, 0xf5, 0x7f, 0xa4, 0x6c, 0xdd, 0xb5, + 0xeb, 0x8d, 0x0d, 0x9f, 0xe8, 0xde, 0x6b, 0x34, + 0x2d, 0x27, 0x94, 0x2a, 0xe9, 0x0a, 0x32, 0x31, + 0xe0, 0xba, 0x33, 0x3e, 0x02, 0x20, 0x3d, 0xee, + 0xe8, 0x06, 0x0f, 0xdc, 0x70, 0x23, 0x0a, 0x7f, + 0x5b, 0x4a, 0xd7, 0xd7, 0xbc, 0x3e, 0x62, 0x8c, + 0xbe, 0x21, 0x9a, 0x88, 0x6b, 0x84, 0x26, 0x9e, + 0xae, 0xb8, 0x1e, 0x26, 0xb4, 0xfe, 0x01, + 0x41, // OP_DATA_65 + 0x04, 0xae, 0x31, 0xc3, 0x1b, 0xf9, 0x12, 0x78, + 0xd9, 0x9b, 0x83, 0x77, 0xa3, 0x5b, 0xbc, 0xe5, + 0xb2, 0x7d, 0x9f, 0xff, 0x15, 0x45, 0x68, 0x39, + 0xe9, 0x19, 0x45, 0x3f, 0xc7, 0xb3, 0xf7, 0x21, + 0xf0, 0xba, 0x40, 0x3f, 0xf9, 0x6c, 0x9d, 0xee, + 0xb6, 0x80, 0xe5, 0xfd, 0x34, 0x1c, 0x0f, 0xc3, + 0xa7, 0xb9, 0x0d, 0xa4, 0x63, 0x1e, 0xe3, 0x95, + 0x60, 0x63, 0x9d, 0xb4, 0x62, 0xe9, 0xcb, 0x85, + 0x0f, // 65-byte pubkey + }, + Sequence: 0xffffffff, + }, + }, + TxOut: []*wire.TxOut{ + { + Value: 0xf4240, // 1000000 + PkScript: []byte{ + 0x76, // OP_DUP + 0xa9, // OP_HASH160 + 0x14, // OP_DATA_20 + 0xb0, 0xdc, 0xbf, 0x97, 0xea, 0xbf, 0x44, 0x04, + 0xe3, 0x1d, 0x95, 0x24, 0x77, 0xce, 0x82, 0x2d, + 0xad, 0xbe, 0x7e, 0x10, + 0x88, // OP_EQUALVERIFY + 0xac, // OP_CHECKSIG + }, + }, + { + Value: 0x11d260c0, // 299000000 + PkScript: []byte{ + 0x76, // OP_DUP + 0xa9, // OP_HASH160 + 0x14, // OP_DATA_20 + 0x6b, 0x12, 0x81, 0xee, 0xc2, 0x5a, 0xb4, 0xe1, + 0xe0, 0x79, 0x3f, 0xf4, 0xe0, 0x8a, 0xb1, 0xab, + 0xb3, 0x40, 0x9c, 0xd9, + 0x88, // OP_EQUALVERIFY + 0xac, // OP_CHECKSIG + }, + }, + }, + LockTime: 0, + }, + { + Version: 1, + TxIn: []*wire.TxIn{ + { + PreviousOutPoint: wire.OutPoint{ + Hash: chainhash.Hash([32]byte{ // Make go vet happy. + 0x0b, 0x60, 0x72, 0xb3, 0x86, 0xd4, 0xa7, 0x73, + 0x23, 0x52, 0x37, 0xf6, 0x4c, 0x11, 0x26, 0xac, + 0x3b, 0x24, 0x0c, 0x84, 0xb9, 0x17, 0xa3, 0x90, + 0x9b, 0xa1, 0xc4, 0x3d, 0xed, 0x5f, 0x51, 0xf4, + }), // f4515fed3dc4a19b90a317b9840c243bac26114cf637522373a7d486b372600b + Index: 0, + }, + SignatureScript: []byte{ + 0x49, // OP_DATA_73 + 0x30, 0x46, 0x02, 0x21, 0x00, 0xbb, 0x1a, 0xd2, + 0x6d, 0xf9, 0x30, 0xa5, 0x1c, 0xce, 0x11, 0x0c, + 0xf4, 0x4f, 0x7a, 0x48, 0xc3, 0xc5, 0x61, 0xfd, + 0x97, 0x75, 0x00, 0xb1, 0xae, 0x5d, 0x6b, 0x6f, + 0xd1, 0x3d, 0x0b, 0x3f, 0x4a, 0x02, 0x21, 0x00, + 0xc5, 0xb4, 0x29, 0x51, 0xac, 0xed, 0xff, 0x14, + 0xab, 0xba, 0x27, 0x36, 0xfd, 0x57, 0x4b, 0xdb, + 0x46, 0x5f, 0x3e, 0x6f, 0x8d, 0xa1, 0x2e, 0x2c, + 0x53, 0x03, 0x95, 0x4a, 0xca, 0x7f, 0x78, 0xf3, + 0x01, // 73-byte signature + 0x41, // OP_DATA_65 + 0x04, 0xa7, 0x13, 0x5b, 0xfe, 0x82, 0x4c, 0x97, + 0xec, 0xc0, 0x1e, 0xc7, 0xd7, 0xe3, 0x36, 0x18, + 0x5c, 0x81, 0xe2, 0xaa, 0x2c, 0x41, 0xab, 0x17, + 0x54, 0x07, 0xc0, 0x94, 0x84, 0xce, 0x96, 0x94, + 0xb4, 0x49, 0x53, 0xfc, 0xb7, 0x51, 0x20, 0x65, + 0x64, 0xa9, 0xc2, 0x4d, 0xd0, 0x94, 0xd4, 0x2f, + 0xdb, 0xfd, 0xd5, 0xaa, 0xd3, 0xe0, 0x63, 0xce, + 0x6a, 0xf4, 0xcf, 0xaa, 0xea, 0x4e, 0xa1, 0x4f, + 0xbb, // 65-byte pubkey + }, + Sequence: 0xffffffff, + }, + }, + TxOut: []*wire.TxOut{ + { + Value: 0xf4240, // 1000000 + PkScript: []byte{ + 0x76, // OP_DUP + 0xa9, // OP_HASH160 + 0x14, // OP_DATA_20 + 0x39, 0xaa, 0x3d, 0x56, 0x9e, 0x06, 0xa1, 0xd7, + 0x92, 0x6d, 0xc4, 0xbe, 0x11, 0x93, 0xc9, 0x9b, + 0xf2, 0xeb, 0x9e, 0xe0, + 0x88, // OP_EQUALVERIFY + 0xac, // OP_CHECKSIG + }, + }, + }, + LockTime: 0, + }, + }, +} diff --git a/btcutil/bloom/README.md b/btcutil/bloom/README.md new file mode 100644 index 0000000000..4a5c937f88 --- /dev/null +++ b/btcutil/bloom/README.md @@ -0,0 +1,30 @@ +bloom +===== + +[![Build Status](http://img.shields.io/travis/btcsuite/btcutil.svg)](https://travis-ci.org/btcsuite/btcutil) +[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) +[![GoDoc](http://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/btcsuite/btcd/btcutil/bloom) + +Package bloom provides an API for dealing with bitcoin-specific bloom filters. + +A comprehensive suite of tests is provided to ensure proper functionality. See +`test_coverage.txt` for the gocov coverage report. Alternatively, if you are +running a POSIX OS, you can run the `cov_report.sh` script for a real-time +report. + +## Installation and Updating + +```bash +$ go get -u github.com/btcsuite/btcd/btcutil/bloom +``` + +## Examples + +* [NewFilter Example](http://godoc.org/github.com/btcsuite/btcd/btcutil/bloom#example-NewFilter) + Demonstrates how to create a new bloom filter, add a transaction hash to it, + and check if the filter matches the transaction. + +## License + +Package bloom is licensed under the [copyfree](http://copyfree.org) ISC +License. diff --git a/btcutil/bloom/cov_report.sh b/btcutil/bloom/cov_report.sh new file mode 100644 index 0000000000..307f05b76c --- /dev/null +++ b/btcutil/bloom/cov_report.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +# This script uses gocov to generate a test coverage report. +# The gocov tool my be obtained with the following command: +# go get github.com/axw/gocov/gocov +# +# It will be installed to $GOPATH/bin, so ensure that location is in your $PATH. + +# Check for gocov. +type gocov >/dev/null 2>&1 +if [ $? -ne 0 ]; then + echo >&2 "This script requires the gocov tool." + echo >&2 "You may obtain it with the following command:" + echo >&2 "go get github.com/axw/gocov/gocov" + exit 1 +fi +gocov test | gocov report diff --git a/btcutil/bloom/example_test.go b/btcutil/bloom/example_test.go new file mode 100644 index 0000000000..2be2b67a74 --- /dev/null +++ b/btcutil/bloom/example_test.go @@ -0,0 +1,45 @@ +// Copyright (c) 2014-2016 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package bloom_test + +import ( + "fmt" + "math/rand" + "time" + + "github.com/btcsuite/btcd/btcutil/bloom" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/wire" +) + +// This example demonstrates how to create a new bloom filter, add a transaction +// hash to it, and check if the filter matches the transaction. +func ExampleNewFilter() { + rand.Seed(time.Now().UnixNano()) + tweak := rand.Uint32() + + // Create a new bloom filter intended to hold 10 elements with a 0.01% + // false positive rate and does not include any automatic update + // functionality when transactions are matched. + filter := bloom.NewFilter(10, tweak, 0.0001, wire.BloomUpdateNone) + + // Create a transaction hash and add it to the filter. This particular + // transaction is the first transaction in block 310,000 of the main + // bitcoin block chain. + txHashStr := "fd611c56ca0d378cdcd16244b45c2ba9588da3adac367c4ef43e808b280b8a45" + txHash, err := chainhash.NewHashFromStr(txHashStr) + if err != nil { + fmt.Println(err) + return + } + filter.AddHash(txHash) + + // Show that the filter matches. + matches := filter.Matches(txHash[:]) + fmt.Println("Filter Matches?:", matches) + + // Output: + // Filter Matches?: true +} diff --git a/btcutil/bloom/filter.go b/btcutil/bloom/filter.go new file mode 100644 index 0000000000..2eca228570 --- /dev/null +++ b/btcutil/bloom/filter.go @@ -0,0 +1,354 @@ +// Copyright (c) 2014-2016 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package bloom + +import ( + "encoding/binary" + "math" + "sync" + + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/txscript" + "github.com/btcsuite/btcd/wire" +) + +// ln2Squared is simply the square of the natural log of 2. +const ln2Squared = math.Ln2 * math.Ln2 + +// minUint32 is a convenience function to return the minimum value of the two +// passed uint32 values. +func minUint32(a, b uint32) uint32 { + if a < b { + return a + } + return b +} + +// Filter defines a bitcoin bloom filter that provides easy manipulation of raw +// filter data. +type Filter struct { + mtx sync.Mutex + msgFilterLoad *wire.MsgFilterLoad +} + +// NewFilter creates a new bloom filter instance, mainly to be used by SPV +// clients. The tweak parameter is a random value added to the seed value. +// The false positive rate is the probability of a false positive where 1.0 is +// "match everything" and zero is unachievable. Thus, providing any false +// positive rates less than 0 or greater than 1 will be adjusted to the valid +// range. +// +// For more information on what values to use for both elements and fprate, +// see https://en.wikipedia.org/wiki/Bloom_filter. +func NewFilter(elements, tweak uint32, fprate float64, flags wire.BloomUpdateType) *Filter { + // Massage the false positive rate to sane values. + if fprate > 1.0 { + fprate = 1.0 + } + if fprate < 1e-9 { + fprate = 1e-9 + } + + // Calculate the size of the filter in bytes for the given number of + // elements and false positive rate. + // + // Equivalent to m = -(n*ln(p) / ln(2)^2), where m is in bits. + // Then clamp it to the maximum filter size and convert to bytes. + dataLen := uint32(-1 * float64(elements) * math.Log(fprate) / ln2Squared) + dataLen = minUint32(dataLen, wire.MaxFilterLoadFilterSize*8) / 8 + + // Calculate the number of hash functions based on the size of the + // filter calculated above and the number of elements. + // + // Equivalent to k = (m/n) * ln(2) + // Then clamp it to the maximum allowed hash funcs. + hashFuncs := uint32(float64(dataLen*8) / float64(elements) * math.Ln2) + hashFuncs = minUint32(hashFuncs, wire.MaxFilterLoadHashFuncs) + + data := make([]byte, dataLen) + msg := wire.NewMsgFilterLoad(data, hashFuncs, tweak, flags) + + return &Filter{ + msgFilterLoad: msg, + } +} + +// LoadFilter creates a new Filter instance with the given underlying +// wire.MsgFilterLoad. +func LoadFilter(filter *wire.MsgFilterLoad) *Filter { + return &Filter{ + msgFilterLoad: filter, + } +} + +// IsLoaded returns true if a filter is loaded, otherwise false. +// +// This function is safe for concurrent access. +func (bf *Filter) IsLoaded() bool { + bf.mtx.Lock() + loaded := bf.msgFilterLoad != nil + bf.mtx.Unlock() + return loaded +} + +// Reload loads a new filter replacing any existing filter. +// +// This function is safe for concurrent access. +func (bf *Filter) Reload(filter *wire.MsgFilterLoad) { + bf.mtx.Lock() + bf.msgFilterLoad = filter + bf.mtx.Unlock() +} + +// Unload unloads the bloom filter. +// +// This function is safe for concurrent access. +func (bf *Filter) Unload() { + bf.mtx.Lock() + bf.msgFilterLoad = nil + bf.mtx.Unlock() +} + +// hash returns the bit offset in the bloom filter which corresponds to the +// passed data for the given independent hash function number. +func (bf *Filter) hash(hashNum uint32, data []byte) uint32 { + // bitcoind: 0xfba4c795 chosen as it guarantees a reasonable bit + // difference between hashNum values. + // + // Note that << 3 is equivalent to multiplying by 8, but is faster. + // Thus the returned hash is brought into range of the number of bits + // the filter has and returned. + mm := MurmurHash3(hashNum*0xfba4c795+bf.msgFilterLoad.Tweak, data) + return mm % (uint32(len(bf.msgFilterLoad.Filter)) << 3) +} + +// matches returns true if the bloom filter might contain the passed data and +// false if it definitely does not. +// +// This function MUST be called with the filter lock held. +func (bf *Filter) matches(data []byte) bool { + if bf.msgFilterLoad == nil { + return false + } + + // The bloom filter does not contain the data if any of the bit offsets + // which result from hashing the data using each independent hash + // function are not set. The shifts and masks below are a faster + // equivalent of: + // arrayIndex := idx / 8 (idx >> 3) + // bitOffset := idx % 8 (idx & 7) + /// if filter[arrayIndex] & 1<>3]&(1<<(idx&7)) == 0 { + return false + } + } + return true +} + +// Matches returns true if the bloom filter might contain the passed data and +// false if it definitely does not. +// +// This function is safe for concurrent access. +func (bf *Filter) Matches(data []byte) bool { + bf.mtx.Lock() + match := bf.matches(data) + bf.mtx.Unlock() + return match +} + +// matchesOutPoint returns true if the bloom filter might contain the passed +// outpoint and false if it definitely does not. +// +// This function MUST be called with the filter lock held. +func (bf *Filter) matchesOutPoint(outpoint *wire.OutPoint) bool { + // Serialize + var buf [chainhash.HashSize + 4]byte + copy(buf[:], outpoint.Hash[:]) + binary.LittleEndian.PutUint32(buf[chainhash.HashSize:], outpoint.Index) + + return bf.matches(buf[:]) +} + +// MatchesOutPoint returns true if the bloom filter might contain the passed +// outpoint and false if it definitely does not. +// +// This function is safe for concurrent access. +func (bf *Filter) MatchesOutPoint(outpoint *wire.OutPoint) bool { + bf.mtx.Lock() + match := bf.matchesOutPoint(outpoint) + bf.mtx.Unlock() + return match +} + +// add adds the passed byte slice to the bloom filter. +// +// This function MUST be called with the filter lock held. +func (bf *Filter) add(data []byte) { + if bf.msgFilterLoad == nil { + return + } + + // Adding data to a bloom filter consists of setting all of the bit + // offsets which result from hashing the data using each independent + // hash function. The shifts and masks below are a faster equivalent + // of: + // arrayIndex := idx / 8 (idx >> 3) + // bitOffset := idx % 8 (idx & 7) + /// filter[arrayIndex] |= 1<>3] |= (1 << (7 & idx)) + } +} + +// Add adds the passed byte slice to the bloom filter. +// +// This function is safe for concurrent access. +func (bf *Filter) Add(data []byte) { + bf.mtx.Lock() + bf.add(data) + bf.mtx.Unlock() +} + +// AddHash adds the passed chainhash.Hash to the Filter. +// +// This function is safe for concurrent access. +func (bf *Filter) AddHash(hash *chainhash.Hash) { + bf.mtx.Lock() + bf.add(hash[:]) + bf.mtx.Unlock() +} + +// addOutPoint adds the passed transaction outpoint to the bloom filter. +// +// This function MUST be called with the filter lock held. +func (bf *Filter) addOutPoint(outpoint *wire.OutPoint) { + // Serialize + var buf [chainhash.HashSize + 4]byte + copy(buf[:], outpoint.Hash[:]) + binary.LittleEndian.PutUint32(buf[chainhash.HashSize:], outpoint.Index) + + bf.add(buf[:]) +} + +// AddOutPoint adds the passed transaction outpoint to the bloom filter. +// +// This function is safe for concurrent access. +func (bf *Filter) AddOutPoint(outpoint *wire.OutPoint) { + bf.mtx.Lock() + bf.addOutPoint(outpoint) + bf.mtx.Unlock() +} + +// maybeAddOutpoint potentially adds the passed outpoint to the bloom filter +// depending on the bloom update flags and the type of the passed public key +// script. +// +// This function MUST be called with the filter lock held. +func (bf *Filter) maybeAddOutpoint(pkScript []byte, outHash *chainhash.Hash, outIdx uint32) { + switch bf.msgFilterLoad.Flags { + case wire.BloomUpdateAll: + outpoint := wire.NewOutPoint(outHash, outIdx) + bf.addOutPoint(outpoint) + case wire.BloomUpdateP2PubkeyOnly: + class := txscript.GetScriptClass(pkScript) + if class == txscript.PubKeyTy || class == txscript.MultiSigTy { + outpoint := wire.NewOutPoint(outHash, outIdx) + bf.addOutPoint(outpoint) + } + } +} + +// matchTxAndUpdate returns true if the bloom filter matches data within the +// passed transaction, otherwise false is returned. If the filter does match +// the passed transaction, it will also update the filter depending on the bloom +// update flags set via the loaded filter if needed. +// +// This function MUST be called with the filter lock held. +func (bf *Filter) matchTxAndUpdate(tx *btcutil.Tx) bool { + // Check if the filter matches the hash of the transaction. + // This is useful for finding transactions when they appear in a block. + matched := bf.matches(tx.Hash()[:]) + + // Check if the filter matches any data elements in the public key + // scripts of any of the outputs. When it does, add the outpoint that + // matched so transactions which spend from the matched transaction are + // also included in the filter. This removes the burden of updating the + // filter for this scenario from the client. It is also more efficient + // on the network since it avoids the need for another filteradd message + // from the client and avoids some potential races that could otherwise + // occur. + for i, txOut := range tx.MsgTx().TxOut { + pushedData, err := txscript.PushedData(txOut.PkScript) + if err != nil { + continue + } + + for _, data := range pushedData { + if !bf.matches(data) { + continue + } + + matched = true + bf.maybeAddOutpoint(txOut.PkScript, tx.Hash(), uint32(i)) + break + } + } + + // Nothing more to do if a match has already been made. + if matched { + return true + } + + // At this point, the transaction and none of the data elements in the + // public key scripts of its outputs matched. + + // Check if the filter matches any outpoints this transaction spends or + // any data elements in the signature scripts of any of the inputs. + for _, txin := range tx.MsgTx().TxIn { + if bf.matchesOutPoint(&txin.PreviousOutPoint) { + return true + } + + pushedData, err := txscript.PushedData(txin.SignatureScript) + if err != nil { + continue + } + for _, data := range pushedData { + if bf.matches(data) { + return true + } + } + } + + return false +} + +// MatchTxAndUpdate returns true if the bloom filter matches data within the +// passed transaction, otherwise false is returned. If the filter does match +// the passed transaction, it will also update the filter depending on the bloom +// update flags set via the loaded filter if needed. +// +// This function is safe for concurrent access. +func (bf *Filter) MatchTxAndUpdate(tx *btcutil.Tx) bool { + bf.mtx.Lock() + match := bf.matchTxAndUpdate(tx) + bf.mtx.Unlock() + return match +} + +// MsgFilterLoad returns the underlying wire.MsgFilterLoad for the bloom +// filter. +// +// This function is safe for concurrent access. +func (bf *Filter) MsgFilterLoad() *wire.MsgFilterLoad { + bf.mtx.Lock() + msg := bf.msgFilterLoad + bf.mtx.Unlock() + return msg +} diff --git a/btcutil/bloom/filter_test.go b/btcutil/bloom/filter_test.go new file mode 100644 index 0000000000..c4b839ad17 --- /dev/null +++ b/btcutil/bloom/filter_test.go @@ -0,0 +1,660 @@ +// Copyright (c) 2013-2016 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package bloom_test + +import ( + "bytes" + "encoding/hex" + "testing" + + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/btcutil/bloom" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/wire" +) + +// TestFilterLarge ensures a maximum sized filter can be created. +func TestFilterLarge(t *testing.T) { + f := bloom.NewFilter(100000000, 0, 0.01, wire.BloomUpdateNone) + if len(f.MsgFilterLoad().Filter) > wire.MaxFilterLoadFilterSize { + t.Errorf("TestFilterLarge test failed: %d > %d", + len(f.MsgFilterLoad().Filter), wire.MaxFilterLoadFilterSize) + } +} + +// TestFilterLoad ensures loading and unloading of a filter pass. +func TestFilterLoad(t *testing.T) { + merkle := wire.MsgFilterLoad{} + + f := bloom.LoadFilter(&merkle) + if !f.IsLoaded() { + t.Errorf("TestFilterLoad IsLoaded test failed: want %v got %v", + true, !f.IsLoaded()) + return + } + f.Unload() + if f.IsLoaded() { + t.Errorf("TestFilterLoad IsLoaded test failed: want %v got %v", + f.IsLoaded(), false) + return + } +} + +// TestFilterInsert ensures inserting data into the filter causes that data +// to be matched and the resulting serialized MsgFilterLoad is the expected +// value. +func TestFilterInsert(t *testing.T) { + var tests = []struct { + hex string + insert bool + }{ + {"99108ad8ed9bb6274d3980bab5a85c048f0950c8", true}, + {"19108ad8ed9bb6274d3980bab5a85c048f0950c8", false}, + {"b5a2c786d9ef4658287ced5914b37a1b4aa32eee", true}, + {"b9300670b4c5366e95b2699e8b18bc75e5f729c5", true}, + } + + f := bloom.NewFilter(3, 0, 0.01, wire.BloomUpdateAll) + + for i, test := range tests { + data, err := hex.DecodeString(test.hex) + if err != nil { + t.Errorf("TestFilterInsert DecodeString failed: %v\n", err) + return + } + if test.insert { + f.Add(data) + } + + result := f.Matches(data) + if test.insert != result { + t.Errorf("TestFilterInsert Matches test #%d failure: got %v want %v\n", + i, result, test.insert) + return + } + } + + want, err := hex.DecodeString("03614e9b050000000000000001") + if err != nil { + t.Errorf("TestFilterInsert DecodeString failed: %v\n", err) + return + } + + got := bytes.NewBuffer(nil) + err = f.MsgFilterLoad().BtcEncode(got, wire.ProtocolVersion, wire.LatestEncoding) + if err != nil { + t.Errorf("TestFilterInsert BtcDecode failed: %v\n", err) + return + } + + if !bytes.Equal(got.Bytes(), want) { + t.Errorf("TestFilterInsert failure: got %v want %v\n", + got.Bytes(), want) + return + } +} + +// TestFilterFPRange checks that new filters made with out of range +// false positive targets result in either max or min false positive rates. +func TestFilterFPRange(t *testing.T) { + tests := []struct { + name string + hash string + want string + filter *bloom.Filter + }{ + { + name: "fprates > 1 should be clipped at 1", + hash: "02981fa052f0481dbc5868f4fc2166035a10f27a03cfd2de67326471df5bc041", + want: "00000000000000000001", + filter: bloom.NewFilter(1, 0, 20.9999999769, wire.BloomUpdateAll), + }, + { + name: "fprates less than 1e-9 should be clipped at min", + hash: "02981fa052f0481dbc5868f4fc2166035a10f27a03cfd2de67326471df5bc041", + want: "0566d97a91a91b0000000000000001", + filter: bloom.NewFilter(1, 0, 0, wire.BloomUpdateAll), + }, + { + name: "negative fprates should be clipped at min", + hash: "02981fa052f0481dbc5868f4fc2166035a10f27a03cfd2de67326471df5bc041", + want: "0566d97a91a91b0000000000000001", + filter: bloom.NewFilter(1, 0, -1, wire.BloomUpdateAll), + }, + } + + for _, test := range tests { + // Convert test input to appropriate types. + hash, err := chainhash.NewHashFromStr(test.hash) + if err != nil { + t.Errorf("NewHashFromStr unexpected error: %v", err) + continue + } + want, err := hex.DecodeString(test.want) + if err != nil { + t.Errorf("DecodeString unexpected error: %v\n", err) + continue + } + + // Add the test hash to the bloom filter and ensure the + // filter serializes to the expected bytes. + f := test.filter + f.AddHash(hash) + got := bytes.NewBuffer(nil) + err = f.MsgFilterLoad().BtcEncode(got, wire.ProtocolVersion, wire.LatestEncoding) + if err != nil { + t.Errorf("BtcDecode unexpected error: %v\n", err) + continue + } + if !bytes.Equal(got.Bytes(), want) { + t.Errorf("serialized filter mismatch: got %x want %x\n", + got.Bytes(), want) + continue + } + } +} + +// TestFilterInsert ensures inserting data into the filter with a tweak causes +// that data to be matched and the resulting serialized MsgFilterLoad is the +// expected value. +func TestFilterInsertWithTweak(t *testing.T) { + var tests = []struct { + hex string + insert bool + }{ + {"99108ad8ed9bb6274d3980bab5a85c048f0950c8", true}, + {"19108ad8ed9bb6274d3980bab5a85c048f0950c8", false}, + {"b5a2c786d9ef4658287ced5914b37a1b4aa32eee", true}, + {"b9300670b4c5366e95b2699e8b18bc75e5f729c5", true}, + } + + f := bloom.NewFilter(3, 2147483649, 0.01, wire.BloomUpdateAll) + + for i, test := range tests { + data, err := hex.DecodeString(test.hex) + if err != nil { + t.Errorf("TestFilterInsertWithTweak DecodeString failed: %v\n", err) + return + } + if test.insert { + f.Add(data) + } + + result := f.Matches(data) + if test.insert != result { + t.Errorf("TestFilterInsertWithTweak Matches test #%d failure: got %v want %v\n", + i, result, test.insert) + return + } + } + + want, err := hex.DecodeString("03ce4299050000000100008001") + if err != nil { + t.Errorf("TestFilterInsertWithTweak DecodeString failed: %v\n", err) + return + } + got := bytes.NewBuffer(nil) + err = f.MsgFilterLoad().BtcEncode(got, wire.ProtocolVersion, wire.LatestEncoding) + if err != nil { + t.Errorf("TestFilterInsertWithTweak BtcDecode failed: %v\n", err) + return + } + + if !bytes.Equal(got.Bytes(), want) { + t.Errorf("TestFilterInsertWithTweak failure: got %v want %v\n", + got.Bytes(), want) + return + } +} + +// TestFilterInsertKey ensures inserting public keys and addresses works as +// expected. +func TestFilterInsertKey(t *testing.T) { + secret := "5Kg1gnAjaLfKiwhhPpGS3QfRg2m6awQvaj98JCZBZQ5SuS2F15C" + + wif, err := btcutil.DecodeWIF(secret) + if err != nil { + t.Errorf("TestFilterInsertKey DecodeWIF failed: %v", err) + return + } + + f := bloom.NewFilter(2, 0, 0.001, wire.BloomUpdateAll) + f.Add(wif.SerializePubKey()) + f.Add(btcutil.Hash160(wif.SerializePubKey())) + + want, err := hex.DecodeString("038fc16b080000000000000001") + if err != nil { + t.Errorf("TestFilterInsertWithTweak DecodeString failed: %v\n", err) + return + } + got := bytes.NewBuffer(nil) + err = f.MsgFilterLoad().BtcEncode(got, wire.ProtocolVersion, wire.LatestEncoding) + if err != nil { + t.Errorf("TestFilterInsertWithTweak BtcDecode failed: %v\n", err) + return + } + + if !bytes.Equal(got.Bytes(), want) { + t.Errorf("TestFilterInsertWithTweak failure: got %v want %v\n", + got.Bytes(), want) + return + } +} + +func TestFilterBloomMatch(t *testing.T) { + str := "01000000010b26e9b7735eb6aabdf358bab62f9816a21ba9ebdb719d5299e" + + "88607d722c190000000008b4830450220070aca44506c5cef3a16ed519d7" + + "c3c39f8aab192c4e1c90d065f37b8a4af6141022100a8e160b856c2d43d2" + + "7d8fba71e5aef6405b8643ac4cb7cb3c462aced7f14711a0141046d11fee" + + "51b0e60666d5049a9101a72741df480b96ee26488a4d3466b95c9a40ac5e" + + "eef87e10a5cd336c19a84565f80fa6c547957b7700ff4dfbdefe76036c33" + + "9ffffffff021bff3d11000000001976a91404943fdd508053c75000106d3" + + "bc6e2754dbcff1988ac2f15de00000000001976a914a266436d296554760" + + "8b9e15d9032a7b9d64fa43188ac00000000" + strBytes, err := hex.DecodeString(str) + if err != nil { + t.Errorf("TestFilterBloomMatch DecodeString failure: %v", err) + return + } + tx, err := btcutil.NewTxFromBytes(strBytes) + if err != nil { + t.Errorf("TestFilterBloomMatch NewTxFromBytes failure: %v", err) + return + } + spendingTxBytes := []byte{0x01, 0x00, 0x00, 0x00, 0x01, 0x6b, 0xff, 0x7f, + 0xcd, 0x4f, 0x85, 0x65, 0xef, 0x40, 0x6d, 0xd5, 0xd6, + 0x3d, 0x4f, 0xf9, 0x4f, 0x31, 0x8f, 0xe8, 0x20, 0x27, + 0xfd, 0x4d, 0xc4, 0x51, 0xb0, 0x44, 0x74, 0x01, 0x9f, + 0x74, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x49, 0x30, + 0x46, 0x02, 0x21, 0x00, 0xda, 0x0d, 0xc6, 0xae, 0xce, + 0xfe, 0x1e, 0x06, 0xef, 0xdf, 0x05, 0x77, 0x37, 0x57, + 0xde, 0xb1, 0x68, 0x82, 0x09, 0x30, 0xe3, 0xb0, 0xd0, + 0x3f, 0x46, 0xf5, 0xfc, 0xf1, 0x50, 0xbf, 0x99, 0x0c, + 0x02, 0x21, 0x00, 0xd2, 0x5b, 0x5c, 0x87, 0x04, 0x00, + 0x76, 0xe4, 0xf2, 0x53, 0xf8, 0x26, 0x2e, 0x76, 0x3e, + 0x2d, 0xd5, 0x1e, 0x7f, 0xf0, 0xbe, 0x15, 0x77, 0x27, + 0xc4, 0xbc, 0x42, 0x80, 0x7f, 0x17, 0xbd, 0x39, 0x01, + 0x41, 0x04, 0xe6, 0xc2, 0x6e, 0xf6, 0x7d, 0xc6, 0x10, + 0xd2, 0xcd, 0x19, 0x24, 0x84, 0x78, 0x9a, 0x6c, 0xf9, + 0xae, 0xa9, 0x93, 0x0b, 0x94, 0x4b, 0x7e, 0x2d, 0xb5, + 0x34, 0x2b, 0x9d, 0x9e, 0x5b, 0x9f, 0xf7, 0x9a, 0xff, + 0x9a, 0x2e, 0xe1, 0x97, 0x8d, 0xd7, 0xfd, 0x01, 0xdf, + 0xc5, 0x22, 0xee, 0x02, 0x28, 0x3d, 0x3b, 0x06, 0xa9, + 0xd0, 0x3a, 0xcf, 0x80, 0x96, 0x96, 0x8d, 0x7d, 0xbb, + 0x0f, 0x91, 0x78, 0xff, 0xff, 0xff, 0xff, 0x02, 0x8b, + 0xa7, 0x94, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x19, 0x76, + 0xa9, 0x14, 0xba, 0xde, 0xec, 0xfd, 0xef, 0x05, 0x07, + 0x24, 0x7f, 0xc8, 0xf7, 0x42, 0x41, 0xd7, 0x3b, 0xc0, + 0x39, 0x97, 0x2d, 0x7b, 0x88, 0xac, 0x40, 0x94, 0xa8, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x19, 0x76, 0xa9, 0x14, + 0xc1, 0x09, 0x32, 0x48, 0x3f, 0xec, 0x93, 0xed, 0x51, + 0xf5, 0xfe, 0x95, 0xe7, 0x25, 0x59, 0xf2, 0xcc, 0x70, + 0x43, 0xf9, 0x88, 0xac, 0x00, 0x00, 0x00, 0x00, 0x00} + + spendingTx, err := btcutil.NewTxFromBytes(spendingTxBytes) + if err != nil { + t.Errorf("TestFilterBloomMatch NewTxFromBytes failure: %v", err) + return + } + + f := bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateAll) + inputStr := "b4749f017444b051c44dfd2720e88f314ff94f3dd6d56d40ef65854fcd7fff6b" + hash, err := chainhash.NewHashFromStr(inputStr) + if err != nil { + t.Errorf("TestFilterBloomMatch NewHashFromStr failed: %v\n", err) + return + } + f.AddHash(hash) + if !f.MatchTxAndUpdate(tx) { + t.Errorf("TestFilterBloomMatch didn't match hash %s", inputStr) + } + + f = bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateAll) + inputStr = "6bff7fcd4f8565ef406dd5d63d4ff94f318fe82027fd4dc451b04474019f74b4" + hashBytes, err := hex.DecodeString(inputStr) + if err != nil { + t.Errorf("TestFilterBloomMatch DecodeString failed: %v\n", err) + return + } + f.Add(hashBytes) + if !f.MatchTxAndUpdate(tx) { + t.Errorf("TestFilterBloomMatch didn't match hash %s", inputStr) + } + + f = bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateAll) + inputStr = "30450220070aca44506c5cef3a16ed519d7c3c39f8aab192c4e1c90d065" + + "f37b8a4af6141022100a8e160b856c2d43d27d8fba71e5aef6405b8643" + + "ac4cb7cb3c462aced7f14711a01" + hashBytes, err = hex.DecodeString(inputStr) + if err != nil { + t.Errorf("TestFilterBloomMatch DecodeString failed: %v\n", err) + return + } + f.Add(hashBytes) + if !f.MatchTxAndUpdate(tx) { + t.Errorf("TestFilterBloomMatch didn't match input signature %s", inputStr) + } + + f = bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateAll) + inputStr = "046d11fee51b0e60666d5049a9101a72741df480b96ee26488a4d3466b95" + + "c9a40ac5eeef87e10a5cd336c19a84565f80fa6c547957b7700ff4dfbdefe" + + "76036c339" + hashBytes, err = hex.DecodeString(inputStr) + if err != nil { + t.Errorf("TestFilterBloomMatch DecodeString failed: %v\n", err) + return + } + f.Add(hashBytes) + if !f.MatchTxAndUpdate(tx) { + t.Errorf("TestFilterBloomMatch didn't match input pubkey %s", inputStr) + } + + f = bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateAll) + inputStr = "04943fdd508053c75000106d3bc6e2754dbcff19" + hashBytes, err = hex.DecodeString(inputStr) + if err != nil { + t.Errorf("TestFilterBloomMatch DecodeString failed: %v\n", err) + return + } + f.Add(hashBytes) + if !f.MatchTxAndUpdate(tx) { + t.Errorf("TestFilterBloomMatch didn't match output address %s", inputStr) + } + if !f.MatchTxAndUpdate(spendingTx) { + t.Errorf("TestFilterBloomMatch spendingTx didn't match output address %s", inputStr) + } + + f = bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateAll) + inputStr = "a266436d2965547608b9e15d9032a7b9d64fa431" + hashBytes, err = hex.DecodeString(inputStr) + if err != nil { + t.Errorf("TestFilterBloomMatch DecodeString failed: %v\n", err) + return + } + f.Add(hashBytes) + if !f.MatchTxAndUpdate(tx) { + t.Errorf("TestFilterBloomMatch didn't match output address %s", inputStr) + } + + f = bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateAll) + inputStr = "90c122d70786e899529d71dbeba91ba216982fb6ba58f3bdaab65e73b7e9260b" + hash, err = chainhash.NewHashFromStr(inputStr) + if err != nil { + t.Errorf("TestFilterBloomMatch NewHashFromStr failed: %v\n", err) + return + } + outpoint := wire.NewOutPoint(hash, 0) + f.AddOutPoint(outpoint) + if !f.MatchTxAndUpdate(tx) { + t.Errorf("TestFilterBloomMatch didn't match outpoint %s", inputStr) + } + + f = bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateAll) + inputStr = "00000009e784f32f62ef849763d4f45b98e07ba658647343b915ff832b110436" + hash, err = chainhash.NewHashFromStr(inputStr) + if err != nil { + t.Errorf("TestFilterBloomMatch NewHashFromStr failed: %v\n", err) + return + } + f.AddHash(hash) + if f.MatchTxAndUpdate(tx) { + t.Errorf("TestFilterBloomMatch matched hash %s", inputStr) + } + + f = bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateAll) + inputStr = "0000006d2965547608b9e15d9032a7b9d64fa431" + hashBytes, err = hex.DecodeString(inputStr) + if err != nil { + t.Errorf("TestFilterBloomMatch DecodeString failed: %v\n", err) + return + } + f.Add(hashBytes) + if f.MatchTxAndUpdate(tx) { + t.Errorf("TestFilterBloomMatch matched address %s", inputStr) + } + + f = bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateAll) + inputStr = "90c122d70786e899529d71dbeba91ba216982fb6ba58f3bdaab65e73b7e9260b" + hash, err = chainhash.NewHashFromStr(inputStr) + if err != nil { + t.Errorf("TestFilterBloomMatch NewHashFromStr failed: %v\n", err) + return + } + outpoint = wire.NewOutPoint(hash, 1) + f.AddOutPoint(outpoint) + if f.MatchTxAndUpdate(tx) { + t.Errorf("TestFilterBloomMatch matched outpoint %s", inputStr) + } + + f = bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateAll) + inputStr = "000000d70786e899529d71dbeba91ba216982fb6ba58f3bdaab65e73b7e9260b" + hash, err = chainhash.NewHashFromStr(inputStr) + if err != nil { + t.Errorf("TestFilterBloomMatch NewHashFromStr failed: %v\n", err) + return + } + outpoint = wire.NewOutPoint(hash, 0) + f.AddOutPoint(outpoint) + if f.MatchTxAndUpdate(tx) { + t.Errorf("TestFilterBloomMatch matched outpoint %s", inputStr) + } +} + +func TestFilterInsertUpdateNone(t *testing.T) { + f := bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateNone) + + // Add the generation pubkey + inputStr := "04eaafc2314def4ca98ac970241bcab022b9c1e1f4ea423a20f134c" + + "876f2c01ec0f0dd5b2e86e7168cefe0d81113c3807420ce13ad1357231a" + + "2252247d97a46a91" + inputBytes, err := hex.DecodeString(inputStr) + if err != nil { + t.Errorf("TestFilterInsertUpdateNone DecodeString failed: %v", err) + return + } + f.Add(inputBytes) + + // Add the output address for the 4th transaction + inputStr = "b6efd80d99179f4f4ff6f4dd0a007d018c385d21" + inputBytes, err = hex.DecodeString(inputStr) + if err != nil { + t.Errorf("TestFilterInsertUpdateNone DecodeString failed: %v", err) + return + } + f.Add(inputBytes) + + inputStr = "147caa76786596590baa4e98f5d9f48b86c7765e489f7a6ff3360fe5c674360b" + hash, err := chainhash.NewHashFromStr(inputStr) + if err != nil { + t.Errorf("TestFilterInsertUpdateNone NewHashFromStr failed: %v", err) + return + } + outpoint := wire.NewOutPoint(hash, 0) + + if f.MatchesOutPoint(outpoint) { + t.Errorf("TestFilterInsertUpdateNone matched outpoint %s", inputStr) + return + } + + inputStr = "02981fa052f0481dbc5868f4fc2166035a10f27a03cfd2de67326471df5bc041" + hash, err = chainhash.NewHashFromStr(inputStr) + if err != nil { + t.Errorf("TestFilterInsertUpdateNone NewHashFromStr failed: %v", err) + return + } + outpoint = wire.NewOutPoint(hash, 0) + + if f.MatchesOutPoint(outpoint) { + t.Errorf("TestFilterInsertUpdateNone matched outpoint %s", inputStr) + return + } +} + +func TestFilterInsertP2PubKeyOnly(t *testing.T) { + blockStr := "0100000082bb869cf3a793432a66e826e05a6fc37469f8efb7421dc" + + "880670100000000007f16c5962e8bd963659c793ce370d95f093bc7e367" + + "117b3c30c1f8fdd0d9728776381b4d4c86041b554b85290701000000010" + + "00000000000000000000000000000000000000000000000000000000000" + + "0000ffffffff07044c86041b0136ffffffff0100f2052a0100000043410" + + "4eaafc2314def4ca98ac970241bcab022b9c1e1f4ea423a20f134c876f2" + + "c01ec0f0dd5b2e86e7168cefe0d81113c3807420ce13ad1357231a22522" + + "47d97a46a91ac000000000100000001bcad20a6a29827d1424f08989255" + + "120bf7f3e9e3cdaaa6bb31b0737fe048724300000000494830450220356" + + "e834b046cadc0f8ebb5a8a017b02de59c86305403dad52cd77b55af062e" + + "a10221009253cd6c119d4729b77c978e1e2aa19f5ea6e0e52b3f16e32fa" + + "608cd5bab753901ffffffff02008d380c010000001976a9142b4b8072ec" + + "bba129b6453c63e129e643207249ca88ac0065cd1d000000001976a9141" + + "b8dd13b994bcfc787b32aeadf58ccb3615cbd5488ac0000000001000000" + + "03fdacf9b3eb077412e7a968d2e4f11b9a9dee312d666187ed77ee7d26a" + + "f16cb0b000000008c493046022100ea1608e70911ca0de5af51ba57ad23" + + "b9a51db8d28f82c53563c56a05c20f5a87022100a8bdc8b4a8acc8634c6" + + "b420410150775eb7f2474f5615f7fccd65af30f310fbf01410465fdf49e" + + "29b06b9a1582287b6279014f834edc317695d125ef623c1cc3aaece245b" + + "d69fcad7508666e9c74a49dc9056d5fc14338ef38118dc4afae5fe2c585" + + "caffffffff309e1913634ecb50f3c4f83e96e70b2df071b497b8973a3e7" + + "5429df397b5af83000000004948304502202bdb79c596a9ffc24e96f438" + + "6199aba386e9bc7b6071516e2b51dda942b3a1ed022100c53a857e76b72" + + "4fc14d45311eac5019650d415c3abb5428f3aae16d8e69bec2301ffffff" + + "ff2089e33491695080c9edc18a428f7d834db5b6d372df13ce2b1b0e0cb" + + "cb1e6c10000000049483045022100d4ce67c5896ee251c810ac1ff9cecc" + + "d328b497c8f553ab6e08431e7d40bad6b5022033119c0c2b7d792d31f11" + + "87779c7bd95aefd93d90a715586d73801d9b47471c601ffffffff010071" + + "4460030000001976a914c7b55141d097ea5df7a0ed330cf794376e53ec8" + + "d88ac0000000001000000045bf0e214aa4069a3e792ecee1e1bf0c1d397" + + "cde8dd08138f4b72a00681743447000000008b48304502200c45de8c4f3" + + "e2c1821f2fc878cba97b1e6f8807d94930713aa1c86a67b9bf1e4022100" + + "8581abfef2e30f957815fc89978423746b2086375ca8ecf359c85c2a5b7" + + "c88ad01410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf64852" + + "61c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d" + + "3ae37079b794a92d7ec95ffffffffd669f7d7958d40fc59d2253d88e0f2" + + "48e29b599c80bbcec344a83dda5f9aa72c000000008a473044022078124" + + "c8beeaa825f9e0b30bff96e564dd859432f2d0cb3b72d3d5d93d38d7e93" + + "0220691d233b6c0f995be5acb03d70a7f7a65b6bc9bdd426260f38a1346" + + "669507a3601410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6" + + "485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270e" + + "fb1d3ae37079b794a92d7ec95fffffffff878af0d93f5229a68166cf051" + + "fd372bb7a537232946e0a46f53636b4dafdaa4000000008c49304602210" + + "0c717d1714551663f69c3c5759bdbb3a0fcd3fab023abc0e522fe6440de" + + "35d8290221008d9cbe25bffc44af2b18e81c58eb37293fd7fe1c2e7b46f" + + "c37ee8c96c50ab1e201410462bb73f76ca0994fcb8b4271e6fb7561f5c0" + + "f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f" + + "4d87270efb1d3ae37079b794a92d7ec95ffffffff27f2b668859cd7f2f8" + + "94aa0fd2d9e60963bcd07c88973f425f999b8cbfd7a1e2000000008c493" + + "046022100e00847147cbf517bcc2f502f3ddc6d284358d102ed20d47a8a" + + "a788a62f0db780022100d17b2d6fa84dcaf1c95d88d7e7c30385aecf415" + + "588d749afd3ec81f6022cecd701410462bb73f76ca0994fcb8b4271e6fb" + + "7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018" + + "ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffff0100c817a8" + + "040000001976a914b6efd80d99179f4f4ff6f4dd0a007d018c385d2188a" + + "c000000000100000001834537b2f1ce8ef9373a258e10545ce5a50b758d" + + "f616cd4356e0032554ebd3c4000000008b483045022100e68f422dd7c34" + + "fdce11eeb4509ddae38201773dd62f284e8aa9d96f85099d0b002202243" + + "bd399ff96b649a0fad05fa759d6a882f0af8c90cf7632c2840c29070aec" + + "20141045e58067e815c2f464c6a2a15f987758374203895710c2d452442" + + "e28496ff38ba8f5fd901dc20e29e88477167fe4fc299bf818fd0d9e1632" + + "d467b2a3d9503b1aaffffffff0280d7e636030000001976a914f34c3e10" + + "eb387efe872acb614c89e78bfca7815d88ac404b4c00000000001976a91" + + "4a84e272933aaf87e1715d7786c51dfaeb5b65a6f88ac00000000010000" + + "000143ac81c8e6f6ef307dfe17f3d906d999e23e0189fda838c5510d850" + + "927e03ae7000000008c4930460221009c87c344760a64cb8ae6685a3eec" + + "2c1ac1bed5b88c87de51acd0e124f266c16602210082d07c037359c3a25" + + "7b5c63ebd90f5a5edf97b2ac1c434b08ca998839f346dd40141040ba7e5" + + "21fa7946d12edbb1d1e95a15c34bd4398195e86433c92b431cd315f455f" + + "e30032ede69cad9d1e1ed6c3c4ec0dbfced53438c625462afb792dcb098" + + "544bffffffff0240420f00000000001976a9144676d1b820d63ec272f19" + + "00d59d43bc6463d96f888ac40420f00000000001976a914648d04341d00" + + "d7968b3405c034adc38d4d8fb9bd88ac00000000010000000248cc91750" + + "1ea5c55f4a8d2009c0567c40cfe037c2e71af017d0a452ff705e3f10000" + + "00008b483045022100bf5fdc86dc5f08a5d5c8e43a8c9d5b1ed8c65562e" + + "280007b52b133021acd9acc02205e325d613e555f772802bf413d36ba80" + + "7892ed1a690a77811d3033b3de226e0a01410429fa713b124484cb2bd7b" + + "5557b2c0b9df7b2b1fee61825eadc5ae6c37a9920d38bfccdc7dc3cb0c4" + + "7d7b173dbc9db8d37db0a33ae487982c59c6f8606e9d1791ffffffff41e" + + "d70551dd7e841883ab8f0b16bf04176b7d1480e4f0af9f3d4c3595768d0" + + "68000000008b4830450221008513ad65187b903aed1102d1d0c47688127" + + "658c51106753fed0151ce9c16b80902201432b9ebcb87bd04ceb2de6603" + + "5fbbaf4bf8b00d1cfe41f1a1f7338f9ad79d210141049d4cf80125bf50b" + + "e1709f718c07ad15d0fc612b7da1f5570dddc35f2a352f0f27c978b0682" + + "0edca9ef982c35fda2d255afba340068c5035552368bc7200c1488fffff" + + "fff0100093d00000000001976a9148edb68822f1ad580b043c7b3df2e40" + + "0f8699eb4888ac00000000" + blockBytes, err := hex.DecodeString(blockStr) + if err != nil { + t.Errorf("TestFilterInsertP2PubKeyOnly DecodeString failed: %v", err) + return + } + block, err := btcutil.NewBlockFromBytes(blockBytes) + if err != nil { + t.Errorf("TestFilterInsertP2PubKeyOnly NewBlockFromBytes failed: %v", err) + return + } + + f := bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateP2PubkeyOnly) + + // Generation pubkey + inputStr := "04eaafc2314def4ca98ac970241bcab022b9c1e1f4ea423a20f134c" + + "876f2c01ec0f0dd5b2e86e7168cefe0d81113c3807420ce13ad1357231a" + + "2252247d97a46a91" + inputBytes, err := hex.DecodeString(inputStr) + if err != nil { + t.Errorf("TestFilterInsertP2PubKeyOnly DecodeString failed: %v", err) + return + } + f.Add(inputBytes) + + // Output address of 4th transaction + inputStr = "b6efd80d99179f4f4ff6f4dd0a007d018c385d21" + inputBytes, err = hex.DecodeString(inputStr) + if err != nil { + t.Errorf("TestFilterInsertP2PubKeyOnly DecodeString failed: %v", err) + return + } + f.Add(inputBytes) + + // Ignore return value -- this is just used to update the filter. + _, _ = bloom.NewMerkleBlock(block, f) + + // We should match the generation pubkey + inputStr = "147caa76786596590baa4e98f5d9f48b86c7765e489f7a6ff3360fe5c674360b" + hash, err := chainhash.NewHashFromStr(inputStr) + if err != nil { + t.Errorf("TestMerkleBlockP2PubKeyOnly NewHashFromStr failed: %v", err) + return + } + outpoint := wire.NewOutPoint(hash, 0) + if !f.MatchesOutPoint(outpoint) { + t.Errorf("TestMerkleBlockP2PubKeyOnly didn't match the generation "+ + "outpoint %s", inputStr) + return + } + + // We should not match the 4th transaction, which is not p2pk + inputStr = "02981fa052f0481dbc5868f4fc2166035a10f27a03cfd2de67326471df5bc041" + hash, err = chainhash.NewHashFromStr(inputStr) + if err != nil { + t.Errorf("TestMerkleBlockP2PubKeyOnly NewHashFromStr failed: %v", err) + return + } + outpoint = wire.NewOutPoint(hash, 0) + if f.MatchesOutPoint(outpoint) { + t.Errorf("TestMerkleBlockP2PubKeyOnly matched outpoint %s", inputStr) + return + } +} + +func TestFilterReload(t *testing.T) { + f := bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateAll) + + bFilter := bloom.LoadFilter(f.MsgFilterLoad()) + if bFilter.MsgFilterLoad() == nil { + t.Errorf("TestFilterReload LoadFilter test failed") + return + } + bFilter.Reload(nil) + + if bFilter.MsgFilterLoad() != nil { + t.Errorf("TestFilterReload Reload test failed") + } +} diff --git a/btcutil/bloom/merkleblock.go b/btcutil/bloom/merkleblock.go new file mode 100644 index 0000000000..468aa72a05 --- /dev/null +++ b/btcutil/bloom/merkleblock.go @@ -0,0 +1,126 @@ +// Copyright (c) 2013-2016 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package bloom + +import ( + "github.com/btcsuite/btcd/blockchain" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/wire" +) + +// merkleBlock is used to house intermediate information needed to generate a +// wire.MsgMerkleBlock according to a filter. +type merkleBlock struct { + numTx uint32 + allHashes []*chainhash.Hash + finalHashes []*chainhash.Hash + matchedBits []byte + bits []byte +} + +// calcTreeWidth calculates and returns the number of nodes (width) or a +// merkle tree at the given depth-first height. +func (m *merkleBlock) calcTreeWidth(height uint32) uint32 { + return (m.numTx + (1 << height) - 1) >> height +} + +// calcHash returns the hash for a sub-tree given a depth-first height and +// node position. +func (m *merkleBlock) calcHash(height, pos uint32) *chainhash.Hash { + if height == 0 { + return m.allHashes[pos] + } + + var right *chainhash.Hash + left := m.calcHash(height-1, pos*2) + if pos*2+1 < m.calcTreeWidth(height-1) { + right = m.calcHash(height-1, pos*2+1) + } else { + right = left + } + res := blockchain.HashMerkleBranches(left, right) + return &res +} + +// traverseAndBuild builds a partial merkle tree using a recursive depth-first +// approach. As it calculates the hashes, it also saves whether or not each +// node is a parent node and a list of final hashes to be included in the +// merkle block. +func (m *merkleBlock) traverseAndBuild(height, pos uint32) { + // Determine whether this node is a parent of a matched node. + var isParent byte + for i := pos << height; i < (pos+1)< 1 { + height++ + } + + // Build the depth-first partial merkle tree. + mBlock.traverseAndBuild(height, 0) + + // Create and return the merkle block. + msgMerkleBlock := wire.MsgMerkleBlock{ + Header: block.MsgBlock().Header, + Transactions: mBlock.numTx, + Hashes: make([]*chainhash.Hash, 0, len(mBlock.finalHashes)), + Flags: make([]byte, (len(mBlock.bits)+7)/8), + } + for _, hash := range mBlock.finalHashes { + _ = msgMerkleBlock.AddTxHash(hash) + } + for i := uint32(0); i < uint32(len(mBlock.bits)); i++ { + msgMerkleBlock.Flags[i/8] |= mBlock.bits[i] << (i % 8) + } + return &msgMerkleBlock, matchedIndices +} diff --git a/btcutil/bloom/merkleblock_test.go b/btcutil/bloom/merkleblock_test.go new file mode 100644 index 0000000000..ae7b1f3430 --- /dev/null +++ b/btcutil/bloom/merkleblock_test.go @@ -0,0 +1,74 @@ +// Copyright (c) 2013-2016 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package bloom_test + +import ( + "bytes" + "encoding/hex" + "testing" + + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/btcutil/bloom" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/wire" +) + +func TestMerkleBlock3(t *testing.T) { + blockStr := "0100000079cda856b143d9db2c1caff01d1aecc8630d30625d10e8b" + + "4b8b0000000000000b50cc069d6a3e33e3ff84a5c41d9d3febe7c770fdc" + + "c96b2c3ff60abe184f196367291b4d4c86041b8fa45d630101000000010" + + "00000000000000000000000000000000000000000000000000000000000" + + "0000ffffffff08044c86041b020a02ffffffff0100f2052a01000000434" + + "104ecd3229b0571c3be876feaac0442a9f13c5a572742927af1dc623353" + + "ecf8c202225f64868137a18cdd85cbbb4c74fbccfd4f49639cf1bdc94a5" + + "672bb15ad5d4cac00000000" + blockBytes, err := hex.DecodeString(blockStr) + if err != nil { + t.Errorf("TestMerkleBlock3 DecodeString failed: %v", err) + return + } + blk, err := btcutil.NewBlockFromBytes(blockBytes) + if err != nil { + t.Errorf("TestMerkleBlock3 NewBlockFromBytes failed: %v", err) + return + } + + f := bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateAll) + + inputStr := "63194f18be0af63f2c6bc9dc0f777cbefed3d9415c4af83f3ee3a3d669c00cb5" + hash, err := chainhash.NewHashFromStr(inputStr) + if err != nil { + t.Errorf("TestMerkleBlock3 NewHashFromStr failed: %v", err) + return + } + + f.AddHash(hash) + + mBlock, _ := bloom.NewMerkleBlock(blk, f) + + wantStr := "0100000079cda856b143d9db2c1caff01d1aecc8630d30625d10e8b4" + + "b8b0000000000000b50cc069d6a3e33e3ff84a5c41d9d3febe7c770fdcc" + + "96b2c3ff60abe184f196367291b4d4c86041b8fa45d630100000001b50c" + + "c069d6a3e33e3ff84a5c41d9d3febe7c770fdcc96b2c3ff60abe184f196" + + "30101" + want, err := hex.DecodeString(wantStr) + if err != nil { + t.Errorf("TestMerkleBlock3 DecodeString failed: %v", err) + return + } + + got := bytes.NewBuffer(nil) + err = mBlock.BtcEncode(got, wire.ProtocolVersion, wire.LatestEncoding) + if err != nil { + t.Errorf("TestMerkleBlock3 BtcEncode failed: %v", err) + return + } + + if !bytes.Equal(want, got.Bytes()) { + t.Errorf("TestMerkleBlock3 failed merkle block comparison: "+ + "got %v want %v", got.Bytes(), want) + return + } +} diff --git a/btcutil/bloom/murmurhash3.go b/btcutil/bloom/murmurhash3.go new file mode 100644 index 0000000000..6bb562ecba --- /dev/null +++ b/btcutil/bloom/murmurhash3.go @@ -0,0 +1,72 @@ +// Copyright (c) 2013, 2014 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package bloom + +import ( + "encoding/binary" +) + +// The following constants are used by the MurmurHash3 algorithm. +const ( + murmurC1 = 0xcc9e2d51 + murmurC2 = 0x1b873593 + murmurR1 = 15 + murmurR2 = 13 + murmurM = 5 + murmurN = 0xe6546b64 +) + +// MurmurHash3 implements a non-cryptographic hash function using the +// MurmurHash3 algorithm. This implementation yields a 32-bit hash value which +// is suitable for general hash-based lookups. The seed can be used to +// effectively randomize the hash function. This makes it ideal for use in +// bloom filters which need multiple independent hash functions. +func MurmurHash3(seed uint32, data []byte) uint32 { + dataLen := uint32(len(data)) + hash := seed + k := uint32(0) + numBlocks := dataLen / 4 + + // Calculate the hash in 4-byte chunks. + for i := uint32(0); i < numBlocks; i++ { + k = binary.LittleEndian.Uint32(data[i*4:]) + k *= murmurC1 + k = (k << murmurR1) | (k >> (32 - murmurR1)) + k *= murmurC2 + + hash ^= k + hash = (hash << murmurR2) | (hash >> (32 - murmurR2)) + hash = hash*murmurM + murmurN + } + + // Handle remaining bytes. + tailIdx := numBlocks * 4 + k = 0 + + switch dataLen & 3 { + case 3: + k ^= uint32(data[tailIdx+2]) << 16 + fallthrough + case 2: + k ^= uint32(data[tailIdx+1]) << 8 + fallthrough + case 1: + k ^= uint32(data[tailIdx]) + k *= murmurC1 + k = (k << murmurR1) | (k >> (32 - murmurR1)) + k *= murmurC2 + hash ^= k + } + + // Finalization. + hash ^= dataLen + hash ^= hash >> 16 + hash *= 0x85ebca6b + hash ^= hash >> 13 + hash *= 0xc2b2ae35 + hash ^= hash >> 16 + + return hash +} diff --git a/btcutil/bloom/murmurhash3_test.go b/btcutil/bloom/murmurhash3_test.go new file mode 100644 index 0000000000..9c102d5f8c --- /dev/null +++ b/btcutil/bloom/murmurhash3_test.go @@ -0,0 +1,45 @@ +// Copyright (c) 2013, 2014 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package bloom_test + +import ( + "testing" + + "github.com/btcsuite/btcd/btcutil/bloom" +) + +// TestMurmurHash3 ensure the MurmurHash3 function produces the correct hash +// when given various seeds and data. +func TestMurmurHash3(t *testing.T) { + var tests = []struct { + seed uint32 + data []byte + out uint32 + }{ + {0x00000000, []byte{}, 0x00000000}, + {0xfba4c795, []byte{}, 0x6a396f08}, + {0xffffffff, []byte{}, 0x81f16f39}, + {0x00000000, []byte{0x00}, 0x514e28b7}, + {0xfba4c795, []byte{0x00}, 0xea3f0b17}, + {0x00000000, []byte{0xff}, 0xfd6cf10d}, + {0x00000000, []byte{0x00, 0x11}, 0x16c6b7ab}, + {0x00000000, []byte{0x00, 0x11, 0x22}, 0x8eb51c3d}, + {0x00000000, []byte{0x00, 0x11, 0x22, 0x33}, 0xb4471bf8}, + {0x00000000, []byte{0x00, 0x11, 0x22, 0x33, 0x44}, 0xe2301fa8}, + {0x00000000, []byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55}, 0xfc2e4a15}, + {0x00000000, []byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66}, 0xb074502c}, + {0x00000000, []byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77}, 0x8034d2a0}, + {0x00000000, []byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}, 0xb4698def}, + } + + for i, test := range tests { + result := bloom.MurmurHash3(test.seed, test.data) + if result != test.out { + t.Errorf("MurmurHash3 test #%d failed: got %v want %v\n", + i, result, test.out) + continue + } + } +} diff --git a/btcutil/bloom/test_coverage.txt b/btcutil/bloom/test_coverage.txt new file mode 100644 index 0000000000..e503f26feb --- /dev/null +++ b/btcutil/bloom/test_coverage.txt @@ -0,0 +1,28 @@ + +github.com/conformal/btcutil/bloom/murmurhash3.go MurmurHash3 100.00% (31/31) +github.com/conformal/btcutil/bloom/merkleblock.go NewMerkleBlock 100.00% (19/19) +github.com/conformal/btcutil/bloom/merkleblock.go merkleBlock.traverseAndBuild 100.00% (10/10) +github.com/conformal/btcutil/bloom/merkleblock.go merkleBlock.calcHash 100.00% (8/8) +github.com/conformal/btcutil/bloom/filter.go Filter.maybeAddOutpoint 100.00% (7/7) +github.com/conformal/btcutil/bloom/filter.go Filter.addOutPoint 100.00% (4/4) +github.com/conformal/btcutil/bloom/filter.go Filter.IsLoaded 100.00% (4/4) +github.com/conformal/btcutil/bloom/filter.go Filter.MsgFilterLoad 100.00% (4/4) +github.com/conformal/btcutil/bloom/filter.go Filter.matchesOutPoint 100.00% (4/4) +github.com/conformal/btcutil/bloom/filter.go Filter.MatchesOutPoint 100.00% (4/4) +github.com/conformal/btcutil/bloom/filter.go Filter.MatchTxAndUpdate 100.00% (4/4) +github.com/conformal/btcutil/bloom/filter.go Filter.Matches 100.00% (4/4) +github.com/conformal/btcutil/bloom/filter.go Filter.Add 100.00% (3/3) +github.com/conformal/btcutil/bloom/filter.go Filter.Reload 100.00% (3/3) +github.com/conformal/btcutil/bloom/filter.go Filter.Unload 100.00% (3/3) +github.com/conformal/btcutil/bloom/filter.go Filter.AddShaHash 100.00% (3/3) +github.com/conformal/btcutil/bloom/filter.go Filter.AddOutPoint 100.00% (3/3) +github.com/conformal/btcutil/bloom/filter.go minUint32 100.00% (3/3) +github.com/conformal/btcutil/bloom/filter.go Filter.hash 100.00% (2/2) +github.com/conformal/btcutil/bloom/merkleblock.go merkleBlock.calcTreeWidth 100.00% (1/1) +github.com/conformal/btcutil/bloom/filter.go LoadFilter 100.00% (1/1) +github.com/conformal/btcutil/bloom/filter.go Filter.matchTxAndUpdate 91.30% (21/23) +github.com/conformal/btcutil/bloom/filter.go Filter.matches 85.71% (6/7) +github.com/conformal/btcutil/bloom/filter.go NewFilter 81.82% (9/11) +github.com/conformal/btcutil/bloom/filter.go Filter.add 80.00% (4/5) +github.com/conformal/btcutil/bloom ---------------------------- 96.49% (165/171) + diff --git a/btcutil/certgen.go b/btcutil/certgen.go new file mode 100644 index 0000000000..52e2d9cc95 --- /dev/null +++ b/btcutil/certgen.go @@ -0,0 +1,144 @@ +// Copyright (c) 2013-2015 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package btcutil + +import ( + "bytes" + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" + _ "crypto/sha512" // Needed for RegisterHash in init + "crypto/x509" + "crypto/x509/pkix" + "encoding/pem" + "errors" + "fmt" + "math/big" + "net" + "os" + "time" +) + +// NewTLSCertPair returns a new PEM-encoded x.509 certificate pair +// based on a 521-bit ECDSA private key. The machine's local interface +// addresses and all variants of IPv4 and IPv6 localhost are included as +// valid IP addresses. +func NewTLSCertPair(organization string, validUntil time.Time, extraHosts []string) (cert, key []byte, err error) { + now := time.Now() + if validUntil.Before(now) { + return nil, nil, errors.New("validUntil would create an already-expired certificate") + } + + priv, err := ecdsa.GenerateKey(elliptic.P521(), rand.Reader) + if err != nil { + return nil, nil, err + } + + // end of ASN.1 time + endOfTime := time.Date(2049, 12, 31, 23, 59, 59, 0, time.UTC) + if validUntil.After(endOfTime) { + validUntil = endOfTime + } + + serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128) + serialNumber, err := rand.Int(rand.Reader, serialNumberLimit) + if err != nil { + return nil, nil, fmt.Errorf("failed to generate serial number: %s", err) + } + + host, err := os.Hostname() + if err != nil { + return nil, nil, err + } + + ipAddresses := []net.IP{net.ParseIP("127.0.0.1"), net.ParseIP("::1")} + dnsNames := []string{host} + if host != "localhost" { + dnsNames = append(dnsNames, "localhost") + } + + addIP := func(ipAddr net.IP) { + for _, ip := range ipAddresses { + if ip.Equal(ipAddr) { + return + } + } + ipAddresses = append(ipAddresses, ipAddr) + } + addHost := func(host string) { + for _, dnsName := range dnsNames { + if host == dnsName { + return + } + } + dnsNames = append(dnsNames, host) + } + + addrs, err := interfaceAddrs() + if err != nil { + return nil, nil, err + } + for _, a := range addrs { + ipAddr, _, err := net.ParseCIDR(a.String()) + if err == nil { + addIP(ipAddr) + } + } + + for _, hostStr := range extraHosts { + host, _, err := net.SplitHostPort(hostStr) + if err != nil { + host = hostStr + } + if ip := net.ParseIP(host); ip != nil { + addIP(ip) + } else { + addHost(host) + } + } + + template := x509.Certificate{ + SerialNumber: serialNumber, + Subject: pkix.Name{ + Organization: []string{organization}, + CommonName: host, + }, + NotBefore: now.Add(-time.Hour * 24), + NotAfter: validUntil, + + KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | + x509.KeyUsageCertSign, + IsCA: true, // so can sign self. + BasicConstraintsValid: true, + + DNSNames: dnsNames, + IPAddresses: ipAddresses, + } + + derBytes, err := x509.CreateCertificate(rand.Reader, &template, + &template, &priv.PublicKey, priv) + if err != nil { + return nil, nil, fmt.Errorf("failed to create certificate: %v", err) + } + + certBuf := &bytes.Buffer{} + err = pem.Encode(certBuf, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes}) + if err != nil { + return nil, nil, fmt.Errorf("failed to encode certificate: %v", err) + } + + keybytes, err := x509.MarshalECPrivateKey(priv) + if err != nil { + return nil, nil, fmt.Errorf("failed to marshal private key: %v", err) + } + + keyBuf := &bytes.Buffer{} + err = pem.Encode(keyBuf, &pem.Block{Type: "EC PRIVATE KEY", Bytes: keybytes}) + if err != nil { + return nil, nil, fmt.Errorf("failed to encode private key: %v", err) + } + + return certBuf.Bytes(), keyBuf.Bytes(), nil +} diff --git a/btcutil/certgen_test.go b/btcutil/certgen_test.go new file mode 100644 index 0000000000..81aeea5d6a --- /dev/null +++ b/btcutil/certgen_test.go @@ -0,0 +1,123 @@ +// Copyright (c) 2013-2015 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package btcutil_test + +import ( + "crypto/x509" + "encoding/pem" + "net" + "testing" + "time" + + "github.com/btcsuite/btcd/btcutil" + //"github.com/davecgh/go-spew/spew" +) + +// TestNewTLSCertPair ensures the NewTLSCertPair function works as expected. +func TestNewTLSCertPair(t *testing.T) { + // Certs don't support sub-second precision, so truncate it now to + // ensure the checks later don't fail due to nanosecond precision + // differences. + validUntil := time.Unix(time.Now().Add(10*365*24*time.Hour).Unix(), 0) + org := "test autogenerated cert" + extraHosts := []string{"testtlscert.bogus", "localhost", "127.0.0.1"} + cert, key, err := btcutil.NewTLSCertPair(org, validUntil, extraHosts) + if err != nil { + t.Fatalf("failed with unexpected error: %v", err) + } + + // Ensure the PEM-encoded cert that is returned can be decoded. + pemCert, _ := pem.Decode(cert) + if pemCert == nil { + t.Fatalf("pem.Decode was unable to decode the certificate") + } + + // Ensure the PEM-encoded key that is returned can be decoded. + pemKey, _ := pem.Decode(key) + if pemCert == nil { + t.Fatalf("pem.Decode was unable to decode the key") + } + + // Ensure the DER-encoded key bytes can be successfully parsed. + _, err = x509.ParseECPrivateKey(pemKey.Bytes) + if err != nil { + t.Fatalf("failed with unexpected error: %v", err) + } + + // Ensure the DER-encoded cert bytes can be successfully into an X.509 + // certificate. + x509Cert, err := x509.ParseCertificate(pemCert.Bytes) + if err != nil { + t.Fatalf("failed with unexpected error: %v", err) + } + + // Ensure the specified organization is correct. + x509Orgs := x509Cert.Subject.Organization + if len(x509Orgs) == 0 || x509Orgs[0] != org { + x509Org := "" + if len(x509Orgs) > 0 { + x509Org = x509Orgs[0] + } + t.Fatalf("generated cert organization field mismatch, got "+ + "'%v', want '%v'", x509Org, org) + } + + // Ensure the specified valid until value is correct. + if !x509Cert.NotAfter.Equal(validUntil) { + t.Fatalf("generated cert valid until field mismatch, got %v, "+ + "want %v", x509Cert.NotAfter, validUntil) + } + + // Ensure the specified extra hosts are present. + for _, host := range extraHosts { + if err := x509Cert.VerifyHostname(host); err != nil { + t.Fatalf("failed to verify extra host '%s'", host) + } + } + + // Ensure that the Common Name is also the first SAN DNS name. + cn := x509Cert.Subject.CommonName + san0 := x509Cert.DNSNames[0] + if cn != san0 { + t.Errorf("common name %s does not match first SAN %s", cn, san0) + } + + // Ensure there are no duplicate hosts or IPs. + hostCounts := make(map[string]int) + for _, host := range x509Cert.DNSNames { + hostCounts[host]++ + } + ipCounts := make(map[string]int) + for _, ip := range x509Cert.IPAddresses { + ipCounts[string(ip)]++ + } + for host, count := range hostCounts { + if count != 1 { + t.Errorf("host %s appears %d times in certificate", host, count) + } + } + for ipStr, count := range ipCounts { + if count != 1 { + t.Errorf("ip %s appears %d times in certificate", net.IP(ipStr), count) + } + } + + // Ensure the cert can be use for the intended purposes. + if !x509Cert.IsCA { + t.Fatal("generated cert is not a certificate authority") + } + if x509Cert.KeyUsage&x509.KeyUsageKeyEncipherment == 0 { + t.Fatal("generated cert can't be used for key encipherment") + } + if x509Cert.KeyUsage&x509.KeyUsageDigitalSignature == 0 { + t.Fatal("generated cert can't be used for digital signatures") + } + if x509Cert.KeyUsage&x509.KeyUsageCertSign == 0 { + t.Fatal("generated cert can't be used for signing other certs") + } + if !x509Cert.BasicConstraintsValid { + t.Fatal("generated cert does not have valid basic constraints") + } +} diff --git a/btcutil/coinset/README.md b/btcutil/coinset/README.md new file mode 100644 index 0000000000..4fc239ad5e --- /dev/null +++ b/btcutil/coinset/README.md @@ -0,0 +1,71 @@ +coinset +======= + +[![Build Status](http://img.shields.io/travis/btcsuite/btcutil.svg)](https://travis-ci.org/btcsuite/btcutil) +[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) +[![GoDoc](http://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/btcsuite/btcd/btcutil/coinset) + +Package coinset provides bitcoin-specific convenience functions for selecting +from and managing sets of unspent transaction outpoints (UTXOs). + +A comprehensive suite of tests is provided to ensure proper functionality. See +`test_coverage.txt` for the gocov coverage report. Alternatively, if you are +running a POSIX OS, you can run the `cov_report.sh` script for a real-time +report. + +## Installation and Updating + +```bash +$ go get -u github.com/btcsuite/btcd/btcutil/coinset +``` + +## Usage + +Each unspent transaction outpoint is represented by the Coin interface. An +example of a concrete type that implements Coin is coinset.SimpleCoin. + +The typical use case for this library is for creating raw bitcoin transactions +given a set of Coins that may be spent by the user, for example as below: + +```Go +var unspentCoins = []coinset.Coin{ ... } +``` + +When the user needs to spend a certain amount, they will need to select a +subset of these coins which contain at least that value. CoinSelector is +an interface that represents types that implement coin selection algos, +subject to various criteria. There are a few examples of CoinSelector's: + +- MinIndexCoinSelector + +- MinNumberCoinSelector + +- MaxValueAgeCoinSelector + +- MinPriorityCoinSelector + +For example, if the user wishes to maximize the probability that their +transaction is mined quickly, they could use the MaxValueAgeCoinSelector to +select high priority coins, then also attach a relatively high fee. + +```Go +selector := &coinset.MaxValueAgeCoinSelector{ + MaxInputs: 10, + MinAmountChange: 10000, +} +selectedCoins, err := selector.CoinSelect(targetAmount + bigFee, unspentCoins) +if err != nil { + return err +} +msgTx := coinset.NewMsgTxWithInputCoins(selectedCoins) +... + +``` + +The user can then create the msgTx.TxOut's as required, then sign the +transaction and transmit it to the network. + +## License + +Package coinset is licensed under the [copyfree](http://copyfree.org) ISC +License. diff --git a/btcutil/coinset/coins.go b/btcutil/coinset/coins.go new file mode 100644 index 0000000000..a0e680d8d6 --- /dev/null +++ b/btcutil/coinset/coins.go @@ -0,0 +1,395 @@ +// Copyright (c) 2014-2017 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package coinset + +import ( + "container/list" + "errors" + "sort" + + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/wire" +) + +// Coin represents a spendable transaction outpoint +type Coin interface { + Hash() *chainhash.Hash + Index() uint32 + Value() btcutil.Amount + PkScript() []byte + NumConfs() int64 + ValueAge() int64 +} + +// Coins represents a set of Coins +type Coins interface { + Coins() []Coin +} + +// CoinSet is a utility struct for the modifications of a set of +// Coins that implements the Coins interface. To create a CoinSet, +// you must call NewCoinSet with nil for an empty set or a slice of +// coins as the initial contents. +// +// It is important to note that the all the Coins being added or removed +// from a CoinSet must have a constant ValueAge() during the use of +// the CoinSet, otherwise the cached values will be incorrect. +type CoinSet struct { + coinList *list.List + totalValue btcutil.Amount + totalValueAge int64 +} + +// Ensure that CoinSet is a Coins +var _ Coins = NewCoinSet(nil) + +// NewCoinSet creates a CoinSet containing the coins provided. +// To create an empty CoinSet, you may pass null as the coins input parameter. +func NewCoinSet(coins []Coin) *CoinSet { + newCoinSet := &CoinSet{ + coinList: list.New(), + totalValue: 0, + totalValueAge: 0, + } + for _, coin := range coins { + newCoinSet.PushCoin(coin) + } + return newCoinSet +} + +// Coins returns a new slice of the coins contained in the set. +func (cs *CoinSet) Coins() []Coin { + coins := make([]Coin, cs.coinList.Len()) + for i, e := 0, cs.coinList.Front(); e != nil; i, e = i+1, e.Next() { + coins[i] = e.Value.(Coin) + } + return coins +} + +// TotalValue returns the total value of the coins in the set. +func (cs *CoinSet) TotalValue() (value btcutil.Amount) { + return cs.totalValue +} + +// TotalValueAge returns the total value * number of confirmations +// of the coins in the set. +func (cs *CoinSet) TotalValueAge() (valueAge int64) { + return cs.totalValueAge +} + +// Num returns the number of coins in the set +func (cs *CoinSet) Num() int { + return cs.coinList.Len() +} + +// PushCoin adds a coin to the end of the list and updates +// the cached value amounts. +func (cs *CoinSet) PushCoin(c Coin) { + cs.coinList.PushBack(c) + cs.totalValue += c.Value() + cs.totalValueAge += c.ValueAge() +} + +// PopCoin removes the last coin on the list and returns it. +func (cs *CoinSet) PopCoin() Coin { + back := cs.coinList.Back() + if back == nil { + return nil + } + return cs.removeElement(back) +} + +// ShiftCoin removes the first coin on the list and returns it. +func (cs *CoinSet) ShiftCoin() Coin { + front := cs.coinList.Front() + if front == nil { + return nil + } + return cs.removeElement(front) +} + +// removeElement updates the cached value amounts in the CoinSet, +// removes the element from the list, then returns the Coin that +// was removed to the caller. +func (cs *CoinSet) removeElement(e *list.Element) Coin { + c := e.Value.(Coin) + cs.coinList.Remove(e) + cs.totalValue -= c.Value() + cs.totalValueAge -= c.ValueAge() + return c +} + +// NewMsgTxWithInputCoins takes the coins in the CoinSet and makes them +// the inputs to a new wire.MsgTx which is returned. +func NewMsgTxWithInputCoins(txVersion int32, inputCoins Coins) *wire.MsgTx { + msgTx := wire.NewMsgTx(txVersion) + coins := inputCoins.Coins() + msgTx.TxIn = make([]*wire.TxIn, len(coins)) + for i, coin := range coins { + msgTx.TxIn[i] = &wire.TxIn{ + PreviousOutPoint: wire.OutPoint{ + Hash: *coin.Hash(), + Index: coin.Index(), + }, + SignatureScript: nil, + Sequence: wire.MaxTxInSequenceNum, + } + } + return msgTx +} + +var ( + // ErrCoinsNoSelectionAvailable is returned when a CoinSelector believes there is no + // possible combination of coins which can meet the requirements provided to the selector. + ErrCoinsNoSelectionAvailable = errors.New("no coin selection possible") +) + +// satisfiesTargetValue checks that the totalValue is either exactly the targetValue +// or is greater than the targetValue by at least the minChange amount. +func satisfiesTargetValue(targetValue, minChange, totalValue btcutil.Amount) bool { + return (totalValue == targetValue || totalValue >= targetValue+minChange) +} + +// CoinSelector is an interface that wraps the CoinSelect method. +// +// CoinSelect will attempt to select a subset of the coins which has at +// least the targetValue amount. CoinSelect is not guaranteed to return a +// selection of coins even if the total value of coins given is greater +// than the target value. +// +// The exact choice of coins in the subset will be implementation specific. +// +// It is important to note that the Coins being used as inputs need to have +// a constant ValueAge() during the execution of CoinSelect. +type CoinSelector interface { + CoinSelect(targetValue btcutil.Amount, coins []Coin) (Coins, error) +} + +// MinIndexCoinSelector is a CoinSelector that attempts to construct a +// selection of coins whose total value is at least targetValue and prefers +// any number of lower indexes (as in the ordered array) over higher ones. +type MinIndexCoinSelector struct { + MaxInputs int + MinChangeAmount btcutil.Amount +} + +// CoinSelect will attempt to select coins using the algorithm described +// in the MinIndexCoinSelector struct. +func (s MinIndexCoinSelector) CoinSelect(targetValue btcutil.Amount, coins []Coin) (Coins, error) { + cs := NewCoinSet(nil) + for n := 0; n < len(coins) && n < s.MaxInputs; n++ { + cs.PushCoin(coins[n]) + if satisfiesTargetValue(targetValue, s.MinChangeAmount, cs.TotalValue()) { + return cs, nil + } + } + return nil, ErrCoinsNoSelectionAvailable +} + +// MinNumberCoinSelector is a CoinSelector that attempts to construct +// a selection of coins whose total value is at least targetValue +// that uses as few of the inputs as possible. +type MinNumberCoinSelector struct { + MaxInputs int + MinChangeAmount btcutil.Amount +} + +// CoinSelect will attempt to select coins using the algorithm described +// in the MinNumberCoinSelector struct. +func (s MinNumberCoinSelector) CoinSelect(targetValue btcutil.Amount, coins []Coin) (Coins, error) { + sortedCoins := make([]Coin, 0, len(coins)) + sortedCoins = append(sortedCoins, coins...) + sort.Sort(sort.Reverse(byAmount(sortedCoins))) + + return MinIndexCoinSelector(s).CoinSelect(targetValue, sortedCoins) +} + +// MaxValueAgeCoinSelector is a CoinSelector that attempts to construct +// a selection of coins whose total value is at least targetValue +// that has as much input value-age as possible. +// +// This would be useful in the case where you want to maximize +// likelihood of the inclusion of your transaction in the next mined +// block. +type MaxValueAgeCoinSelector struct { + MaxInputs int + MinChangeAmount btcutil.Amount +} + +// CoinSelect will attempt to select coins using the algorithm described +// in the MaxValueAgeCoinSelector struct. +func (s MaxValueAgeCoinSelector) CoinSelect(targetValue btcutil.Amount, coins []Coin) (Coins, error) { + sortedCoins := make([]Coin, 0, len(coins)) + sortedCoins = append(sortedCoins, coins...) + sort.Sort(sort.Reverse(byValueAge(sortedCoins))) + + return MinIndexCoinSelector(s).CoinSelect(targetValue, sortedCoins) +} + +// MinPriorityCoinSelector is a CoinSelector that attempts to construct +// a selection of coins whose total value is at least targetValue and +// whose average value-age per input is greater than MinAvgValueAgePerInput. +// If there is change, it must exceed MinChangeAmount to be a valid selection. +// +// When possible, MinPriorityCoinSelector will attempt to reduce the average +// input priority over the threshold, but no guarantees will be made as to +// minimality of the selection. The selection below is almost certainly +// suboptimal. +type MinPriorityCoinSelector struct { + MaxInputs int + MinChangeAmount btcutil.Amount + MinAvgValueAgePerInput int64 +} + +// CoinSelect will attempt to select coins using the algorithm described +// in the MinPriorityCoinSelector struct. +func (s MinPriorityCoinSelector) CoinSelect(targetValue btcutil.Amount, coins []Coin) (Coins, error) { + possibleCoins := make([]Coin, 0, len(coins)) + possibleCoins = append(possibleCoins, coins...) + + sort.Sort(byValueAge(possibleCoins)) + + // find the first coin with sufficient valueAge + cutoffIndex := -1 + for i := 0; i < len(possibleCoins); i++ { + if possibleCoins[i].ValueAge() >= s.MinAvgValueAgePerInput { + cutoffIndex = i + break + } + } + if cutoffIndex < 0 { + return nil, ErrCoinsNoSelectionAvailable + } + + // create sets of input coins that will obey minimum average valueAge + for i := cutoffIndex; i < len(possibleCoins); i++ { + possibleHighCoins := possibleCoins[cutoffIndex : i+1] + + // choose a set of high-enough valueAge coins + highSelect, err := (&MinNumberCoinSelector{ + MaxInputs: s.MaxInputs, + MinChangeAmount: s.MinChangeAmount, + }).CoinSelect(targetValue, possibleHighCoins) + + if err != nil { + // attempt to add available low priority to make a solution + + for numLow := 1; numLow <= cutoffIndex && numLow+(i-cutoffIndex) <= s.MaxInputs; numLow++ { + allHigh := NewCoinSet(possibleCoins[cutoffIndex : i+1]) + newTargetValue := targetValue - allHigh.TotalValue() + newMaxInputs := allHigh.Num() + numLow + if newMaxInputs > numLow { + newMaxInputs = numLow + } + newMinAvgValueAge := ((s.MinAvgValueAgePerInput * int64(allHigh.Num()+numLow)) - allHigh.TotalValueAge()) / int64(numLow) + + // find the minimum priority that can be added to set + lowSelect, err := (&MinPriorityCoinSelector{ + MaxInputs: newMaxInputs, + MinChangeAmount: s.MinChangeAmount, + MinAvgValueAgePerInput: newMinAvgValueAge, + }).CoinSelect(newTargetValue, possibleCoins[0:cutoffIndex]) + + if err != nil { + continue + } + + for _, coin := range lowSelect.Coins() { + allHigh.PushCoin(coin) + } + + return allHigh, nil + } + // oh well, couldn't fix, try to add more high priority to the set. + } else { + extendedCoins := NewCoinSet(highSelect.Coins()) + + // attempt to lower priority towards target with lowest ones first + for n := 0; n < cutoffIndex; n++ { + if extendedCoins.Num() >= s.MaxInputs { + break + } + if possibleCoins[n].ValueAge() == 0 { + continue + } + + extendedCoins.PushCoin(possibleCoins[n]) + if extendedCoins.TotalValueAge()/int64(extendedCoins.Num()) < s.MinAvgValueAgePerInput { + extendedCoins.PopCoin() + continue + } + } + return extendedCoins, nil + } + } + + return nil, ErrCoinsNoSelectionAvailable +} + +type byValueAge []Coin + +func (a byValueAge) Len() int { return len(a) } +func (a byValueAge) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a byValueAge) Less(i, j int) bool { return a[i].ValueAge() < a[j].ValueAge() } + +type byAmount []Coin + +func (a byAmount) Len() int { return len(a) } +func (a byAmount) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a byAmount) Less(i, j int) bool { return a[i].Value() < a[j].Value() } + +// SimpleCoin defines a concrete instance of Coin that is backed by a +// btcutil.Tx, a specific outpoint index, and the number of confirmations +// that transaction has had. +type SimpleCoin struct { + Tx *btcutil.Tx + TxIndex uint32 + TxNumConfs int64 +} + +// Ensure that SimpleCoin is a Coin +var _ Coin = &SimpleCoin{} + +// Hash returns the hash value of the transaction on which the Coin is an output +func (c *SimpleCoin) Hash() *chainhash.Hash { + return c.Tx.Hash() +} + +// Index returns the index of the output on the transaction which the Coin represents +func (c *SimpleCoin) Index() uint32 { + return c.TxIndex +} + +// txOut returns the TxOut of the transaction the Coin represents +func (c *SimpleCoin) txOut() *wire.TxOut { + return c.Tx.MsgTx().TxOut[c.TxIndex] +} + +// Value returns the value of the Coin +func (c *SimpleCoin) Value() btcutil.Amount { + return btcutil.Amount(c.txOut().Value) +} + +// PkScript returns the outpoint script of the Coin. +// +// This can be used to determine what type of script the Coin uses +// and extract standard addresses if possible using +// txscript.ExtractPkScriptAddrs for example. +func (c *SimpleCoin) PkScript() []byte { + return c.txOut().PkScript +} + +// NumConfs returns the number of confirmations that the transaction the Coin references +// has had. +func (c *SimpleCoin) NumConfs() int64 { + return c.TxNumConfs +} + +// ValueAge returns the product of the value and the number of confirmations. This is +// used as an input to calculate the priority of the transaction. +func (c *SimpleCoin) ValueAge() int64 { + return c.TxNumConfs * int64(c.Value()) +} diff --git a/btcutil/coinset/coins_test.go b/btcutil/coinset/coins_test.go new file mode 100644 index 0000000000..c1984623f6 --- /dev/null +++ b/btcutil/coinset/coins_test.go @@ -0,0 +1,260 @@ +// Copyright (c) 2014-2016 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package coinset_test + +import ( + "bytes" + "crypto/sha256" + "encoding/hex" + "fmt" + "testing" + + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/btcutil/coinset" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/wire" +) + +type TestCoin struct { + TxHash *chainhash.Hash + TxIndex uint32 + TxValue btcutil.Amount + TxNumConfs int64 +} + +func (c *TestCoin) Hash() *chainhash.Hash { return c.TxHash } +func (c *TestCoin) Index() uint32 { return c.TxIndex } +func (c *TestCoin) Value() btcutil.Amount { return c.TxValue } +func (c *TestCoin) PkScript() []byte { return nil } +func (c *TestCoin) NumConfs() int64 { return c.TxNumConfs } +func (c *TestCoin) ValueAge() int64 { return int64(c.TxValue) * c.TxNumConfs } + +func NewCoin(index int64, value btcutil.Amount, numConfs int64) coinset.Coin { + h := sha256.New() + _, _ = h.Write([]byte(fmt.Sprintf("%d", index))) + hash, _ := chainhash.NewHash(h.Sum(nil)) + c := &TestCoin{ + TxHash: hash, + TxIndex: 0, + TxValue: value, + TxNumConfs: numConfs, + } + return coinset.Coin(c) +} + +type coinSelectTest struct { + selector coinset.CoinSelector + inputCoins []coinset.Coin + targetValue btcutil.Amount + expectedCoins []coinset.Coin + expectedError error +} + +func testCoinSelector(tests []coinSelectTest, t *testing.T) { + for testIndex, test := range tests { + cs, err := test.selector.CoinSelect(test.targetValue, test.inputCoins) + if err != test.expectedError { + t.Errorf("[%d] expected a different error: got=%v, expected=%v", testIndex, err, test.expectedError) + continue + } + if test.expectedCoins != nil { + if cs == nil { + t.Errorf("[%d] expected non-nil coinset", testIndex) + continue + } + coins := cs.Coins() + if len(coins) != len(test.expectedCoins) { + t.Errorf("[%d] expected different number of coins: got=%d, expected=%d", testIndex, len(coins), len(test.expectedCoins)) + continue + } + for n := 0; n < len(test.expectedCoins); n++ { + if coins[n] != test.expectedCoins[n] { + t.Errorf("[%d] expected different coins at coin index %d: got=%#v, expected=%#v", testIndex, n, coins[n], test.expectedCoins[n]) + continue + } + } + coinSet := coinset.NewCoinSet(coins) + if coinSet.TotalValue() < test.targetValue { + t.Errorf("[%d] targetValue not satistifed", testIndex) + continue + } + } + } +} + +var coins = []coinset.Coin{ + NewCoin(1, 100000000, 1), + NewCoin(2, 10000000, 20), + NewCoin(3, 50000000, 0), + NewCoin(4, 25000000, 6), +} + +func TestCoinSet(t *testing.T) { + cs := coinset.NewCoinSet(nil) + if cs.PopCoin() != nil { + t.Error("Expected popCoin of empty to be nil") + } + if cs.ShiftCoin() != nil { + t.Error("Expected shiftCoin of empty to be nil") + } + + cs.PushCoin(coins[0]) + cs.PushCoin(coins[1]) + cs.PushCoin(coins[2]) + if cs.PopCoin() != coins[2] { + t.Error("Expected third coin") + } + if cs.ShiftCoin() != coins[0] { + t.Error("Expected first coin") + } + + mtx := coinset.NewMsgTxWithInputCoins(wire.TxVersion, cs) + if len(mtx.TxIn) != 1 { + t.Errorf("Expected only 1 TxIn, got %d", len(mtx.TxIn)) + } + op := mtx.TxIn[0].PreviousOutPoint + if !op.Hash.IsEqual(coins[1].Hash()) || op.Index != coins[1].Index() { + t.Errorf("Expected the second coin to be added as input to mtx") + } +} + +var minIndexSelectors = []coinset.MinIndexCoinSelector{ + {MaxInputs: 10, MinChangeAmount: 10000}, + {MaxInputs: 2, MinChangeAmount: 10000}, +} + +var minIndexTests = []coinSelectTest{ + {minIndexSelectors[0], coins, coins[0].Value() - minIndexSelectors[0].MinChangeAmount, []coinset.Coin{coins[0]}, nil}, + {minIndexSelectors[0], coins, coins[0].Value() - minIndexSelectors[0].MinChangeAmount + 1, []coinset.Coin{coins[0], coins[1]}, nil}, + {minIndexSelectors[0], coins, 100000000, []coinset.Coin{coins[0]}, nil}, + {minIndexSelectors[0], coins, 110000000, []coinset.Coin{coins[0], coins[1]}, nil}, + {minIndexSelectors[0], coins, 140000000, []coinset.Coin{coins[0], coins[1], coins[2]}, nil}, + {minIndexSelectors[0], coins, 200000000, nil, coinset.ErrCoinsNoSelectionAvailable}, + {minIndexSelectors[1], coins, 10000000, []coinset.Coin{coins[0]}, nil}, + {minIndexSelectors[1], coins, 110000000, []coinset.Coin{coins[0], coins[1]}, nil}, + {minIndexSelectors[1], coins, 140000000, nil, coinset.ErrCoinsNoSelectionAvailable}, +} + +func TestMinIndexSelector(t *testing.T) { + testCoinSelector(minIndexTests, t) +} + +var minNumberSelectors = []coinset.MinNumberCoinSelector{ + {MaxInputs: 10, MinChangeAmount: 10000}, + {MaxInputs: 2, MinChangeAmount: 10000}, +} + +var minNumberTests = []coinSelectTest{ + {minNumberSelectors[0], coins, coins[0].Value() - minNumberSelectors[0].MinChangeAmount, []coinset.Coin{coins[0]}, nil}, + {minNumberSelectors[0], coins, coins[0].Value() - minNumberSelectors[0].MinChangeAmount + 1, []coinset.Coin{coins[0], coins[2]}, nil}, + {minNumberSelectors[0], coins, 100000000, []coinset.Coin{coins[0]}, nil}, + {minNumberSelectors[0], coins, 110000000, []coinset.Coin{coins[0], coins[2]}, nil}, + {minNumberSelectors[0], coins, 160000000, []coinset.Coin{coins[0], coins[2], coins[3]}, nil}, + {minNumberSelectors[0], coins, 184990000, []coinset.Coin{coins[0], coins[2], coins[3], coins[1]}, nil}, + {minNumberSelectors[0], coins, 184990001, nil, coinset.ErrCoinsNoSelectionAvailable}, + {minNumberSelectors[0], coins, 200000000, nil, coinset.ErrCoinsNoSelectionAvailable}, + {minNumberSelectors[1], coins, 10000000, []coinset.Coin{coins[0]}, nil}, + {minNumberSelectors[1], coins, 110000000, []coinset.Coin{coins[0], coins[2]}, nil}, + {minNumberSelectors[1], coins, 140000000, []coinset.Coin{coins[0], coins[2]}, nil}, +} + +func TestMinNumberSelector(t *testing.T) { + testCoinSelector(minNumberTests, t) +} + +var maxValueAgeSelectors = []coinset.MaxValueAgeCoinSelector{ + {MaxInputs: 10, MinChangeAmount: 10000}, + {MaxInputs: 2, MinChangeAmount: 10000}, +} + +var maxValueAgeTests = []coinSelectTest{ + {maxValueAgeSelectors[0], coins, 100000, []coinset.Coin{coins[1]}, nil}, + {maxValueAgeSelectors[0], coins, 10000000, []coinset.Coin{coins[1]}, nil}, + {maxValueAgeSelectors[0], coins, 10000001, []coinset.Coin{coins[1], coins[3]}, nil}, + {maxValueAgeSelectors[0], coins, 35000000, []coinset.Coin{coins[1], coins[3]}, nil}, + {maxValueAgeSelectors[0], coins, 135000000, []coinset.Coin{coins[1], coins[3], coins[0]}, nil}, + {maxValueAgeSelectors[0], coins, 185000000, []coinset.Coin{coins[1], coins[3], coins[0], coins[2]}, nil}, + {maxValueAgeSelectors[0], coins, 200000000, nil, coinset.ErrCoinsNoSelectionAvailable}, + {maxValueAgeSelectors[1], coins, 40000000, nil, coinset.ErrCoinsNoSelectionAvailable}, + {maxValueAgeSelectors[1], coins, 35000000, []coinset.Coin{coins[1], coins[3]}, nil}, + {maxValueAgeSelectors[1], coins, 34990001, nil, coinset.ErrCoinsNoSelectionAvailable}, +} + +func TestMaxValueAgeSelector(t *testing.T) { + testCoinSelector(maxValueAgeTests, t) +} + +var minPrioritySelectors = []coinset.MinPriorityCoinSelector{ + {MaxInputs: 10, MinChangeAmount: 10000, MinAvgValueAgePerInput: 100000000}, + {MaxInputs: 02, MinChangeAmount: 10000, MinAvgValueAgePerInput: 200000000}, + {MaxInputs: 02, MinChangeAmount: 10000, MinAvgValueAgePerInput: 150000000}, + {MaxInputs: 03, MinChangeAmount: 10000, MinAvgValueAgePerInput: 150000000}, + {MaxInputs: 10, MinChangeAmount: 10000, MinAvgValueAgePerInput: 1000000000}, + {MaxInputs: 10, MinChangeAmount: 10000, MinAvgValueAgePerInput: 175000000}, + {MaxInputs: 02, MinChangeAmount: 10000, MinAvgValueAgePerInput: 125000000}, +} + +var connectedCoins = []coinset.Coin{coins[0], coins[1], coins[3]} + +var minPriorityTests = []coinSelectTest{ + {minPrioritySelectors[0], connectedCoins, 100000000, []coinset.Coin{coins[0]}, nil}, + {minPrioritySelectors[0], connectedCoins, 125000000, []coinset.Coin{coins[0], coins[3]}, nil}, + {minPrioritySelectors[0], connectedCoins, 135000000, []coinset.Coin{coins[0], coins[3], coins[1]}, nil}, + {minPrioritySelectors[0], connectedCoins, 140000000, nil, coinset.ErrCoinsNoSelectionAvailable}, + {minPrioritySelectors[1], connectedCoins, 100000000, nil, coinset.ErrCoinsNoSelectionAvailable}, + {minPrioritySelectors[1], connectedCoins, 10000000, []coinset.Coin{coins[1]}, nil}, + {minPrioritySelectors[1], connectedCoins, 100000000, nil, coinset.ErrCoinsNoSelectionAvailable}, + {minPrioritySelectors[2], connectedCoins, 11000000, []coinset.Coin{coins[3]}, nil}, + {minPrioritySelectors[2], connectedCoins, 25000001, []coinset.Coin{coins[3], coins[1]}, nil}, + {minPrioritySelectors[3], connectedCoins, 25000001, []coinset.Coin{coins[3], coins[1], coins[0]}, nil}, + {minPrioritySelectors[3], connectedCoins, 100000000, []coinset.Coin{coins[3], coins[1], coins[0]}, nil}, + {minPrioritySelectors[3], []coinset.Coin{coins[1], coins[2]}, 10000000, []coinset.Coin{coins[1]}, nil}, + {minPrioritySelectors[4], connectedCoins, 1, nil, coinset.ErrCoinsNoSelectionAvailable}, + {minPrioritySelectors[5], connectedCoins, 20000000, []coinset.Coin{coins[1], coins[3]}, nil}, + {minPrioritySelectors[6], connectedCoins, 25000000, []coinset.Coin{coins[3], coins[0]}, nil}, +} + +func TestMinPrioritySelector(t *testing.T) { + testCoinSelector(minPriorityTests, t) +} + +var ( + // should be two outpoints, with 1st one having 0.035BTC value. + testSimpleCoinNumConfs = int64(1) + testSimpleCoinTxHash = "9b5965c86de51d5dc824e179a05cf232db78c80ae86ca9d7cb2a655b5e19c1e2" + testSimpleCoinTxHex = "0100000001a214a110f79e4abe073865ea5b3745c6e82c913bad44be70652804a5e4003b0a010000008c493046022100edd18a69664efa57264be207100c203e6cade1888cbb88a0ad748548256bb2f0022100f1027dc2e6c7f248d78af1dd90027b5b7d8ec563bb62aa85d4e74d6376f3868c0141048f3757b65ed301abd1b0e8942d1ab5b50594d3314cff0299f300c696376a0a9bf72e74710a8af7a5372d4af4bb519e2701a094ef48c8e48e3b65b28502452dceffffffff02e0673500000000001976a914686dd149a79b4a559d561fbc396d3e3c6628b98d88ace86ef102000000001976a914ac3f995655e81b875b38b64351d6f896ddbfc68588ac00000000" + testSimpleCoinTxValue0 = btcutil.Amount(3500000) + testSimpleCoinTxValueAge0 = int64(testSimpleCoinTxValue0) * testSimpleCoinNumConfs + testSimpleCoinTxPkScript0Hex = "76a914686dd149a79b4a559d561fbc396d3e3c6628b98d88ac" + testSimpleCoinTxPkScript0Bytes, _ = hex.DecodeString(testSimpleCoinTxPkScript0Hex) + testSimpleCoinTxBytes, _ = hex.DecodeString(testSimpleCoinTxHex) + testSimpleCoinTx, _ = btcutil.NewTxFromBytes(testSimpleCoinTxBytes) + testSimpleCoin = &coinset.SimpleCoin{ + Tx: testSimpleCoinTx, + TxIndex: 0, + TxNumConfs: testSimpleCoinNumConfs, + } +) + +func TestSimpleCoin(t *testing.T) { + if testSimpleCoin.Hash().String() != testSimpleCoinTxHash { + t.Error("Different value for tx hash than expected") + } + if testSimpleCoin.Index() != 0 { + t.Error("Different value for index of outpoint than expected") + } + if testSimpleCoin.Value() != testSimpleCoinTxValue0 { + t.Error("Different value of coin value than expected") + } + if !bytes.Equal(testSimpleCoin.PkScript(), testSimpleCoinTxPkScript0Bytes) { + t.Error("Different value of coin pkScript than expected") + } + if testSimpleCoin.NumConfs() != 1 { + t.Error("Different value of num confs than expected") + } + if testSimpleCoin.ValueAge() != testSimpleCoinTxValueAge0 { + t.Error("Different value of coin value * age than expected") + } +} diff --git a/btcutil/coinset/cov_report.sh b/btcutil/coinset/cov_report.sh new file mode 100644 index 0000000000..307f05b76c --- /dev/null +++ b/btcutil/coinset/cov_report.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +# This script uses gocov to generate a test coverage report. +# The gocov tool my be obtained with the following command: +# go get github.com/axw/gocov/gocov +# +# It will be installed to $GOPATH/bin, so ensure that location is in your $PATH. + +# Check for gocov. +type gocov >/dev/null 2>&1 +if [ $? -ne 0 ]; then + echo >&2 "This script requires the gocov tool." + echo >&2 "You may obtain it with the following command:" + echo >&2 "go get github.com/axw/gocov/gocov" + exit 1 +fi +gocov test | gocov report diff --git a/btcutil/coinset/test_coverage.txt b/btcutil/coinset/test_coverage.txt new file mode 100644 index 0000000000..0e3e15d9f7 --- /dev/null +++ b/btcutil/coinset/test_coverage.txt @@ -0,0 +1,31 @@ + +github.com/conformal/btcutil/coinset/coins.go MinPriorityCoinSelector.CoinSelect 100.00% (39/39) +github.com/conformal/btcutil/coinset/coins.go NewMsgTxWithInputCoins 100.00% (6/6) +github.com/conformal/btcutil/coinset/coins.go MinIndexCoinSelector.CoinSelect 100.00% (6/6) +github.com/conformal/btcutil/coinset/coins.go CoinSet.removeElement 100.00% (5/5) +github.com/conformal/btcutil/coinset/coins.go NewCoinSet 100.00% (4/4) +github.com/conformal/btcutil/coinset/coins.go CoinSet.Coins 100.00% (4/4) +github.com/conformal/btcutil/coinset/coins.go CoinSet.PopCoin 100.00% (4/4) +github.com/conformal/btcutil/coinset/coins.go CoinSet.ShiftCoin 100.00% (4/4) +github.com/conformal/btcutil/coinset/coins.go MinNumberCoinSelector.CoinSelect 100.00% (4/4) +github.com/conformal/btcutil/coinset/coins.go MaxValueAgeCoinSelector.CoinSelect 100.00% (4/4) +github.com/conformal/btcutil/coinset/coins.go CoinSet.PushCoin 100.00% (3/3) +github.com/conformal/btcutil/coinset/coins.go CoinSet.TotalValueAge 100.00% (1/1) +github.com/conformal/btcutil/coinset/coins.go SimpleCoin.NumConfs 100.00% (1/1) +github.com/conformal/btcutil/coinset/coins.go SimpleCoin.ValueAge 100.00% (1/1) +github.com/conformal/btcutil/coinset/coins.go CoinSet.TotalValue 100.00% (1/1) +github.com/conformal/btcutil/coinset/coins.go byValueAge.Len 100.00% (1/1) +github.com/conformal/btcutil/coinset/coins.go byValueAge.Swap 100.00% (1/1) +github.com/conformal/btcutil/coinset/coins.go byValueAge.Less 100.00% (1/1) +github.com/conformal/btcutil/coinset/coins.go byAmount.Len 100.00% (1/1) +github.com/conformal/btcutil/coinset/coins.go byAmount.Swap 100.00% (1/1) +github.com/conformal/btcutil/coinset/coins.go byAmount.Less 100.00% (1/1) +github.com/conformal/btcutil/coinset/coins.go SimpleCoin.Hash 100.00% (1/1) +github.com/conformal/btcutil/coinset/coins.go SimpleCoin.Index 100.00% (1/1) +github.com/conformal/btcutil/coinset/coins.go SimpleCoin.txOut 100.00% (1/1) +github.com/conformal/btcutil/coinset/coins.go SimpleCoin.Value 100.00% (1/1) +github.com/conformal/btcutil/coinset/coins.go SimpleCoin.PkScript 100.00% (1/1) +github.com/conformal/btcutil/coinset/coins.go CoinSet.Num 100.00% (1/1) +github.com/conformal/btcutil/coinset/coins.go satisfiesTargetValue 100.00% (1/1) +github.com/conformal/btcutil/coinset ---------------------------------- 100.00% (100/100) + diff --git a/btcutil/const.go b/btcutil/const.go new file mode 100644 index 0000000000..c73946056f --- /dev/null +++ b/btcutil/const.go @@ -0,0 +1,16 @@ +// Copyright (c) 2013-2014 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package btcutil + +const ( + // SatoshiPerBitcent is the number of satoshi in one bitcoin cent. + SatoshiPerBitcent = 1e6 + + // SatoshiPerBitcoin is the number of satoshi in one bitcoin (1 BTC). + SatoshiPerBitcoin = 1e8 + + // MaxSatoshi is the maximum transaction amount allowed in satoshi. + MaxSatoshi = 21e6 * SatoshiPerBitcoin +) diff --git a/btcutil/cov_report.sh b/btcutil/cov_report.sh new file mode 100644 index 0000000000..307f05b76c --- /dev/null +++ b/btcutil/cov_report.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +# This script uses gocov to generate a test coverage report. +# The gocov tool my be obtained with the following command: +# go get github.com/axw/gocov/gocov +# +# It will be installed to $GOPATH/bin, so ensure that location is in your $PATH. + +# Check for gocov. +type gocov >/dev/null 2>&1 +if [ $? -ne 0 ]; then + echo >&2 "This script requires the gocov tool." + echo >&2 "You may obtain it with the following command:" + echo >&2 "go get github.com/axw/gocov/gocov" + exit 1 +fi +gocov test | gocov report diff --git a/btcutil/doc.go b/btcutil/doc.go new file mode 100644 index 0000000000..c4a4441201 --- /dev/null +++ b/btcutil/doc.go @@ -0,0 +1,46 @@ +// Copyright (c) 2013-2014 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +/* +Package btcutil provides bitcoin-specific convenience functions and types. + +# Block Overview + +A Block defines a bitcoin block that provides easier and more efficient +manipulation of raw wire protocol blocks. It also memoizes hashes for the +block and its transactions on their first access so subsequent accesses don't +have to repeat the relatively expensive hashing operations. + +# Tx Overview + +A Tx defines a bitcoin transaction that provides more efficient manipulation of +raw wire protocol transactions. It memoizes the hash for the transaction on its +first access so subsequent accesses don't have to repeat the relatively +expensive hashing operations. + +# Address Overview + +The Address interface provides an abstraction for a Bitcoin address. While the +most common type is a pay-to-pubkey-hash, Bitcoin already supports others and +may well support more in the future. This package currently provides +implementations for the pay-to-pubkey, pay-to-pubkey-hash, and +pay-to-script-hash address types. + +To decode/encode an address: + + // NOTE: The default network is only used for address types which do not + // already contain that information. At this time, that is only + // pay-to-pubkey addresses. + addrString := "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962" + + "e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d57" + + "8a4c702b6bf11d5f" + defaultNet := &chaincfg.MainNetParams + addr, err := btcutil.DecodeAddress(addrString, defaultNet) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(addr.EncodeAddress()) +*/ +package btcutil diff --git a/btcutil/example_test.go b/btcutil/example_test.go new file mode 100644 index 0000000000..90be77b073 --- /dev/null +++ b/btcutil/example_test.go @@ -0,0 +1,76 @@ +package btcutil_test + +import ( + "fmt" + "math" + + "github.com/btcsuite/btcd/btcutil" +) + +func ExampleAmount() { + + a := btcutil.Amount(0) + fmt.Println("Zero Satoshi:", a) + + a = btcutil.Amount(1e8) + fmt.Println("100,000,000 Satoshis:", a) + + a = btcutil.Amount(1e5) + fmt.Println("100,000 Satoshis:", a) + // Output: + // Zero Satoshi: 0 BTC + // 100,000,000 Satoshis: 1 BTC + // 100,000 Satoshis: 0.00100000 BTC +} + +func ExampleNewAmount() { + amountOne, err := btcutil.NewAmount(1) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(amountOne) //Output 1 + + amountFraction, err := btcutil.NewAmount(0.01234567) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(amountFraction) //Output 2 + + amountZero, err := btcutil.NewAmount(0) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(amountZero) //Output 3 + + amountNaN, err := btcutil.NewAmount(math.NaN()) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(amountNaN) //Output 4 + + // Output: 1 BTC + // 0.01234567 BTC + // 0 BTC + // invalid bitcoin amount +} + +func ExampleAmount_unitConversions() { + amount := btcutil.Amount(44433322211100) + + fmt.Println("Satoshi to kBTC:", amount.Format(btcutil.AmountKiloBTC)) + fmt.Println("Satoshi to BTC:", amount) + fmt.Println("Satoshi to MilliBTC:", amount.Format(btcutil.AmountMilliBTC)) + fmt.Println("Satoshi to MicroBTC:", amount.Format(btcutil.AmountMicroBTC)) + fmt.Println("Satoshi to Satoshi:", amount.Format(btcutil.AmountSatoshi)) + + // Output: + // Satoshi to kBTC: 444.333222111 kBTC + // Satoshi to BTC: 444333.22211100 BTC + // Satoshi to MilliBTC: 444333222.111 mBTC + // Satoshi to MicroBTC: 444333222111 μBTC + // Satoshi to Satoshi: 44433322211100 Satoshi +} diff --git a/btcutil/gcs/README.md b/btcutil/gcs/README.md new file mode 100644 index 0000000000..ee0c120401 --- /dev/null +++ b/btcutil/gcs/README.md @@ -0,0 +1,24 @@ +gcs +========== + +[![Build Status](http://img.shields.io/travis/btcsuite/btcutil.svg)] +(https://travis-ci.org/btcsuite/btcutil) [![ISC License] +(http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) +[![GoDoc](https://godoc.org/github.com/btcsuite/btcd/btcutil/gcs?status.png)] +(http://godoc.org/github.com/btcsuite/btcd/btcutil/gcs) + +Package gcs provides an API for building and using a Golomb-coded set filter +similar to that described [here](http://giovanni.bajo.it/post/47119962313/golomb-coded-sets-smaller-than-bloom-filters). + +A comprehensive suite of tests is provided to ensure proper functionality. + +## Installation and Updating + +```bash +$ go get -u github.com/btcsuite/btcd/btcutil/gcs +``` + +## License + +Package gcs is licensed under the [copyfree](http://copyfree.org) ISC +License. diff --git a/btcutil/gcs/builder/builder.go b/btcutil/gcs/builder/builder.go new file mode 100644 index 0000000000..8e257b39fc --- /dev/null +++ b/btcutil/gcs/builder/builder.go @@ -0,0 +1,378 @@ +// Copyright (c) 2017 The btcsuite developers +// Copyright (c) 2017 The Lightning Network Developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package builder + +import ( + "crypto/rand" + "fmt" + "io" + "math" + + "github.com/btcsuite/btcd/btcutil/gcs" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/txscript" + "github.com/btcsuite/btcd/wire" +) + +const ( + // DefaultP is the default collision probability (2^-19) + DefaultP = 19 + + // DefaultM is the default value used for the hash range. + DefaultM uint64 = 784931 +) + +// GCSBuilder is a utility class that makes building GCS filters convenient. +type GCSBuilder struct { + p uint8 + + m uint64 + + key [gcs.KeySize]byte + + // data is a set of entries represented as strings. This is done to + // deduplicate items as they are added. + data map[string]struct{} + err error +} + +// RandomKey is a utility function that returns a cryptographically random +// [gcs.KeySize]byte usable as a key for a GCS filter. +func RandomKey() ([gcs.KeySize]byte, error) { + var key [gcs.KeySize]byte + + // Read a byte slice from rand.Reader. + randKey := make([]byte, gcs.KeySize) + _, err := rand.Read(randKey) + + // This shouldn't happen unless the user is on a system that doesn't + // have a system CSPRNG. OK to panic in this case. + if err != nil { + return key, err + } + + // Copy the byte slice to a [gcs.KeySize]byte array and return it. + copy(key[:], randKey) + return key, nil +} + +// DeriveKey is a utility function that derives a key from a chainhash.Hash by +// truncating the bytes of the hash to the appropriate key size. +func DeriveKey(keyHash *chainhash.Hash) [gcs.KeySize]byte { + var key [gcs.KeySize]byte + copy(key[:], keyHash.CloneBytes()) + return key +} + +// Key retrieves the key with which the builder will build a filter. This is +// useful if the builder is created with a random initial key. +func (b *GCSBuilder) Key() ([gcs.KeySize]byte, error) { + // Do nothing if the builder's errored out. + if b.err != nil { + return [gcs.KeySize]byte{}, b.err + } + + return b.key, nil +} + +// SetKey sets the key with which the builder will build a filter to the passed +// [gcs.KeySize]byte. +func (b *GCSBuilder) SetKey(key [gcs.KeySize]byte) *GCSBuilder { + // Do nothing if the builder's already errored out. + if b.err != nil { + return b + } + + copy(b.key[:], key[:]) + return b +} + +// SetKeyFromHash sets the key with which the builder will build a filter to a +// key derived from the passed chainhash.Hash using DeriveKey(). +func (b *GCSBuilder) SetKeyFromHash(keyHash *chainhash.Hash) *GCSBuilder { + // Do nothing if the builder's already errored out. + if b.err != nil { + return b + } + + return b.SetKey(DeriveKey(keyHash)) +} + +// SetP sets the filter's probability after calling Builder(). +func (b *GCSBuilder) SetP(p uint8) *GCSBuilder { + // Do nothing if the builder's already errored out. + if b.err != nil { + return b + } + + // Basic sanity check. + if p > 32 { + b.err = gcs.ErrPTooBig + return b + } + + b.p = p + return b +} + +// SetM sets the filter's modulous value after calling Builder(). +func (b *GCSBuilder) SetM(m uint64) *GCSBuilder { + // Do nothing if the builder's already errored out. + if b.err != nil { + return b + } + + // Basic sanity check. + if m > uint64(math.MaxUint32) { + b.err = gcs.ErrPTooBig + return b + } + + b.m = m + return b +} + +// Preallocate sets the estimated filter size after calling Builder() to reduce +// the probability of memory reallocations. If the builder has already had data +// added to it, Preallocate has no effect. +func (b *GCSBuilder) Preallocate(n uint32) *GCSBuilder { + // Do nothing if the builder's already errored out. + if b.err != nil { + return b + } + + if b.data == nil { + b.data = make(map[string]struct{}, n) + } + + return b +} + +// AddEntry adds a []byte to the list of entries to be included in the GCS +// filter when it's built. +func (b *GCSBuilder) AddEntry(data []byte) *GCSBuilder { + // Do nothing if the builder's already errored out. + if b.err != nil { + return b + } + + b.data[string(data)] = struct{}{} + return b +} + +// AddEntries adds all the []byte entries in a [][]byte to the list of entries +// to be included in the GCS filter when it's built. +func (b *GCSBuilder) AddEntries(data [][]byte) *GCSBuilder { + // Do nothing if the builder's already errored out. + if b.err != nil { + return b + } + + for _, entry := range data { + b.AddEntry(entry) + } + return b +} + +// AddHash adds a chainhash.Hash to the list of entries to be included in the +// GCS filter when it's built. +func (b *GCSBuilder) AddHash(hash *chainhash.Hash) *GCSBuilder { + // Do nothing if the builder's already errored out. + if b.err != nil { + return b + } + + return b.AddEntry(hash.CloneBytes()) +} + +// AddWitness adds each item of the passed filter stack to the filter, and then +// adds each item as a script. +func (b *GCSBuilder) AddWitness(witness wire.TxWitness) *GCSBuilder { + // Do nothing if the builder's already errored out. + if b.err != nil { + return b + } + + return b.AddEntries(witness) +} + +// Build returns a function which builds a GCS filter with the given parameters +// and data. +func (b *GCSBuilder) Build() (*gcs.Filter, error) { + // Do nothing if the builder's already errored out. + if b.err != nil { + return nil, b.err + } + + // We'll ensure that all the parameters we need to actually build the + // filter properly are set. + if b.p == 0 { + return nil, fmt.Errorf("p value is not set, cannot build") + } + if b.m == 0 { + return nil, fmt.Errorf("m value is not set, cannot build") + } + + dataSlice := make([][]byte, 0, len(b.data)) + for item := range b.data { + dataSlice = append(dataSlice, []byte(item)) + } + + return gcs.BuildGCSFilter(b.p, b.m, b.key, dataSlice) +} + +// WithKeyPNM creates a GCSBuilder with specified key and the passed +// probability, modulus and estimated filter size. +func WithKeyPNM(key [gcs.KeySize]byte, p uint8, n uint32, m uint64) *GCSBuilder { + b := GCSBuilder{} + return b.SetKey(key).SetP(p).SetM(m).Preallocate(n) +} + +// WithKeyPM creates a GCSBuilder with specified key and the passed +// probability. Estimated filter size is set to zero, which means more +// reallocations are done when building the filter. +func WithKeyPM(key [gcs.KeySize]byte, p uint8, m uint64) *GCSBuilder { + return WithKeyPNM(key, p, 0, m) +} + +// WithKey creates a GCSBuilder with specified key. Probability is set to 19 +// (2^-19 collision probability). Estimated filter size is set to zero, which +// means more reallocations are done when building the filter. +func WithKey(key [gcs.KeySize]byte) *GCSBuilder { + return WithKeyPNM(key, DefaultP, 0, DefaultM) +} + +// WithKeyHashPNM creates a GCSBuilder with key derived from the specified +// chainhash.Hash and the passed probability and estimated filter size. +func WithKeyHashPNM(keyHash *chainhash.Hash, p uint8, n uint32, + m uint64) *GCSBuilder { + + return WithKeyPNM(DeriveKey(keyHash), p, n, m) +} + +// WithKeyHashPM creates a GCSBuilder with key derived from the specified +// chainhash.Hash and the passed probability. Estimated filter size is set to +// zero, which means more reallocations are done when building the filter. +func WithKeyHashPM(keyHash *chainhash.Hash, p uint8, m uint64) *GCSBuilder { + return WithKeyHashPNM(keyHash, p, 0, m) +} + +// WithKeyHash creates a GCSBuilder with key derived from the specified +// chainhash.Hash. Probability is set to 20 (2^-20 collision probability). +// Estimated filter size is set to zero, which means more reallocations are +// done when building the filter. +func WithKeyHash(keyHash *chainhash.Hash) *GCSBuilder { + return WithKeyHashPNM(keyHash, DefaultP, 0, DefaultM) +} + +// WithRandomKeyPNM creates a GCSBuilder with a cryptographically random key and +// the passed probability and estimated filter size. +func WithRandomKeyPNM(p uint8, n uint32, m uint64) *GCSBuilder { + key, err := RandomKey() + if err != nil { + b := GCSBuilder{err: err} + return &b + } + return WithKeyPNM(key, p, n, m) +} + +// WithRandomKeyPM creates a GCSBuilder with a cryptographically random key and +// the passed probability. Estimated filter size is set to zero, which means +// more reallocations are done when building the filter. +func WithRandomKeyPM(p uint8, m uint64) *GCSBuilder { + return WithRandomKeyPNM(p, 0, m) +} + +// WithRandomKey creates a GCSBuilder with a cryptographically random key. +// Probability is set to 20 (2^-20 collision probability). Estimated filter +// size is set to zero, which means more reallocations are done when +// building the filter. +func WithRandomKey() *GCSBuilder { + return WithRandomKeyPNM(DefaultP, 0, DefaultM) +} + +// BuildBasicFilter builds a basic GCS filter from a block. A basic GCS filter +// will contain all the previous output scripts spent by inputs within a block, +// as well as the data pushes within all the outputs created within a block. +func BuildBasicFilter(block *wire.MsgBlock, prevOutScripts [][]byte) (*gcs.Filter, error) { + blockHash := block.BlockHash() + b := WithKeyHash(&blockHash) + + // If the filter had an issue with the specified key, then we force it + // to bubble up here by calling the Key() function. + _, err := b.Key() + if err != nil { + return nil, err + } + + // In order to build a basic filter, we'll range over the entire block, + // adding each whole script itself. + for _, tx := range block.Transactions { + // For each output in a transaction, we'll add each of the + // individual data pushes within the script. + for _, txOut := range tx.TxOut { + if len(txOut.PkScript) == 0 { + continue + } + + // In order to allow the filters to later be committed + // to within an OP_RETURN output, we ignore all + // OP_RETURNs to avoid a circular dependency. + if txOut.PkScript[0] == txscript.OP_RETURN { + continue + } + + b.AddEntry(txOut.PkScript) + } + } + + // In the second pass, we'll also add all the prevOutScripts + // individually as elements. + for _, prevScript := range prevOutScripts { + if len(prevScript) == 0 { + continue + } + + b.AddEntry(prevScript) + } + + return b.Build() +} + +// GetFilterHash returns the double-SHA256 of the filter. +func GetFilterHash(filter *gcs.Filter) (chainhash.Hash, error) { + filterData, err := filter.NBytes() + if err != nil { + return chainhash.Hash{}, err + } + + return chainhash.DoubleHashRaw(func(w io.Writer) error { + _, err := w.Write(filterData) + return err + }), nil +} + +// MakeHeaderForFilter makes a filter chain header for a filter, given the +// filter and the previous filter chain header. +func MakeHeaderForFilter(filter *gcs.Filter, prevHeader chainhash.Hash) (chainhash.Hash, error) { + filterTip := make([]byte, 2*chainhash.HashSize) + filterHash, err := GetFilterHash(filter) + if err != nil { + return chainhash.Hash{}, err + } + + // In the buffer we created above we'll compute hash || prevHash as an + // intermediate value. + copy(filterTip, filterHash[:]) + copy(filterTip[chainhash.HashSize:], prevHeader[:]) + + // The final filter hash is the double-sha256 of the hash computed + // above. + return chainhash.DoubleHashRaw(func(w io.Writer) error { + _, err := w.Write(filterTip) + return err + }), nil +} diff --git a/btcutil/gcs/builder/builder_test.go b/btcutil/gcs/builder/builder_test.go new file mode 100644 index 0000000000..59768380b1 --- /dev/null +++ b/btcutil/gcs/builder/builder_test.go @@ -0,0 +1,281 @@ +// Copyright (c) 2017 The btcsuite developers +// Copyright (c) 2017 The Lightning Network Developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package builder_test + +import ( + "encoding/hex" + "testing" + + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/btcutil/gcs" + "github.com/btcsuite/btcd/btcutil/gcs/builder" + "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/txscript" + "github.com/btcsuite/btcd/wire" +) + +var ( + // List of values for building a filter + contents = [][]byte{ + []byte("Alex"), + []byte("Bob"), + []byte("Charlie"), + []byte("Dick"), + []byte("Ed"), + []byte("Frank"), + []byte("George"), + []byte("Harry"), + []byte("Ilya"), + []byte("John"), + []byte("Kevin"), + []byte("Larry"), + []byte("Michael"), + []byte("Nate"), + []byte("Owen"), + []byte("Paul"), + []byte("Quentin"), + } + + testKey = [16]byte{0x4c, 0xb1, 0xab, 0x12, 0x57, 0x62, 0x1e, 0x41, + 0x3b, 0x8b, 0x0e, 0x26, 0x64, 0x8d, 0x4a, 0x15} + + testHash = "000000000000000000496d7ff9bd2c96154a8d64260e8b3b411e625712abb14c" + + testAddr = "3Nxwenay9Z8Lc9JBiywExpnEFiLp6Afp8v" + + witness = [][]byte{ + {0x4c, 0xb1, 0xab, 0x12, 0x57, 0x62, 0x1e, 0x41, + 0x3b, 0x8b, 0x0e, 0x26, 0x64, 0x8d, 0x4a, 0x15, + 0x3b, 0x8b, 0x0e, 0x26, 0x64, 0x8d, 0x4a, 0x15, + 0x3b, 0x8b, 0x0e, 0x26, 0x64, 0x8d, 0x4a, 0x15}, + + {0xdd, 0xa3, 0x5a, 0x14, 0x88, 0xfb, 0x97, 0xb6, + 0xeb, 0x3f, 0xe6, 0xe9, 0xef, 0x2a, 0x25, 0x81, + 0x4e, 0x39, 0x6f, 0xb5, 0xdc, 0x29, 0x5f, 0xe9, + 0x94, 0xb9, 0x67, 0x89, 0xb2, 0x1a, 0x03, 0x98, + 0x94, 0xb9, 0x67, 0x89, 0xb2, 0x1a, 0x03, 0x98, + 0x94, 0xb9, 0x67, 0x89, 0xb2, 0x1a, 0x03, 0x98}, + } +) + +// TestUseBlockHash tests using a block hash as a filter key. +func TestUseBlockHash(t *testing.T) { + // Block hash #448710, pretty high difficulty. + hash, err := chainhash.NewHashFromStr(testHash) + if err != nil { + t.Fatalf("Hash from string failed: %s", err.Error()) + } + + // wire.OutPoint + outPoint := wire.OutPoint{ + Hash: *hash, + Index: 4321, + } + + // btcutil.Address + addr, err := btcutil.DecodeAddress(testAddr, &chaincfg.MainNetParams) + if err != nil { + t.Fatalf("Address decode failed: %s", err.Error()) + } + addrBytes, err := txscript.NewScriptBuilder(). + AddOp(txscript.OP_HASH160).AddData(addr.ScriptAddress()). + AddOp(txscript.OP_EQUAL).Script() + if err != nil { + t.Fatalf("Address script build failed: %s", err.Error()) + } + + // Create a GCSBuilder with a key hash and check that the key is derived + // correctly, then test it. + b := builder.WithKeyHash(hash) + key, err := b.Key() + if err != nil { + t.Fatalf("Builder instantiation with key hash failed: %s", + err.Error()) + } + if key != testKey { + t.Fatalf("Key not derived correctly from key hash:\n%s\n%s", + hex.EncodeToString(key[:]), + hex.EncodeToString(testKey[:])) + } + BuilderTest(b, hash, builder.DefaultP, outPoint, addrBytes, witness, t) + + // Create a GCSBuilder with a key hash and non-default P and test it. + b = builder.WithKeyHashPM(hash, 30, 90) + BuilderTest(b, hash, 30, outPoint, addrBytes, witness, t) + + // Create a GCSBuilder with a random key, set the key from a hash + // manually, check that the key is correct, and test it. + b = builder.WithRandomKey() + b.SetKeyFromHash(hash) + key, err = b.Key() + if err != nil { + t.Fatalf("Builder instantiation with known key failed: %s", + err.Error()) + } + if key != testKey { + t.Fatalf("Key not copied correctly from known key:\n%s\n%s", + hex.EncodeToString(key[:]), + hex.EncodeToString(testKey[:])) + } + BuilderTest(b, hash, builder.DefaultP, outPoint, addrBytes, witness, t) + + // Create a GCSBuilder with a random key and test it. + b = builder.WithRandomKey() + key1, err := b.Key() + if err != nil { + t.Fatalf("Builder instantiation with random key failed: %s", + err.Error()) + } + t.Logf("Random Key 1: %s", hex.EncodeToString(key1[:])) + BuilderTest(b, hash, builder.DefaultP, outPoint, addrBytes, witness, t) + + // Create a GCSBuilder with a random key and non-default P and test it. + b = builder.WithRandomKeyPM(30, 90) + key2, err := b.Key() + if err != nil { + t.Fatalf("Builder instantiation with random key failed: %s", + err.Error()) + } + t.Logf("Random Key 2: %s", hex.EncodeToString(key2[:])) + if key2 == key1 { + t.Fatalf("Random keys are the same!") + } + BuilderTest(b, hash, 30, outPoint, addrBytes, witness, t) + + // Create a GCSBuilder with a known key and test it. + b = builder.WithKey(testKey) + key, err = b.Key() + if err != nil { + t.Fatalf("Builder instantiation with known key failed: %s", + err.Error()) + } + if key != testKey { + t.Fatalf("Key not copied correctly from known key:\n%s\n%s", + hex.EncodeToString(key[:]), + hex.EncodeToString(testKey[:])) + } + BuilderTest(b, hash, builder.DefaultP, outPoint, addrBytes, witness, t) + + // Create a GCSBuilder with a known key and non-default P and test it. + b = builder.WithKeyPM(testKey, 30, 90) + key, err = b.Key() + if err != nil { + t.Fatalf("Builder instantiation with known key failed: %s", + err.Error()) + } + if key != testKey { + t.Fatalf("Key not copied correctly from known key:\n%s\n%s", + hex.EncodeToString(key[:]), + hex.EncodeToString(testKey[:])) + } + BuilderTest(b, hash, 30, outPoint, addrBytes, witness, t) + + // Create a GCSBuilder with a known key and too-high P and ensure error + // works throughout all functions that use it. + b = builder.WithRandomKeyPM(33, 99).SetKeyFromHash(hash).SetKey(testKey) + b.SetP(30).AddEntry(hash.CloneBytes()).AddEntries(contents). + AddHash(hash).AddEntry(addrBytes) + _, err = b.Key() + if err != gcs.ErrPTooBig { + t.Fatalf("No error on P too big!") + } + _, err = b.Build() + if err != gcs.ErrPTooBig { + t.Fatalf("No error on P too big!") + } +} + +func BuilderTest(b *builder.GCSBuilder, hash *chainhash.Hash, p uint8, + outPoint wire.OutPoint, addrBytes []byte, witness wire.TxWitness, + t *testing.T) { + + key, err := b.Key() + if err != nil { + t.Fatalf("Builder instantiation with key hash failed: %s", + err.Error()) + } + + // Build a filter and test matches. + b.AddEntries(contents) + f, err := b.Build() + if err != nil { + t.Fatalf("Filter build failed: %s", err.Error()) + } + if f.P() != p { + t.Fatalf("Filter built with wrong probability") + } + match, err := f.Match(key, []byte("Nate")) + if err != nil { + t.Fatalf("Filter match failed: %s", err) + } + if !match { + t.Fatal("Filter didn't match when it should have!") + } + match, err = f.Match(key, []byte("weks")) + if err != nil { + t.Fatalf("Filter match failed: %s", err) + } + if match { + t.Logf("False positive match, should be 1 in 2**%d!", + builder.DefaultP) + } + + // Add a hash, build a filter, and test matches + b.AddHash(hash) + f, err = b.Build() + if err != nil { + t.Fatalf("Filter build failed: %s", err.Error()) + } + match, err = f.Match(key, hash.CloneBytes()) + if err != nil { + t.Fatalf("Filter match failed: %s", err) + } + if !match { + t.Fatal("Filter didn't match when it should have!") + } + + // Add a script, build a filter, and test matches + b.AddEntry(addrBytes) + f, err = b.Build() + if err != nil { + t.Fatalf("Filter build failed: %s", err.Error()) + } + match, err = f.MatchAny(key, [][]byte{addrBytes}) + if err != nil { + t.Fatalf("Filter match any failed: %s", err) + } + if !match { + t.Fatal("Filter didn't match when it should have!") + } + + // Add a routine witness stack, build a filter, and test that it + // matches. + b.AddWitness(witness) + f, err = b.Build() + if err != nil { + t.Fatalf("Filter build failed: %s", err.Error()) + } + match, err = f.MatchAny(key, witness) + if err != nil { + t.Fatalf("Filter match any failed: %s", err) + } + if !match { + t.Fatal("Filter didn't match when it should have!") + } + + // Check that adding duplicate items does not increase filter size. + originalSize := f.N() + b.AddEntry(addrBytes) + b.AddWitness(witness) + f, err = b.Build() + if err != nil { + t.Fatalf("Filter build failed: %s", err.Error()) + } + if f.N() != originalSize { + t.Fatal("Filter size increased with duplicate items") + } +} diff --git a/btcutil/gcs/doc.go b/btcutil/gcs/doc.go new file mode 100644 index 0000000000..8e67e369a6 --- /dev/null +++ b/btcutil/gcs/doc.go @@ -0,0 +1,24 @@ +// Copyright (c) 2016-2017 The btcsuite developers +// Copyright (c) 2016-2017 The Lightning Network Developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +/* +Package gcs provides an API for building and using a Golomb-coded set filter. + +# Golomb-Coded Set + +A Golomb-coded set is a probabilistic data structure used similarly to a Bloom +filter. A filter uses constant-size overhead plus on average n+2 bits per +item added to the filter, where 2^-n is the desired false positive (collision) +probability. + +# GCS use in Bitcoin + +GCS filters are a proposed mechanism for storing and transmitting per-block +filters in Bitcoin. The usage is intended to be the inverse of Bloom filters: +a full node would send an SPV node the GCS filter for a block, which the SPV +node would check against its list of relevant items. The suggested collision +probability for Bitcoin use is 2^-20. +*/ +package gcs diff --git a/btcutil/gcs/gcs.go b/btcutil/gcs/gcs.go new file mode 100644 index 0000000000..fca315d6db --- /dev/null +++ b/btcutil/gcs/gcs.go @@ -0,0 +1,541 @@ +// Copyright (c) 2016-2017 The btcsuite developers +// Copyright (c) 2016-2017 The Lightning Network Developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package gcs + +import ( + "bytes" + "fmt" + "io" + "sort" + + "github.com/aead/siphash" + "github.com/btcsuite/btcd/wire" + "github.com/kkdai/bstream" +) + +// Inspired by https://github.com/rasky/gcs + +var ( + // ErrNTooBig signifies that the filter can't handle N items. + ErrNTooBig = fmt.Errorf("N is too big to fit in uint32") + + // ErrPTooBig signifies that the filter can't handle `1/2**P` + // collision probability. + ErrPTooBig = fmt.Errorf("P is too big to fit in uint32") +) + +const ( + // KeySize is the size of the byte array required for key material for + // the SipHash keyed hash function. + KeySize = 16 + + // varIntProtoVer is the protocol version to use for serializing N as a + // VarInt. + varIntProtoVer uint32 = 0 +) + +// fastReduction calculates a mapping that's more ore less equivalent to: x mod +// N. However, instead of using a mod operation, which using a non-power of two +// will lead to slowness on many processors due to unnecessary division, we +// instead use a "multiply-and-shift" trick which eliminates all divisions, +// described in: +// https://lemire.me/blog/2016/06/27/a-fast-alternative-to-the-modulo-reduction/ +// +// v * N >> log_2(N) +// +// In our case, using 64-bit integers, log_2 is 64. As most processors don't +// support 128-bit arithmetic natively, we'll be super portable and unfold the +// operation into several operations with 64-bit arithmetic. As inputs, we the +// number to reduce, and our modulus N divided into its high 32-bits and lower +// 32-bits. +func fastReduction(v, nHi, nLo uint64) uint64 { + // First, we'll spit the item we need to reduce into its higher and + // lower bits. + vhi := v >> 32 + vlo := uint64(uint32(v)) + + // Then, we distribute multiplication over each part. + vnphi := vhi * nHi + vnpmid := vhi * nLo + npvmid := nHi * vlo + vnplo := vlo * nLo + + // We calculate the carry bit. + carry := (uint64(uint32(vnpmid)) + uint64(uint32(npvmid)) + + (vnplo >> 32)) >> 32 + + // Last, we add the high bits, the middle bits, and the carry. + v = vnphi + (vnpmid >> 32) + (npvmid >> 32) + carry + + return v +} + +// Filter describes an immutable filter that can be built from a set of data +// elements, serialized, deserialized, and queried in a thread-safe manner. The +// serialized form is compressed as a Golomb Coded Set (GCS), but does not +// include N or P to allow the user to encode the metadata separately if +// necessary. The hash function used is SipHash, a keyed function; the key used +// in building the filter is required in order to match filter values and is +// not included in the serialized form. +type Filter struct { + n uint32 + p uint8 + modulusNP uint64 + + filterData []byte +} + +// BuildGCSFilter builds a new GCS filter with the collision probability of +// `1/(2**P)`, key `key`, and including every `[]byte` in `data` as a member of +// the set. +func BuildGCSFilter(P uint8, M uint64, key [KeySize]byte, data [][]byte) (*Filter, error) { // nolint:gocritic + // Some initial parameter checks: make sure we have data from which to + // build the filter, and make sure our parameters will fit the hash + // function we're using. + if uint64(len(data)) >= (1 << 32) { + return nil, ErrNTooBig + } + if P > 32 { + return nil, ErrPTooBig + } + + // Create the filter object and insert metadata. + f := Filter{ + n: uint32(len(data)), + p: P, + } + + // First we'll compute the value of m, which is the modulus we use + // within our finite field. We want to compute: mScalar * 2^P. We use + // math.Round in order to round the value up, rather than down. + f.modulusNP = uint64(f.n) * M + + // Shortcut if the filter is empty. + if f.n == 0 { + return &f, nil + } + + // Build the filter. + values := make([]uint64, 0, len(data)) + b := bstream.NewBStreamWriter(0) + + // Insert the hash (fast-ranged over a space of N*P) of each data + // element into a slice and sort the slice. This can be greatly + // optimized with native 128-bit multiplication, but we're going to be + // fully portable for now. + // + // First, we cache the high and low bits of modulusNP for the + // multiplication of 2 64-bit integers into a 128-bit integer. + nphi := f.modulusNP >> 32 + nplo := uint64(uint32(f.modulusNP)) + for _, d := range data { + // For each datum, we assign the initial hash to a uint64. + v := siphash.Sum64(d, &key) + + v = fastReduction(v, nphi, nplo) + values = append(values, v) + } + sort.Slice(values, func(i, j int) bool { return values[i] < values[j] }) + + // Write the sorted list of values into the filter bitstream, + // compressing it using Golomb coding. + var value, lastValue, remainder uint64 + for _, v := range values { + // Calculate the difference between this value and the last, + // modulo P. + remainder = (v - lastValue) & ((uint64(1) << f.p) - 1) + + // Calculate the difference between this value and the last, + // divided by P. + value = (v - lastValue - remainder) >> f.p + lastValue = v + + // Write the P multiple into the bitstream in unary; the + // average should be around 1 (2 bits - 0b10). + for value > 0 { + b.WriteBit(true) + value-- + } + b.WriteBit(false) + + // Write the remainder as a big-endian integer with enough bits + // to represent the appropriate collision probability. + b.WriteBits(remainder, int(f.p)) + } + + // Copy the bitstream into the filter object and return the object. + f.filterData = b.Bytes() + + return &f, nil +} + +// FromBytes deserializes a GCS filter from a known N, P, and serialized filter +// as returned by Bytes(). +func FromBytes(N uint32, P uint8, M uint64, d []byte) (*Filter, error) { // nolint:gocritic + // Basic sanity check. + if P > 32 { + return nil, ErrPTooBig + } + + // Create the filter object and insert metadata. + f := &Filter{ + n: N, + p: P, + } + + // First we'll compute the value of m, which is the modulus we use + // within our finite field. We want to compute: mScalar * 2^P. We use + // math.Round in order to round the value up, rather than down. + f.modulusNP = uint64(f.n) * M + + // Copy the filter. + f.filterData = make([]byte, len(d)) + copy(f.filterData, d) + + return f, nil +} + +// FromNBytes deserializes a GCS filter from a known P, and serialized N and +// filter as returned by NBytes(). +func FromNBytes(P uint8, M uint64, d []byte) (*Filter, error) { // nolint:gocritic + buffer := bytes.NewBuffer(d) + N, err := wire.ReadVarInt(buffer, varIntProtoVer) + if err != nil { + return nil, err + } + if N >= (1 << 32) { + return nil, ErrNTooBig + } + return FromBytes(uint32(N), P, M, buffer.Bytes()) +} + +// Bytes returns the serialized format of the GCS filter, which does not +// include N or P (returned by separate methods) or the key used by SipHash. +func (f *Filter) Bytes() ([]byte, error) { + filterData := make([]byte, len(f.filterData)) + copy(filterData, f.filterData) + return filterData, nil +} + +// NBytes returns the serialized format of the GCS filter with N, which does +// not include P (returned by a separate method) or the key used by SipHash. +func (f *Filter) NBytes() ([]byte, error) { + var buffer bytes.Buffer + buffer.Grow(wire.VarIntSerializeSize(uint64(f.n)) + len(f.filterData)) + + err := wire.WriteVarInt(&buffer, varIntProtoVer, uint64(f.n)) + if err != nil { + return nil, err + } + + _, err = buffer.Write(f.filterData) + if err != nil { + return nil, err + } + + return buffer.Bytes(), nil +} + +// PBytes returns the serialized format of the GCS filter with P, which does +// not include N (returned by a separate method) or the key used by SipHash. +func (f *Filter) PBytes() ([]byte, error) { + filterData := make([]byte, len(f.filterData)+1) + filterData[0] = f.p + copy(filterData[1:], f.filterData) + return filterData, nil +} + +// NPBytes returns the serialized format of the GCS filter with N and P, which +// does not include the key used by SipHash. +func (f *Filter) NPBytes() ([]byte, error) { + var buffer bytes.Buffer + buffer.Grow(wire.VarIntSerializeSize(uint64(f.n)) + 1 + len(f.filterData)) + + err := wire.WriteVarInt(&buffer, varIntProtoVer, uint64(f.n)) + if err != nil { + return nil, err + } + + err = buffer.WriteByte(f.p) + if err != nil { + return nil, err + } + + _, err = buffer.Write(f.filterData) + if err != nil { + return nil, err + } + + return buffer.Bytes(), nil +} + +// P returns the filter's collision probability as a negative power of 2 (that +// is, a collision probability of `1/2**20` is represented as 20). +func (f *Filter) P() uint8 { + return f.p +} + +// N returns the size of the data set used to build the filter. +func (f *Filter) N() uint32 { + return f.n +} + +// Match checks whether a []byte value is likely (within collision probability) +// to be a member of the set represented by the filter. +func (f *Filter) Match(key [KeySize]byte, data []byte) (bool, error) { + // Create a filter bitstream. + filterData, err := f.Bytes() + if err != nil { + return false, err + } + + b := bstream.NewBStreamReader(filterData) + + // We take the high and low bits of modulusNP for the multiplication + // of 2 64-bit integers into a 128-bit integer. + nphi := f.modulusNP >> 32 + nplo := uint64(uint32(f.modulusNP)) + + // Then we hash our search term with the same parameters as the filter. + term := siphash.Sum64(data, &key) + term = fastReduction(term, nphi, nplo) + + // Go through the search filter and look for the desired value. + var value uint64 + for i := uint32(0); i < f.N(); i++ { + // Read the difference between previous and new value from + // bitstream. + delta, err := f.readFullUint64(b) + if err != nil { + if err == io.EOF { + return false, nil + } + return false, err + } + + // Add the delta to the previous value. + value += delta + switch { + + // The current value matches our query term, success. + case value == term: + return true, nil + + // The current value is greater than our query term, thus no + // future decoded value can match because the values + // monotonically increase. + case value > term: + return false, nil + } + } + + // All values were decoded and none produced a successful match. This + // indicates that the items in the filter were all smaller than our + // target. + return false, nil +} + +// MatchAny returns checks whether any []byte value is likely (within collision +// probability) to be a member of the set represented by the filter faster than +// calling Match() for each value individually. +func (f *Filter) MatchAny(key [KeySize]byte, data [][]byte) (bool, error) { + // TODO(conner): add real heuristics to query optimization + switch { + + case len(data) >= int(f.N()/2): + return f.HashMatchAny(key, data) + + default: + return f.ZipMatchAny(key, data) + } +} + +// ZipMatchAny returns checks whether any []byte value is likely (within +// collision probability) to be a member of the set represented by the filter +// faster than calling Match() for each value individually. +// +// NOTE: This method should outperform HashMatchAny when the number of query +// entries is smaller than the number of filter entries. +func (f *Filter) ZipMatchAny(key [KeySize]byte, data [][]byte) (bool, error) { + // Basic anity check. + if len(data) == 0 { + return false, nil + } + + // Create a filter bitstream. + filterData, err := f.Bytes() + if err != nil { + return false, err + } + + b := bstream.NewBStreamReader(filterData) + + // Create an uncompressed filter of the search values. + values := make([]uint64, 0, len(data)) + + // First, we cache the high and low bits of modulusNP for the + // multiplication of 2 64-bit integers into a 128-bit integer. + nphi := f.modulusNP >> 32 + nplo := uint64(uint32(f.modulusNP)) + for _, d := range data { + // For each datum, we assign the initial hash to a uint64. + v := siphash.Sum64(d, &key) + + // We'll then reduce the value down to the range of our + // modulus. + v = fastReduction(v, nphi, nplo) + values = append(values, v) + } + sort.Slice(values, func(i, j int) bool { return values[i] < values[j] }) + + querySize := len(values) + + // Zip down the filters, comparing values until we either run out of + // values to compare in one of the filters or we reach a matching + // value. + var ( + value uint64 + queryIndex int + ) +out: + for i := uint32(0); i < f.N(); i++ { + // Advance filter we're searching or return false if we're at + // the end because nothing matched. + delta, err := f.readFullUint64(b) + if err != nil { + if err == io.EOF { + return false, nil + } + return false, err + } + value += delta + + for { + switch { + + // All query items have been exhausted and we haven't + // had a match, therefore there are no matches. + case queryIndex == querySize: + return false, nil + + // The current item in the query matches the decoded + // value, success. + case values[queryIndex] == value: + return true, nil + + // The current item in the query is greater than the + // current decoded value, continue to decode the next + // delta and try again. + case values[queryIndex] > value: + continue out + } + + queryIndex++ + } + } + + // All items in the filter were decoded and none produced a successful + // match. + return false, nil +} + +// HashMatchAny returns checks whether any []byte value is likely (within +// collision probability) to be a member of the set represented by the filter +// faster than calling Match() for each value individually. +// +// NOTE: This method should outperform MatchAny if the number of query entries +// approaches the number of filter entries, len(data) >= f.N(). +func (f *Filter) HashMatchAny(key [KeySize]byte, data [][]byte) (bool, error) { + // Basic sanity check. + if len(data) == 0 { + return false, nil + } + + // Create a filter bitstream. + filterData, err := f.Bytes() + if err != nil { + return false, err + } + + b := bstream.NewBStreamReader(filterData) + + var ( + values = make(map[uint32]struct{}, f.N()) + lastValue uint64 + ) + + // First, decompress the filter and construct an index of the keys + // contained within the filter. Index construction terminates after all + // values have been read from the bitstream. + for { + // Read the next diff value from the filter, add it to the + // last value, and set the new value in the index. + value, err := f.readFullUint64(b) + if err == nil { + lastValue += value + values[uint32(lastValue)] = struct{}{} + continue + } else if err == io.EOF { + break + } + + return false, err + } + + // We cache the high and low bits of modulusNP for the multiplication of + // 2 64-bit integers into a 128-bit integer. + nphi := f.modulusNP >> 32 + nplo := uint64(uint32(f.modulusNP)) + + // Finally, run through the provided data items, querying the index to + // determine if the filter contains any elements of interest. + for _, d := range data { + // For each datum, we assign the initial hash to + // a uint64. + v := siphash.Sum64(d, &key) + + // We'll then reduce the value down to the range + // of our modulus. + v = fastReduction(v, nphi, nplo) + + if _, ok := values[uint32(v)]; !ok { + continue + } + + return true, nil + } + + return false, nil +} + +// readFullUint64 reads a value represented by the sum of a unary multiple of +// the filter's P modulus (`2**P`) and a big-endian P-bit remainder. +func (f *Filter) readFullUint64(b *bstream.BStream) (uint64, error) { + var quotient uint64 + + // Count the 1s until we reach a 0. + c, err := b.ReadBit() + if err != nil { + return 0, err + } + for c { + quotient++ + c, err = b.ReadBit() + if err != nil { + return 0, err + } + } + + // Read P bits. + remainder, err := b.ReadBits(int(f.p)) + if err != nil { + return 0, err + } + + // Add the multiple and the remainder. + v := (quotient << f.p) + remainder + return v, nil +} diff --git a/btcutil/gcs/gcs_test.go b/btcutil/gcs/gcs_test.go new file mode 100644 index 0000000000..8ae49f0507 --- /dev/null +++ b/btcutil/gcs/gcs_test.go @@ -0,0 +1,368 @@ +// Copyright (c) 2016-2017 The btcsuite developers +// Copyright (c) 2016-2017 The Lightning Network Developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package gcs_test + +import ( + "bytes" + "encoding/binary" + "math/rand" + "testing" + + "github.com/btcsuite/btcd/btcutil/gcs" +) + +var ( + // No need to allocate an err variable in every test + err error + + // Collision probability for the tests (1/2**19) + P = uint8(19) + + // Modulus value for the tests. + M uint64 = 784931 + + // Filters are conserved between tests but we must define with an + // interface which functions we're testing because the gcsFilter type + // isn't exported + filter, filter2, filter3 *gcs.Filter + + // We need to use the same key for building and querying the filters + key [gcs.KeySize]byte + + // List of values for building a filter + contents = [][]byte{ + []byte("Alex"), + []byte("Bob"), + []byte("Charlie"), + []byte("Dick"), + []byte("Ed"), + []byte("Frank"), + []byte("George"), + []byte("Harry"), + []byte("Ilya"), + []byte("John"), + []byte("Kevin"), + []byte("Larry"), + []byte("Michael"), + []byte("Nate"), + []byte("Owen"), + []byte("Paul"), + []byte("Quentin"), + } + + // List of values for querying a filter using MatchAny() + contents2 = [][]byte{ + []byte("Alice"), + []byte("Betty"), + []byte("Charmaine"), + []byte("Donna"), + []byte("Edith"), + []byte("Faina"), + []byte("Georgia"), + []byte("Hannah"), + []byte("Ilsbeth"), + []byte("Jennifer"), + []byte("Kayla"), + []byte("Lena"), + []byte("Michelle"), + []byte("Natalie"), + []byte("Ophelia"), + []byte("Peggy"), + []byte("Queenie"), + } +) + +// TestGCSFilterBuild builds a test filter with a randomized key. For Bitcoin +// use, deterministic filter generation is desired. Therefore, a key that's +// derived deterministically would be required. +func TestGCSFilterBuild(t *testing.T) { + for i := 0; i < gcs.KeySize; i += 4 { + binary.BigEndian.PutUint32(key[i:], rand.Uint32()) + } + filter, err = gcs.BuildGCSFilter(P, M, key, contents) + if err != nil { + t.Fatalf("Filter build failed: %s", err.Error()) + } +} + +// TestGCSMatchZeroHash ensures that Match and MatchAny properly match an item +// if it's hash after the reduction is zero. This is accomplished by brute +// forcing a specific target whose hash is zero given a certain (P, M, key, +// len(elements)) combination. In this case, P and M are the default, key was +// chosen randomly, and len(elements) is 13. The target 4-byte value of 16060032 +// is the first such 32-bit value, thus we use the number 0-11 as the other +// elements in the filter since we know they won't collide. We test both the +// positive and negative cases, when the zero hash item is in the filter and +// when it is excluded. In the negative case, the 32-bit value of 12 is added to +// the filter instead of the target. +func TestGCSMatchZeroHash(t *testing.T) { + t.Run("include zero", func(t *testing.T) { + testGCSMatchZeroHash(t, true) + }) + t.Run("exclude zero", func(t *testing.T) { + testGCSMatchZeroHash(t, false) + }) +} + +func testGCSMatchZeroHash(t *testing.T, includeZeroHash bool) { + key := [gcs.KeySize]byte{ + 0x25, 0x28, 0x0d, 0x25, 0x26, 0xe1, 0xd3, 0xc7, + 0xa5, 0x71, 0x85, 0x34, 0x92, 0xa5, 0x7e, 0x68, + } + + // Construct the target data to match, whose hash is zero after applying + // the reduction with the parameters in the test. + target := make([]byte, 4) + binary.BigEndian.PutUint32(target, 16060032) + + // Construct the set of 13 items including the target, using the 32-bit + // values of 0 through 11 as the first 12 items. We known none of these + // hash to zero since the brute force ended well beyond them. + elements := make([][]byte, 0, 13) + for i := 0; i < 12; i++ { + data := make([]byte, 4) + binary.BigEndian.PutUint32(data, uint32(i)) + elements = append(elements, data) + } + + // If the filter should include the zero hash element, add the target + // which we know hashes to zero. Otherwise add 32-bit value of 12 which + // we know does not hash to zero. + if includeZeroHash { + elements = append(elements, target) + } else { + data := make([]byte, 4) + binary.BigEndian.PutUint32(data, 12) + elements = append(elements, data) + } + + filter, err := gcs.BuildGCSFilter(P, M, key, elements) + if err != nil { + t.Fatalf("unable to build filter: %v", err) + } + + match, err := filter.Match(key, target) + if err != nil { + t.Fatalf("unable to match: %v", err) + } + + // We should only get a match iff the target was included. + if match != includeZeroHash { + t.Fatalf("expected match from Match: %t, got %t", + includeZeroHash, match) + } + + match, err = filter.MatchAny(key, [][]byte{target}) + if err != nil { + t.Fatalf("unable to match any: %v", err) + } + + // We should only get a match iff the target was included. + if match != includeZeroHash { + t.Fatalf("expected match from MatchAny: %t, got %t", + includeZeroHash, match) + } +} + +// TestGCSFilterCopy deserializes and serializes a filter to create a copy. +func TestGCSFilterCopy(t *testing.T) { + serialized2, err := filter.Bytes() + if err != nil { + t.Fatalf("Filter Bytes() failed: %v", err) + } + filter2, err = gcs.FromBytes(filter.N(), P, M, serialized2) + if err != nil { + t.Fatalf("Filter copy failed: %s", err.Error()) + } + serialized3, err := filter.NBytes() + if err != nil { + t.Fatalf("Filter NBytes() failed: %v", err) + } + filter3, err = gcs.FromNBytes(filter.P(), M, serialized3) + if err != nil { + t.Fatalf("Filter copy failed: %s", err.Error()) + } +} + +// TestGCSFilterMetadata checks that the filter metadata is built and copied +// correctly. +func TestGCSFilterMetadata(t *testing.T) { + if filter.P() != P { + t.Fatal("P not correctly stored in filter metadata") + } + if filter.N() != uint32(len(contents)) { + t.Fatal("N not correctly stored in filter metadata") + } + if filter.P() != filter2.P() { + t.Fatal("P doesn't match between copied filters") + } + if filter.P() != filter3.P() { + t.Fatal("P doesn't match between copied filters") + } + if filter.N() != filter2.N() { + t.Fatal("N doesn't match between copied filters") + } + if filter.N() != filter3.N() { + t.Fatal("N doesn't match between copied filters") + } + serialized, err := filter.Bytes() + if err != nil { + t.Fatalf("Filter Bytes() failed: %v", err) + } + serialized2, err := filter2.Bytes() + if err != nil { + t.Fatalf("Filter Bytes() failed: %v", err) + } + if !bytes.Equal(serialized, serialized2) { + t.Fatal("Bytes don't match between copied filters") + } + serialized3, err := filter3.Bytes() + if err != nil { + t.Fatalf("Filter Bytes() failed: %v", err) + } + if !bytes.Equal(serialized, serialized3) { + t.Fatal("Bytes don't match between copied filters") + } + serialized4, err := filter3.Bytes() + if err != nil { + t.Fatalf("Filter Bytes() failed: %v", err) + } + if !bytes.Equal(serialized, serialized4) { + t.Fatal("Bytes don't match between copied filters") + } +} + +// TestGCSFilterMatch checks that both the built and copied filters match +// correctly, logging any false positives without failing on them. +func TestGCSFilterMatch(t *testing.T) { + match, err := filter.Match(key, []byte("Nate")) + if err != nil { + t.Fatalf("Filter match failed: %s", err.Error()) + } + if !match { + t.Fatal("Filter didn't match when it should have!") + } + match, err = filter2.Match(key, []byte("Nate")) + if err != nil { + t.Fatalf("Filter match failed: %s", err.Error()) + } + if !match { + t.Fatal("Filter didn't match when it should have!") + } + match, err = filter.Match(key, []byte("Quentin")) + if err != nil { + t.Fatalf("Filter match failed: %s", err.Error()) + } + if !match { + t.Fatal("Filter didn't match when it should have!") + } + match, err = filter2.Match(key, []byte("Quentin")) + if err != nil { + t.Fatalf("Filter match failed: %s", err.Error()) + } + if !match { + t.Fatal("Filter didn't match when it should have!") + } + match, err = filter.Match(key, []byte("Nates")) + if err != nil { + t.Fatalf("Filter match failed: %s", err.Error()) + } + if match { + t.Logf("False positive match, should be 1 in 2**%d!", P) + } + match, err = filter2.Match(key, []byte("Nates")) + if err != nil { + t.Fatalf("Filter match failed: %s", err.Error()) + } + if match { + t.Logf("False positive match, should be 1 in 2**%d!", P) + } + match, err = filter.Match(key, []byte("Quentins")) + if err != nil { + t.Fatalf("Filter match failed: %s", err.Error()) + } + if match { + t.Logf("False positive match, should be 1 in 2**%d!", P) + } + match, err = filter2.Match(key, []byte("Quentins")) + if err != nil { + t.Fatalf("Filter match failed: %s", err.Error()) + } + if match { + t.Logf("False positive match, should be 1 in 2**%d!", P) + } +} + +// AnyMatcher is the function signature of our matching algorithms. +type AnyMatcher func(key [gcs.KeySize]byte, data [][]byte) (bool, error) + +// TestGCSFilterMatchAnySuite checks that all of our matching algorithms +// properly match a list correctly when using built or copied filters, logging +// any false positives without failing on them. +func TestGCSFilterMatchAnySuite(t *testing.T) { + funcs := []struct { + name string + matchAny func(*gcs.Filter) AnyMatcher + }{ + { + "default", + func(f *gcs.Filter) AnyMatcher { + return f.MatchAny + }, + }, + { + "hash", + func(f *gcs.Filter) AnyMatcher { + return f.HashMatchAny + }, + }, + { + "zip", + func(f *gcs.Filter) AnyMatcher { + return f.ZipMatchAny + }, + }, + } + + for _, test := range funcs { + test := test + + t.Run(test.name, func(t *testing.T) { + contentsCopy := make([][]byte, len(contents2)) + copy(contentsCopy, contents2) + + match, err := test.matchAny(filter)(key, contentsCopy) + if err != nil { + t.Fatalf("Filter match any failed: %s", err.Error()) + } + if match { + t.Logf("False positive match, should be 1 in 2**%d!", P) + } + match, err = test.matchAny(filter2)(key, contentsCopy) + if err != nil { + t.Fatalf("Filter match any failed: %s", err.Error()) + } + if match { + t.Logf("False positive match, should be 1 in 2**%d!", P) + } + contentsCopy = append(contentsCopy, []byte("Nate")) + match, err = test.matchAny(filter)(key, contentsCopy) + if err != nil { + t.Fatalf("Filter match any failed: %s", err.Error()) + } + if !match { + t.Fatal("Filter didn't match any when it should have!") + } + match, err = test.matchAny(filter2)(key, contentsCopy) + if err != nil { + t.Fatalf("Filter match any failed: %s", err.Error()) + } + if !match { + t.Fatal("Filter didn't match any when it should have!") + } + }) + } +} diff --git a/btcutil/gcs/gcsbench_test.go b/btcutil/gcs/gcsbench_test.go new file mode 100644 index 0000000000..69ce7708b3 --- /dev/null +++ b/btcutil/gcs/gcsbench_test.go @@ -0,0 +1,237 @@ +// Copyright (c) 2016-2017 The btcsuite developers +// Copyright (c) 2016-2017 The Lightning Network Developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package gcs_test + +import ( + "encoding/binary" + "math/rand" + "testing" + + "github.com/btcsuite/btcd/btcutil/gcs" +) + +func genRandFilterElements(numElements uint) ([][]byte, error) { + testContents := make([][]byte, numElements) + for i := range testContents { + randElem := make([]byte, 32) + if _, err := rand.Read(randElem); err != nil { + return nil, err + } + testContents[i] = randElem + } + + return testContents, nil +} + +var ( + generatedFilter *gcs.Filter +) + +// BenchmarkGCSFilterBuild benchmarks building a filter. +func BenchmarkGCSFilterBuild50000(b *testing.B) { + var testKey [gcs.KeySize]byte + for i := 0; i < gcs.KeySize; i += 4 { + binary.BigEndian.PutUint32(testKey[i:], rand.Uint32()) + } + + randFilterElems, genErr := genRandFilterElements(50000) + if err != nil { + b.Fatalf("unable to generate random item: %v", genErr) + } + + b.ReportAllocs() + b.ResetTimer() + + var localFilter *gcs.Filter + for i := 0; i < b.N; i++ { + localFilter, err = gcs.BuildGCSFilter( + P, M, key, randFilterElems, + ) + if err != nil { + b.Fatalf("unable to generate filter: %v", err) + } + } + generatedFilter = localFilter +} + +// BenchmarkGCSFilterBuild benchmarks building a filter. +func BenchmarkGCSFilterBuild100000(b *testing.B) { + var testKey [gcs.KeySize]byte + for i := 0; i < gcs.KeySize; i += 4 { + binary.BigEndian.PutUint32(testKey[i:], rand.Uint32()) + } + + randFilterElems, genErr := genRandFilterElements(100000) + if err != nil { + b.Fatalf("unable to generate random item: %v", genErr) + } + + b.ReportAllocs() + b.ResetTimer() + + var localFilter *gcs.Filter + for i := 0; i < b.N; i++ { + localFilter, err = gcs.BuildGCSFilter( + P, M, key, randFilterElems, + ) + if err != nil { + b.Fatalf("unable to generate filter: %v", err) + } + } + generatedFilter = localFilter +} + +var ( + match bool +) + +// BenchmarkGCSFilterMatch benchmarks querying a filter for a single value. +func BenchmarkGCSFilterMatch(b *testing.B) { + filter, err := gcs.BuildGCSFilter(P, M, key, contents) + if err != nil { + b.Fatalf("Failed to build filter") + } + + b.ReportAllocs() + b.ResetTimer() + + var localMatch bool + for i := 0; i < b.N; i++ { + _, err = filter.Match(key, []byte("Nate")) + if err != nil { + b.Fatalf("unable to match filter: %v", err) + } + + localMatch, err = filter.Match(key, []byte("Nates")) + if err != nil { + b.Fatalf("unable to match filter: %v", err) + } + } + match = localMatch +} + +var ( + randElems100, _ = genRandFilterElements(100) + randElems1000, _ = genRandFilterElements(1000) + randElems10000, _ = genRandFilterElements(10000) + randElems100000, _ = genRandFilterElements(100000) + randElems1000000, _ = genRandFilterElements(1000000) + randElems10000000, _ = genRandFilterElements(10000000) + + filterElems1000, _ = genRandFilterElements(1000) + filter1000, _ = gcs.BuildGCSFilter(P, M, key, filterElems1000) + filterElems5000, _ = genRandFilterElements(5000) + filter5000, _ = gcs.BuildGCSFilter(P, M, key, filterElems5000) + filterElems10000, _ = genRandFilterElements(10000) + filter10000, _ = gcs.BuildGCSFilter(P, M, key, filterElems10000) +) + +// matchAnyBenchmarks contains combinations of random filters and queries used +// to measure performance of various MatchAny implementations. +var matchAnyBenchmarks = []struct { + name string + query [][]byte + filter *gcs.Filter +}{ + {"q100-f1K", randElems100, filter1000}, + {"q1K-f1K", randElems1000, filter1000}, + {"q10K-f1K", randElems10000, filter1000}, + {"q100K-f1K", randElems100000, filter1000}, + {"q1M-f1K", randElems1000000, filter1000}, + {"q10M-f1K", randElems10000000, filter1000}, + + {"q100-f5K", randElems100, filter5000}, + {"q1K-f5K", randElems1000, filter5000}, + {"q10K-f5K", randElems10000, filter5000}, + {"q100K-f5K", randElems100000, filter5000}, + {"q1M-f5K", randElems1000000, filter5000}, + {"q10M-f5K", randElems10000000, filter5000}, + + {"q100-f10K", randElems100, filter10000}, + {"q1K-f10K", randElems1000, filter10000}, + {"q10K-f10K", randElems10000, filter10000}, + {"q100K-f10K", randElems100000, filter10000}, + {"q1M-f10K", randElems1000000, filter10000}, + {"q10M-f10K", randElems10000000, filter10000}, +} + +// BenchmarkGCSFilterZipMatchAny benchmarks the sort-and-zip MatchAny impl. +func BenchmarkGCSFilterZipMatchAny(b *testing.B) { + for _, test := range matchAnyBenchmarks { + test := test + + b.Run(test.name, func(b *testing.B) { + b.ReportAllocs() + + var ( + localMatch bool + err error + ) + + for i := 0; i < b.N; i++ { + localMatch, err = test.filter.ZipMatchAny( + key, test.query, + ) + if err != nil { + b.Fatalf("unable to match filter: %v", err) + } + } + match = localMatch + }) + } +} + +// BenchmarkGCSFilterHashMatchAny benchmarks the hash-join MatchAny impl. +func BenchmarkGCSFilterHashMatchAny(b *testing.B) { + for _, test := range matchAnyBenchmarks { + test := test + + b.Run(test.name, func(b *testing.B) { + b.ReportAllocs() + + var ( + localMatch bool + err error + ) + + for i := 0; i < b.N; i++ { + localMatch, err = test.filter.HashMatchAny( + key, test.query, + ) + if err != nil { + b.Fatalf("unable to match filter: %v", err) + } + } + match = localMatch + }) + } +} + +// BenchmarkGCSFilterMatchAny benchmarks the hybrid MatchAny impl. +func BenchmarkGCSFilterMatchAny(b *testing.B) { + for _, test := range matchAnyBenchmarks { + test := test + + b.Run(test.name, func(b *testing.B) { + b.ReportAllocs() + + var ( + localMatch bool + err error + ) + + for i := 0; i < b.N; i++ { + localMatch, err = test.filter.MatchAny( + key, test.query, + ) + if err != nil { + b.Fatalf("unable to match filter: %v", err) + } + } + match = localMatch + }) + } +} diff --git a/btcutil/go.mod b/btcutil/go.mod new file mode 100644 index 0000000000..79e6511f28 --- /dev/null +++ b/btcutil/go.mod @@ -0,0 +1,14 @@ +module github.com/btcsuite/btcd/btcutil + +go 1.16 + +require ( + github.com/aead/siphash v1.0.1 + github.com/btcsuite/btcd v0.24.2 + github.com/btcsuite/btcd/btcec/v2 v2.1.3 + github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 + github.com/davecgh/go-spew v1.1.1 + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 + github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 + golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 +) diff --git a/btcutil/go.sum b/btcutil/go.sum new file mode 100644 index 0000000000..b607077b86 --- /dev/null +++ b/btcutil/go.sum @@ -0,0 +1,119 @@ +github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg= +github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= +github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= +github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A= +github.com/btcsuite/btcd v0.24.2 h1:aLmxPguqxza+4ag8R1I2nnJjSu2iFn/kqtHTIImswcY= +github.com/btcsuite/btcd v0.24.2/go.mod h1:5C8ChTkl5ejr3WHj8tkQSCmydiMEPB0ZhQhehpq7Dgg= +github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= +github.com/btcsuite/btcd/btcec/v2 v2.1.3 h1:xM/n3yIhHAhHy04z4i43C8p4ehixJZMsnrVJkgl+MTE= +github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= +github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= +github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= +github.com/btcsuite/btcd/btcutil v1.1.5/go.mod h1:PSZZ4UitpLBWzxGd5VGOrLnmOjtPP/a6HaFo12zMs00= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ= +github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= +github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= +github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= +github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 h1:FOOIBWrEkLgmlgGfMuZT83xIwfPDxEI2OHu6xUmJMFE= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= +golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed h1:J22ig1FUekjjkmZUM7pTKixYm8DvrYsvrBZdunYeIuQ= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/btcutil/hash160.go b/btcutil/hash160.go new file mode 100644 index 0000000000..fa26e09bf9 --- /dev/null +++ b/btcutil/hash160.go @@ -0,0 +1,23 @@ +// Copyright (c) 2013-2017 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package btcutil + +import ( + "crypto/sha256" + "hash" + + "golang.org/x/crypto/ripemd160" +) + +// Calculate the hash of hasher over buf. +func calcHash(buf []byte, hasher hash.Hash) []byte { + _, _ = hasher.Write(buf) + return hasher.Sum(nil) +} + +// Hash160 calculates the hash ripemd160(sha256(b)). +func Hash160(buf []byte) []byte { + return calcHash(calcHash(buf, sha256.New()), ripemd160.New()) +} diff --git a/btcutil/hdkeychain/README.md b/btcutil/hdkeychain/README.md new file mode 100644 index 0000000000..2101ed4d81 --- /dev/null +++ b/btcutil/hdkeychain/README.md @@ -0,0 +1,59 @@ +hdkeychain +========== + +[![Build Status](http://img.shields.io/travis/btcsuite/btcutil.svg)](https://travis-ci.org/btcsuite/btcutil) +[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) +[![GoDoc](http://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/btcsuite/btcd/btcutil/hdkeychain) + +Package hdkeychain provides an API for bitcoin hierarchical deterministic +extended keys (BIP0032). + +A comprehensive suite of tests is provided to ensure proper functionality. See +`test_coverage.txt` for the gocov coverage report. Alternatively, if you are +running a POSIX OS, you can run the `cov_report.sh` script for a real-time +report. + +## Feature Overview + +- Full BIP0032 implementation +- Single type for private and public extended keys +- Convenient cryptographically secure seed generation +- Simple creation of master nodes +- Support for multi-layer derivation +- Easy serialization and deserialization for both private and public extended + keys +- Support for custom networks by registering them with chaincfg +- Obtaining the underlying EC pubkeys, EC privkeys, and associated bitcoin + addresses ties in seamlessly with existing btcec and btcutil types which + provide powerful tools for working with them to do things like sign + transactions and generate payment scripts +- Uses the btcec package which is highly optimized for secp256k1 +- Code examples including: + - Generating a cryptographically secure random seed and deriving a + master node from it + - Default HD wallet layout as described by BIP0032 + - Audits use case as described by BIP0032 +- Comprehensive test coverage including the BIP0032 test vectors +- Benchmarks + +## Installation and Updating + +```bash +$ go get -u github.com/btcsuite/btcd/btcutil/hdkeychain +``` + +## Examples + +* [NewMaster Example](http://godoc.org/github.com/btcsuite/btcd/btcutil/hdkeychain#example-NewMaster) + Demonstrates how to generate a cryptographically random seed then use it to + create a new master node (extended key). +* [Default Wallet Layout Example](http://godoc.org/github.com/btcsuite/btcd/btcutil/hdkeychain#example-package--DefaultWalletLayout) + Demonstrates the default hierarchical deterministic wallet layout as described + in BIP0032. +* [Audits Use Case Example](http://godoc.org/github.com/btcsuite/btcd/btcutil/hdkeychain#example-package--Audits) + Demonstrates the audits use case in BIP0032. + +## License + +Package hdkeychain is licensed under the [copyfree](http://copyfree.org) ISC +License. diff --git a/btcutil/hdkeychain/bench_test.go b/btcutil/hdkeychain/bench_test.go new file mode 100644 index 0000000000..285ef3e8d6 --- /dev/null +++ b/btcutil/hdkeychain/bench_test.go @@ -0,0 +1,84 @@ +// Copyright (c) 2014 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package hdkeychain_test + +import ( + "testing" + + "github.com/btcsuite/btcd/btcutil/hdkeychain" +) + +// bip0032MasterPriv1 is the master private extended key from the first set of +// test vectors in BIP0032. +const bip0032MasterPriv1 = "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbP" + + "y6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi" + +// BenchmarkDeriveHardened benchmarks how long it takes to derive a hardened +// child from a master private extended key. +func BenchmarkDeriveHardened(b *testing.B) { + b.StopTimer() + masterKey, err := hdkeychain.NewKeyFromString(bip0032MasterPriv1) + if err != nil { + b.Errorf("Failed to decode master seed: %v", err) + } + b.StartTimer() + + for i := 0; i < b.N; i++ { + _, _ = masterKey.Derive(hdkeychain.HardenedKeyStart) + } +} + +// BenchmarkDeriveNormal benchmarks how long it takes to derive a normal +// (non-hardened) child from a master private extended key. +func BenchmarkDeriveNormal(b *testing.B) { + b.StopTimer() + masterKey, err := hdkeychain.NewKeyFromString(bip0032MasterPriv1) + if err != nil { + b.Errorf("Failed to decode master seed: %v", err) + } + b.StartTimer() + + for i := 0; i < b.N; i++ { + _, _ = masterKey.Derive(0) + } +} + +// BenchmarkPrivToPub benchmarks how long it takes to convert a private extended +// key to a public extended key. +func BenchmarkPrivToPub(b *testing.B) { + b.StopTimer() + masterKey, err := hdkeychain.NewKeyFromString(bip0032MasterPriv1) + if err != nil { + b.Errorf("Failed to decode master seed: %v", err) + } + b.StartTimer() + + for i := 0; i < b.N; i++ { + _, _ = masterKey.Neuter() + } +} + +// BenchmarkDeserialize benchmarks how long it takes to deserialize a private +// extended key. +func BenchmarkDeserialize(b *testing.B) { + for i := 0; i < b.N; i++ { + _, _ = hdkeychain.NewKeyFromString(bip0032MasterPriv1) + } +} + +// BenchmarkSerialize benchmarks how long it takes to serialize a private +// extended key. +func BenchmarkSerialize(b *testing.B) { + b.StopTimer() + masterKey, err := hdkeychain.NewKeyFromString(bip0032MasterPriv1) + if err != nil { + b.Errorf("Failed to decode master seed: %v", err) + } + b.StartTimer() + + for i := 0; i < b.N; i++ { + _ = masterKey.String() + } +} diff --git a/btcutil/hdkeychain/cov_report.sh b/btcutil/hdkeychain/cov_report.sh new file mode 100644 index 0000000000..307f05b76c --- /dev/null +++ b/btcutil/hdkeychain/cov_report.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +# This script uses gocov to generate a test coverage report. +# The gocov tool my be obtained with the following command: +# go get github.com/axw/gocov/gocov +# +# It will be installed to $GOPATH/bin, so ensure that location is in your $PATH. + +# Check for gocov. +type gocov >/dev/null 2>&1 +if [ $? -ne 0 ]; then + echo >&2 "This script requires the gocov tool." + echo >&2 "You may obtain it with the following command:" + echo >&2 "go get github.com/axw/gocov/gocov" + exit 1 +fi +gocov test | gocov report diff --git a/btcutil/hdkeychain/doc.go b/btcutil/hdkeychain/doc.go new file mode 100644 index 0000000000..094bcdd646 --- /dev/null +++ b/btcutil/hdkeychain/doc.go @@ -0,0 +1,85 @@ +// Copyright (c) 2014 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +/* +Package hdkeychain provides an API for bitcoin hierarchical deterministic +extended keys (BIP0032). + +# Overview + +The ability to implement hierarchical deterministic wallets depends on the +ability to create and derive hierarchical deterministic extended keys. + +At a high level, this package provides support for those hierarchical +deterministic extended keys by providing an ExtendedKey type and supporting +functions. Each extended key can either be a private or public extended key +which itself is capable of deriving a child extended key. + +# Determining the Extended Key Type + +Whether an extended key is a private or public extended key can be determined +with the IsPrivate function. + +# Transaction Signing Keys and Payment Addresses + +In order to create and sign transactions, or provide others with addresses to +send funds to, the underlying key and address material must be accessible. This +package provides the ECPubKey, ECPrivKey, and Address functions for this +purpose. + +# The Master Node + +As previously mentioned, the extended keys are hierarchical meaning they are +used to form a tree. The root of that tree is called the master node and this +package provides the NewMaster function to create it from a cryptographically +random seed. The GenerateSeed function is provided as a convenient way to +create a random seed for use with the NewMaster function. + +# Deriving Children + +Once you have created a tree root (or have deserialized an extended key as +discussed later), the child extended keys can be derived by using the Derive +function. The Derive function supports deriving both normal (non-hardened) and +hardened child extended keys. In order to derive a hardened extended key, use +the HardenedKeyStart constant + the hardened key number as the index to the +Derive function. This provides the ability to cascade the keys into a tree and +hence generate the hierarchical deterministic key chains. + +# Normal vs Hardened Derived Extended Keys + +A private extended key can be used to derive both hardened and non-hardened +(normal) child private and public extended keys. A public extended key can only +be used to derive non-hardened child public extended keys. As enumerated in +BIP0032 "knowledge of the extended public key plus any non-hardened private key +descending from it is equivalent to knowing the extended private key (and thus +every private and public key descending from it). This means that extended +public keys must be treated more carefully than regular public keys. It is also +the reason for the existence of hardened keys, and why they are used for the +account level in the tree. This way, a leak of an account-specific (or below) +private key never risks compromising the master or other accounts." + +# Neutering a Private Extended Key + +A private extended key can be converted to a new instance of the corresponding +public extended key with the Neuter function. The original extended key is not +modified. A public extended key is still capable of deriving non-hardened child +public extended keys. + +# Serializing and Deserializing Extended Keys + +Extended keys are serialized and deserialized with the String and +NewKeyFromString functions. The serialized key is a Base58-encoded string which +looks like the following: + + public key: xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw + private key: xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7 + +# Network + +Extended keys are much like normal Bitcoin addresses in that they have version +bytes which tie them to a specific network. The SetNet and IsForNet functions +are provided to set and determinine which network an extended key is associated +with. +*/ +package hdkeychain diff --git a/btcutil/hdkeychain/example_test.go b/btcutil/hdkeychain/example_test.go new file mode 100644 index 0000000000..8ea4244df1 --- /dev/null +++ b/btcutil/hdkeychain/example_test.go @@ -0,0 +1,182 @@ +// Copyright (c) 2014 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package hdkeychain_test + +import ( + "fmt" + + "github.com/btcsuite/btcd/btcutil/hdkeychain" + "github.com/btcsuite/btcd/chaincfg" +) + +// This example demonstrates how to generate a cryptographically random seed +// then use it to create a new master node (extended key). +func ExampleNewMaster() { + // Generate a random seed at the recommended length. + seed, err := hdkeychain.GenerateSeed(hdkeychain.RecommendedSeedLen) + if err != nil { + fmt.Println(err) + return + } + + // Generate a new master node using the seed. + key, err := hdkeychain.NewMaster(seed, &chaincfg.MainNetParams) + if err != nil { + fmt.Println(err) + return + } + + // Show that the generated master node extended key is private. + fmt.Println("Private Extended Key?:", key.IsPrivate()) + + // Output: + // Private Extended Key?: true +} + +// This example demonstrates the default hierarchical deterministic wallet +// layout as described in BIP0032. +func Example_defaultWalletLayout() { + // The default wallet layout described in BIP0032 is: + // + // Each account is composed of two keypair chains: an internal and an + // external one. The external keychain is used to generate new public + // addresses, while the internal keychain is used for all other + // operations (change addresses, generation addresses, ..., anything + // that doesn't need to be communicated). + // + // * m/iH/0/k + // corresponds to the k'th keypair of the external chain of account + // number i of the HDW derived from master m. + // * m/iH/1/k + // corresponds to the k'th keypair of the internal chain of account + // number i of the HDW derived from master m. + + // Ordinarily this would either be read from some encrypted source + // and be decrypted or generated as the NewMaster example shows, but + // for the purposes of this example, the private extended key for the + // master node is being hard coded here. + master := "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jP" + + "PqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi" + + // Start by getting an extended key instance for the master node. + // This gives the path: + // m + masterKey, err := hdkeychain.NewKeyFromString(master) + if err != nil { + fmt.Println(err) + return + } + + // Derive the extended key for account 0. This gives the path: + // m/0H + acct0, err := masterKey.Derive(hdkeychain.HardenedKeyStart + 0) + if err != nil { + fmt.Println(err) + return + } + + // Derive the extended key for the account 0 external chain. This + // gives the path: + // m/0H/0 + acct0Ext, err := acct0.Derive(0) + if err != nil { + fmt.Println(err) + return + } + + // Derive the extended key for the account 0 internal chain. This gives + // the path: + // m/0H/1 + acct0Int, err := acct0.Derive(1) + if err != nil { + fmt.Println(err) + return + } + + // At this point, acct0Ext and acct0Int are ready to derive the keys for + // the external and internal wallet chains. + + // Derive the 10th extended key for the account 0 external chain. This + // gives the path: + // m/0H/0/10 + acct0Ext10, err := acct0Ext.Derive(10) + if err != nil { + fmt.Println(err) + return + } + + // Derive the 1st extended key for the account 0 internal chain. This + // gives the path: + // m/0H/1/0 + acct0Int0, err := acct0Int.Derive(0) + if err != nil { + fmt.Println(err) + return + } + + // Get and show the address associated with the extended keys for the + // main bitcoin network. + acct0ExtAddr, err := acct0Ext10.Address(&chaincfg.MainNetParams) + if err != nil { + fmt.Println(err) + return + } + acct0IntAddr, err := acct0Int0.Address(&chaincfg.MainNetParams) + if err != nil { + fmt.Println(err) + return + } + fmt.Println("Account 0 External Address 10:", acct0ExtAddr) + fmt.Println("Account 0 Internal Address 0:", acct0IntAddr) + + // Output: + // Account 0 External Address 10: 1HVccubUT8iKTapMJ5AnNA4sLRN27xzQ4F + // Account 0 Internal Address 0: 1J5rebbkQaunJTUoNVREDbeB49DqMNFFXk +} + +// This example demonstrates the audits use case in BIP0032. +func Example_audits() { + // The audits use case described in BIP0032 is: + // + // In case an auditor needs full access to the list of incoming and + // outgoing payments, one can share all account public extended keys. + // This will allow the auditor to see all transactions from and to the + // wallet, in all accounts, but not a single secret key. + // + // * N(m/*) + // corresponds to the neutered master extended key (also called + // the master public extended key) + + // Ordinarily this would either be read from some encrypted source + // and be decrypted or generated as the NewMaster example shows, but + // for the purposes of this example, the private extended key for the + // master node is being hard coded here. + master := "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jP" + + "PqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi" + + // Start by getting an extended key instance for the master node. + // This gives the path: + // m + masterKey, err := hdkeychain.NewKeyFromString(master) + if err != nil { + fmt.Println(err) + return + } + + // Neuter the master key to generate a master public extended key. This + // gives the path: + // N(m/*) + masterPubKey, err := masterKey.Neuter() + if err != nil { + fmt.Println(err) + return + } + + // Share the master public extended key with the auditor. + fmt.Println("Audit key N(m/*):", masterPubKey) + + // Output: + // Audit key N(m/*): xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8 +} diff --git a/btcutil/hdkeychain/extendedkey.go b/btcutil/hdkeychain/extendedkey.go new file mode 100644 index 0000000000..8bbcdceef4 --- /dev/null +++ b/btcutil/hdkeychain/extendedkey.go @@ -0,0 +1,754 @@ +// Copyright (c) 2014-2016 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package hdkeychain + +// References: +// [BIP32]: BIP0032 - Hierarchical Deterministic Wallets +// https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki + +import ( + "bytes" + "crypto/hmac" + "crypto/rand" + "crypto/sha512" + "encoding/binary" + "errors" + "fmt" + "math/big" + + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/btcutil/base58" + "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/chaincfg/chainhash" +) + +const ( + // RecommendedSeedLen is the recommended length in bytes for a seed + // to a master node. + RecommendedSeedLen = 32 // 256 bits + + // HardenedKeyStart is the index at which a hardened key starts. Each + // extended key has 2^31 normal child keys and 2^31 hardened child keys. + // Thus the range for normal child keys is [0, 2^31 - 1] and the range + // for hardened child keys is [2^31, 2^32 - 1]. + HardenedKeyStart = 0x80000000 // 2^31 + + // MinSeedBytes is the minimum number of bytes allowed for a seed to + // a master node. + MinSeedBytes = 16 // 128 bits + + // MaxSeedBytes is the maximum number of bytes allowed for a seed to + // a master node. + MaxSeedBytes = 64 // 512 bits + + // serializedKeyLen is the length of a serialized public or private + // extended key. It consists of 4 bytes version, 1 byte depth, 4 bytes + // fingerprint, 4 bytes child number, 32 bytes chain code, and 33 bytes + // public/private key data. + serializedKeyLen = 4 + 1 + 4 + 4 + 32 + 33 // 78 bytes + + // maxUint8 is the max positive integer which can be serialized in a uint8 + maxUint8 = 1<<8 - 1 +) + +var ( + // ErrDeriveHardFromPublic describes an error in which the caller + // attempted to derive a hardened extended key from a public key. + ErrDeriveHardFromPublic = errors.New("cannot derive a hardened key " + + "from a public key") + + // ErrDeriveBeyondMaxDepth describes an error in which the caller + // has attempted to derive more than 255 keys from a root key. + ErrDeriveBeyondMaxDepth = errors.New("cannot derive a key with more than " + + "255 indices in its path") + + // ErrNotPrivExtKey describes an error in which the caller attempted + // to extract a private key from a public extended key. + ErrNotPrivExtKey = errors.New("unable to create private keys from a " + + "public extended key") + + // ErrInvalidChild describes an error in which the child at a specific + // index is invalid due to the derived key falling outside of the valid + // range for secp256k1 private keys. This error indicates the caller + // should simply ignore the invalid child extended key at this index and + // increment to the next index. + ErrInvalidChild = errors.New("the extended key at this index is invalid") + + // ErrUnusableSeed describes an error in which the provided seed is not + // usable due to the derived key falling outside of the valid range for + // secp256k1 private keys. This error indicates the caller must choose + // another seed. + ErrUnusableSeed = errors.New("unusable seed") + + // ErrInvalidSeedLen describes an error in which the provided seed or + // seed length is not in the allowed range. + ErrInvalidSeedLen = fmt.Errorf("seed length must be between %d and %d "+ + "bits", MinSeedBytes*8, MaxSeedBytes*8) + + // ErrBadChecksum describes an error in which the checksum encoded with + // a serialized extended key does not match the calculated value. + ErrBadChecksum = errors.New("bad extended key checksum") + + // ErrInvalidKeyLen describes an error in which the provided serialized + // key is not the expected length. + ErrInvalidKeyLen = errors.New("the provided serialized extended key " + + "length is invalid") +) + +// masterKey is the master key used along with a random seed used to generate +// the master node in the hierarchical tree. +var masterKey = []byte("Bitcoin seed") + +// ExtendedKey houses all the information needed to support a hierarchical +// deterministic extended key. See the package overview documentation for +// more details on how to use extended keys. +type ExtendedKey struct { + key []byte // This will be the pubkey for extended pub keys + pubKey []byte // This will only be set for extended priv keys + chainCode []byte + depth uint8 + parentFP []byte + childNum uint32 + version []byte + isPrivate bool +} + +// NewExtendedKey returns a new instance of an extended key with the given +// fields. No error checking is performed here as it's only intended to be a +// convenience method used to create a populated struct. This function should +// only be used by applications that need to create custom ExtendedKeys. All +// other applications should just use NewMaster, Derive, or Neuter. +func NewExtendedKey(version, key, chainCode, parentFP []byte, depth uint8, + childNum uint32, isPrivate bool) *ExtendedKey { + + // NOTE: The pubKey field is intentionally left nil so it is only + // computed and memoized as required. + return &ExtendedKey{ + key: key, + chainCode: chainCode, + depth: depth, + parentFP: parentFP, + childNum: childNum, + version: version, + isPrivate: isPrivate, + } +} + +// pubKeyBytes returns bytes for the serialized compressed public key associated +// with this extended key in an efficient manner including memoization as +// necessary. +// +// When the extended key is already a public key, the key is simply returned as +// is since it's already in the correct form. However, when the extended key is +// a private key, the public key will be calculated and memoized so future +// accesses can simply return the cached result. +func (k *ExtendedKey) pubKeyBytes() []byte { + // Just return the key if it's already an extended public key. + if !k.isPrivate { + return k.key + } + + // This is a private extended key, so calculate and memoize the public + // key if needed. + if len(k.pubKey) == 0 { + _, pubKey := btcec.PrivKeyFromBytes(k.key) + k.pubKey = pubKey.SerializeCompressed() + } + + return k.pubKey +} + +// IsPrivate returns whether or not the extended key is a private extended key. +// +// A private extended key can be used to derive both hardened and non-hardened +// child private and public extended keys. A public extended key can only be +// used to derive non-hardened child public extended keys. +func (k *ExtendedKey) IsPrivate() bool { + return k.isPrivate +} + +// Depth returns the current derivation level with respect to the root. +// +// The root key has depth zero, and the field has a maximum of 255 due to +// how depth is serialized. +func (k *ExtendedKey) Depth() uint8 { + return k.depth +} + +// Version returns the extended key's hardened derivation version. This can be +// used to identify the extended key's type. +func (k *ExtendedKey) Version() []byte { + return k.version +} + +// ParentFingerprint returns a fingerprint of the parent extended key from which +// this one was derived. +func (k *ExtendedKey) ParentFingerprint() uint32 { + return binary.BigEndian.Uint32(k.parentFP) +} + +// ChainCode returns the chain code part of this extended key. +// +// It is identical for both public and private extended keys. +func (k *ExtendedKey) ChainCode() []byte { + return append([]byte{}, k.chainCode...) +} + +// Derive returns a derived child extended key at the given index. +// +// IMPORTANT: if you were previously using the Child method, this method is incompatible. +// The Child method had a BIP-32 standard compatibility issue. You have to check whether +// any hardened derivations in your derivation path are affected by this issue, via the +// IsAffectedByIssue172 method and migrate the wallet if so. This method does conform +// to the standard. If you need the old behavior, use DeriveNonStandard. +// +// When this extended key is a private extended key (as determined by the IsPrivate +// function), a private extended key will be derived. Otherwise, the derived +// extended key will be also be a public extended key. +// +// When the index is greater to or equal than the HardenedKeyStart constant, the +// derived extended key will be a hardened extended key. It is only possible to +// derive a hardened extended key from a private extended key. Consequently, +// this function will return ErrDeriveHardFromPublic if a hardened child +// extended key is requested from a public extended key. +// +// A hardened extended key is useful since, as previously mentioned, it requires +// a parent private extended key to derive. In other words, normal child +// extended public keys can be derived from a parent public extended key (no +// knowledge of the parent private key) whereas hardened extended keys may not +// be. +// +// NOTE: There is an extremely small chance (< 1 in 2^127) the specific child +// index does not derive to a usable child. The ErrInvalidChild error will be +// returned if this should occur, and the caller is expected to ignore the +// invalid child and simply increment to the next index. +func (k *ExtendedKey) Derive(i uint32) (*ExtendedKey, error) { + // Prevent derivation of children beyond the max allowed depth. + if k.depth == maxUint8 { + return nil, ErrDeriveBeyondMaxDepth + } + + // There are four scenarios that could happen here: + // 1) Private extended key -> Hardened child private extended key + // 2) Private extended key -> Non-hardened child private extended key + // 3) Public extended key -> Non-hardened child public extended key + // 4) Public extended key -> Hardened child public extended key (INVALID!) + + // Case #4 is invalid, so error out early. + // A hardened child extended key may not be created from a public + // extended key. + isChildHardened := i >= HardenedKeyStart + if !k.isPrivate && isChildHardened { + return nil, ErrDeriveHardFromPublic + } + + // The data used to derive the child key depends on whether or not the + // child is hardened per [BIP32]. + // + // For hardened children: + // 0x00 || ser256(parentKey) || ser32(i) + // + // For normal children: + // serP(parentPubKey) || ser32(i) + keyLen := 33 + data := make([]byte, keyLen+4) + if isChildHardened { + // Case #1. + // When the child is a hardened child, the key is known to be a + // private key due to the above early return. Pad it with a + // leading zero as required by [BIP32] for deriving the child. + // Additionally, right align it if it's shorter than 32 bytes. + offset := 33 - len(k.key) + copy(data[offset:], k.key) + } else { + // Case #2 or #3. + // This is either a public or private extended key, but in + // either case, the data which is used to derive the child key + // starts with the secp256k1 compressed public key bytes. + copy(data, k.pubKeyBytes()) + } + binary.BigEndian.PutUint32(data[keyLen:], i) + + // Take the HMAC-SHA512 of the current key's chain code and the derived + // data: + // I = HMAC-SHA512(Key = chainCode, Data = data) + hmac512 := hmac.New(sha512.New, k.chainCode) + _, _ = hmac512.Write(data) + ilr := hmac512.Sum(nil) + + // Split "I" into two 32-byte sequences Il and Ir where: + // Il = intermediate key used to derive the child + // Ir = child chain code + il := ilr[:len(ilr)/2] + childChainCode := ilr[len(ilr)/2:] + + // Both derived public or private keys rely on treating the left 32-byte + // sequence calculated above (Il) as a 256-bit integer that must be + // within the valid range for a secp256k1 private key. There is a small + // chance (< 1 in 2^127) this condition will not hold, and in that case, + // a child extended key can't be created for this index and the caller + // should simply increment to the next index. + var ilNum btcec.ModNScalar + if overflow := ilNum.SetByteSlice(il); overflow { + return nil, ErrInvalidChild + } + + // The algorithm used to derive the child key depends on whether or not + // a private or public child is being derived. + // + // For private children: + // childKey = parse256(Il) + parentKey + // + // For public children: + // childKey = serP(point(parse256(Il)) + parentKey) + var isPrivate bool + var childKey []byte + if k.isPrivate { + // Case #1 or #2. + // Add the parent private key to the intermediate private key to + // derive the final child key. + // + // childKey = parse256(Il) + parenKey + var keyNum btcec.ModNScalar + if overflow := keyNum.SetByteSlice(k.key); overflow { + return nil, ErrInvalidChild + } + + childKeyBytes := ilNum.Add(&keyNum).Bytes() + childKey = childKeyBytes[:] + + // Strip leading zeroes from childKey, to match the expectation + // as the old big.Int usage in this area of the codebase. + for len(childKey) > 0 && childKey[0] == 0x00 { + childKey = childKey[1:] + } + + isPrivate = true + } else { + // Case #3. + // Calculate the corresponding intermediate public key for thek + // intermediate private key: ilJ = ilScalar*G + var ( + ilScalar btcec.ModNScalar + ilJ btcec.JacobianPoint + ) + if overflow := ilScalar.SetByteSlice(il); overflow { + return nil, ErrInvalidChild + } + btcec.ScalarBaseMultNonConst(&ilScalar, &ilJ) + + if (ilJ.X.IsZero() && ilJ.Y.IsZero()) || ilJ.Z.IsZero() { + return nil, ErrInvalidChild + } + + // Convert the serialized compressed parent public key into X + // and Y coordinates so it can be added to the intermediate + // public key. + pubKey, err := btcec.ParsePubKey(k.key) + if err != nil { + return nil, err + } + + // Convert the public key to jacobian coordinates, as that's + // what our main add/double methods use. + var pubKeyJ btcec.JacobianPoint + pubKey.AsJacobian(&pubKeyJ) + + // Add the intermediate public key to the parent public key to + // derive the final child key. + // + // childKey = serP(point(parse256(Il)) + parentKey) + var childKeyPubJ btcec.JacobianPoint + btcec.AddNonConst(&ilJ, &pubKeyJ, &childKeyPubJ) + + // Convert the new child public key back to affine coordinates + // so we can serialize it in compressed format. + childKeyPubJ.ToAffine() + childKeyPub := btcec.NewPublicKey( + &childKeyPubJ.X, &childKeyPubJ.Y, + ) + + childKey = childKeyPub.SerializeCompressed() + } + + // The fingerprint of the parent for the derived child is the first 4 + // bytes of the RIPEMD160(SHA256(parentPubKey)). + parentFP := btcutil.Hash160(k.pubKeyBytes())[:4] + return NewExtendedKey(k.version, childKey, childChainCode, parentFP, + k.depth+1, i, isPrivate), nil +} + +// Returns true if this key was affected by the BIP-32 issue in the Child +// method (since renamed to DeriveNonStandard). +func (k *ExtendedKey) IsAffectedByIssue172() bool { + return len(k.key) < 32 +} + +// Deprecated: This is a non-standard derivation that is affected by issue #172. +// 1-of-256 hardened derivations will be wrong. See note in the Derive method +// and IsAffectedByIssue172. +func (k *ExtendedKey) DeriveNonStandard(i uint32) (*ExtendedKey, error) { + if k.depth == maxUint8 { + return nil, ErrDeriveBeyondMaxDepth + } + + isChildHardened := i >= HardenedKeyStart + if !k.isPrivate && isChildHardened { + return nil, ErrDeriveHardFromPublic + } + + keyLen := 33 + data := make([]byte, keyLen+4) + if isChildHardened { + copy(data[1:], k.key) + } else { + copy(data, k.pubKeyBytes()) + } + binary.BigEndian.PutUint32(data[keyLen:], i) + + hmac512 := hmac.New(sha512.New, k.chainCode) + _, _ = hmac512.Write(data) + ilr := hmac512.Sum(nil) + + il := ilr[:len(ilr)/2] + childChainCode := ilr[len(ilr)/2:] + + ilNum := new(big.Int).SetBytes(il) + if ilNum.Cmp(btcec.S256().N) >= 0 || ilNum.Sign() == 0 { + return nil, ErrInvalidChild + } + + var isPrivate bool + var childKey []byte + if k.isPrivate { + keyNum := new(big.Int).SetBytes(k.key) + ilNum.Add(ilNum, keyNum) + ilNum.Mod(ilNum, btcec.S256().N) + childKey = ilNum.Bytes() + isPrivate = true + } else { + var ( + ilScalar btcec.ModNScalar + ilJ btcec.JacobianPoint + ) + if overflow := ilScalar.SetByteSlice(il); overflow { + return nil, ErrInvalidChild + } + btcec.ScalarBaseMultNonConst(&ilScalar, &ilJ) + + if (ilJ.X.IsZero() && ilJ.Y.IsZero()) || ilJ.Z.IsZero() { + return nil, ErrInvalidChild + } + + pubKey, err := btcec.ParsePubKey(k.key) + if err != nil { + return nil, err + } + + var pubKeyJ btcec.JacobianPoint + pubKey.AsJacobian(&pubKeyJ) + + var childKeyPubJ btcec.JacobianPoint + btcec.AddNonConst(&ilJ, &pubKeyJ, &childKeyPubJ) + + childKeyPubJ.ToAffine() + childKeyPub := btcec.NewPublicKey( + &childKeyPubJ.X, &childKeyPubJ.Y, + ) + + childKey = childKeyPub.SerializeCompressed() + } + + parentFP := btcutil.Hash160(k.pubKeyBytes())[:4] + return NewExtendedKey(k.version, childKey, childChainCode, parentFP, + k.depth+1, i, isPrivate), nil +} + +// ChildIndex returns the index at which the child extended key was derived. +// +// Extended keys with ChildNum value between 0 and 2^31-1 are normal child +// keys, and those with a value between 2^31 and 2^32-1 are hardened keys. +func (k *ExtendedKey) ChildIndex() uint32 { + return k.childNum +} + +// Neuter returns a new extended public key from this extended private key. The +// same extended key will be returned unaltered if it is already an extended +// public key. +// +// As the name implies, an extended public key does not have access to the +// private key, so it is not capable of signing transactions or deriving +// child extended private keys. However, it is capable of deriving further +// child extended public keys. +func (k *ExtendedKey) Neuter() (*ExtendedKey, error) { + // Already an extended public key. + if !k.isPrivate { + return k, nil + } + + // Get the associated public extended key version bytes. + version, err := chaincfg.HDPrivateKeyToPublicKeyID(k.version) + if err != nil { + return nil, err + } + + // Convert it to an extended public key. The key for the new extended + // key will simply be the pubkey of the current extended private key. + // + // This is the function N((k,c)) -> (K, c) from [BIP32]. + return NewExtendedKey(version, k.pubKeyBytes(), k.chainCode, k.parentFP, + k.depth, k.childNum, false), nil +} + +// CloneWithVersion returns a new extended key cloned from this extended key, +// but using the provided HD version bytes. The version must be a private HD +// key ID for an extended private key, and a public HD key ID for an extended +// public key. +// +// This method creates a new copy and therefore does not mutate the original +// extended key instance. +// +// Unlike Neuter(), this does NOT convert an extended private key to an +// extended public key. It is particularly useful for converting between +// standard BIP0032 extended keys (serializable to xprv/xpub) and keys based +// on the SLIP132 standard (serializable to yprv/ypub, zprv/zpub, etc.). +// +// References: +// +// [SLIP132]: SLIP-0132 - Registered HD version bytes for BIP-0032 +// https://github.com/satoshilabs/slips/blob/master/slip-0132.md +func (k *ExtendedKey) CloneWithVersion(version []byte) (*ExtendedKey, error) { + if len(version) != 4 { + // TODO: The semantically correct error to return here is + // ErrInvalidHDKeyID (introduced in btcsuite/btcd#1617). Update the + // error type once available in a stable btcd / chaincfg release. + return nil, chaincfg.ErrUnknownHDKeyID + } + + // Initialize a new extended key instance with the same fields as the + // current extended private/public key and the provided HD version bytes. + return NewExtendedKey(version, k.key, k.chainCode, k.parentFP, + k.depth, k.childNum, k.isPrivate), nil +} + +// ECPubKey converts the extended key to a btcec public key and returns it. +func (k *ExtendedKey) ECPubKey() (*btcec.PublicKey, error) { + return btcec.ParsePubKey(k.pubKeyBytes()) +} + +// ECPrivKey converts the extended key to a btcec private key and returns it. +// As you might imagine this is only possible if the extended key is a private +// extended key (as determined by the IsPrivate function). The ErrNotPrivExtKey +// error will be returned if this function is called on a public extended key. +func (k *ExtendedKey) ECPrivKey() (*btcec.PrivateKey, error) { + if !k.isPrivate { + return nil, ErrNotPrivExtKey + } + + privKey, _ := btcec.PrivKeyFromBytes(k.key) + return privKey, nil +} + +// Address converts the extended key to a standard bitcoin pay-to-pubkey-hash +// address for the passed network. +func (k *ExtendedKey) Address(net *chaincfg.Params) (*btcutil.AddressPubKeyHash, error) { + pkHash := btcutil.Hash160(k.pubKeyBytes()) + return btcutil.NewAddressPubKeyHash(pkHash, net) +} + +// paddedAppend appends the src byte slice to dst, returning the new slice. +// If the length of the source is smaller than the passed size, leading zero +// bytes are appended to the dst slice before appending src. +func paddedAppend(size uint, dst, src []byte) []byte { + for i := 0; i < int(size)-len(src); i++ { + dst = append(dst, 0) + } + return append(dst, src...) +} + +// String returns the extended key as a human-readable base58-encoded string. +func (k *ExtendedKey) String() string { + if len(k.key) == 0 { + return "zeroed extended key" + } + + var childNumBytes [4]byte + binary.BigEndian.PutUint32(childNumBytes[:], k.childNum) + + // The serialized format is: + // version (4) || depth (1) || parent fingerprint (4)) || + // child num (4) || chain code (32) || key data (33) || checksum (4) + serializedBytes := make([]byte, 0, serializedKeyLen+4) + serializedBytes = append(serializedBytes, k.version...) + serializedBytes = append(serializedBytes, k.depth) + serializedBytes = append(serializedBytes, k.parentFP...) + serializedBytes = append(serializedBytes, childNumBytes[:]...) + serializedBytes = append(serializedBytes, k.chainCode...) + if k.isPrivate { + serializedBytes = append(serializedBytes, 0x00) + serializedBytes = paddedAppend(32, serializedBytes, k.key) + } else { + serializedBytes = append(serializedBytes, k.pubKeyBytes()...) + } + + checkSum := chainhash.DoubleHashB(serializedBytes)[:4] + serializedBytes = append(serializedBytes, checkSum...) + return base58.Encode(serializedBytes) +} + +// IsForNet returns whether or not the extended key is associated with the +// passed bitcoin network. +func (k *ExtendedKey) IsForNet(net *chaincfg.Params) bool { + return bytes.Equal(k.version, net.HDPrivateKeyID[:]) || + bytes.Equal(k.version, net.HDPublicKeyID[:]) +} + +// SetNet associates the extended key, and any child keys yet to be derived from +// it, with the passed network. +func (k *ExtendedKey) SetNet(net *chaincfg.Params) { + if k.isPrivate { + k.version = net.HDPrivateKeyID[:] + } else { + k.version = net.HDPublicKeyID[:] + } +} + +// zero sets all bytes in the passed slice to zero. This is used to +// explicitly clear private key material from memory. +func zero(b []byte) { + lenb := len(b) + for i := 0; i < lenb; i++ { + b[i] = 0 + } +} + +// Zero manually clears all fields and bytes in the extended key. This can be +// used to explicitly clear key material from memory for enhanced security +// against memory scraping. This function only clears this particular key and +// not any children that have already been derived. +func (k *ExtendedKey) Zero() { + zero(k.key) + zero(k.pubKey) + zero(k.chainCode) + zero(k.parentFP) + k.version = nil + k.key = nil + k.depth = 0 + k.childNum = 0 + k.isPrivate = false +} + +// NewMaster creates a new master node for use in creating a hierarchical +// deterministic key chain. The seed must be between 128 and 512 bits and +// should be generated by a cryptographically secure random generation source. +// +// NOTE: There is an extremely small chance (< 1 in 2^127) the provided seed +// will derive to an unusable secret key. The ErrUnusable error will be +// returned if this should occur, so the caller must check for it and generate a +// new seed accordingly. +func NewMaster(seed []byte, net *chaincfg.Params) (*ExtendedKey, error) { + // Per [BIP32], the seed must be in range [MinSeedBytes, MaxSeedBytes]. + if len(seed) < MinSeedBytes || len(seed) > MaxSeedBytes { + return nil, ErrInvalidSeedLen + } + + // First take the HMAC-SHA512 of the master key and the seed data: + // I = HMAC-SHA512(Key = "Bitcoin seed", Data = S) + hmac512 := hmac.New(sha512.New, masterKey) + _, _ = hmac512.Write(seed) + lr := hmac512.Sum(nil) + + // Split "I" into two 32-byte sequences Il and Ir where: + // Il = master secret key + // Ir = master chain code + secretKey := lr[:len(lr)/2] + chainCode := lr[len(lr)/2:] + + // Ensure the key in usable. + secretKeyNum := new(big.Int).SetBytes(secretKey) + if secretKeyNum.Cmp(btcec.S256().N) >= 0 || secretKeyNum.Sign() == 0 { + return nil, ErrUnusableSeed + } + + parentFP := []byte{0x00, 0x00, 0x00, 0x00} + return NewExtendedKey(net.HDPrivateKeyID[:], secretKey, chainCode, + parentFP, 0, 0, true), nil +} + +// NewKeyFromString returns a new extended key instance from a base58-encoded +// extended key. +func NewKeyFromString(key string) (*ExtendedKey, error) { + // The base58-decoded extended key must consist of a serialized payload + // plus an additional 4 bytes for the checksum. + decoded := base58.Decode(key) + if len(decoded) != serializedKeyLen+4 { + return nil, ErrInvalidKeyLen + } + + // The serialized format is: + // version (4) || depth (1) || parent fingerprint (4)) || + // child num (4) || chain code (32) || key data (33) || checksum (4) + + // Split the payload and checksum up and ensure the checksum matches. + payload := decoded[:len(decoded)-4] + checkSum := decoded[len(decoded)-4:] + expectedCheckSum := chainhash.DoubleHashB(payload)[:4] + if !bytes.Equal(checkSum, expectedCheckSum) { + return nil, ErrBadChecksum + } + + // Deserialize each of the payload fields. + version := payload[:4] + depth := payload[4:5][0] + parentFP := payload[5:9] + childNum := binary.BigEndian.Uint32(payload[9:13]) + chainCode := payload[13:45] + keyData := payload[45:78] + + // The key data is a private key if it starts with 0x00. Serialized + // compressed pubkeys either start with 0x02 or 0x03. + isPrivate := keyData[0] == 0x00 + if isPrivate { + // Ensure the private key is valid. It must be within the range + // of the order of the secp256k1 curve and not be 0. + keyData = keyData[1:] + keyNum := new(big.Int).SetBytes(keyData) + if keyNum.Cmp(btcec.S256().N) >= 0 || keyNum.Sign() == 0 { + return nil, ErrUnusableSeed + } + } else { + // Ensure the public key parses correctly and is actually on the + // secp256k1 curve. + _, err := btcec.ParsePubKey(keyData) + if err != nil { + return nil, err + } + } + + return NewExtendedKey(version, keyData, chainCode, parentFP, depth, + childNum, isPrivate), nil +} + +// GenerateSeed returns a cryptographically secure random seed that can be used +// as the input for the NewMaster function to generate a new master node. +// +// The length is in bytes and it must be between 16 and 64 (128 to 512 bits). +// The recommended length is 32 (256 bits) as defined by the RecommendedSeedLen +// constant. +func GenerateSeed(length uint8) ([]byte, error) { + // Per [BIP32], the seed must be in range [MinSeedBytes, MaxSeedBytes]. + if length < MinSeedBytes || length > MaxSeedBytes { + return nil, ErrInvalidSeedLen + } + + buf := make([]byte, length) + _, err := rand.Read(buf) + if err != nil { + return nil, err + } + + return buf, nil +} diff --git a/btcutil/hdkeychain/extendedkey_test.go b/btcutil/hdkeychain/extendedkey_test.go new file mode 100644 index 0000000000..05ec2d6d37 --- /dev/null +++ b/btcutil/hdkeychain/extendedkey_test.go @@ -0,0 +1,1211 @@ +// Copyright (c) 2014-2017 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package hdkeychain + +// References: +// [BIP32]: BIP0032 - Hierarchical Deterministic Wallets +// https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki + +import ( + "bytes" + "encoding/binary" + "encoding/hex" + "errors" + "math" + "reflect" + "testing" + + "github.com/btcsuite/btcd/chaincfg" + secp_ecdsa "github.com/decred/dcrd/dcrec/secp256k1/v4" +) + +// TestBIP0032Vectors tests the vectors provided by [BIP32] to ensure the +// derivation works as intended. +func TestBIP0032Vectors(t *testing.T) { + // The master seeds for each of the two test vectors in [BIP32]. + testVec1MasterHex := "000102030405060708090a0b0c0d0e0f" + testVec2MasterHex := "fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542" + testVec3MasterHex := "4b381541583be4423346c643850da4b320e46a87ae3d2a4e6da11eba819cd4acba45d239319ac14f863b8d5ab5a0d0c64d2e8a1e7d1457df2e5a3c51c73235be" + hkStart := uint32(0x80000000) + + tests := []struct { + name string + master string + path []uint32 + wantPub string + wantPriv string + net *chaincfg.Params + }{ + // Test vector 1 + { + name: "test vector 1 chain m", + master: testVec1MasterHex, + path: []uint32{}, + wantPub: "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8", + wantPriv: "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi", + net: &chaincfg.MainNetParams, + }, + { + name: "test vector 1 chain m/0H", + master: testVec1MasterHex, + path: []uint32{hkStart}, + wantPub: "xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw", + wantPriv: "xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7", + net: &chaincfg.MainNetParams, + }, + { + name: "test vector 1 chain m/0H/1", + master: testVec1MasterHex, + path: []uint32{hkStart, 1}, + wantPub: "xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ", + wantPriv: "xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs", + net: &chaincfg.MainNetParams, + }, + { + name: "test vector 1 chain m/0H/1/2H", + master: testVec1MasterHex, + path: []uint32{hkStart, 1, hkStart + 2}, + wantPub: "xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5", + wantPriv: "xprv9z4pot5VBttmtdRTWfWQmoH1taj2axGVzFqSb8C9xaxKymcFzXBDptWmT7FwuEzG3ryjH4ktypQSAewRiNMjANTtpgP4mLTj34bhnZX7UiM", + net: &chaincfg.MainNetParams, + }, + { + name: "test vector 1 chain m/0H/1/2H/2", + master: testVec1MasterHex, + path: []uint32{hkStart, 1, hkStart + 2, 2}, + wantPub: "xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV", + wantPriv: "xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334", + net: &chaincfg.MainNetParams, + }, + { + name: "test vector 1 chain m/0H/1/2H/2/1000000000", + master: testVec1MasterHex, + path: []uint32{hkStart, 1, hkStart + 2, 2, 1000000000}, + wantPub: "xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy", + wantPriv: "xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76", + net: &chaincfg.MainNetParams, + }, + + // Test vector 2 + { + name: "test vector 2 chain m", + master: testVec2MasterHex, + path: []uint32{}, + wantPub: "xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB", + wantPriv: "xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U", + net: &chaincfg.MainNetParams, + }, + { + name: "test vector 2 chain m/0", + master: testVec2MasterHex, + path: []uint32{0}, + wantPub: "xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH", + wantPriv: "xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt", + net: &chaincfg.MainNetParams, + }, + { + name: "test vector 2 chain m/0/2147483647H", + master: testVec2MasterHex, + path: []uint32{0, hkStart + 2147483647}, + wantPub: "xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a", + wantPriv: "xprv9wSp6B7kry3Vj9m1zSnLvN3xH8RdsPP1Mh7fAaR7aRLcQMKTR2vidYEeEg2mUCTAwCd6vnxVrcjfy2kRgVsFawNzmjuHc2YmYRmagcEPdU9", + net: &chaincfg.MainNetParams, + }, + { + name: "test vector 2 chain m/0/2147483647H/1", + master: testVec2MasterHex, + path: []uint32{0, hkStart + 2147483647, 1}, + wantPub: "xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon", + wantPriv: "xprv9zFnWC6h2cLgpmSA46vutJzBcfJ8yaJGg8cX1e5StJh45BBciYTRXSd25UEPVuesF9yog62tGAQtHjXajPPdbRCHuWS6T8XA2ECKADdw4Ef", + net: &chaincfg.MainNetParams, + }, + { + name: "test vector 2 chain m/0/2147483647H/1/2147483646H", + master: testVec2MasterHex, + path: []uint32{0, hkStart + 2147483647, 1, hkStart + 2147483646}, + wantPub: "xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL", + wantPriv: "xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc", + net: &chaincfg.MainNetParams, + }, + { + name: "test vector 2 chain m/0/2147483647H/1/2147483646H/2", + master: testVec2MasterHex, + path: []uint32{0, hkStart + 2147483647, 1, hkStart + 2147483646, 2}, + wantPub: "xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt", + wantPriv: "xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j", + net: &chaincfg.MainNetParams, + }, + + // Test vector 3 + { + name: "test vector 3 chain m", + master: testVec3MasterHex, + path: []uint32{}, + wantPub: "xpub661MyMwAqRbcEZVB4dScxMAdx6d4nFc9nvyvH3v4gJL378CSRZiYmhRoP7mBy6gSPSCYk6SzXPTf3ND1cZAceL7SfJ1Z3GC8vBgp2epUt13", + wantPriv: "xprv9s21ZrQH143K25QhxbucbDDuQ4naNntJRi4KUfWT7xo4EKsHt2QJDu7KXp1A3u7Bi1j8ph3EGsZ9Xvz9dGuVrtHHs7pXeTzjuxBrCmmhgC6", + net: &chaincfg.MainNetParams, + }, + { + name: "test vector 3 chain m/0H", + master: testVec3MasterHex, + path: []uint32{hkStart}, + wantPub: "xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y", + wantPriv: "xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L", + net: &chaincfg.MainNetParams, + }, + + // Test vector 1 - Testnet + { + name: "test vector 1 chain m - testnet", + master: testVec1MasterHex, + path: []uint32{}, + wantPub: "tpubD6NzVbkrYhZ4XgiXtGrdW5XDAPFCL9h7we1vwNCpn8tGbBcgfVYjXyhWo4E1xkh56hjod1RhGjxbaTLV3X4FyWuejifB9jusQ46QzG87VKp", + wantPriv: "tprv8ZgxMBicQKsPeDgjzdC36fs6bMjGApWDNLR9erAXMs5skhMv36j9MV5ecvfavji5khqjWaWSFhN3YcCUUdiKH6isR4Pwy3U5y5egddBr16m", + net: &chaincfg.TestNet3Params, + }, + { + name: "test vector 1 chain m/0H - testnet", + master: testVec1MasterHex, + path: []uint32{hkStart}, + wantPub: "tpubD8eQVK4Kdxg3gHrF62jGP7dKVCoYiEB8dFSpuTawkL5YxTus5j5pf83vaKnii4bc6v2NVEy81P2gYrJczYne3QNNwMTS53p5uzDyHvnw2jm", + wantPriv: "tprv8bxNLu25VazNnppTCP4fyhyCvBHcYtzE3wr3cwYeL4HA7yf6TLGEUdS4QC1vLT63TkjRssqJe4CvGNEC8DzW5AoPUw56D1Ayg6HY4oy8QZ9", + net: &chaincfg.TestNet3Params, + }, + { + name: "test vector 1 chain m/0H/1 - testnet", + master: testVec1MasterHex, + path: []uint32{hkStart, 1}, + wantPub: "tpubDApXh6cD2fZ7WjtgpHd8yrWyYaneiFuRZa7fVjMkgxsmC1QzoXW8cgx9zQFJ81Jx4deRGfRE7yXA9A3STsxXj4CKEZJHYgpMYikkas9DBTP", + wantPriv: "tprv8e8VYgZxtHsSdGrtvdxYaSrryZGiYviWzGWtDDKTGh5NMXAEB8gYSCLHpFCywNs5uqV7ghRjimALQJkRFZnUrLHpzi2pGkwqLtbubgWuQ8q", + net: &chaincfg.TestNet3Params, + }, + { + name: "test vector 1 chain m/0H/1/2H - testnet", + master: testVec1MasterHex, + path: []uint32{hkStart, 1, hkStart + 2}, + wantPub: "tpubDDRojdS4jYQXNugn4t2WLrZ7mjfAyoVQu7MLk4eurqFCbrc7cHLZX8W5YRS8ZskGR9k9t3PqVv68bVBjAyW4nWM9pTGRddt3GQftg6MVQsm", + wantPriv: "tprv8gjmbDPpbAirVSezBEMuwSu1Ci9EpUJWKokZTYccSZSomNMLytWyLdtDNHRbucNaRJWWHANf9AzEdWVAqahfyRjVMKbNRhBmxAM8EJr7R15", + net: &chaincfg.TestNet3Params, + }, + { + name: "test vector 1 chain m/0H/1/2H/2 - testnet", + master: testVec1MasterHex, + path: []uint32{hkStart, 1, hkStart + 2, 2}, + wantPub: "tpubDFfCa4Z1v25WTPAVm9EbEMiRrYwucPocLbEe12BPBGooxxEUg42vihy1DkRWyftztTsL23snYezF9uXjGGwGW6pQjEpcTpmsH6ajpf4CVPn", + wantPriv: "tprv8iyAReWmmePqZv8hsVZzpx4KHXRyT4chmHdriW95m11R8Tyi3fDLYDM93bq4NGn1V6eCu5cE3zSQ6hPd31F2ApKXkZgTyn1V78pHjkq1V2v", + net: &chaincfg.TestNet3Params, + }, + { + name: "test vector 1 chain m/0H/1/2H/2/1000000000 - testnet", + master: testVec1MasterHex, + path: []uint32{hkStart, 1, hkStart + 2, 2, 1000000000}, + wantPub: "tpubDHNy3kAG39ThyiwwsgoKY4iRenXDRtce8qdCFJZXPMCJg5dsCUHayp84raLTpvyiNA9sXPob5rgqkKvkN8S7MMyXbnEhGJMW64Cf4vFAoaF", + wantPriv: "tprv8kgvuL81tmn36Fv9z38j8f4K5m1HGZRjZY2QxnXDy5PuqbP6a5TzoKWCgTcGHBu66W3TgSbAu2yX6sPza5FkHmy564Sh6gmCPUNeUt4yj2x", + net: &chaincfg.TestNet3Params, + }, + } + +tests: + for i, test := range tests { + masterSeed, err := hex.DecodeString(test.master) + if err != nil { + t.Errorf("DecodeString #%d (%s): unexpected error: %v", + i, test.name, err) + continue + } + + extKey, err := NewMaster(masterSeed, test.net) + if err != nil { + t.Errorf("NewMaster #%d (%s): unexpected error when "+ + "creating new master key: %v", i, test.name, + err) + continue + } + + for _, childNum := range test.path { + var err error + extKey, err = extKey.Derive(childNum) + if err != nil { + t.Errorf("err: %v", err) + continue tests + } + } + + if extKey.Depth() != uint8(len(test.path)) { + t.Errorf("Depth of key %d should match fixture path: %v", + extKey.Depth(), len(test.path)) + continue + } + + privStr := extKey.String() + if privStr != test.wantPriv { + t.Errorf("Serialize #%d (%s): mismatched serialized "+ + "private extended key -- got: %s, want: %s", i, + test.name, privStr, test.wantPriv) + continue + } + + pubKey, err := extKey.Neuter() + if err != nil { + t.Errorf("Neuter #%d (%s): unexpected error: %v ", i, + test.name, err) + continue + } + + // Neutering a second time should have no effect. + pubKey, err = pubKey.Neuter() + if err != nil { + t.Errorf("Neuter #%d (%s): unexpected error: %v", i, + test.name, err) + return + } + + pubStr := pubKey.String() + if pubStr != test.wantPub { + t.Errorf("Neuter #%d (%s): mismatched serialized "+ + "public extended key -- got: %s, want: %s", i, + test.name, pubStr, test.wantPub) + continue + } + } +} + +// TestPrivateDerivation tests several vectors which derive private keys from +// other private keys works as intended. +func TestPrivateDerivation(t *testing.T) { + // The private extended keys for test vectors in [BIP32]. + testVec1MasterPrivKey := "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi" + testVec2MasterPrivKey := "xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U" + + tests := []struct { + name string + master string + path []uint32 + wantPriv string + }{ + // Test vector 1 + { + name: "test vector 1 chain m", + master: testVec1MasterPrivKey, + path: []uint32{}, + wantPriv: "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi", + }, + { + name: "test vector 1 chain m/0", + master: testVec1MasterPrivKey, + path: []uint32{0}, + wantPriv: "xprv9uHRZZhbkedL37eZEnyrNsQPFZYRAvjy5rt6M1nbEkLSo378x1CQQLo2xxBvREwiK6kqf7GRNvsNEchwibzXaV6i5GcsgyjBeRguXhKsi4R", + }, + { + name: "test vector 1 chain m/0/1", + master: testVec1MasterPrivKey, + path: []uint32{0, 1}, + wantPriv: "xprv9ww7sMFLzJMzy7bV1qs7nGBxgKYrgcm3HcJvGb4yvNhT9vxXC7eX7WVULzCfxucFEn2TsVvJw25hH9d4mchywguGQCZvRgsiRaTY1HCqN8G", + }, + { + name: "test vector 1 chain m/0/1/2", + master: testVec1MasterPrivKey, + path: []uint32{0, 1, 2}, + wantPriv: "xprv9xrdP7iD2L1YZCgR9AecDgpDMZSTzP5KCfUykGXgjBxLgp1VFHsEeL3conzGAkbc1MigG1o8YqmfEA2jtkPdf4vwMaGJC2YSDbBTPAjfRUi", + }, + { + name: "test vector 1 chain m/0/1/2/2", + master: testVec1MasterPrivKey, + path: []uint32{0, 1, 2, 2}, + wantPriv: "xprvA2J8Hq4eiP7xCEBP7gzRJGJnd9CHTkEU6eTNMrZ6YR7H5boik8daFtDZxmJDfdMSKHwroCfAfsBKWWidRfBQjpegy6kzXSkQGGoMdWKz5Xh", + }, + { + name: "test vector 1 chain m/0/1/2/2/1000000000", + master: testVec1MasterPrivKey, + path: []uint32{0, 1, 2, 2, 1000000000}, + wantPriv: "xprvA3XhazxncJqJsQcG85Gg61qwPQKiobAnWjuPpjKhExprZjfse6nErRwTMwGe6uGWXPSykZSTiYb2TXAm7Qhwj8KgRd2XaD21Styu6h6AwFz", + }, + + // Test vector 2 + { + name: "test vector 2 chain m", + master: testVec2MasterPrivKey, + path: []uint32{}, + wantPriv: "xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U", + }, + { + name: "test vector 2 chain m/0", + master: testVec2MasterPrivKey, + path: []uint32{0}, + wantPriv: "xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt", + }, + { + name: "test vector 2 chain m/0/2147483647", + master: testVec2MasterPrivKey, + path: []uint32{0, 2147483647}, + wantPriv: "xprv9wSp6B7cXJWXZRpDbxkFg3ry2fuSyUfvboJ5Yi6YNw7i1bXmq9QwQ7EwMpeG4cK2pnMqEx1cLYD7cSGSCtruGSXC6ZSVDHugMsZgbuY62m6", + }, + { + name: "test vector 2 chain m/0/2147483647/1", + master: testVec2MasterPrivKey, + path: []uint32{0, 2147483647, 1}, + wantPriv: "xprv9ysS5br6UbWCRCJcggvpUNMyhVWgD7NypY9gsVTMYmuRtZg8izyYC5Ey4T931WgWbfJwRDwfVFqV3b29gqHDbuEpGcbzf16pdomk54NXkSm", + }, + { + name: "test vector 2 chain m/0/2147483647/1/2147483646", + master: testVec2MasterPrivKey, + path: []uint32{0, 2147483647, 1, 2147483646}, + wantPriv: "xprvA2LfeWWwRCxh4iqigcDMnUf2E3nVUFkntc93nmUYBtb9rpSPYWa8MY3x9ZHSLZkg4G84UefrDruVK3FhMLSJsGtBx883iddHNuH1LNpRrEp", + }, + { + name: "test vector 2 chain m/0/2147483647/1/2147483646/2", + master: testVec2MasterPrivKey, + path: []uint32{0, 2147483647, 1, 2147483646, 2}, + wantPriv: "xprvA48ALo8BDjcRET68R5RsPzF3H7WeyYYtHcyUeLRGBPHXu6CJSGjwW7dWoeUWTEzT7LG3qk6Eg6x2ZoqD8gtyEFZecpAyvchksfLyg3Zbqam", + }, + + // Custom tests to trigger specific conditions. + { + // Seed 000000000000000000000000000000da. + name: "Derived privkey with zero high byte m/0", + master: "xprv9s21ZrQH143K4FR6rNeqEK4EBhRgLjWLWhA3pw8iqgAKk82ypz58PXbrzU19opYcxw8JDJQF4id55PwTsN1Zv8Xt6SKvbr2KNU5y8jN8djz", + path: []uint32{0}, + wantPriv: "xprv9uC5JqtViMmgcAMUxcsBCBFA7oYCNs4bozPbyvLfddjHou4rMiGEHipz94xNaPb1e4f18TRoPXfiXx4C3cDAcADqxCSRSSWLvMBRWPctSN9", + }, + } + +tests: + for i, test := range tests { + extKey, err := NewKeyFromString(test.master) + if err != nil { + t.Errorf("NewKeyFromString #%d (%s): unexpected error "+ + "creating extended key: %v", i, test.name, + err) + continue + } + + for _, childNum := range test.path { + var err error + extKey, err = extKey.Derive(childNum) + if err != nil { + t.Errorf("err: %v", err) + continue tests + } + } + + privStr := extKey.String() + if privStr != test.wantPriv { + t.Errorf("Derive #%d (%s): mismatched serialized "+ + "private extended key -- got: %s, want: %s", i, + test.name, privStr, test.wantPriv) + continue + } + } +} + +// TestPublicDerivation tests several vectors which derive public keys from +// other public keys works as intended. +func TestPublicDerivation(t *testing.T) { + // The public extended keys for test vectors in [BIP32]. + testVec1MasterPubKey := "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8" + testVec2MasterPubKey := "xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB" + + tests := []struct { + name string + master string + path []uint32 + wantPub string + }{ + // Test vector 1 + { + name: "test vector 1 chain m", + master: testVec1MasterPubKey, + path: []uint32{}, + wantPub: "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8", + }, + { + name: "test vector 1 chain m/0", + master: testVec1MasterPubKey, + path: []uint32{0}, + wantPub: "xpub68Gmy5EVb2BdFbj2LpWrk1M7obNuaPTpT5oh9QCCo5sRfqSHVYWex97WpDZzszdzHzxXDAzPLVSwybe4uPYkSk4G3gnrPqqkV9RyNzAcNJ1", + }, + { + name: "test vector 1 chain m/0/1", + master: testVec1MasterPubKey, + path: []uint32{0, 1}, + wantPub: "xpub6AvUGrnEpfvJBbfx7sQ89Q8hEMPM65UteqEX4yUbUiES2jHfjexmfJoxCGSwFMZiPBaKQT1RiKWrKfuDV4vpgVs4Xn8PpPTR2i79rwHd4Zr", + }, + { + name: "test vector 1 chain m/0/1/2", + master: testVec1MasterPubKey, + path: []uint32{0, 1, 2}, + wantPub: "xpub6BqyndF6rhZqmgktFCBcapkwubGxPqoAZtQaYewJHXVKZcLdnqBVC8N6f6FSHWUghjuTLeubWyQWfJdk2G3tGgvgj3qngo4vLTnnSjAZckv", + }, + { + name: "test vector 1 chain m/0/1/2/2", + master: testVec1MasterPubKey, + path: []uint32{0, 1, 2, 2}, + wantPub: "xpub6FHUhLbYYkgFQiFrDiXRfQFXBB2msCxKTsNyAExi6keFxQ8sHfwpogY3p3s1ePSpUqLNYks5T6a3JqpCGszt4kxbyq7tUoFP5c8KWyiDtPp", + }, + { + name: "test vector 1 chain m/0/1/2/2/1000000000", + master: testVec1MasterPubKey, + path: []uint32{0, 1, 2, 2, 1000000000}, + wantPub: "xpub6GX3zWVgSgPc5tgjE6ogT9nfwSADD3tdsxpzd7jJoJMqSY12Be6VQEFwDCp6wAQoZsH2iq5nNocHEaVDxBcobPrkZCjYW3QUmoDYzMFBDu9", + }, + + // Test vector 2 + { + name: "test vector 2 chain m", + master: testVec2MasterPubKey, + path: []uint32{}, + wantPub: "xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB", + }, + { + name: "test vector 2 chain m/0", + master: testVec2MasterPubKey, + path: []uint32{0}, + wantPub: "xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH", + }, + { + name: "test vector 2 chain m/0/2147483647", + master: testVec2MasterPubKey, + path: []uint32{0, 2147483647}, + wantPub: "xpub6ASAVgeWMg4pmutghzHG3BohahjwNwPmy2DgM6W9wGegtPrvNgjBwuZRD7hSDFhYfunq8vDgwG4ah1gVzZysgp3UsKz7VNjCnSUJJ5T4fdD", + }, + { + name: "test vector 2 chain m/0/2147483647/1", + master: testVec2MasterPubKey, + path: []uint32{0, 2147483647, 1}, + wantPub: "xpub6CrnV7NzJy4VdgP5niTpqWJiFXMAca6qBm5Hfsry77SQmN1HGYHnjsZSujoHzdxf7ZNK5UVrmDXFPiEW2ecwHGWMFGUxPC9ARipss9rXd4b", + }, + { + name: "test vector 2 chain m/0/2147483647/1/2147483646", + master: testVec2MasterPubKey, + path: []uint32{0, 2147483647, 1, 2147483646}, + wantPub: "xpub6FL2423qFaWzHCvBndkN9cbkn5cysiUeFq4eb9t9kE88jcmY63tNuLNRzpHPdAM4dUpLhZ7aUm2cJ5zF7KYonf4jAPfRqTMTRBNkQL3Tfta", + }, + { + name: "test vector 2 chain m/0/2147483647/1/2147483646/2", + master: testVec2MasterPubKey, + path: []uint32{0, 2147483647, 1, 2147483646, 2}, + wantPub: "xpub6H7WkJf547AiSwAbX6xsm8Bmq9M9P1Gjequ5SipsjipWmtXSyp4C3uwzewedGEgAMsDy4jEvNTWtxLyqqHY9C12gaBmgUdk2CGmwachwnWK", + }, + } + +tests: + for i, test := range tests { + extKey, err := NewKeyFromString(test.master) + if err != nil { + t.Errorf("NewKeyFromString #%d (%s): unexpected error "+ + "creating extended key: %v", i, test.name, + err) + continue + } + + for _, childNum := range test.path { + var err error + extKey, err = extKey.Derive(childNum) + if err != nil { + t.Errorf("err: %v", err) + continue tests + } + } + + pubStr := extKey.String() + if pubStr != test.wantPub { + t.Errorf("Derive #%d (%s): mismatched serialized "+ + "public extended key -- got: %s, want: %s", i, + test.name, pubStr, test.wantPub) + continue + } + } +} + +// TestGenerateSeed ensures the GenerateSeed function works as intended. +func TestGenerateSeed(t *testing.T) { + wantErr := errors.New("seed length must be between 128 and 512 bits") + + tests := []struct { + name string + length uint8 + err error + }{ + // Test various valid lengths. + {name: "16 bytes", length: 16}, + {name: "17 bytes", length: 17}, + {name: "20 bytes", length: 20}, + {name: "32 bytes", length: 32}, + {name: "64 bytes", length: 64}, + + // Test invalid lengths. + {name: "15 bytes", length: 15, err: wantErr}, + {name: "65 bytes", length: 65, err: wantErr}, + } + + for i, test := range tests { + seed, err := GenerateSeed(test.length) + if !reflect.DeepEqual(err, test.err) { + t.Errorf("GenerateSeed #%d (%s): unexpected error -- "+ + "want %v, got %v", i, test.name, test.err, err) + continue + } + + if test.err == nil && len(seed) != int(test.length) { + t.Errorf("GenerateSeed #%d (%s): length mismatch -- "+ + "got %d, want %d", i, test.name, len(seed), + test.length) + continue + } + } +} + +// TestExtendedKeyAPI ensures the API on the ExtendedKey type works as intended. +func TestExtendedKeyAPI(t *testing.T) { + tests := []struct { + name string + extKey string + isPrivate bool + parentFP uint32 + chainCode []byte + childNum uint32 + privKey string + privKeyErr error + pubKey string + address string + }{ + { + name: "test vector 1 master node private", + extKey: "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi", + isPrivate: true, + parentFP: 0, + chainCode: []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}, + childNum: 0, + privKey: "e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35", + pubKey: "0339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2", + address: "15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma", + }, + { + name: "test vector 1 chain m/0H/1/2H public", + extKey: "xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5", + isPrivate: false, + parentFP: 3203769081, + chainCode: []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}, + childNum: 2147483650, + privKeyErr: ErrNotPrivExtKey, + pubKey: "0357bfe1e341d01c69fe5654309956cbea516822fba8a601743a012a7896ee8dc2", + address: "1NjxqbA9aZWnh17q1UW3rB4EPu79wDXj7x", + }, + } + + for i, test := range tests { + key, err := NewKeyFromString(test.extKey) + if err != nil { + t.Errorf("NewKeyFromString #%d (%s): unexpected "+ + "error: %v", i, test.name, err) + continue + } + + if key.IsPrivate() != test.isPrivate { + t.Errorf("IsPrivate #%d (%s): mismatched key type -- "+ + "want private %v, got private %v", i, test.name, + test.isPrivate, key.IsPrivate()) + continue + } + + parentFP := key.ParentFingerprint() + if parentFP != test.parentFP { + t.Errorf("ParentFingerprint #%d (%s): mismatched "+ + "parent fingerprint -- want %d, got %d", i, + test.name, test.parentFP, parentFP) + continue + } + + chainCode := key.ChainCode() + if !bytes.Equal(chainCode, test.chainCode) { + t.Errorf("ChainCode #%d (%s): want %v, got %v", i, + test.name, test.chainCode, chainCode) + continue + } + + childIndex := key.ChildIndex() + if childIndex != test.childNum { + t.Errorf("ChildIndex #%d (%s): want %d, got %d", i, + test.name, test.childNum, childIndex) + continue + } + + serializedKey := key.String() + if serializedKey != test.extKey { + t.Errorf("String #%d (%s): mismatched serialized key "+ + "-- want %s, got %s", i, test.name, test.extKey, + serializedKey) + continue + } + + privKey, err := key.ECPrivKey() + if !reflect.DeepEqual(err, test.privKeyErr) { + t.Errorf("ECPrivKey #%d (%s): mismatched error: want "+ + "%v, got %v", i, test.name, test.privKeyErr, err) + continue + } + if test.privKeyErr == nil { + privKeyStr := hex.EncodeToString(privKey.Serialize()) + if privKeyStr != test.privKey { + t.Errorf("ECPrivKey #%d (%s): mismatched "+ + "private key -- want %s, got %s", i, + test.name, test.privKey, privKeyStr) + continue + } + } + + pubKey, err := key.ECPubKey() + if err != nil { + t.Errorf("ECPubKey #%d (%s): unexpected error: %v", i, + test.name, err) + continue + } + pubKeyStr := hex.EncodeToString(pubKey.SerializeCompressed()) + if pubKeyStr != test.pubKey { + t.Errorf("ECPubKey #%d (%s): mismatched public key -- "+ + "want %s, got %s", i, test.name, test.pubKey, + pubKeyStr) + continue + } + + addr, err := key.Address(&chaincfg.MainNetParams) + if err != nil { + t.Errorf("Address #%d (%s): unexpected error: %v", i, + test.name, err) + continue + } + if addr.EncodeAddress() != test.address { + t.Errorf("Address #%d (%s): mismatched address -- want "+ + "%s, got %s", i, test.name, test.address, + addr.EncodeAddress()) + continue + } + } +} + +// TestNet ensures the network related APIs work as intended. +func TestNet(t *testing.T) { + tests := []struct { + name string + key string + origNet *chaincfg.Params + newNet *chaincfg.Params + newPriv string + newPub string + isPrivate bool + }{ + // Private extended keys. + { + name: "mainnet -> simnet", + key: "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi", + origNet: &chaincfg.MainNetParams, + newNet: &chaincfg.SimNetParams, + newPriv: "sprv8Erh3X3hFeKunvVdAGQQtambRPapECWiTDtvsTGdyrhzhbYgnSZajRRWbihzvq4AM4ivm6uso31VfKaukwJJUs3GYihXP8ebhMb3F2AHu3P", + newPub: "spub4Tr3T2ab61tD1Qa6GHwRFiiKyRRJdfEZpSpXfqgFYCEyaPsqKysqHDjzSzMJSiUEGbcsG3w2SLMoTqn44B8x6u3MLRRkYfACTUBnHK79THk", + isPrivate: true, + }, + { + name: "simnet -> mainnet", + key: "sprv8Erh3X3hFeKunvVdAGQQtambRPapECWiTDtvsTGdyrhzhbYgnSZajRRWbihzvq4AM4ivm6uso31VfKaukwJJUs3GYihXP8ebhMb3F2AHu3P", + origNet: &chaincfg.SimNetParams, + newNet: &chaincfg.MainNetParams, + newPriv: "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi", + newPub: "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8", + isPrivate: true, + }, + { + name: "mainnet -> regtest", + key: "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi", + origNet: &chaincfg.MainNetParams, + newNet: &chaincfg.RegressionNetParams, + newPriv: "tprv8ZgxMBicQKsPeDgjzdC36fs6bMjGApWDNLR9erAXMs5skhMv36j9MV5ecvfavji5khqjWaWSFhN3YcCUUdiKH6isR4Pwy3U5y5egddBr16m", + newPub: "tpubD6NzVbkrYhZ4XgiXtGrdW5XDAPFCL9h7we1vwNCpn8tGbBcgfVYjXyhWo4E1xkh56hjod1RhGjxbaTLV3X4FyWuejifB9jusQ46QzG87VKp", + isPrivate: true, + }, + { + name: "regtest -> mainnet", + key: "tprv8ZgxMBicQKsPeDgjzdC36fs6bMjGApWDNLR9erAXMs5skhMv36j9MV5ecvfavji5khqjWaWSFhN3YcCUUdiKH6isR4Pwy3U5y5egddBr16m", + origNet: &chaincfg.RegressionNetParams, + newNet: &chaincfg.MainNetParams, + newPriv: "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi", + newPub: "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8", + isPrivate: true, + }, + + // Public extended keys. + { + name: "mainnet -> simnet", + key: "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8", + origNet: &chaincfg.MainNetParams, + newNet: &chaincfg.SimNetParams, + newPub: "spub4Tr3T2ab61tD1Qa6GHwRFiiKyRRJdfEZpSpXfqgFYCEyaPsqKysqHDjzSzMJSiUEGbcsG3w2SLMoTqn44B8x6u3MLRRkYfACTUBnHK79THk", + isPrivate: false, + }, + { + name: "simnet -> mainnet", + key: "spub4Tr3T2ab61tD1Qa6GHwRFiiKyRRJdfEZpSpXfqgFYCEyaPsqKysqHDjzSzMJSiUEGbcsG3w2SLMoTqn44B8x6u3MLRRkYfACTUBnHK79THk", + origNet: &chaincfg.SimNetParams, + newNet: &chaincfg.MainNetParams, + newPub: "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8", + isPrivate: false, + }, + { + name: "mainnet -> regtest", + key: "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8", + origNet: &chaincfg.MainNetParams, + newNet: &chaincfg.RegressionNetParams, + newPub: "tpubD6NzVbkrYhZ4XgiXtGrdW5XDAPFCL9h7we1vwNCpn8tGbBcgfVYjXyhWo4E1xkh56hjod1RhGjxbaTLV3X4FyWuejifB9jusQ46QzG87VKp", + isPrivate: false, + }, + { + name: "regtest -> mainnet", + key: "tpubD6NzVbkrYhZ4XgiXtGrdW5XDAPFCL9h7we1vwNCpn8tGbBcgfVYjXyhWo4E1xkh56hjod1RhGjxbaTLV3X4FyWuejifB9jusQ46QzG87VKp", + origNet: &chaincfg.RegressionNetParams, + newNet: &chaincfg.MainNetParams, + newPub: "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8", + isPrivate: false, + }, + } + + for i, test := range tests { + extKey, err := NewKeyFromString(test.key) + if err != nil { + t.Errorf("NewKeyFromString #%d (%s): unexpected error "+ + "creating extended key: %v", i, test.name, + err) + continue + } + + if !extKey.IsForNet(test.origNet) { + t.Errorf("IsForNet #%d (%s): key is not for expected "+ + "network %v", i, test.name, test.origNet.Name) + continue + } + + extKey.SetNet(test.newNet) + if !extKey.IsForNet(test.newNet) { + t.Errorf("SetNet/IsForNet #%d (%s): key is not for "+ + "expected network %v", i, test.name, + test.newNet.Name) + continue + } + + if test.isPrivate { + privStr := extKey.String() + if privStr != test.newPriv { + t.Errorf("Serialize #%d (%s): mismatched serialized "+ + "private extended key -- got: %s, want: %s", i, + test.name, privStr, test.newPriv) + continue + } + + extKey, err = extKey.Neuter() + if err != nil { + t.Errorf("Neuter #%d (%s): unexpected error: %v ", i, + test.name, err) + continue + } + } + + pubStr := extKey.String() + if pubStr != test.newPub { + t.Errorf("Neuter #%d (%s): mismatched serialized "+ + "public extended key -- got: %s, want: %s", i, + test.name, pubStr, test.newPub) + continue + } + } +} + +// TestErrors performs some negative tests for various invalid cases to ensure +// the errors are handled properly. +func TestErrors(t *testing.T) { + // Should get an error when seed has too few bytes. + net := &chaincfg.MainNetParams + _, err := NewMaster(bytes.Repeat([]byte{0x00}, 15), net) + if err != ErrInvalidSeedLen { + t.Fatalf("NewMaster: mismatched error -- got: %v, want: %v", + err, ErrInvalidSeedLen) + } + + // Should get an error when seed has too many bytes. + _, err = NewMaster(bytes.Repeat([]byte{0x00}, 65), net) + if err != ErrInvalidSeedLen { + t.Fatalf("NewMaster: mismatched error -- got: %v, want: %v", + err, ErrInvalidSeedLen) + } + + // Generate a new key and neuter it to a public extended key. + seed, err := GenerateSeed(RecommendedSeedLen) + if err != nil { + t.Fatalf("GenerateSeed: unexpected error: %v", err) + } + extKey, err := NewMaster(seed, net) + if err != nil { + t.Fatalf("NewMaster: unexpected error: %v", err) + } + pubKey, err := extKey.Neuter() + if err != nil { + t.Fatalf("Neuter: unexpected error: %v", err) + } + + // Deriving a hardened child extended key should fail from a public key. + _, err = pubKey.Derive(HardenedKeyStart) + if err != ErrDeriveHardFromPublic { + t.Fatalf("Derive: mismatched error -- got: %v, want: %v", + err, ErrDeriveHardFromPublic) + } + + // NewKeyFromString failure tests. + tests := []struct { + name string + key string + err error + neuter bool + neuterErr error + }{ + { + name: "invalid key length", + key: "xpub1234", + err: ErrInvalidKeyLen, + }, + { + name: "bad checksum", + key: "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EBygr15", + err: ErrBadChecksum, + }, + { + name: "pubkey not on curve", + key: "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ1hr9Rwbk95YadvBkQXxzHBSngB8ndpW6QH7zhhsXZ2jHyZqPjk", + err: secp_ecdsa.ErrPubKeyNotOnCurve, + }, + { + name: "unsupported version", + key: "xbad4LfUL9eKmA66w2GJdVMqhvDmYGJpTGjWRAtjHqoUY17sGaymoMV9Cm3ocn9Ud6Hh2vLFVC7KSKCRVVrqc6dsEdsTjRV1WUmkK85YEUujAPX", + err: nil, + neuter: true, + neuterErr: chaincfg.ErrUnknownHDKeyID, + }, + } + + for i, test := range tests { + extKey, err := NewKeyFromString(test.key) + if !errors.Is(err, test.err) { + t.Errorf("NewKeyFromString #%d (%s): mismatched error "+ + "-- got: %v, want: %v", i, test.name, err, + test.err) + continue + } + + if test.neuter { + _, err := extKey.Neuter() + if !errors.Is(err, test.neuterErr) { + t.Errorf("Neuter #%d (%s): mismatched error "+ + "-- got: %v, want: %v", i, test.name, + err, test.neuterErr) + continue + } + } + } +} + +// TestZero ensures that zeroing an extended key works as intended. +func TestZero(t *testing.T) { + tests := []struct { + name string + master string + extKey string + net *chaincfg.Params + }{ + // Test vector 1 + { + name: "test vector 1 chain m", + master: "000102030405060708090a0b0c0d0e0f", + extKey: "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi", + net: &chaincfg.MainNetParams, + }, + + // Test vector 2 + { + name: "test vector 2 chain m", + master: "fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542", + extKey: "xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U", + net: &chaincfg.MainNetParams, + }, + } + + // Use a closure to test that a key is zeroed since the tests create + // keys in different ways and need to test the same things multiple + // times. + testZeroed := func(i int, testName string, key *ExtendedKey) bool { + // Zeroing a key should result in it no longer being private + if key.IsPrivate() { + t.Errorf("IsPrivate #%d (%s): mismatched key type -- "+ + "want private %v, got private %v", i, testName, + false, key.IsPrivate()) + return false + } + + parentFP := key.ParentFingerprint() + if parentFP != 0 { + t.Errorf("ParentFingerprint #%d (%s): mismatched "+ + "parent fingerprint -- want %d, got %d", i, + testName, 0, parentFP) + return false + } + + wantKey := "zeroed extended key" + serializedKey := key.String() + if serializedKey != wantKey { + t.Errorf("String #%d (%s): mismatched serialized key "+ + "-- want %s, got %s", i, testName, wantKey, + serializedKey) + return false + } + + wantErr := ErrNotPrivExtKey + _, err := key.ECPrivKey() + if !reflect.DeepEqual(err, wantErr) { + t.Errorf("ECPrivKey #%d (%s): mismatched error: want "+ + "%v, got %v", i, testName, wantErr, err) + return false + } + + wantErr = secp_ecdsa.ErrPubKeyInvalidLen + _, err = key.ECPubKey() + if !errors.Is(err, wantErr) { + t.Errorf("ECPubKey #%d (%s): mismatched error: want "+ + "%v, got %v", i, testName, wantErr, err) + return false + } + + wantAddr := "1HT7xU2Ngenf7D4yocz2SAcnNLW7rK8d4E" + addr, err := key.Address(&chaincfg.MainNetParams) + if err != nil { + t.Errorf("Address #%d (%s): unexpected error: %v", i, + testName, err) + return false + } + if addr.EncodeAddress() != wantAddr { + t.Errorf("Address #%d (%s): mismatched address -- want "+ + "%s, got %s", i, testName, wantAddr, + addr.EncodeAddress()) + return false + } + + return true + } + + for i, test := range tests { + // Create new key from seed and get the neutered version. + masterSeed, err := hex.DecodeString(test.master) + if err != nil { + t.Errorf("DecodeString #%d (%s): unexpected error: %v", + i, test.name, err) + continue + } + key, err := NewMaster(masterSeed, test.net) + if err != nil { + t.Errorf("NewMaster #%d (%s): unexpected error when "+ + "creating new master key: %v", i, test.name, + err) + continue + } + neuteredKey, err := key.Neuter() + if err != nil { + t.Errorf("Neuter #%d (%s): unexpected error: %v", i, + test.name, err) + continue + } + + // Ensure both non-neutered and neutered keys are zeroed + // properly. + key.Zero() + if !testZeroed(i, test.name+" from seed not neutered", key) { + continue + } + neuteredKey.Zero() + if !testZeroed(i, test.name+" from seed neutered", key) { + continue + } + + // Deserialize key and get the neutered version. + key, err = NewKeyFromString(test.extKey) + if err != nil { + t.Errorf("NewKeyFromString #%d (%s): unexpected "+ + "error: %v", i, test.name, err) + continue + } + neuteredKey, err = key.Neuter() + if err != nil { + t.Errorf("Neuter #%d (%s): unexpected error: %v", i, + test.name, err) + continue + } + + // Ensure both non-neutered and neutered keys are zeroed + // properly. + key.Zero() + if !testZeroed(i, test.name+" deserialized not neutered", key) { + continue + } + neuteredKey.Zero() + if !testZeroed(i, test.name+" deserialized neutered", key) { + continue + } + } +} + +// TestMaximumDepth ensures that attempting to retrieve a child key when already +// at the maximum depth is not allowed. The serialization of a BIP32 key uses +// uint8 to encode the depth. This implicitly bounds the depth of the tree to +// 255 derivations. Here we test that an error is returned after 'max uint8'. +func TestMaximumDepth(t *testing.T) { + net := &chaincfg.MainNetParams + extKey, err := NewMaster([]byte(`abcd1234abcd1234abcd1234abcd1234`), net) + if err != nil { + t.Fatalf("NewMaster: unexpected error: %v", err) + } + + for i := uint8(0); i < math.MaxUint8; i++ { + if extKey.Depth() != i { + t.Fatalf("extendedkey depth %d should match expected value %d", + extKey.Depth(), i) + } + newKey, err := extKey.Derive(1) + if err != nil { + t.Fatalf("Derive: unexpected error: %v", err) + } + extKey = newKey + } + + noKey, err := extKey.Derive(1) + if err != ErrDeriveBeyondMaxDepth { + t.Fatalf("Derive: mismatched error: want %v, got %v", + ErrDeriveBeyondMaxDepth, err) + } + if noKey != nil { + t.Fatal("Derive: deriving 256th key should not succeed") + } +} + +// TestCloneWithVersion ensures proper conversion between standard and SLIP132 +// extended keys. +// +// The following tool was used for generating the tests: +// +// https://jlopp.github.io/xpub-converter +func TestCloneWithVersion(t *testing.T) { + tests := []struct { + name string + key string + version []byte + want string + wantErr error + }{ + { + name: "test xpub to zpub", + key: "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8", + version: []byte{0x04, 0xb2, 0x47, 0x46}, + want: "zpub6jftahH18ngZxUuv6oSniLNrBCSSE1B4EEU59bwTCEt8x6aS6b2mdfLxbS4QS53g85SWWP6wexqeer516433gYpZQoJie2tcMYdJ1SYYYAL", + }, + { + name: "test zpub to xpub", + key: "zpub6jftahH18ngZxUuv6oSniLNrBCSSE1B4EEU59bwTCEt8x6aS6b2mdfLxbS4QS53g85SWWP6wexqeer516433gYpZQoJie2tcMYdJ1SYYYAL", + version: []byte{0x04, 0x88, 0xb2, 0x1e}, + want: "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8", + }, + { + name: "test xprv to zprv", + key: "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi", + version: []byte{0x04, 0xb2, 0x43, 0x0c}, + want: "zprvAWgYBBk7JR8GjzqSzmunMCS7dAbwpYTCs1YUMDXqduMA5JFHZ3iX5s2UkAR6vBdcCYYa1S5o1fVLrKsrnpCQ4WpUd6aVUWP1bS2Yy5DoaKv", + }, + { + name: "test zprv to xprv", + key: "zprvAWgYBBk7JR8GjzqSzmunMCS7dAbwpYTCs1YUMDXqduMA5JFHZ3iX5s2UkAR6vBdcCYYa1S5o1fVLrKsrnpCQ4WpUd6aVUWP1bS2Yy5DoaKv", + version: []byte{0x04, 0x88, 0xad, 0xe4}, + want: "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi", + }, + { + name: "test invalid key id", + key: "zprvAWgYBBk7JR8GjzqSzmunMCS7dAbwpYTCs1YUMDXqduMA5JFHZ3iX5s2UkAR6vBdcCYYa1S5o1fVLrKsrnpCQ4WpUd6aVUWP1bS2Yy5DoaKv", + version: []byte{0x4B, 0x1D}, + wantErr: chaincfg.ErrUnknownHDKeyID, + }, + } + + for i, test := range tests { + extKey, err := NewKeyFromString(test.key) + if err != nil { + panic(err) // This is never expected to fail. + } + + got, err := extKey.CloneWithVersion(test.version) + if !reflect.DeepEqual(err, test.wantErr) { + t.Errorf("CloneWithVersion #%d (%s): unexpected error -- "+ + "want %v, got %v", i, test.name, test.wantErr, err) + continue + } + + if test.wantErr == nil { + if k := got.String(); k != test.want { + t.Errorf("CloneWithVersion #%d (%s): "+ + "got %s, want %s", i, test.name, k, test.want) + continue + } + } + } +} + +// TestLeadingZero ensures that deriving children from keys with a leading zero byte is done according +// to the BIP-32 standard and that the legacy method generates a backwards-compatible result. +func TestLeadingZero(t *testing.T) { + // The 400th seed results in a m/0' public key with a leading zero, allowing us to test + // the desired behavior. + ii := 399 + seed := make([]byte, 32) + binary.BigEndian.PutUint32(seed[28:], uint32(ii)) + masterKey, err := NewMaster(seed, &chaincfg.MainNetParams) + if err != nil { + t.Fatalf("hdkeychain.NewMaster failed: %v", err) + } + child0, err := masterKey.Derive(0 + HardenedKeyStart) + if err != nil { + t.Fatalf("masterKey.Derive failed: %v", err) + } + if !child0.IsAffectedByIssue172() { + t.Fatal("expected child0 to be affected by issue 172") + } + child1, err := child0.Derive(0 + HardenedKeyStart) + if err != nil { + t.Fatalf("child0.Derive failed: %v", err) + } + if child1.IsAffectedByIssue172() { + t.Fatal("did not expect child1 to be affected by issue 172") + } + + child1nonstandard, err := child0.DeriveNonStandard(0 + HardenedKeyStart) + if err != nil { + t.Fatalf("child0.DeriveNonStandard failed: %v", err) + } + + // This is the correct result based on BIP32 + if hex.EncodeToString(child1.key) != "a9b6b30a5b90b56ed48728c73af1d8a7ef1e9cc372ec21afcc1d9bdf269b0988" { + t.Error("incorrect standard BIP32 derivation") + } + + if hex.EncodeToString(child1nonstandard.key) != "ea46d8f58eb863a2d371a938396af8b0babe85c01920f59a8044412e70e837ee" { + t.Error("incorrect btcutil backwards compatible BIP32-like derivation") + } + + if !child0.IsAffectedByIssue172() { + t.Error("child 0 should be affected by issue 172") + } + + if child1.IsAffectedByIssue172() { + t.Error("child 1 should not be affected by issue 172") + } +} diff --git a/btcutil/hdkeychain/test_coverage.txt b/btcutil/hdkeychain/test_coverage.txt new file mode 100644 index 0000000000..c0bc7ef035 --- /dev/null +++ b/btcutil/hdkeychain/test_coverage.txt @@ -0,0 +1,20 @@ + +github.com/conformal/btcutil/hdkeychain/extendedkey.go ExtendedKey.String 100.00% (18/18) +github.com/conformal/btcutil/hdkeychain/extendedkey.go ExtendedKey.Zero 100.00% (9/9) +github.com/conformal/btcutil/hdkeychain/extendedkey.go ExtendedKey.pubKeyBytes 100.00% (7/7) +github.com/conformal/btcutil/hdkeychain/extendedkey.go ExtendedKey.Neuter 100.00% (6/6) +github.com/conformal/btcutil/hdkeychain/extendedkey.go ExtendedKey.ECPrivKey 100.00% (4/4) +github.com/conformal/btcutil/hdkeychain/extendedkey.go zero 100.00% (3/3) +github.com/conformal/btcutil/hdkeychain/extendedkey.go ExtendedKey.SetNet 100.00% (3/3) +github.com/conformal/btcutil/hdkeychain/extendedkey.go ExtendedKey.Address 100.00% (2/2) +github.com/conformal/btcutil/hdkeychain/extendedkey.go newExtendedKey 100.00% (1/1) +github.com/conformal/btcutil/hdkeychain/extendedkey.go ExtendedKey.IsPrivate 100.00% (1/1) +github.com/conformal/btcutil/hdkeychain/extendedkey.go ExtendedKey.ParentFingerprint 100.00% (1/1) +github.com/conformal/btcutil/hdkeychain/extendedkey.go ExtendedKey.ECPubKey 100.00% (1/1) +github.com/conformal/btcutil/hdkeychain/extendedkey.go ExtendedKey.IsForNet 100.00% (1/1) +github.com/conformal/btcutil/hdkeychain/extendedkey.go NewKeyFromString 95.83% (23/24) +github.com/conformal/btcutil/hdkeychain/extendedkey.go ExtendedKey.Child 91.67% (33/36) +github.com/conformal/btcutil/hdkeychain/extendedkey.go NewMaster 91.67% (11/12) +github.com/conformal/btcutil/hdkeychain/extendedkey.go GenerateSeed 85.71% (6/7) +github.com/conformal/btcutil/hdkeychain ----------------------------- 95.59% (130/136) + diff --git a/btcutil/internal_test.go b/btcutil/internal_test.go new file mode 100644 index 0000000000..211b6ae64b --- /dev/null +++ b/btcutil/internal_test.go @@ -0,0 +1,147 @@ +// Copyright (c) 2013-2017 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +/* +This test file is part of the btcutil package rather than than the +btcutil_test package so it can bridge access to the internals to properly test +cases which are either not possible or can't reliably be tested via the public +interface. The functions are only exported while the tests are being run. +*/ + +package btcutil + +import ( + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcutil/base58" + "github.com/btcsuite/btcd/btcutil/bech32" + "golang.org/x/crypto/ripemd160" +) + +// SetBlockBytes sets the internal serialized block byte buffer to the passed +// buffer. It is used to inject errors and is only available to the test +// package. +func (b *Block) SetBlockBytes(buf []byte) { + b.serializedBlock = buf +} + +// TstAppDataDir makes the internal appDataDir function available to the test +// package. +func TstAppDataDir(goos, appName string, roaming bool) string { + return appDataDir(goos, appName, roaming) +} + +// TstAddressPubKeyHash makes an AddressPubKeyHash, setting the +// unexported fields with the parameters hash and netID. +func TstAddressPubKeyHash(hash [ripemd160.Size]byte, + netID byte) *AddressPubKeyHash { + + return &AddressPubKeyHash{ + hash: hash, + netID: netID, + } +} + +// TstAddressScriptHash makes an AddressScriptHash, setting the +// unexported fields with the parameters hash and netID. +func TstAddressScriptHash(hash [ripemd160.Size]byte, + netID byte) *AddressScriptHash { + + return &AddressScriptHash{ + hash: hash, + netID: netID, + } +} + +// TstAddressWitnessPubKeyHash creates an AddressWitnessPubKeyHash, initiating +// the fields as given. +func TstAddressWitnessPubKeyHash(version byte, program [20]byte, + hrp string) *AddressWitnessPubKeyHash { + + return &AddressWitnessPubKeyHash{ + AddressSegWit{ + hrp: hrp, + witnessVersion: version, + witnessProgram: program[:], + }, + } +} + +// TstAddressWitnessScriptHash creates an AddressWitnessScriptHash, initiating +// the fields as given. +func TstAddressWitnessScriptHash(version byte, program [32]byte, + hrp string) *AddressWitnessScriptHash { + + return &AddressWitnessScriptHash{ + AddressSegWit{ + hrp: hrp, + witnessVersion: version, + witnessProgram: program[:], + }, + } +} + +// TstAddressTaproot creates an AddressTaproot, initiating the fields as given. +func TstAddressTaproot(version byte, program [32]byte, + hrp string) *AddressTaproot { + + return &AddressTaproot{ + AddressSegWit{ + hrp: hrp, + witnessVersion: version, + witnessProgram: program[:], + }, + } +} + +// TstAddressPubKey makes an AddressPubKey, setting the unexported fields with +// the parameters. +func TstAddressPubKey(serializedPubKey []byte, pubKeyFormat PubKeyFormat, + netID byte) *AddressPubKey { + + pubKey, _ := btcec.ParsePubKey(serializedPubKey) + return &AddressPubKey{ + pubKeyFormat: pubKeyFormat, + pubKey: pubKey, + pubKeyHashID: netID, + } +} + +// TstAddressSAddr returns the expected script address bytes for +// P2PKH and P2SH bitcoin addresses. +func TstAddressSAddr(addr string) []byte { + decoded := base58.Decode(addr) + return decoded[1 : 1+ripemd160.Size] +} + +// TstAddressSegwitSAddr returns the expected witness program bytes for +// bech32 encoded P2WPKH and P2WSH bitcoin addresses. +func TstAddressSegwitSAddr(addr string) []byte { + _, data, err := bech32.Decode(addr) + if err != nil { + return []byte{} + } + + // First byte is version, rest is base 32 encoded data. + data, err = bech32.ConvertBits(data[1:], 5, 8, false) + if err != nil { + return []byte{} + } + return data +} + +// TstAddressTaprootSAddr returns the expected witness program bytes for a +// bech32m encoded P2TR bitcoin address. +func TstAddressTaprootSAddr(addr string) []byte { + _, data, err := bech32.Decode(addr) + if err != nil { + return []byte{} + } + + // First byte is version, rest is base 32 encoded data. + data, err = bech32.ConvertBits(data[1:], 5, 8, false) + if err != nil { + return []byte{} + } + return data +} diff --git a/btcutil/net.go b/btcutil/net.go new file mode 100644 index 0000000000..ec5638622b --- /dev/null +++ b/btcutil/net.go @@ -0,0 +1,19 @@ +// Copyright (c) 2013-2014 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +//go:build !appengine +// +build !appengine + +package btcutil + +import ( + "net" +) + +// interfaceAddrs returns a list of the system's network interface addresses. +// It is wrapped here so that we can substitute it for other functions when +// building for systems that do not allow access to net.InterfaceAddrs(). +func interfaceAddrs() ([]net.Addr, error) { + return net.InterfaceAddrs() +} diff --git a/btcutil/net_noop.go b/btcutil/net_noop.go new file mode 100644 index 0000000000..ae9c1f5fb9 --- /dev/null +++ b/btcutil/net_noop.go @@ -0,0 +1,20 @@ +// Copyright (c) 2013-2014 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +//go:build appengine +// +build appengine + +package btcutil + +import ( + "net" +) + +// interfaceAddrs returns a list of the system's network interface addresses. +// It is wrapped here so that we can substitute it for a no-op function that +// returns an empty slice of net.Addr when building for systems that do not +// allow access to net.InterfaceAddrs(). +func interfaceAddrs() ([]net.Addr, error) { + return []net.Addr{}, nil +} diff --git a/btcutil/psbt/bip32.go b/btcutil/psbt/bip32.go new file mode 100644 index 0000000000..96a3f67274 --- /dev/null +++ b/btcutil/psbt/bip32.go @@ -0,0 +1,80 @@ +package psbt + +import ( + "bytes" + "encoding/binary" +) + +// Bip32Derivation encapsulates the data for the input and output +// Bip32Derivation key-value fields. +// +// TODO(roasbeef): use hdkeychain here instead? +type Bip32Derivation struct { + // PubKey is the raw pubkey serialized in compressed format. + PubKey []byte + + // MasterKeyFingerprint is the fingerprint of the master pubkey. + MasterKeyFingerprint uint32 + + // Bip32Path is the BIP 32 path with child index as a distinct integer. + Bip32Path []uint32 +} + +// checkValid ensures that the PubKey in the Bip32Derivation struct is valid. +func (pb *Bip32Derivation) checkValid() bool { + return validatePubkey(pb.PubKey) +} + +// Bip32Sorter implements sort.Interface for the Bip32Derivation struct. +type Bip32Sorter []*Bip32Derivation + +func (s Bip32Sorter) Len() int { return len(s) } + +func (s Bip32Sorter) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +func (s Bip32Sorter) Less(i, j int) bool { + return bytes.Compare(s[i].PubKey, s[j].PubKey) < 0 +} + +// ReadBip32Derivation deserializes a byte slice containing chunks of 4 byte +// little endian encodings of uint32 values, the first of which is the +// masterkeyfingerprint and the remainder of which are the derivation path. +func ReadBip32Derivation(path []byte) (uint32, []uint32, error) { + // BIP-0174 defines the derivation path being encoded as + // "<32-bit uint> <32-bit uint>*" + // with the asterisk meaning 0 to n times. Which in turn means that an + // empty path is valid, only the key fingerprint is mandatory. + if len(path)%4 != 0 { + return 0, nil, ErrInvalidPsbtFormat + } + + masterKeyInt := binary.LittleEndian.Uint32(path[:4]) + + var paths []uint32 + for i := 4; i < len(path); i += 4 { + paths = append(paths, binary.LittleEndian.Uint32(path[i:i+4])) + } + + return masterKeyInt, paths, nil +} + +// SerializeBIP32Derivation takes a master key fingerprint as defined in BIP32, +// along with a path specified as a list of uint32 values, and returns a +// bytestring specifying the derivation in the format required by BIP174: // +// master key fingerprint (4) || child index (4) || child index (4) || .... +func SerializeBIP32Derivation(masterKeyFingerprint uint32, + bip32Path []uint32) []byte { + + var masterKeyBytes [4]byte + binary.LittleEndian.PutUint32(masterKeyBytes[:], masterKeyFingerprint) + + derivationPath := make([]byte, 0, 4+4*len(bip32Path)) + derivationPath = append(derivationPath, masterKeyBytes[:]...) + for _, path := range bip32Path { + var pathbytes [4]byte + binary.LittleEndian.PutUint32(pathbytes[:], path) + derivationPath = append(derivationPath, pathbytes[:]...) + } + + return derivationPath +} diff --git a/btcutil/psbt/creator.go b/btcutil/psbt/creator.go new file mode 100644 index 0000000000..58b9a54488 --- /dev/null +++ b/btcutil/psbt/creator.go @@ -0,0 +1,63 @@ +// Copyright (c) 2018 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package psbt + +import ( + "github.com/btcsuite/btcd/wire" +) + +// MinTxVersion is the lowest transaction version that we'll permit. +const MinTxVersion = 1 + +// New on provision of an input and output 'skeleton' for the transaction, a +// new partially populated PBST packet. The populated packet will include the +// unsigned transaction, and the set of known inputs and outputs contained +// within the unsigned transaction. The values of nLockTime, nSequence (per +// input) and transaction version (must be 1 of 2) must be specified here. Note +// that the default nSequence value is wire.MaxTxInSequenceNum. Referencing +// the PSBT BIP, this function serves the roles of the Creator. +func New(inputs []*wire.OutPoint, + outputs []*wire.TxOut, version int32, nLockTime uint32, + nSequences []uint32) (*Packet, error) { + + // Create the new struct; the input and output lists will be empty, the + // unsignedTx object must be constructed and serialized, and that + // serialization should be entered as the only entry for the + // globalKVPairs list. + // + // Ensure that the version of the transaction is greater then our + // minimum allowed transaction version. There must be one sequence + // number per input. + if version < MinTxVersion || len(nSequences) != len(inputs) { + return nil, ErrInvalidPsbtFormat + } + + unsignedTx := wire.NewMsgTx(version) + unsignedTx.LockTime = nLockTime + for i, in := range inputs { + unsignedTx.AddTxIn(&wire.TxIn{ + PreviousOutPoint: *in, + Sequence: nSequences[i], + }) + } + for _, out := range outputs { + unsignedTx.AddTxOut(out) + } + + // The input and output lists are empty, but there is a list of those + // two lists, and each one must be of length matching the unsigned + // transaction; the unknown list can be nil. + pInputs := make([]PInput, len(unsignedTx.TxIn)) + pOutputs := make([]POutput, len(unsignedTx.TxOut)) + + // This new Psbt is "raw" and contains no key-value fields, so sanity + // checking with c.Cpsbt.SanityCheck() is not required. + return &Packet{ + UnsignedTx: unsignedTx, + Inputs: pInputs, + Outputs: pOutputs, + Unknowns: nil, + }, nil +} diff --git a/btcutil/psbt/extractor.go b/btcutil/psbt/extractor.go new file mode 100644 index 0000000000..365e2f1bba --- /dev/null +++ b/btcutil/psbt/extractor.go @@ -0,0 +1,82 @@ +// Copyright (c) 2018 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package psbt + +// The Extractor requires provision of a single PSBT +// in which all necessary signatures are encoded, and +// uses it to construct a fully valid network serialized +// transaction. + +import ( + "bytes" + + "github.com/btcsuite/btcd/txscript" + "github.com/btcsuite/btcd/wire" +) + +// Extract takes a finalized psbt.Packet and outputs a finalized transaction +// instance. Note that if the PSBT is in-complete, then an error +// ErrIncompletePSBT will be returned. As the extracted transaction has been +// fully finalized, it will be ready for network broadcast once returned. +func Extract(p *Packet) (*wire.MsgTx, error) { + // If the packet isn't complete, then we'll return an error as it + // doesn't have all the required witness data. + if !p.IsComplete() { + return nil, ErrIncompletePSBT + } + + // First, we'll make a copy of the underlying unsigned transaction (the + // initial template) so we don't mutate it during our activates below. + finalTx := p.UnsignedTx.Copy() + + // For each input, we'll now populate any relevant witness and + // sigScript data. + for i, tin := range finalTx.TxIn { + // We'll grab the corresponding internal packet input which + // matches this materialized transaction input and emplace that + // final sigScript (if present). + pInput := p.Inputs[i] + if pInput.FinalScriptSig != nil { + tin.SignatureScript = pInput.FinalScriptSig + } + + // Similarly, if there's a final witness, then we'll also need + // to extract that as well, parsing the lower-level transaction + // encoding. + if pInput.FinalScriptWitness != nil { + // In order to set the witness, need to re-deserialize + // the field as encoded within the PSBT packet. For + // each input, the witness is encoded as a stack with + // one or more items. + witnessReader := bytes.NewReader( + pInput.FinalScriptWitness, + ) + + // First we extract the number of witness elements + // encoded in the above witnessReader. + witCount, err := wire.ReadVarInt(witnessReader, 0) + if err != nil { + return nil, err + } + + // Now that we know how many inputs we'll need, we'll + // construct a packing slice, then read out each input + // (with a varint prefix) from the witnessReader. + tin.Witness = make(wire.TxWitness, witCount) + for j := uint64(0); j < witCount; j++ { + wit, err := wire.ReadVarBytes( + witnessReader, 0, + txscript.MaxScriptSize, "witness", + ) + if err != nil { + return nil, err + } + tin.Witness[j] = wit + } + } + } + + return finalTx, nil +} diff --git a/btcutil/psbt/finalizer.go b/btcutil/psbt/finalizer.go new file mode 100644 index 0000000000..b1bf12d131 --- /dev/null +++ b/btcutil/psbt/finalizer.go @@ -0,0 +1,597 @@ +// Copyright (c) 2018 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package psbt + +// The Finalizer requires provision of a single PSBT input +// in which all necessary signatures are encoded, and +// uses it to construct valid final sigScript and scriptWitness +// fields. +// NOTE that p2sh (legacy) and p2wsh currently support only +// multisig and no other custom script. + +import ( + "bytes" + "fmt" + + "github.com/btcsuite/btcd/btcec/v2/schnorr" + "github.com/btcsuite/btcd/txscript" + "github.com/btcsuite/btcd/wire" +) + +// isFinalized considers this input finalized if it contains at least one of +// the FinalScriptSig or FinalScriptWitness are filled (which only occurs in a +// successful call to Finalize*). +func isFinalized(p *Packet, inIndex int) bool { + input := p.Inputs[inIndex] + return input.FinalScriptSig != nil || input.FinalScriptWitness != nil +} + +// isFinalizableWitnessInput returns true if the target input is a witness UTXO +// that can be finalized. +func isFinalizableWitnessInput(pInput *PInput) bool { + pkScript := pInput.WitnessUtxo.PkScript + + switch { + // If this is a native witness output, then we require both + // the witness script, but not a redeem script. + case txscript.IsWitnessProgram(pkScript): + switch { + case txscript.IsPayToWitnessScriptHash(pkScript): + if pInput.WitnessScript == nil || + pInput.RedeemScript != nil { + + return false + } + + case txscript.IsPayToTaproot(pkScript): + if pInput.TaprootKeySpendSig == nil && + pInput.TaprootScriptSpendSig == nil { + + return false + } + + // For each of the script spend signatures we need a + // corresponding tap script leaf with the control block. + for _, sig := range pInput.TaprootScriptSpendSig { + _, err := FindLeafScript(pInput, sig.LeafHash) + if err != nil { + return false + } + } + + default: + // A P2WKH output on the other hand doesn't need + // neither a witnessScript or redeemScript. + if pInput.WitnessScript != nil || + pInput.RedeemScript != nil { + + return false + } + } + + // For nested P2SH inputs, we verify that a witness script is known. + case txscript.IsPayToScriptHash(pkScript): + if pInput.RedeemScript == nil { + return false + } + + // If this is a nested P2SH input, then it must also have a + // witness script, while we don't need one for P2WKH. + if txscript.IsPayToWitnessScriptHash(pInput.RedeemScript) { + if pInput.WitnessScript == nil { + return false + } + } else if txscript.IsPayToWitnessPubKeyHash(pInput.RedeemScript) { + if pInput.WitnessScript != nil { + return false + } + } else { + // unrecognized type + return false + } + + // If this isn't a nested P2SH output or a native witness output, then + // we can't finalize this input as we don't understand it. + default: + return false + } + + return true +} + +// isFinalizableLegacyInput returns true of the passed input a legacy input +// (non-witness) that can be finalized. +func isFinalizableLegacyInput(p *Packet, pInput *PInput, inIndex int) bool { + // If the input has a witness, then it's invalid. + if pInput.WitnessScript != nil { + return false + } + + // Otherwise, we'll verify that we only have a RedeemScript if the prev + // output script is P2SH. + outIndex := p.UnsignedTx.TxIn[inIndex].PreviousOutPoint.Index + if txscript.IsPayToScriptHash(pInput.NonWitnessUtxo.TxOut[outIndex].PkScript) { + if pInput.RedeemScript == nil { + return false + } + } else { + if pInput.RedeemScript != nil { + return false + } + } + + return true +} + +// isFinalizable checks whether the structure of the entry for the input of the +// psbt.Packet at index inIndex contains sufficient information to finalize +// this input. +func isFinalizable(p *Packet, inIndex int) bool { + pInput := p.Inputs[inIndex] + + // The input cannot be finalized without any signatures. + if pInput.PartialSigs == nil && pInput.TaprootKeySpendSig == nil && + pInput.TaprootScriptSpendSig == nil { + + return false + } + + // For an input to be finalized, we'll one of two possible top-level + // UTXOs present. Each UTXO type has a distinct set of requirements to + // be considered finalized. + switch { + + // A witness input must be either native P2WSH or nested P2SH with all + // relevant sigScript or witness data populated. + case pInput.WitnessUtxo != nil: + if !isFinalizableWitnessInput(&pInput) { + return false + } + + case pInput.NonWitnessUtxo != nil: + if !isFinalizableLegacyInput(p, &pInput, inIndex) { + return false + } + + // If neither a known UTXO type isn't present at all, then we'll + // return false as we need one of them. + default: + return false + } + + return true +} + +// MaybeFinalize attempts to finalize the input at index inIndex in the PSBT p, +// returning true with no error if it succeeds, OR if the input has already +// been finalized. +func MaybeFinalize(p *Packet, inIndex int) (bool, error) { + if isFinalized(p, inIndex) { + return true, nil + } + + if !isFinalizable(p, inIndex) { + return false, ErrNotFinalizable + } + + if err := Finalize(p, inIndex); err != nil { + return false, err + } + + return true, nil +} + +// MaybeFinalizeAll attempts to finalize all inputs of the psbt.Packet that are +// not already finalized, and returns an error if it fails to do so. +func MaybeFinalizeAll(p *Packet) error { + for i := range p.UnsignedTx.TxIn { + success, err := MaybeFinalize(p, i) + if err != nil || !success { + return err + } + } + + return nil +} + +// Finalize assumes that the provided psbt.Packet struct has all partial +// signatures and redeem scripts/witness scripts already prepared for the +// specified input, and so removes all temporary data and replaces them with +// completed sigScript and witness fields, which are stored in key-types 07 and +// 08. The witness/non-witness utxo fields in the inputs (key-types 00 and 01) +// are left intact as they may be needed for validation (?). If there is any +// invalid or incomplete data, an error is returned. +func Finalize(p *Packet, inIndex int) error { + pInput := p.Inputs[inIndex] + + // Depending on the UTXO type, we either attempt to finalize it as a + // witness or legacy UTXO. + switch { + case pInput.WitnessUtxo != nil: + pkScript := pInput.WitnessUtxo.PkScript + + switch { + case txscript.IsPayToTaproot(pkScript): + if err := finalizeTaprootInput(p, inIndex); err != nil { + return err + } + + default: + if err := finalizeWitnessInput(p, inIndex); err != nil { + return err + } + } + + case pInput.NonWitnessUtxo != nil: + if err := finalizeNonWitnessInput(p, inIndex); err != nil { + return err + } + + default: + return ErrInvalidPsbtFormat + } + + // Before returning we sanity check the PSBT to ensure we don't extract + // an invalid transaction or produce an invalid intermediate state. + if err := p.SanityCheck(); err != nil { + return err + } + + return nil +} + +// checkFinalScriptSigWitness checks whether a given input in the psbt.Packet +// struct already has the fields 07 (FinalInScriptSig) or 08 (FinalInWitness). +// If so, it returns true. It does not modify the Psbt. +func checkFinalScriptSigWitness(p *Packet, inIndex int) bool { + pInput := p.Inputs[inIndex] + + if pInput.FinalScriptSig != nil { + return true + } + + if pInput.FinalScriptWitness != nil { + return true + } + + return false +} + +// finalizeNonWitnessInput attempts to create a PsbtInFinalScriptSig field for +// the input at index inIndex, and removes all other fields except for the UTXO +// field, for an input of type non-witness, or returns an error. +func finalizeNonWitnessInput(p *Packet, inIndex int) error { + // If this input has already been finalized, then we'll return an error + // as we can't proceed. + if checkFinalScriptSigWitness(p, inIndex) { + return ErrInputAlreadyFinalized + } + + // Our goal here is to construct a sigScript given the pubkey, + // signature (keytype 02), of which there might be multiple, and the + // redeem script field (keytype 04) if present (note, it is not present + // for p2pkh type inputs). + var sigScript []byte + + pInput := p.Inputs[inIndex] + containsRedeemScript := pInput.RedeemScript != nil + + var ( + pubKeys [][]byte + sigs [][]byte + ) + for _, ps := range pInput.PartialSigs { + pubKeys = append(pubKeys, ps.PubKey) + + sigOK := checkSigHashFlags(ps.Signature, &pInput) + if !sigOK { + return ErrInvalidSigHashFlags + } + + sigs = append(sigs, ps.Signature) + } + + // We have failed to identify at least 1 (sig, pub) pair in the PSBT, + // which indicates it was not ready to be finalized. As a result, we + // can't proceed. + if len(sigs) < 1 || len(pubKeys) < 1 { + return ErrNotFinalizable + } + + // If this input doesn't need a redeem script (P2PKH), then we'll + // construct a simple sigScript that's just the signature then the + // pubkey (OP_CHECKSIG). + var err error + if !containsRedeemScript { + // At this point, we should only have a single signature and + // pubkey. + if len(sigs) != 1 || len(pubKeys) != 1 { + return ErrNotFinalizable + } + + // In this case, our sigScript is just: . + builder := txscript.NewScriptBuilder() + builder.AddData(sigs[0]).AddData(pubKeys[0]) + sigScript, err = builder.Script() + if err != nil { + return err + } + } else { + // This is assumed p2sh multisig Given redeemScript and pubKeys + // we can decide in what order signatures must be appended. + orderedSigs, err := extractKeyOrderFromScript( + pInput.RedeemScript, pubKeys, sigs, + ) + if err != nil { + return err + } + + // At this point, we assume that this is a mult-sig input, so + // we construct our sigScript which looks something like this + // (mind the extra element for the extra multi-sig pop): + // * + // + // TODO(waxwing): the below is specific to the multisig case. + builder := txscript.NewScriptBuilder() + builder.AddOp(txscript.OP_FALSE) + for _, os := range orderedSigs { + builder.AddData(os) + } + builder.AddData(pInput.RedeemScript) + sigScript, err = builder.Script() + if err != nil { + return err + } + } + + // At this point, a sigScript has been constructed. Remove all fields + // other than non-witness utxo (00) and finaliscriptsig (07) + newInput := NewPsbtInput(pInput.NonWitnessUtxo, nil) + newInput.FinalScriptSig = sigScript + + // Overwrite the entry in the input list at the correct index. Note + // that this removes all the other entries in the list for this input + // index. + p.Inputs[inIndex] = *newInput + + return nil +} + +// finalizeWitnessInput attempts to create PsbtInFinalScriptSig field and +// PsbtInFinalScriptWitness field for input at index inIndex, and removes all +// other fields except for the utxo field, for an input of type witness, or +// returns an error. +func finalizeWitnessInput(p *Packet, inIndex int) error { + // If this input has already been finalized, then we'll return an error + // as we can't proceed. + if checkFinalScriptSigWitness(p, inIndex) { + return ErrInputAlreadyFinalized + } + + // Depending on the actual output type, we'll either populate a + // serializedWitness or a witness as well asa sigScript. + var ( + sigScript []byte + serializedWitness []byte + ) + + pInput := p.Inputs[inIndex] + + // First we'll validate and collect the pubkey+sig pairs from the set + // of partial signatures. + var ( + pubKeys [][]byte + sigs [][]byte + ) + for _, ps := range pInput.PartialSigs { + pubKeys = append(pubKeys, ps.PubKey) + + sigOK := checkSigHashFlags(ps.Signature, &pInput) + if !sigOK { + return ErrInvalidSigHashFlags + + } + + sigs = append(sigs, ps.Signature) + } + + // If at this point, we don't have any pubkey+sig pairs, then we bail + // as we can't proceed. + if len(sigs) == 0 || len(pubKeys) == 0 { + return ErrNotFinalizable + } + + containsRedeemScript := pInput.RedeemScript != nil + containsWitnessScript := pInput.WitnessScript != nil + + // If there's no redeem script, then we assume that this is native + // segwit input. + var err error + if !containsRedeemScript { + // If we have only a sigley pubkey+sig pair, and no witness + // script, then we assume this is a P2WKH input. + if len(pubKeys) == 1 && len(sigs) == 1 && + !containsWitnessScript { + + serializedWitness, err = writePKHWitness( + sigs[0], pubKeys[0], + ) + if err != nil { + return err + } + } else { + // Otherwise, we must have a witnessScript field, so + // we'll generate a valid multi-sig witness. + // + // NOTE: We tacitly assume multisig. + // + // TODO(roasbeef): need to add custom finalize for + // non-multisig P2WSH outputs (HTLCs, delay outputs, + // etc). + if !containsWitnessScript { + return ErrNotFinalizable + } + + serializedWitness, err = getMultisigScriptWitness( + pInput.WitnessScript, pubKeys, sigs, + ) + if err != nil { + return err + } + } + } else { + // Otherwise, we assume that this is a p2wsh multi-sig output, + // which is nested in a p2sh, or a p2wkh nested in a p2sh. + // + // In this case, we'll take the redeem script (the witness + // program in this case), and push it on the stack within the + // sigScript. + builder := txscript.NewScriptBuilder() + builder.AddData(pInput.RedeemScript) + sigScript, err = builder.Script() + if err != nil { + return err + } + + // If don't have a witness script, then we assume this is a + // nested p2wkh output. + if !containsWitnessScript { + // Assumed p2sh-p2wkh Here the witness is just (sig, + // pub) as for p2pkh case + if len(sigs) != 1 || len(pubKeys) != 1 { + return ErrNotFinalizable + } + + serializedWitness, err = writePKHWitness( + sigs[0], pubKeys[0], + ) + if err != nil { + return err + } + + } else { + // Otherwise, we assume that this is a p2wsh multi-sig, + // so we generate the proper witness. + serializedWitness, err = getMultisigScriptWitness( + pInput.WitnessScript, pubKeys, sigs, + ) + if err != nil { + return err + } + } + } + + // At this point, a witness has been constructed, and a sigScript (if + // nested; else it's []). Remove all fields other than witness utxo + // (01) and finalscriptsig (07), finalscriptwitness (08). + newInput := NewPsbtInput(nil, pInput.WitnessUtxo) + if len(sigScript) > 0 { + newInput.FinalScriptSig = sigScript + } + + newInput.FinalScriptWitness = serializedWitness + + // Finally, we overwrite the entry in the input list at the correct + // index. + p.Inputs[inIndex] = *newInput + return nil +} + +// finalizeTaprootInput attempts to create PsbtInFinalScriptWitness field for +// input at index inIndex, and removes all other fields except for the utxo +// field, for an input of type p2tr, or returns an error. +func finalizeTaprootInput(p *Packet, inIndex int) error { + // If this input has already been finalized, then we'll return an error + // as we can't proceed. + if checkFinalScriptSigWitness(p, inIndex) { + return ErrInputAlreadyFinalized + } + + // Any p2tr input will only have a witness script, no sig script. + var ( + serializedWitness []byte + err error + pInput = &p.Inputs[inIndex] + ) + + // What spend path did we take? + switch { + // Key spend path. + case len(pInput.TaprootKeySpendSig) > 0: + sig := pInput.TaprootKeySpendSig + + // Make sure TaprootKeySpendSig is equal to size of signature, + // if not, we assume that sighash flag was appended to the + // signature. + if len(pInput.TaprootKeySpendSig) == schnorr.SignatureSize { + // Append to the signature if flag is not equal to the + // default sighash (that can be omitted). + if pInput.SighashType != txscript.SigHashDefault { + sigHashType := byte(pInput.SighashType) + sig = append(sig, sigHashType) + } + } + serializedWitness, err = writeWitness(sig) + + // Script spend path. + case len(pInput.TaprootScriptSpendSig) > 0: + var witnessStack wire.TxWitness + + // If there are multiple script spend signatures, we assume they + // are from multiple signing participants for the same leaf + // script that uses OP_CHECKSIGADD for multi-sig. Signing + // multiple possible execution paths at the same time is + // currently not supported by this library. + targetLeafHash := pInput.TaprootScriptSpendSig[0].LeafHash + leafScript, err := FindLeafScript(pInput, targetLeafHash) + if err != nil { + return fmt.Errorf("control block for script spend " + + "signature not found") + } + + // The witness stack will contain all signatures, followed by + // the script itself and then the control block. + for idx, scriptSpendSig := range pInput.TaprootScriptSpendSig { + // Make sure that if there are indeed multiple + // signatures, they all reference the same leaf hash. + if !bytes.Equal(scriptSpendSig.LeafHash, targetLeafHash) { + return fmt.Errorf("script spend signature %d "+ + "references different target leaf "+ + "hash than first signature; only one "+ + "script path is supported", idx) + } + + sig := append([]byte{}, scriptSpendSig.Signature...) + if scriptSpendSig.SigHash != txscript.SigHashDefault { + sig = append(sig, byte(scriptSpendSig.SigHash)) + } + witnessStack = append(witnessStack, sig) + } + + // Complete the witness stack with the executed script and the + // serialized control block. + witnessStack = append(witnessStack, leafScript.Script) + witnessStack = append(witnessStack, leafScript.ControlBlock) + + serializedWitness, err = writeWitness(witnessStack...) + + default: + return ErrInvalidPsbtFormat + } + if err != nil { + return err + } + + // At this point, a witness has been constructed. Remove all fields + // other than witness utxo (01) and finalscriptsig (07), + // finalscriptwitness (08). + newInput := NewPsbtInput(nil, pInput.WitnessUtxo) + newInput.FinalScriptWitness = serializedWitness + + // Finally, we overwrite the entry in the input list at the correct + // index. + p.Inputs[inIndex] = *newInput + return nil +} diff --git a/btcutil/psbt/go.mod b/btcutil/psbt/go.mod new file mode 100644 index 0000000000..81ccca266b --- /dev/null +++ b/btcutil/psbt/go.mod @@ -0,0 +1,22 @@ +module github.com/btcsuite/btcd/btcutil/psbt + +go 1.17 + +require ( + github.com/btcsuite/btcd v0.23.5-0.20231219003633-4c2ce6daed8f + github.com/btcsuite/btcd/btcec/v2 v2.1.3 + github.com/btcsuite/btcd/btcutil v1.1.4 + github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 + github.com/davecgh/go-spew v1.1.1 + github.com/stretchr/testify v1.7.0 +) + +require ( + github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect + github.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 // indirect + golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed // indirect + gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect +) diff --git a/btcutil/psbt/go.sum b/btcutil/psbt/go.sum new file mode 100644 index 0000000000..74a2ce8a3d --- /dev/null +++ b/btcutil/psbt/go.sum @@ -0,0 +1,111 @@ +github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= +github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= +github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A= +github.com/btcsuite/btcd v0.23.5-0.20231219003633-4c2ce6daed8f h1:E+dQ8sNtK/lOdfeflUKkRLXe/zW7I333C7HhaoASjZA= +github.com/btcsuite/btcd v0.23.5-0.20231219003633-4c2ce6daed8f/go.mod h1:KVEB81PybLGYzpf1db/kKNi1ZEbUsiVGeTGhKuOl5AM= +github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= +github.com/btcsuite/btcd/btcec/v2 v2.1.3 h1:xM/n3yIhHAhHy04z4i43C8p4ehixJZMsnrVJkgl+MTE= +github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= +github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= +github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= +github.com/btcsuite/btcd/btcutil v1.1.4 h1:mWvWRLRIPuoeZsVRpc0xNCkfeNxWy1E4jIZ06ZpGI1A= +github.com/btcsuite/btcd/btcutil v1.1.4/go.mod h1:PSZZ4UitpLBWzxGd5VGOrLnmOjtPP/a6HaFo12zMs00= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ= +github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= +github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= +github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= +github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= +golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed h1:J22ig1FUekjjkmZUM7pTKixYm8DvrYsvrBZdunYeIuQ= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/btcutil/psbt/partial_input.go b/btcutil/psbt/partial_input.go new file mode 100644 index 0000000000..73595d2513 --- /dev/null +++ b/btcutil/psbt/partial_input.go @@ -0,0 +1,605 @@ +package psbt + +import ( + "bytes" + "encoding/binary" + "io" + "sort" + + "github.com/btcsuite/btcd/txscript" + "github.com/btcsuite/btcd/wire" +) + +// PInput is a struct encapsulating all the data that can be attached to any +// specific input of the PSBT. +type PInput struct { + NonWitnessUtxo *wire.MsgTx + WitnessUtxo *wire.TxOut + PartialSigs []*PartialSig + SighashType txscript.SigHashType + RedeemScript []byte + WitnessScript []byte + Bip32Derivation []*Bip32Derivation + FinalScriptSig []byte + FinalScriptWitness []byte + TaprootKeySpendSig []byte + TaprootScriptSpendSig []*TaprootScriptSpendSig + TaprootLeafScript []*TaprootTapLeafScript + TaprootBip32Derivation []*TaprootBip32Derivation + TaprootInternalKey []byte + TaprootMerkleRoot []byte + Unknowns []*Unknown +} + +// NewPsbtInput creates an instance of PsbtInput given either a nonWitnessUtxo +// or a witnessUtxo. +// +// NOTE: Only one of the two arguments should be specified, with the other +// being `nil`; otherwise the created PsbtInput object will fail IsSane() +// checks and will not be usable. +func NewPsbtInput(nonWitnessUtxo *wire.MsgTx, witnessUtxo *wire.TxOut) *PInput { + return &PInput{ + NonWitnessUtxo: nonWitnessUtxo, + WitnessUtxo: witnessUtxo, + PartialSigs: []*PartialSig{}, + SighashType: 0, + RedeemScript: nil, + WitnessScript: nil, + Bip32Derivation: []*Bip32Derivation{}, + FinalScriptSig: nil, + FinalScriptWitness: nil, + Unknowns: nil, + } +} + +// IsSane returns true only if there are no conflicting values in the Psbt +// PInput. For segwit v0 no checks are currently implemented. +func (pi *PInput) IsSane() bool { + // TODO(guggero): Implement sanity checks for segwit v1. For segwit v0 + // it is unsafe to only rely on the witness UTXO so we don't check that + // only one is set anymore. + // See https://github.com/bitcoin/bitcoin/pull/19215. + + return true +} + +// deserialize attempts to deserialize a new PInput from the passed io.Reader. +func (pi *PInput) deserialize(r io.Reader) error { + for { + keyCode, keyData, err := getKey(r) + if err != nil { + return err + } + if keyCode == -1 { + // Reached separator byte, this section is done. + break + } + value, err := wire.ReadVarBytes( + r, 0, MaxPsbtValueLength, "PSBT value", + ) + if err != nil { + return err + } + + switch InputType(keyCode) { + + case NonWitnessUtxoType: + if pi.NonWitnessUtxo != nil { + return ErrDuplicateKey + } + if keyData != nil { + return ErrInvalidKeyData + } + tx := wire.NewMsgTx(2) + + err := tx.Deserialize(bytes.NewReader(value)) + if err != nil { + return err + } + pi.NonWitnessUtxo = tx + + case WitnessUtxoType: + if pi.WitnessUtxo != nil { + return ErrDuplicateKey + } + if keyData != nil { + return ErrInvalidKeyData + } + txout, err := readTxOut(value) + if err != nil { + return err + } + pi.WitnessUtxo = txout + + case PartialSigType: + newPartialSig := PartialSig{ + PubKey: keyData, + Signature: value, + } + + if !newPartialSig.checkValid() { + return ErrInvalidPsbtFormat + } + + // Duplicate keys are not allowed. + for _, x := range pi.PartialSigs { + if bytes.Equal(x.PubKey, newPartialSig.PubKey) { + return ErrDuplicateKey + } + } + + pi.PartialSigs = append(pi.PartialSigs, &newPartialSig) + + case SighashType: + if pi.SighashType != 0 { + return ErrDuplicateKey + } + if keyData != nil { + return ErrInvalidKeyData + } + + // Bounds check on value here since the sighash type + // must be a 32-bit unsigned integer. + if len(value) != 4 { + return ErrInvalidKeyData + } + + sighashType := txscript.SigHashType( + binary.LittleEndian.Uint32(value), + ) + pi.SighashType = sighashType + + case RedeemScriptInputType: + if pi.RedeemScript != nil { + return ErrDuplicateKey + } + if keyData != nil { + return ErrInvalidKeyData + } + pi.RedeemScript = value + + case WitnessScriptInputType: + if pi.WitnessScript != nil { + return ErrDuplicateKey + } + if keyData != nil { + return ErrInvalidKeyData + } + pi.WitnessScript = value + + case Bip32DerivationInputType: + if !validatePubkey(keyData) { + return ErrInvalidPsbtFormat + } + master, derivationPath, err := ReadBip32Derivation( + value, + ) + if err != nil { + return err + } + + // Duplicate keys are not allowed + for _, x := range pi.Bip32Derivation { + if bytes.Equal(x.PubKey, keyData) { + return ErrDuplicateKey + } + } + + pi.Bip32Derivation = append( + pi.Bip32Derivation, + &Bip32Derivation{ + PubKey: keyData, + MasterKeyFingerprint: master, + Bip32Path: derivationPath, + }, + ) + + case FinalScriptSigType: + if pi.FinalScriptSig != nil { + return ErrDuplicateKey + } + if keyData != nil { + return ErrInvalidKeyData + } + + pi.FinalScriptSig = value + + case FinalScriptWitnessType: + if pi.FinalScriptWitness != nil { + return ErrDuplicateKey + } + if keyData != nil { + return ErrInvalidKeyData + } + + pi.FinalScriptWitness = value + + case TaprootKeySpendSignatureType: + if pi.TaprootKeySpendSig != nil { + return ErrDuplicateKey + } + if keyData != nil { + return ErrInvalidKeyData + } + + // The signature can either be 64 or 65 bytes. + switch { + case len(value) == schnorrSigMinLength: + if !validateSchnorrSignature(value) { + return ErrInvalidKeyData + } + + case len(value) == schnorrSigMaxLength: + if !validateSchnorrSignature( + value[0:schnorrSigMinLength], + ) { + return ErrInvalidKeyData + } + + default: + return ErrInvalidKeyData + } + + pi.TaprootKeySpendSig = value + + case TaprootScriptSpendSignatureType: + // The key data for the script spend signature is: + // + if len(keyData) != 32*2 { + return ErrInvalidKeyData + } + + newPartialSig := TaprootScriptSpendSig{ + XOnlyPubKey: keyData[:32], + LeafHash: keyData[32:], + } + + // The signature can either be 64 or 65 bytes. + switch { + case len(value) == schnorrSigMinLength: + newPartialSig.Signature = value + newPartialSig.SigHash = txscript.SigHashDefault + + case len(value) == schnorrSigMaxLength: + newPartialSig.Signature = value[0:schnorrSigMinLength] + newPartialSig.SigHash = txscript.SigHashType( + value[schnorrSigMinLength], + ) + + default: + return ErrInvalidKeyData + } + + if !newPartialSig.checkValid() { + return ErrInvalidKeyData + } + + // Duplicate keys are not allowed. + for _, x := range pi.TaprootScriptSpendSig { + if x.EqualKey(&newPartialSig) { + return ErrDuplicateKey + } + } + + pi.TaprootScriptSpendSig = append( + pi.TaprootScriptSpendSig, &newPartialSig, + ) + + case TaprootLeafScriptType: + if len(value) < 1 { + return ErrInvalidKeyData + } + + newLeafScript := TaprootTapLeafScript{ + ControlBlock: keyData, + Script: value[:len(value)-1], + LeafVersion: txscript.TapscriptLeafVersion( + value[len(value)-1], + ), + } + + if !newLeafScript.checkValid() { + return ErrInvalidKeyData + } + + // Duplicate keys are not allowed. + for _, x := range pi.TaprootLeafScript { + if bytes.Equal( + x.ControlBlock, + newLeafScript.ControlBlock, + ) { + return ErrDuplicateKey + } + } + + pi.TaprootLeafScript = append( + pi.TaprootLeafScript, &newLeafScript, + ) + + case TaprootBip32DerivationInputType: + if !validateXOnlyPubkey(keyData) { + return ErrInvalidKeyData + } + + taprootDerivation, err := ReadTaprootBip32Derivation( + keyData, value, + ) + if err != nil { + return err + } + + // Duplicate keys are not allowed. + for _, x := range pi.TaprootBip32Derivation { + if bytes.Equal(x.XOnlyPubKey, keyData) { + return ErrDuplicateKey + } + } + + pi.TaprootBip32Derivation = append( + pi.TaprootBip32Derivation, taprootDerivation, + ) + + case TaprootInternalKeyInputType: + if pi.TaprootInternalKey != nil { + return ErrDuplicateKey + } + if keyData != nil { + return ErrInvalidKeyData + } + + if !validateXOnlyPubkey(value) { + return ErrInvalidKeyData + } + + pi.TaprootInternalKey = value + + case TaprootMerkleRootType: + if pi.TaprootMerkleRoot != nil { + return ErrDuplicateKey + } + if keyData != nil { + return ErrInvalidKeyData + } + + pi.TaprootMerkleRoot = value + + default: + // A fall through case for any proprietary types. + keyCodeAndData := append( + []byte{byte(keyCode)}, keyData..., + ) + newUnknown := &Unknown{ + Key: keyCodeAndData, + Value: value, + } + + // Duplicate key+keyData are not allowed. + for _, x := range pi.Unknowns { + if bytes.Equal(x.Key, newUnknown.Key) && + bytes.Equal(x.Value, newUnknown.Value) { + + return ErrDuplicateKey + } + } + + pi.Unknowns = append(pi.Unknowns, newUnknown) + } + } + + return nil +} + +// serialize attempts to serialize the target PInput into the passed io.Writer. +func (pi *PInput) serialize(w io.Writer) error { + if !pi.IsSane() { + return ErrInvalidPsbtFormat + } + + if pi.NonWitnessUtxo != nil { + var buf bytes.Buffer + err := pi.NonWitnessUtxo.Serialize(&buf) + if err != nil { + return err + } + + err = serializeKVPairWithType( + w, uint8(NonWitnessUtxoType), nil, buf.Bytes(), + ) + if err != nil { + return err + } + } + if pi.WitnessUtxo != nil { + var buf bytes.Buffer + err := wire.WriteTxOut(&buf, 0, 0, pi.WitnessUtxo) + if err != nil { + return err + } + + err = serializeKVPairWithType( + w, uint8(WitnessUtxoType), nil, buf.Bytes(), + ) + if err != nil { + return err + } + } + + if pi.FinalScriptSig == nil && pi.FinalScriptWitness == nil { + sort.Sort(PartialSigSorter(pi.PartialSigs)) + for _, ps := range pi.PartialSigs { + err := serializeKVPairWithType( + w, uint8(PartialSigType), ps.PubKey, + ps.Signature, + ) + if err != nil { + return err + } + } + + if pi.SighashType != 0 { + var shtBytes [4]byte + binary.LittleEndian.PutUint32( + shtBytes[:], uint32(pi.SighashType), + ) + + err := serializeKVPairWithType( + w, uint8(SighashType), nil, shtBytes[:], + ) + if err != nil { + return err + } + } + + if pi.RedeemScript != nil { + err := serializeKVPairWithType( + w, uint8(RedeemScriptInputType), nil, + pi.RedeemScript, + ) + if err != nil { + return err + } + } + + if pi.WitnessScript != nil { + err := serializeKVPairWithType( + w, uint8(WitnessScriptInputType), nil, + pi.WitnessScript, + ) + if err != nil { + return err + } + } + + sort.Sort(Bip32Sorter(pi.Bip32Derivation)) + for _, kd := range pi.Bip32Derivation { + err := serializeKVPairWithType( + w, + uint8(Bip32DerivationInputType), kd.PubKey, + SerializeBIP32Derivation( + kd.MasterKeyFingerprint, kd.Bip32Path, + ), + ) + if err != nil { + return err + } + } + + if pi.TaprootKeySpendSig != nil { + err := serializeKVPairWithType( + w, uint8(TaprootKeySpendSignatureType), nil, + pi.TaprootKeySpendSig, + ) + if err != nil { + return err + } + } + + sort.Slice(pi.TaprootScriptSpendSig, func(i, j int) bool { + return pi.TaprootScriptSpendSig[i].SortBefore( + pi.TaprootScriptSpendSig[j], + ) + }) + for _, scriptSpend := range pi.TaprootScriptSpendSig { + keyData := append([]byte{}, scriptSpend.XOnlyPubKey...) + keyData = append(keyData, scriptSpend.LeafHash...) + value := append([]byte{}, scriptSpend.Signature...) + if scriptSpend.SigHash != txscript.SigHashDefault { + value = append(value, byte(scriptSpend.SigHash)) + } + err := serializeKVPairWithType( + w, uint8(TaprootScriptSpendSignatureType), + keyData, value, + ) + if err != nil { + return err + } + } + + sort.Slice(pi.TaprootLeafScript, func(i, j int) bool { + return pi.TaprootLeafScript[i].SortBefore( + pi.TaprootLeafScript[j], + ) + }) + for _, leafScript := range pi.TaprootLeafScript { + value := append([]byte{}, leafScript.Script...) + value = append(value, byte(leafScript.LeafVersion)) + err := serializeKVPairWithType( + w, uint8(TaprootLeafScriptType), + leafScript.ControlBlock, value, + ) + if err != nil { + return err + } + } + + sort.Slice(pi.TaprootBip32Derivation, func(i, j int) bool { + return pi.TaprootBip32Derivation[i].SortBefore( + pi.TaprootBip32Derivation[j], + ) + }) + for _, derivation := range pi.TaprootBip32Derivation { + value, err := SerializeTaprootBip32Derivation( + derivation, + ) + if err != nil { + return err + } + err = serializeKVPairWithType( + w, uint8(TaprootBip32DerivationInputType), + derivation.XOnlyPubKey, value, + ) + if err != nil { + return err + } + } + + if pi.TaprootInternalKey != nil { + err := serializeKVPairWithType( + w, uint8(TaprootInternalKeyInputType), nil, + pi.TaprootInternalKey, + ) + if err != nil { + return err + } + } + + if pi.TaprootMerkleRoot != nil { + err := serializeKVPairWithType( + w, uint8(TaprootMerkleRootType), nil, + pi.TaprootMerkleRoot, + ) + if err != nil { + return err + } + } + } + + if pi.FinalScriptSig != nil { + err := serializeKVPairWithType( + w, uint8(FinalScriptSigType), nil, pi.FinalScriptSig, + ) + if err != nil { + return err + } + } + + if pi.FinalScriptWitness != nil { + err := serializeKVPairWithType( + w, uint8(FinalScriptWitnessType), nil, pi.FinalScriptWitness, + ) + if err != nil { + return err + } + } + + // Unknown is a special case; we don't have a key type, only a key and + // a value field. + for _, kv := range pi.Unknowns { + err := serializeKVpair(w, kv.Key, kv.Value) + if err != nil { + return err + } + } + + return nil +} diff --git a/btcutil/psbt/partial_output.go b/btcutil/psbt/partial_output.go new file mode 100644 index 0000000000..86e476457d --- /dev/null +++ b/btcutil/psbt/partial_output.go @@ -0,0 +1,259 @@ +package psbt + +import ( + "bytes" + "io" + "sort" + + "github.com/btcsuite/btcd/wire" +) + +// POutput is a struct encapsulating all the data that can be attached +// to any specific output of the PSBT. +type POutput struct { + RedeemScript []byte + WitnessScript []byte + Bip32Derivation []*Bip32Derivation + TaprootInternalKey []byte + TaprootTapTree []byte + TaprootBip32Derivation []*TaprootBip32Derivation + Unknowns []*Unknown +} + +// NewPsbtOutput creates an instance of PsbtOutput; the three parameters +// redeemScript, witnessScript and Bip32Derivation are all allowed to be +// `nil`. +func NewPsbtOutput(redeemScript []byte, witnessScript []byte, + bip32Derivation []*Bip32Derivation) *POutput { + return &POutput{ + RedeemScript: redeemScript, + WitnessScript: witnessScript, + Bip32Derivation: bip32Derivation, + } +} + +// deserialize attempts to recode a new POutput from the passed io.Reader. +func (po *POutput) deserialize(r io.Reader) error { + for { + keyCode, keyData, err := getKey(r) + if err != nil { + return err + } + if keyCode == -1 { + // Reached separator byte, this section is done. + break + } + + value, err := wire.ReadVarBytes( + r, 0, MaxPsbtValueLength, "PSBT value", + ) + if err != nil { + return err + } + + switch OutputType(keyCode) { + + case RedeemScriptOutputType: + if po.RedeemScript != nil { + return ErrDuplicateKey + } + if keyData != nil { + return ErrInvalidKeyData + } + po.RedeemScript = value + + case WitnessScriptOutputType: + if po.WitnessScript != nil { + return ErrDuplicateKey + } + if keyData != nil { + return ErrInvalidKeyData + } + po.WitnessScript = value + + case Bip32DerivationOutputType: + if !validatePubkey(keyData) { + return ErrInvalidKeyData + } + master, derivationPath, err := ReadBip32Derivation( + value, + ) + if err != nil { + return err + } + + // Duplicate keys are not allowed. + for _, x := range po.Bip32Derivation { + if bytes.Equal(x.PubKey, keyData) { + return ErrDuplicateKey + } + } + + po.Bip32Derivation = append(po.Bip32Derivation, + &Bip32Derivation{ + PubKey: keyData, + MasterKeyFingerprint: master, + Bip32Path: derivationPath, + }, + ) + + case TaprootInternalKeyOutputType: + if po.TaprootInternalKey != nil { + return ErrDuplicateKey + } + if keyData != nil { + return ErrInvalidKeyData + } + + if !validateXOnlyPubkey(value) { + return ErrInvalidKeyData + } + + po.TaprootInternalKey = value + + case TaprootTapTreeType: + if po.TaprootTapTree != nil { + return ErrDuplicateKey + } + if keyData != nil { + return ErrInvalidKeyData + } + + po.TaprootTapTree = value + + case TaprootBip32DerivationOutputType: + if !validateXOnlyPubkey(keyData) { + return ErrInvalidKeyData + } + + taprootDerivation, err := ReadTaprootBip32Derivation( + keyData, value, + ) + if err != nil { + return err + } + + // Duplicate keys are not allowed. + for _, x := range po.TaprootBip32Derivation { + if bytes.Equal(x.XOnlyPubKey, keyData) { + return ErrDuplicateKey + } + } + + po.TaprootBip32Derivation = append( + po.TaprootBip32Derivation, taprootDerivation, + ) + + default: + // A fall through case for any proprietary types. + keyCodeAndData := append( + []byte{byte(keyCode)}, keyData..., + ) + newUnknown := &Unknown{ + Key: keyCodeAndData, + Value: value, + } + + // Duplicate key+keyData are not allowed. + for _, x := range po.Unknowns { + if bytes.Equal(x.Key, newUnknown.Key) && + bytes.Equal(x.Value, newUnknown.Value) { + + return ErrDuplicateKey + } + } + + po.Unknowns = append(po.Unknowns, newUnknown) + } + } + + return nil +} + +// serialize attempts to write out the target POutput into the passed +// io.Writer. +func (po *POutput) serialize(w io.Writer) error { + if po.RedeemScript != nil { + err := serializeKVPairWithType( + w, uint8(RedeemScriptOutputType), nil, po.RedeemScript, + ) + if err != nil { + return err + } + } + if po.WitnessScript != nil { + err := serializeKVPairWithType( + w, uint8(WitnessScriptOutputType), nil, po.WitnessScript, + ) + if err != nil { + return err + } + } + + sort.Sort(Bip32Sorter(po.Bip32Derivation)) + for _, kd := range po.Bip32Derivation { + err := serializeKVPairWithType(w, + uint8(Bip32DerivationOutputType), + kd.PubKey, + SerializeBIP32Derivation( + kd.MasterKeyFingerprint, + kd.Bip32Path, + ), + ) + if err != nil { + return err + } + } + + if po.TaprootInternalKey != nil { + err := serializeKVPairWithType( + w, uint8(TaprootInternalKeyOutputType), nil, + po.TaprootInternalKey, + ) + if err != nil { + return err + } + } + + if po.TaprootTapTree != nil { + err := serializeKVPairWithType( + w, uint8(TaprootTapTreeType), nil, + po.TaprootTapTree, + ) + if err != nil { + return err + } + } + + sort.Slice(po.TaprootBip32Derivation, func(i, j int) bool { + return po.TaprootBip32Derivation[i].SortBefore( + po.TaprootBip32Derivation[j], + ) + }) + for _, derivation := range po.TaprootBip32Derivation { + value, err := SerializeTaprootBip32Derivation( + derivation, + ) + if err != nil { + return err + } + err = serializeKVPairWithType( + w, uint8(TaprootBip32DerivationOutputType), + derivation.XOnlyPubKey, value, + ) + if err != nil { + return err + } + } + + // Unknown is a special case; we don't have a key type, only a key and + // a value field + for _, kv := range po.Unknowns { + err := serializeKVpair(w, kv.Key, kv.Value) + if err != nil { + return err + } + } + + return nil +} diff --git a/btcutil/psbt/partialsig.go b/btcutil/psbt/partialsig.go new file mode 100644 index 0000000000..dfb7004999 --- /dev/null +++ b/btcutil/psbt/partialsig.go @@ -0,0 +1,49 @@ +package psbt + +import ( + "bytes" + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcec/v2/ecdsa" +) + +// PartialSig encapsulate a (BTC public key, ECDSA signature) +// pair, note that the fields are stored as byte slices, not +// btcec.PublicKey or btcec.Signature (because manipulations will +// be with the former not the latter, here); compliance with consensus +// serialization is enforced with .checkValid() +type PartialSig struct { + PubKey []byte + Signature []byte +} + +// PartialSigSorter implements sort.Interface for PartialSig. +type PartialSigSorter []*PartialSig + +func (s PartialSigSorter) Len() int { return len(s) } + +func (s PartialSigSorter) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +func (s PartialSigSorter) Less(i, j int) bool { + return bytes.Compare(s[i].PubKey, s[j].PubKey) < 0 +} + +// validatePubkey checks if pubKey is *any* valid pubKey serialization in a +// Bitcoin context (compressed/uncomp. OK). +func validatePubkey(pubKey []byte) bool { + _, err := btcec.ParsePubKey(pubKey) + return err == nil +} + +// validateSignature checks that the passed byte slice is a valid DER-encoded +// ECDSA signature, including the sighash flag. It does *not* of course +// validate the signature against any message or public key. +func validateSignature(sig []byte) bool { + _, err := ecdsa.ParseDERSignature(sig) + return err == nil +} + +// checkValid checks that both the pubkey and sig are valid. See the methods +// (PartialSig, validatePubkey, validateSignature) for more details. +func (ps *PartialSig) checkValid() bool { + return validatePubkey(ps.PubKey) && validateSignature(ps.Signature) +} diff --git a/btcutil/psbt/psbt.go b/btcutil/psbt/psbt.go new file mode 100644 index 0000000000..a72b7fc551 --- /dev/null +++ b/btcutil/psbt/psbt.go @@ -0,0 +1,424 @@ +// Copyright (c) 2018 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +// Package psbt is an implementation of Partially Signed Bitcoin +// Transactions (PSBT). The format is defined in BIP 174: +// https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki +package psbt + +import ( + "bytes" + "encoding/base64" + "errors" + "io" + + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/wire" +) + +// psbtMagicLength is the length of the magic bytes used to signal the start of +// a serialized PSBT packet. +const psbtMagicLength = 5 + +var ( + // psbtMagic is the separator. + psbtMagic = [psbtMagicLength]byte{0x70, + 0x73, 0x62, 0x74, 0xff, // = "psbt" + 0xff sep + } +) + +// MaxPsbtValueLength is the size of the largest transaction serialization +// that could be passed in a NonWitnessUtxo field. This is definitely +// less than 4M. +const MaxPsbtValueLength = 4000000 + +// MaxPsbtKeyLength is the length of the largest key that we'll successfully +// deserialize from the wire. Anything more will return ErrInvalidKeyData. +const MaxPsbtKeyLength = 10000 + +// MaxPsbtKeyValue is the maximum value of a key type in a PSBT. This maximum +// isn't specified by the BIP but used by bitcoind in various places to limit +// the number of items processed. So we use it to validate the key type in order +// to have a consistent behavior. +const MaxPsbtKeyValue = 0x02000000 + +var ( + + // ErrInvalidPsbtFormat is a generic error for any situation in which a + // provided Psbt serialization does not conform to the rules of BIP174. + ErrInvalidPsbtFormat = errors.New("Invalid PSBT serialization format") + + // ErrDuplicateKey indicates that a passed Psbt serialization is invalid + // due to having the same key repeated in the same key-value pair. + ErrDuplicateKey = errors.New("Invalid Psbt due to duplicate key") + + // ErrInvalidKeyData indicates that a key-value pair in the PSBT + // serialization contains data in the key which is not valid. + ErrInvalidKeyData = errors.New("Invalid key data") + + // ErrInvalidMagicBytes indicates that a passed Psbt serialization is + // invalid due to having incorrect magic bytes. + ErrInvalidMagicBytes = errors.New("Invalid Psbt due to incorrect " + + "magic bytes") + + // ErrInvalidRawTxSigned indicates that the raw serialized transaction + // in the global section of the passed Psbt serialization is invalid + // because it contains scriptSigs/witnesses (i.e. is fully or partially + // signed), which is not allowed by BIP174. + ErrInvalidRawTxSigned = errors.New("Invalid Psbt, raw transaction " + + "must be unsigned.") + + // ErrInvalidPrevOutNonWitnessTransaction indicates that the transaction + // hash (i.e. SHA256^2) of the fully serialized previous transaction + // provided in the NonWitnessUtxo key-value field doesn't match the + // prevout hash in the UnsignedTx field in the PSBT itself. + ErrInvalidPrevOutNonWitnessTransaction = errors.New("Prevout hash " + + "does not match the provided non-witness utxo serialization") + + // ErrInvalidSignatureForInput indicates that the signature the user is + // trying to append to the PSBT is invalid, either because it does + // not correspond to the previous transaction hash, or redeem script, + // or witness script. + // NOTE this does not include ECDSA signature checking. + ErrInvalidSignatureForInput = errors.New("Signature does not " + + "correspond to this input") + + // ErrInputAlreadyFinalized indicates that the PSBT passed to a + // Finalizer already contains the finalized scriptSig or witness. + ErrInputAlreadyFinalized = errors.New("Cannot finalize PSBT, " + + "finalized scriptSig or scriptWitnes already exists") + + // ErrIncompletePSBT indicates that the Extractor object + // was unable to successfully extract the passed Psbt struct because + // it is not complete + ErrIncompletePSBT = errors.New("PSBT cannot be extracted as it is " + + "incomplete") + + // ErrNotFinalizable indicates that the PSBT struct does not have + // sufficient data (e.g. signatures) for finalization + ErrNotFinalizable = errors.New("PSBT is not finalizable") + + // ErrInvalidSigHashFlags indicates that a signature added to the PSBT + // uses Sighash flags that are not in accordance with the requirement + // according to the entry in PsbtInSighashType, or otherwise not the + // default value (SIGHASH_ALL) + ErrInvalidSigHashFlags = errors.New("Invalid Sighash Flags") + + // ErrUnsupportedScriptType indicates that the redeem script or + // script witness given is not supported by this codebase, or is + // otherwise not valid. + ErrUnsupportedScriptType = errors.New("Unsupported script type") +) + +// Unknown is a struct encapsulating a key-value pair for which the key type is +// unknown by this package; these fields are allowed in both the 'Global' and +// the 'Input' section of a PSBT. +type Unknown struct { + Key []byte + Value []byte +} + +// Packet is the actual psbt representation. It is a set of 1 + N + M +// key-value pair lists, 1 global, defining the unsigned transaction structure +// with N inputs and M outputs. These key-value pairs can contain scripts, +// signatures, key derivations and other transaction-defining data. +type Packet struct { + // UnsignedTx is the decoded unsigned transaction for this PSBT. + UnsignedTx *wire.MsgTx // Deserialization of unsigned tx + + // Inputs contains all the information needed to properly sign this + // target input within the above transaction. + Inputs []PInput + + // Outputs contains all information required to spend any outputs + // produced by this PSBT. + Outputs []POutput + + // Unknowns are the set of custom types (global only) within this PSBT. + Unknowns []*Unknown +} + +// validateUnsignedTx returns true if the transaction is unsigned. Note that +// more basic sanity requirements, such as the presence of inputs and outputs, +// is implicitly checked in the call to MsgTx.Deserialize(). +func validateUnsignedTX(tx *wire.MsgTx) bool { + for _, tin := range tx.TxIn { + if len(tin.SignatureScript) != 0 || len(tin.Witness) != 0 { + return false + } + } + + return true +} + +// NewFromUnsignedTx creates a new Psbt struct, without any signatures (i.e. +// only the global section is non-empty) using the passed unsigned transaction. +func NewFromUnsignedTx(tx *wire.MsgTx) (*Packet, error) { + if !validateUnsignedTX(tx) { + return nil, ErrInvalidRawTxSigned + } + + inSlice := make([]PInput, len(tx.TxIn)) + outSlice := make([]POutput, len(tx.TxOut)) + unknownSlice := make([]*Unknown, 0) + + return &Packet{ + UnsignedTx: tx, + Inputs: inSlice, + Outputs: outSlice, + Unknowns: unknownSlice, + }, nil +} + +// NewFromRawBytes returns a new instance of a Packet struct created by reading +// from a byte slice. If the format is invalid, an error is returned. If the +// argument b64 is true, the passed byte slice is decoded from base64 encoding +// before processing. +// +// NOTE: To create a Packet from one's own data, rather than reading in a +// serialization from a counterparty, one should use a psbt.New. +func NewFromRawBytes(r io.Reader, b64 bool) (*Packet, error) { + // If the PSBT is encoded in bas64, then we'll create a new wrapper + // reader that'll allow us to incrementally decode the contents of the + // io.Reader. + if b64 { + based64EncodedReader := r + r = base64.NewDecoder(base64.StdEncoding, based64EncodedReader) + } + + // The Packet struct does not store the fixed magic bytes, but they + // must be present or the serialization must be explicitly rejected. + var magic [5]byte + if _, err := io.ReadFull(r, magic[:]); err != nil { + return nil, err + } + if magic != psbtMagic { + return nil, ErrInvalidMagicBytes + } + + // Next we parse the GLOBAL section. There is currently only 1 known + // key type, UnsignedTx. We insist this exists first; unknowns are + // allowed, but only after. + keyCode, keyData, err := getKey(r) + if err != nil { + return nil, err + } + if GlobalType(keyCode) != UnsignedTxType || keyData != nil { + return nil, ErrInvalidPsbtFormat + } + + // Now that we've verified the global type is present, we'll decode it + // into a proper unsigned transaction, and validate it. + value, err := wire.ReadVarBytes( + r, 0, MaxPsbtValueLength, "PSBT value", + ) + if err != nil { + return nil, err + } + msgTx := wire.NewMsgTx(2) + + // BIP-0174 states: "The transaction must be in the old serialization + // format (without witnesses)." + err = msgTx.DeserializeNoWitness(bytes.NewReader(value)) + if err != nil { + return nil, err + } + if !validateUnsignedTX(msgTx) { + return nil, ErrInvalidRawTxSigned + } + + // Next we parse any unknowns that may be present, making sure that we + // break at the separator. + var unknownSlice []*Unknown + for { + keyint, keydata, err := getKey(r) + if err != nil { + return nil, ErrInvalidPsbtFormat + } + if keyint == -1 { + break + } + + value, err := wire.ReadVarBytes( + r, 0, MaxPsbtValueLength, "PSBT value", + ) + if err != nil { + return nil, err + } + + keyintanddata := []byte{byte(keyint)} + keyintanddata = append(keyintanddata, keydata...) + + newUnknown := &Unknown{ + Key: keyintanddata, + Value: value, + } + unknownSlice = append(unknownSlice, newUnknown) + } + + // Next we parse the INPUT section. + inSlice := make([]PInput, len(msgTx.TxIn)) + for i := range msgTx.TxIn { + input := PInput{} + err = input.deserialize(r) + if err != nil { + return nil, err + } + + inSlice[i] = input + } + + // Next we parse the OUTPUT section. + outSlice := make([]POutput, len(msgTx.TxOut)) + for i := range msgTx.TxOut { + output := POutput{} + err = output.deserialize(r) + if err != nil { + return nil, err + } + + outSlice[i] = output + } + + // Populate the new Packet object. + newPsbt := Packet{ + UnsignedTx: msgTx, + Inputs: inSlice, + Outputs: outSlice, + Unknowns: unknownSlice, + } + + // Extended sanity checking is applied here to make sure the + // externally-passed Packet follows all the rules. + if err = newPsbt.SanityCheck(); err != nil { + return nil, err + } + + return &newPsbt, nil +} + +// Serialize creates a binary serialization of the referenced Packet struct +// with lexicographical ordering (by key) of the subsections. +func (p *Packet) Serialize(w io.Writer) error { + // First we write out the precise set of magic bytes that identify a + // valid PSBT transaction. + if _, err := w.Write(psbtMagic[:]); err != nil { + return err + } + + // Next we prep to write out the unsigned transaction by first + // serializing it into an intermediate buffer. + serializedTx := bytes.NewBuffer( + make([]byte, 0, p.UnsignedTx.SerializeSize()), + ) + if err := p.UnsignedTx.SerializeNoWitness(serializedTx); err != nil { + return err + } + + // Now that we have the serialized transaction, we'll write it out to + // the proper global type. + err := serializeKVPairWithType( + w, uint8(UnsignedTxType), nil, serializedTx.Bytes(), + ) + if err != nil { + return err + } + + // Unknown is a special case; we don't have a key type, only a key and + // a value field + for _, kv := range p.Unknowns { + err := serializeKVpair(w, kv.Key, kv.Value) + if err != nil { + return err + } + } + + // With that our global section is done, so we'll write out the + // separator. + separator := []byte{0x00} + if _, err := w.Write(separator); err != nil { + return err + } + + for _, pInput := range p.Inputs { + err := pInput.serialize(w) + if err != nil { + return err + } + + if _, err := w.Write(separator); err != nil { + return err + } + } + + for _, pOutput := range p.Outputs { + err := pOutput.serialize(w) + if err != nil { + return err + } + + if _, err := w.Write(separator); err != nil { + return err + } + } + + return nil +} + +// B64Encode returns the base64 encoding of the serialization of +// the current PSBT, or an error if the encoding fails. +func (p *Packet) B64Encode() (string, error) { + var b bytes.Buffer + if err := p.Serialize(&b); err != nil { + return "", err + } + + return base64.StdEncoding.EncodeToString(b.Bytes()), nil +} + +// IsComplete returns true only if all of the inputs are +// finalized; this is particularly important in that it decides +// whether the final extraction to a network serialized signed +// transaction will be possible. +func (p *Packet) IsComplete() bool { + for i := 0; i < len(p.UnsignedTx.TxIn); i++ { + if !isFinalized(p, i) { + return false + } + } + return true +} + +// SanityCheck checks conditions on a PSBT to ensure that it obeys the +// rules of BIP174, and returns true if so, false if not. +func (p *Packet) SanityCheck() error { + if !validateUnsignedTX(p.UnsignedTx) { + return ErrInvalidRawTxSigned + } + + for _, tin := range p.Inputs { + if !tin.IsSane() { + return ErrInvalidPsbtFormat + } + } + + return nil +} + +// GetTxFee returns the transaction fee. An error is returned if a transaction +// input does not contain any UTXO information. +func (p *Packet) GetTxFee() (btcutil.Amount, error) { + sumInputs, err := SumUtxoInputValues(p) + if err != nil { + return 0, err + } + + var sumOutputs int64 + for _, txOut := range p.UnsignedTx.TxOut { + sumOutputs += txOut.Value + } + + fee := sumInputs - sumOutputs + return btcutil.Amount(fee), nil +} diff --git a/btcutil/psbt/psbt_test.go b/btcutil/psbt/psbt_test.go new file mode 100644 index 0000000000..a39f52923a --- /dev/null +++ b/btcutil/psbt/psbt_test.go @@ -0,0 +1,1580 @@ +// Copyright (c) 2018 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package psbt + +import ( + "bytes" + "encoding/base64" + "encoding/binary" + "encoding/hex" + "strings" + "testing" + + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/txscript" + "github.com/btcsuite/btcd/wire" + "github.com/davecgh/go-spew/spew" + "github.com/stretchr/testify/require" +) + +// Test vectors from: +// // https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki#test-vectors + +// createPsbtFromSignedTx is a utility function to create a PSBT from an +// already-signed transaction, so we can test reconstructing, signing and +// extracting it. Returned are: an unsigned transaction serialization, a list +// of scriptSigs, one per input, and a list of witnesses, one per input. +func createPsbtFromSignedTx(serializedSignedTx []byte) ( + *Packet, [][]byte, []wire.TxWitness, error) { + + tx := wire.NewMsgTx(2) + err := tx.Deserialize(bytes.NewReader(serializedSignedTx)) + if err != nil { + return nil, nil, nil, err + } + scriptSigs := make([][]byte, 0, len(tx.TxIn)) + witnesses := make([]wire.TxWitness, 0, len(tx.TxIn)) + tx2 := tx.Copy() + + // Blank out signature info in inputs + for i, tin := range tx2.TxIn { + tin.SignatureScript = nil + scriptSigs = append(scriptSigs, tx.TxIn[i].SignatureScript) + tin.Witness = nil + witnesses = append(witnesses, tx.TxIn[i].Witness) + + } + + // Outputs always contain: (value, scriptPubkey) so don't need + // amending. Now tx2 is tx with all signing data stripped out + unsignedPsbt, err := NewFromUnsignedTx(tx2) + if err != nil { + return nil, nil, nil, err + } + return unsignedPsbt, scriptSigs, witnesses, nil +} + +// These are all valid PSBTs encoded as hex. +var validPsbtHex = map[int]string{ + 0: "70736274ff0100750200000001268171371edff285e937adeea4b37b78000c0566cbb3ad64641713ca42171bf60000000000feffffff02d3dff505000000001976a914d0c59903c5bac2868760e90fd521a4665aa7652088ac00e1f5050000000017a9143545e6e33b832c47050f24d3eeb93c9c03948bc787b32e1300000100fda5010100000000010289a3c71eab4d20e0371bbba4cc698fa295c9463afa2e397f8533ccb62f9567e50100000017160014be18d152a9b012039daf3da7de4f53349eecb985ffffffff86f8aa43a71dff1448893a530a7237ef6b4608bbb2dd2d0171e63aec6a4890b40100000017160014fe3e9ef1a745e974d902c4355943abcb34bd5353ffffffff0200c2eb0b000000001976a91485cff1097fd9e008bb34af709c62197b38978a4888ac72fef84e2c00000017a914339725ba21efd62ac753a9bcd067d6c7a6a39d05870247304402202712be22e0270f394f568311dc7ca9a68970b8025fdd3b240229f07f8a5f3a240220018b38d7dcd314e734c9276bd6fb40f673325bc4baa144c800d2f2f02db2765c012103d2e15674941bad4a996372cb87e1856d3652606d98562fe39c5e9e7e413f210502483045022100d12b852d85dcd961d2f5f4ab660654df6eedcc794c0c33ce5cc309ffb5fce58d022067338a8e0e1725c197fb1a88af59f51e44e4255b20167c8684031c05d1f2592a01210223b72beef0965d10be0778efecd61fcac6f79a4ea169393380734464f84f2ab300000000000000", + 1: "70736274ff0100a00200000002ab0949a08c5af7c49b8212f417e2f15ab3f5c33dcf153821a8139f877a5b7be40000000000feffffffab0949a08c5af7c49b8212f417e2f15ab3f5c33dcf153821a8139f877a5b7be40100000000feffffff02603bea0b000000001976a914768a40bbd740cbe81d988e71de2a4d5c71396b1d88ac8e240000000000001976a9146f4620b553fa095e721b9ee0efe9fa039cca459788ac000000000001076a47304402204759661797c01b036b25928948686218347d89864b719e1f7fcf57d1e511658702205309eabf56aa4d8891ffd111fdf1336f3a29da866d7f8486d75546ceedaf93190121035cdc61fc7ba971c0b501a646a2a83b102cb43881217ca682dc86e2d73fa882920001012000e1f5050000000017a9143545e6e33b832c47050f24d3eeb93c9c03948bc787010416001485d13537f2e265405a34dbafa9e3dda01fb82308000000", + 2: "70736274ff0100750200000001268171371edff285e937adeea4b37b78000c0566cbb3ad64641713ca42171bf60000000000feffffff02d3dff505000000001976a914d0c59903c5bac2868760e90fd521a4665aa7652088ac00e1f5050000000017a9143545e6e33b832c47050f24d3eeb93c9c03948bc787b32e1300000100fda5010100000000010289a3c71eab4d20e0371bbba4cc698fa295c9463afa2e397f8533ccb62f9567e50100000017160014be18d152a9b012039daf3da7de4f53349eecb985ffffffff86f8aa43a71dff1448893a530a7237ef6b4608bbb2dd2d0171e63aec6a4890b40100000017160014fe3e9ef1a745e974d902c4355943abcb34bd5353ffffffff0200c2eb0b000000001976a91485cff1097fd9e008bb34af709c62197b38978a4888ac72fef84e2c00000017a914339725ba21efd62ac753a9bcd067d6c7a6a39d05870247304402202712be22e0270f394f568311dc7ca9a68970b8025fdd3b240229f07f8a5f3a240220018b38d7dcd314e734c9276bd6fb40f673325bc4baa144c800d2f2f02db2765c012103d2e15674941bad4a996372cb87e1856d3652606d98562fe39c5e9e7e413f210502483045022100d12b852d85dcd961d2f5f4ab660654df6eedcc794c0c33ce5cc309ffb5fce58d022067338a8e0e1725c197fb1a88af59f51e44e4255b20167c8684031c05d1f2592a01210223b72beef0965d10be0778efecd61fcac6f79a4ea169393380734464f84f2ab30000000001030401000000000000", + 3: "70736274ff0100a00200000002ab0949a08c5af7c49b8212f417e2f15ab3f5c33dcf153821a8139f877a5b7be40000000000feffffffab0949a08c5af7c49b8212f417e2f15ab3f5c33dcf153821a8139f877a5b7be40100000000feffffff02603bea0b000000001976a914768a40bbd740cbe81d988e71de2a4d5c71396b1d88ac8e240000000000001976a9146f4620b553fa095e721b9ee0efe9fa039cca459788ac00000000000100df0200000001268171371edff285e937adeea4b37b78000c0566cbb3ad64641713ca42171bf6000000006a473044022070b2245123e6bf474d60c5b50c043d4c691a5d2435f09a34a7662a9dc251790a022001329ca9dacf280bdf30740ec0390422422c81cb45839457aeb76fc12edd95b3012102657d118d3357b8e0f4c2cd46db7b39f6d9c38d9a70abcb9b2de5dc8dbfe4ce31feffffff02d3dff505000000001976a914d0c59903c5bac2868760e90fd521a4665aa7652088ac00e1f5050000000017a9143545e6e33b832c47050f24d3eeb93c9c03948bc787b32e13000001012000e1f5050000000017a9143545e6e33b832c47050f24d3eeb93c9c03948bc787010416001485d13537f2e265405a34dbafa9e3dda01fb8230800220202ead596687ca806043edc3de116cdf29d5e9257c196cd055cf698c8d02bf24e9910b4a6ba670000008000000080020000800022020394f62be9df19952c5587768aeb7698061ad2c4a25c894f47d8c162b4d7213d0510b4a6ba6700000080010000800200008000", + 4: "70736274ff0100550200000001279a2323a5dfb51fc45f220fa58b0fc13e1e3342792a85d7e36cd6333b5cbc390000000000ffffffff01a05aea0b000000001976a914ffe9c0061097cc3b636f2cb0460fa4fc427d2b4588ac0000000000010120955eea0b0000000017a9146345200f68d189e1adc0df1c4d16ea8f14c0dbeb87220203b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4646304302200424b58effaaa694e1559ea5c93bbfd4a89064224055cdf070b6771469442d07021f5c8eb0fea6516d60b8acb33ad64ede60e8785bfb3aa94b99bdf86151db9a9a010104220020771fd18ad459666dd49f3d564e3dbc42f4c84774e360ada16816a8ed488d5681010547522103b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd462103de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd52ae220603b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4610b4a6ba67000000800000008004000080220603de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd10b4a6ba670000008000000080050000800000", + 5: "70736274ff01003f0200000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff010000000000000000036a010000000000000a0f0102030405060708090f0102030405060708090a0b0c0d0e0f0000", + 6: "70736274ff01003f0200000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff010000000000000000036a010000000000002206030d097466b7f59162ac4d90bf65f2a31a8bad82fcd22e98138dcf279401939bd104ffffffff0a0f0102030405060708090f0102030405060708090a0b0c0d0e0f0000", + 7: "70736274ff01002001000000000100000000000000000d6a0b68656c6c6f20776f726c64000000000000", +} + +// These are additional valid PSBTs encoded as base64. +var validPsbtBase64 = map[int]string{ + 0: "cHNidP8BAHUCAAAAASaBcTce3/KF6Tet7qSze3gADAVmy7OtZGQXE8pCFxv2AAAAAAD+////AtPf9QUAAAAAGXapFNDFmQPFusKGh2DpD9UhpGZap2UgiKwA4fUFAAAAABepFDVF5uM7gyxHBQ8k0+65PJwDlIvHh7MuEwAAAQD9pQEBAAAAAAECiaPHHqtNIOA3G7ukzGmPopXJRjr6Ljl/hTPMti+VZ+UBAAAAFxYAFL4Y0VKpsBIDna89p95PUzSe7LmF/////4b4qkOnHf8USIk6UwpyN+9rRgi7st0tAXHmOuxqSJC0AQAAABcWABT+Pp7xp0XpdNkCxDVZQ6vLNL1TU/////8CAMLrCwAAAAAZdqkUhc/xCX/Z4Ai7NK9wnGIZeziXikiIrHL++E4sAAAAF6kUM5cluiHv1irHU6m80GfWx6ajnQWHAkcwRAIgJxK+IuAnDzlPVoMR3HyppolwuAJf3TskAinwf4pfOiQCIAGLONfc0xTnNMkna9b7QPZzMlvEuqFEyADS8vAtsnZcASED0uFWdJQbrUqZY3LLh+GFbTZSYG2YVi/jnF6efkE/IQUCSDBFAiEA0SuFLYXc2WHS9fSrZgZU327tzHlMDDPOXMMJ/7X85Y0CIGczio4OFyXBl/saiK9Z9R5E5CVbIBZ8hoQDHAXR8lkqASECI7cr7vCWXRC+B3jv7NYfysb3mk6haTkzgHNEZPhPKrMAAAAAIQ12pWrO2RXSUT3NhMLDeLLoqlzWMrW3HKLyrFsOOmSb2wIBAiENnBLP3ATHRYTXh6w9I3chMsGFJLx6so3sQhm4/FtCX3ABAQAAAA==", + 1: "cHNidP8BAFICAAAAASd0Srq/MCf+DWzyOpbu4u+xiO9SMBlUWFiD5ptmJLJCAAAAAAD/////AUjmBSoBAAAAFgAUdo4e60z0IIZgM/gKzv8PlyB0SWkAAAAAAAEBKwDyBSoBAAAAIlEgWiws9bUs8x+DrS6Npj/wMYPs2PYJx1EK6KSOA5EKB1chFv40kGTJjW4qhT+jybEr2LMEoZwZXGDvp+4jkwRtP6IyGQB3Ky2nVgAAgAEAAIAAAACAAQAAAAAAAAABFyD+NJBkyY1uKoU/o8mxK9izBKGcGVxg76fuI5MEbT+iMgAiAgNrdyptt02HU8mKgnlY3mx4qzMSEJ830+AwRIQkLs5z2Bh3Ky2nVAAAgAEAAIAAAACAAAAAAAAAAAAA", + 2: "cHNidP8BAFICAAAAASd0Srq/MCf+DWzyOpbu4u+xiO9SMBlUWFiD5ptmJLJCAAAAAAD/////AUjmBSoBAAAAFgAUdo4e60z0IIZgM/gKzv8PlyB0SWkAAAAAAAEBKwDyBSoBAAAAIlEgWiws9bUs8x+DrS6Npj/wMYPs2PYJx1EK6KSOA5EKB1cBE0C7U+yRe62dkGrxuocYHEi4as5aritTYFpyXKdGJWMUdvxvW67a9PLuD0d/NvWPOXDVuCc7fkl7l68uPxJcl680IRb+NJBkyY1uKoU/o8mxK9izBKGcGVxg76fuI5MEbT+iMhkAdystp1YAAIABAACAAAAAgAEAAAAAAAAAARcg/jSQZMmNbiqFP6PJsSvYswShnBlcYO+n7iOTBG0/ojIAIgIDa3cqbbdNh1PJioJ5WN5seKszEhCfN9PgMESEJC7Oc9gYdystp1QAAIABAACAAAAAgAAAAAAAAAAAAA==", + 3: "cHNidP8BAF4CAAAAASd0Srq/MCf+DWzyOpbu4u+xiO9SMBlUWFiD5ptmJLJCAAAAAAD/////AUjmBSoBAAAAIlEgg2mORYxmZOFZXXXaJZfeHiLul9eY5wbEwKS1qYI810MAAAAAAAEBKwDyBSoBAAAAIlEgWiws9bUs8x+DrS6Npj/wMYPs2PYJx1EK6KSOA5EKB1chFv40kGTJjW4qhT+jybEr2LMEoZwZXGDvp+4jkwRtP6IyGQB3Ky2nVgAAgAEAAIAAAACAAQAAAAAAAAABFyD+NJBkyY1uKoU/o8mxK9izBKGcGVxg76fuI5MEbT+iMgABBSARJNp67JLM0GyVRWJkf0N7E4uVchqEvivyJ2u92rPmcSEHESTaeuySzNBslUViZH9DexOLlXIahL4r8idrvdqz5nEZAHcrLadWAACAAQAAgAAAAIAAAAAABQAAAAA=", + 4: "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", + 5: "cHNidP8BAF4CAAAAASd0Srq/MCf+DWzyOpbu4u+xiO9SMBlUWFiD5ptmJLJCAAAAAAD/////AUjmBSoBAAAAIlEgCoy9yG3hzhwPnK6yLW33ztNoP+Qj4F0eQCqHk0HW9vUAAAAAAAEBKwDyBSoBAAAAIlEgWiws9bUs8x+DrS6Npj/wMYPs2PYJx1EK6KSOA5EKB1chFv40kGTJjW4qhT+jybEr2LMEoZwZXGDvp+4jkwRtP6IyGQB3Ky2nVgAAgAEAAIAAAACAAQAAAAAAAAABFyD+NJBkyY1uKoU/o8mxK9izBKGcGVxg76fuI5MEbT+iMgABBSBQkpt0waBJVLeLS2A16XpeB4paDyjsltVHv+6azoA6wAEGbwLAIiBzblcpAP4SUliaIUPI88efcaBBLSNTr3VelwHHgmlKAqwCwCIgYxxfO1gyuPvev7GXBM7rMjwh9A96JPQ9aO8MwmsSWWmsAcAiIET6pJoDON5IjI3//s37bzKfOAvVZu8gyN9tgT6rHEJzrCEHRPqkmgM43kiMjf/+zftvMp84C9Vm7yDI322BPqscQnM5AfBreYuSoQ7ZqdC7/Trxc6U7FhfaOkFZygCCFs2Fay4Odystp1YAAIABAACAAQAAgAAAAAADAAAAIQdQkpt0waBJVLeLS2A16XpeB4paDyjsltVHv+6azoA6wAUAfEYeXSEHYxxfO1gyuPvev7GXBM7rMjwh9A96JPQ9aO8MwmsSWWk5ARis5AmIl4Xg6nDO67jhyokqenjq7eDy4pbPQ1lhqPTKdystp1YAAIABAACAAgAAgAAAAAADAAAAIQdzblcpAP4SUliaIUPI88efcaBBLSNTr3VelwHHgmlKAjkBKaW0kVCQFi11mv0/4Pk/ozJgVtC0CIy5M8rngmy42Cx3Ky2nVgAAgAEAAIADAACAAAAAAAMAAAAA", + 6: "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", +} + +// These are all invalid PSBTs for the indicated reasons. +var invalidPsbtHex = map[int]string{ + // wire format, not PSBT format + 0: "0200000001268171371edff285e937adeea4b37b78000c0566cbb3ad64641713ca42171bf6000000006a473044022070b2245123e6bf474d60c5b50c043d4c691a5d2435f09a34a7662a9dc251790a022001329ca9dacf280bdf30740ec0390422422c81cb45839457aeb76fc12edd95b3012102657d118d3357b8e0f4c2cd46db7b39f6d9c38d9a70abcb9b2de5dc8dbfe4ce31feffffff02d3dff505000000001976a914d0c59903c5bac2868760e90fd521a4665aa7652088ac00e1f5050000000017a9143545e6e33b832c47050f24d3eeb93c9c03948bc787b32e1300", + // missing outputs + 1: "70736274ff0100750200000001268171371edff285e937adeea4b37b78000c0566cbb3ad64641713ca42171bf60000000000feffffff02d3dff505000000001976a914d0c59903c5bac2868760e90fd521a4665aa7652088ac00e1f5050000000017a9143545e6e33b832c47050f24d3eeb93c9c03948bc787b32e1300000100fda5010100000000010289a3c71eab4d20e0371bbba4cc698fa295c9463afa2e397f8533ccb62f9567e50100000017160014be18d152a9b012039daf3da7de4f53349eecb985ffffffff86f8aa43a71dff1448893a530a7237ef6b4608bbb2dd2d0171e63aec6a4890b40100000017160014fe3e9ef1a745e974d902c4355943abcb34bd5353ffffffff0200c2eb0b000000001976a91485cff1097fd9e008bb34af709c62197b38978a4888ac72fef84e2c00000017a914339725ba21efd62ac753a9bcd067d6c7a6a39d05870247304402202712be22e0270f394f568311dc7ca9a68970b8025fdd3b240229f07f8a5f3a240220018b38d7dcd314e734c9276bd6fb40f673325bc4baa144c800d2f2f02db2765c012103d2e15674941bad4a996372cb87e1856d3652606d98562fe39c5e9e7e413f210502483045022100d12b852d85dcd961d2f5f4ab660654df6eedcc794c0c33ce5cc309ffb5fce58d022067338a8e0e1725c197fb1a88af59f51e44e4255b20167c8684031c05d1f2592a01210223b72beef0965d10be0778efecd61fcac6f79a4ea169393380734464f84f2ab30000000000", + // Filled in scriptSig in unsigned tx + 2: "70736274ff0100fd0a010200000002ab0949a08c5af7c49b8212f417e2f15ab3f5c33dcf153821a8139f877a5b7be4000000006a47304402204759661797c01b036b25928948686218347d89864b719e1f7fcf57d1e511658702205309eabf56aa4d8891ffd111fdf1336f3a29da866d7f8486d75546ceedaf93190121035cdc61fc7ba971c0b501a646a2a83b102cb43881217ca682dc86e2d73fa88292feffffffab0949a08c5af7c49b8212f417e2f15ab3f5c33dcf153821a8139f877a5b7be40100000000feffffff02603bea0b000000001976a914768a40bbd740cbe81d988e71de2a4d5c71396b1d88ac8e240000000000001976a9146f4620b553fa095e721b9ee0efe9fa039cca459788ac00000000000001012000e1f5050000000017a9143545e6e33b832c47050f24d3eeb93c9c03948bc787010416001485d13537f2e265405a34dbafa9e3dda01fb82308000000", + // No unsigned tx + 3: "70736274ff000100fda5010100000000010289a3c71eab4d20e0371bbba4cc698fa295c9463afa2e397f8533ccb62f9567e50100000017160014be18d152a9b012039daf3da7de4f53349eecb985ffffffff86f8aa43a71dff1448893a530a7237ef6b4608bbb2dd2d0171e63aec6a4890b40100000017160014fe3e9ef1a745e974d902c4355943abcb34bd5353ffffffff0200c2eb0b000000001976a91485cff1097fd9e008bb34af709c62197b38978a4888ac72fef84e2c00000017a914339725ba21efd62ac753a9bcd067d6c7a6a39d05870247304402202712be22e0270f394f568311dc7ca9a68970b8025fdd3b240229f07f8a5f3a240220018b38d7dcd314e734c9276bd6fb40f673325bc4baa144c800d2f2f02db2765c012103d2e15674941bad4a996372cb87e1856d3652606d98562fe39c5e9e7e413f210502483045022100d12b852d85dcd961d2f5f4ab660654df6eedcc794c0c33ce5cc309ffb5fce58d022067338a8e0e1725c197fb1a88af59f51e44e4255b20167c8684031c05d1f2592a01210223b72beef0965d10be0778efecd61fcac6f79a4ea169393380734464f84f2ab30000000000", + // Duplicate keys in an input + 4: "70736274ff0100750200000001268171371edff285e937adeea4b37b78000c0566cbb3ad64641713ca42171bf60000000000feffffff02d3dff505000000001976a914d0c59903c5bac2868760e90fd521a4665aa7652088ac00e1f5050000000017a9143545e6e33b832c47050f24d3eeb93c9c03948bc787b32e1300000100fda5010100000000010289a3c71eab4d20e0371bbba4cc698fa295c9463afa2e397f8533ccb62f9567e50100000017160014be18d152a9b012039daf3da7de4f53349eecb985ffffffff86f8aa43a71dff1448893a530a7237ef6b4608bbb2dd2d0171e63aec6a4890b40100000017160014fe3e9ef1a745e974d902c4355943abcb34bd5353ffffffff0200c2eb0b000000001976a91485cff1097fd9e008bb34af709c62197b38978a4888ac72fef84e2c00000017a914339725ba21efd62ac753a9bcd067d6c7a6a39d05870247304402202712be22e0270f394f568311dc7ca9a68970b8025fdd3b240229f07f8a5f3a240220018b38d7dcd314e734c9276bd6fb40f673325bc4baa144c800d2f2f02db2765c012103d2e15674941bad4a996372cb87e1856d3652606d98562fe39c5e9e7e413f210502483045022100d12b852d85dcd961d2f5f4ab660654df6eedcc794c0c33ce5cc309ffb5fce58d022067338a8e0e1725c197fb1a88af59f51e44e4255b20167c8684031c05d1f2592a01210223b72beef0965d10be0778efecd61fcac6f79a4ea169393380734464f84f2ab30000000001003f0200000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff010000000000000000036a010000000000000000", + // Invalid global transaction typed key + 5: "70736274ff020001550200000001279a2323a5dfb51fc45f220fa58b0fc13e1e3342792a85d7e36cd6333b5cbc390000000000ffffffff01a05aea0b000000001976a914ffe9c0061097cc3b636f2cb0460fa4fc427d2b4588ac0000000000010120955eea0b0000000017a9146345200f68d189e1adc0df1c4d16ea8f14c0dbeb87220203b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4646304302200424b58effaaa694e1559ea5c93bbfd4a89064224055cdf070b6771469442d07021f5c8eb0fea6516d60b8acb33ad64ede60e8785bfb3aa94b99bdf86151db9a9a010104220020771fd18ad459666dd49f3d564e3dbc42f4c84774e360ada16816a8ed488d5681010547522103b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd462103de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd52ae220603b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4610b4a6ba67000000800000008004000080220603de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd10b4a6ba670000008000000080050000800000", + // Invalid input witness utxo typed key + 6: "70736274ff0100550200000001279a2323a5dfb51fc45f220fa58b0fc13e1e3342792a85d7e36cd6333b5cbc390000000000ffffffff01a05aea0b000000001976a914ffe9c0061097cc3b636f2cb0460fa4fc427d2b4588ac000000000002010020955eea0b0000000017a9146345200f68d189e1adc0df1c4d16ea8f14c0dbeb87220203b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4646304302200424b58effaaa694e1559ea5c93bbfd4a89064224055cdf070b6771469442d07021f5c8eb0fea6516d60b8acb33ad64ede60e8785bfb3aa94b99bdf86151db9a9a010104220020771fd18ad459666dd49f3d564e3dbc42f4c84774e360ada16816a8ed488d5681010547522103b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd462103de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd52ae220603b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4610b4a6ba67000000800000008004000080220603de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd10b4a6ba670000008000000080050000800000", + // Invalid pubkey length for input partial signature typed key + 7: "70736274ff0100550200000001279a2323a5dfb51fc45f220fa58b0fc13e1e3342792a85d7e36cd6333b5cbc390000000000ffffffff01a05aea0b000000001976a914ffe9c0061097cc3b636f2cb0460fa4fc427d2b4588ac0000000000010120955eea0b0000000017a9146345200f68d189e1adc0df1c4d16ea8f14c0dbeb87210203b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd46304302200424b58effaaa694e1559ea5c93bbfd4a89064224055cdf070b6771469442d07021f5c8eb0fea6516d60b8acb33ad64ede60e8785bfb3aa94b99bdf86151db9a9a010104220020771fd18ad459666dd49f3d564e3dbc42f4c84774e360ada16816a8ed488d5681010547522103b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd462103de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd52ae220603b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4610b4a6ba67000000800000008004000080220603de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd10b4a6ba670000008000000080050000800000", + // Invalid redeemscript typed key + 8: "70736274ff0100550200000001279a2323a5dfb51fc45f220fa58b0fc13e1e3342792a85d7e36cd6333b5cbc390000000000ffffffff01a05aea0b000000001976a914ffe9c0061097cc3b636f2cb0460fa4fc427d2b4588ac0000000000010120955eea0b0000000017a9146345200f68d189e1adc0df1c4d16ea8f14c0dbeb87220203b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4646304302200424b58effaaa694e1559ea5c93bbfd4a89064224055cdf070b6771469442d07021f5c8eb0fea6516d60b8acb33ad64ede60e8785bfb3aa94b99bdf86151db9a9a01020400220020771fd18ad459666dd49f3d564e3dbc42f4c84774e360ada16816a8ed488d5681010547522103b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd462103de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd52ae220603b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4610b4a6ba67000000800000008004000080220603de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd10b4a6ba670000008000000080050000800000", + // Invalid witness script typed key + 9: "70736274ff0100550200000001279a2323a5dfb51fc45f220fa58b0fc13e1e3342792a85d7e36cd6333b5cbc390000000000ffffffff01a05aea0b000000001976a914ffe9c0061097cc3b636f2cb0460fa4fc427d2b4588ac0000000000010120955eea0b0000000017a9146345200f68d189e1adc0df1c4d16ea8f14c0dbeb87220203b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4646304302200424b58effaaa694e1559ea5c93bbfd4a89064224055cdf070b6771469442d07021f5c8eb0fea6516d60b8acb33ad64ede60e8785bfb3aa94b99bdf86151db9a9a010104220020771fd18ad459666dd49f3d564e3dbc42f4c84774e360ada16816a8ed488d568102050047522103b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd462103de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd52ae220603b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4610b4a6ba67000000800000008004000080220603de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd10b4a6ba670000008000000080050000800000", + // Invalid bip32 typed key + 10: "70736274ff0100550200000001279a2323a5dfb51fc45f220fa58b0fc13e1e3342792a85d7e36cd6333b5cbc390000000000ffffffff01a05aea0b000000001976a914ffe9c0061097cc3b636f2cb0460fa4fc427d2b4588ac0000000000010120955eea0b0000000017a9146345200f68d189e1adc0df1c4d16ea8f14c0dbeb87220203b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4646304302200424b58effaaa694e1559ea5c93bbfd4a89064224055cdf070b6771469442d07021f5c8eb0fea6516d60b8acb33ad64ede60e8785bfb3aa94b99bdf86151db9a9a010104220020771fd18ad459666dd49f3d564e3dbc42f4c84774e360ada16816a8ed488d5681010547522103b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd462103de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd52ae210603b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd10b4a6ba67000000800000008004000080220603de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd10b4a6ba670000008000000080050000800000", + // Invalid non-witness utxo typed key + 11: "70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f0000000000020000bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f6187650000000107da00473044022074018ad4180097b873323c0015720b3684cc8123891048e7dbcd9b55ad679c99022073d369b740e3eb53dcefa33823c8070514ca55a7dd9544f157c167913261118c01483045022100f61038b308dc1da865a34852746f015772934208c6d24454393cd99bdf2217770220056e675a675a6d0a02b85b14e5e29074d8a25a9b5760bea2816f661910a006ea01475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae0001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e8870107232200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b20289030108da0400473044022062eb7a556107a7c73f45ac4ab5a1dddf6f7075fb1275969a7f383efff784bcb202200c05dbb7470dbf2f08557dd356c7325c1ed30913e996cd3840945db12228da5f01473044022065f45ba5998b59a27ffe1a7bed016af1f1f90d54b3aa8f7450aa5f56a25103bd02207f724703ad1edb96680b284b56d4ffcb88f7fb759eabbe08aa30f29b851383d20147522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae00220203a9a4c37f5996d3aa25dbac6b570af0650394492942460b354753ed9eeca5877110d90c6a4f000000800000008004000080002202027f6399757d2eff55a136ad02c684b1838b6556e5f1b6b34282a94b6b5005109610d90c6a4f00000080000000800500008000", + // Invalid final scriptsig typed key + 12: "70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f618765000000020700da00473044022074018ad4180097b873323c0015720b3684cc8123891048e7dbcd9b55ad679c99022073d369b740e3eb53dcefa33823c8070514ca55a7dd9544f157c167913261118c01483045022100f61038b308dc1da865a34852746f015772934208c6d24454393cd99bdf2217770220056e675a675a6d0a02b85b14e5e29074d8a25a9b5760bea2816f661910a006ea01475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae0001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e8870107232200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b20289030108da0400473044022062eb7a556107a7c73f45ac4ab5a1dddf6f7075fb1275969a7f383efff784bcb202200c05dbb7470dbf2f08557dd356c7325c1ed30913e996cd3840945db12228da5f01473044022065f45ba5998b59a27ffe1a7bed016af1f1f90d54b3aa8f7450aa5f56a25103bd02207f724703ad1edb96680b284b56d4ffcb88f7fb759eabbe08aa30f29b851383d20147522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae00220203a9a4c37f5996d3aa25dbac6b570af0650394492942460b354753ed9eeca5877110d90c6a4f000000800000008004000080002202027f6399757d2eff55a136ad02c684b1838b6556e5f1b6b34282a94b6b5005109610d90c6a4f00000080000000800500008000", + // Invalid final script witness typed key + 13: "70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f6187650000000107da00473044022074018ad4180097b873323c0015720b3684cc8123891048e7dbcd9b55ad679c99022073d369b740e3eb53dcefa33823c8070514ca55a7dd9544f157c167913261118c01483045022100f61038b308dc1da865a34852746f015772934208c6d24454393cd99bdf2217770220056e675a675a6d0a02b85b14e5e29074d8a25a9b5760bea2816f661910a006ea01475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae0001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e8870107232200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903020800da0400473044022062eb7a556107a7c73f45ac4ab5a1dddf6f7075fb1275969a7f383efff784bcb202200c05dbb7470dbf2f08557dd356c7325c1ed30913e996cd3840945db12228da5f01473044022065f45ba5998b59a27ffe1a7bed016af1f1f90d54b3aa8f7450aa5f56a25103bd02207f724703ad1edb96680b284b56d4ffcb88f7fb759eabbe08aa30f29b851383d20147522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae00220203a9a4c37f5996d3aa25dbac6b570af0650394492942460b354753ed9eeca5877110d90c6a4f000000800000008004000080002202027f6399757d2eff55a136ad02c684b1838b6556e5f1b6b34282a94b6b5005109610d90c6a4f00000080000000800500008000", + // Invalid pubkey in output BIP32 derivation paths typed key + 14: "70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f6187650000000107da00473044022074018ad4180097b873323c0015720b3684cc8123891048e7dbcd9b55ad679c99022073d369b740e3eb53dcefa33823c8070514ca55a7dd9544f157c167913261118c01483045022100f61038b308dc1da865a34852746f015772934208c6d24454393cd99bdf2217770220056e675a675a6d0a02b85b14e5e29074d8a25a9b5760bea2816f661910a006ea01475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae0001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e8870107232200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b20289030108da0400473044022062eb7a556107a7c73f45ac4ab5a1dddf6f7075fb1275969a7f383efff784bcb202200c05dbb7470dbf2f08557dd356c7325c1ed30913e996cd3840945db12228da5f01473044022065f45ba5998b59a27ffe1a7bed016af1f1f90d54b3aa8f7450aa5f56a25103bd02207f724703ad1edb96680b284b56d4ffcb88f7fb759eabbe08aa30f29b851383d20147522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae00210203a9a4c37f5996d3aa25dbac6b570af0650394492942460b354753ed9eeca58710d90c6a4f000000800000008004000080002202027f6399757d2eff55a136ad02c684b1838b6556e5f1b6b34282a94b6b5005109610d90c6a4f00000080000000800500008000", + // Invalid input sighash type typed key + 15: "70736274ff0100730200000001301ae986e516a1ec8ac5b4bc6573d32f83b465e23ad76167d68b38e730b4dbdb0000000000ffffffff02747b01000000000017a91403aa17ae882b5d0d54b25d63104e4ffece7b9ea2876043993b0000000017a914b921b1ba6f722e4bfa83b6557a3139986a42ec8387000000000001011f00ca9a3b00000000160014d2d94b64ae08587eefc8eeb187c601e939f9037c0203000100000000010016001462e9e982fff34dd8239610316b090cd2a3b747cb000100220020876bad832f1d168015ed41232a9ea65a1815d9ef13c0ef8759f64b5b2b278a65010125512103b7ce23a01c5b4bf00a642537cdfabb315b668332867478ef51309d2bd57f8a8751ae00", + // Invalid output redeemscript typed key + 16: "70736274ff0100730200000001301ae986e516a1ec8ac5b4bc6573d32f83b465e23ad76167d68b38e730b4dbdb0000000000ffffffff02747b01000000000017a91403aa17ae882b5d0d54b25d63104e4ffece7b9ea2876043993b0000000017a914b921b1ba6f722e4bfa83b6557a3139986a42ec8387000000000001011f00ca9a3b00000000160014d2d94b64ae08587eefc8eeb187c601e939f9037c0002000016001462e9e982fff34dd8239610316b090cd2a3b747cb000100220020876bad832f1d168015ed41232a9ea65a1815d9ef13c0ef8759f64b5b2b278a65010125512103b7ce23a01c5b4bf00a642537cdfabb315b668332867478ef51309d2bd57f8a8751ae00", + // Invalid output witnessScript typed key + 17: "70736274ff0100730200000001301ae986e516a1ec8ac5b4bc6573d32f83b465e23ad76167d68b38e730b4dbdb0000000000ffffffff02747b01000000000017a91403aa17ae882b5d0d54b25d63104e4ffece7b9ea2876043993b0000000017a914b921b1ba6f722e4bfa83b6557a3139986a42ec8387000000000001011f00ca9a3b00000000160014d2d94b64ae08587eefc8eeb187c601e939f9037c00010016001462e9e982fff34dd8239610316b090cd2a3b747cb000100220020876bad832f1d168015ed41232a9ea65a1815d9ef13c0ef8759f64b5b2b278a6521010025512103b7ce23a01c5b4bf00a642537cdfabb315b668332867478ef51309d2bd57f8a8751ae00", + // Additional cases outside the existing test vectors. + // Invalid duplicate PartialSig + 18: "70736274ff0100550200000001279a2323a5dfb51fc45f220fa58b0fc13e1e3342792a85d7e36cd6333b5cbc390000000000ffffffff01a05aea0b000000001976a914ffe9c0061097cc3b636f2cb0460fa4fc427d2b4588ac0000000000010120955eea0b0000000017a9146345200f68d189e1adc0df1c4d16ea8f14c0dbeb87220203b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4646304302200424b58effaaa694e1559ea5c93bbfd4a89064224055cdf070b6771469442d07021f5c8eb0fea6516d60b8acb33ad64ede60e8785bfb3aa94b99bdf86151db9a9a01220203b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4646304302200424b58effaaa694e1559ea5c93bbfd4a89064224055cdf070b6771469442d07021f5c8eb0fea6516d60b8acb33ad64ede60e8785bfb3aa94b99bdf86151db9a9a010104220020771fd18ad459666dd49f3d564e3dbc42f4c84774e360ada16816a8ed488d5681010547522103b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd462103de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd52ae220603b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4610b4a6ba67000000800000008004000080220603de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd10b4a6ba670000008000000080050000800000", + // Invalid duplicate BIP32 derivation (different derivs, same key) + 19: "70736274ff0100550200000001279a2323a5dfb51fc45f220fa58b0fc13e1e3342792a85d7e36cd6333b5cbc390000000000ffffffff01a05aea0b000000001976a914ffe9c0061097cc3b636f2cb0460fa4fc427d2b4588ac0000000000010120955eea0b0000000017a9146345200f68d189e1adc0df1c4d16ea8f14c0dbeb87220203b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4646304302200424b58effaaa694e1559ea5c93bbfd4a89064224055cdf070b6771469442d07021f5c8eb0fea6516d60b8acb33ad64ede60e8785bfb3aa94b99bdf86151db9a9a010104220020771fd18ad459666dd49f3d564e3dbc42f4c84774e360ada16816a8ed488d5681010547522103b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd462103de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd52ae220603b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4610b4a6ba67000000800000008004000080220603b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4610b4a6ba670000008000000080050000800000", + // Invalid var int for key type + 20: "70736274ff01001c000000000002000000000000000000000000736210ff01000001010010ff70ff01001c00000000000000000000000000000000000000000000", +} + +// All following PSBTs are Taproot specific invalid packets taken from +// https://github.com/bitcoin/bitcoin/pull/22558. +var invalidPsbtBase64 = map[int]string{ + // Invalid input internal key length. + 0: "cHNidP8BAHECAAAAASd0Srq/MCf+DWzyOpbu4u+xiO9SMBlUWFiD5ptmJLJCAAAAAAD/////Anh8AQAAAAAAFgAUg6fjS9mf8DpJYu+KGhAbspVGHs5gawQqAQAAABYAFHrDad8bIOAz1hFmI5V7CsSfPFLoAAAAAAABASsA8gUqAQAAACJRIFosLPW1LPMfg60ujaY/8DGD7Nj2CcdRCuikjgORCgdXARchAv40kGTJjW4qhT+jybEr2LMEoZwZXGDvp+4jkwRtP6IyAAAA", + // Invalid input key spend schnorr signature. + 1: "cHNidP8BAHECAAAAASd0Srq/MCf+DWzyOpbu4u+xiO9SMBlUWFiD5ptmJLJCAAAAAAD/////Anh8AQAAAAAAFgAUg6fjS9mf8DpJYu+KGhAbspVGHs5gawQqAQAAABYAFHrDad8bIOAz1hFmI5V7CsSfPFLoAAAAAAABASsA8gUqAQAAACJRIFosLPW1LPMfg60ujaY/8DGD7Nj2CcdRCuikjgORCgdXARM/Fzuz02wHSvtxb+xjB6BpouRQuZXzyCeFlFq43w4kJg3NcDsMvzTeOZGEqUgawrNYbbZgHwJqd/fkk4SBvDR1AAAA", + // Invalid input key spend signature length. + 2: "cHNidP8BAHECAAAAASd0Srq/MCf+DWzyOpbu4u+xiO9SMBlUWFiD5ptmJLJCAAAAAAD/////Anh8AQAAAAAAFgAUg6fjS9mf8DpJYu+KGhAbspVGHs5gawQqAQAAABYAFHrDad8bIOAz1hFmI5V7CsSfPFLoAAAAAAABASsA8gUqAQAAACJRIFosLPW1LPMfg60ujaY/8DGD7Nj2CcdRCuikjgORCgdXARNCFzuz02wHSvtxb+xjB6BpouRQuZXzyCeFlFq43w4kJg3NcDsMvzTeOZGEqUgawrNYbbZgHwJqd/fkk4SBvDR1FwGqAAAA", + // Invalid input x-only pubkey in key. + 3: "cHNidP8BAHECAAAAASd0Srq/MCf+DWzyOpbu4u+xiO9SMBlUWFiD5ptmJLJCAAAAAAD/////Anh8AQAAAAAAFgAUg6fjS9mf8DpJYu+KGhAbspVGHs5gawQqAQAAABYAFHrDad8bIOAz1hFmI5V7CsSfPFLoAAAAAAABASsA8gUqAQAAACJRIFosLPW1LPMfg60ujaY/8DGD7Nj2CcdRCuikjgORCgdXIhYC/jSQZMmNbiqFP6PJsSvYswShnBlcYO+n7iOTBG0/ojIZAHcrLadWAACAAQAAgAAAAIABAAAAAAAAAAAAAA==", + // Invalid output internal key length. + 4: "cHNidP8BAH0CAAAAASd0Srq/MCf+DWzyOpbu4u+xiO9SMBlUWFiD5ptmJLJCAAAAAAD/////Aoh7AQAAAAAAFgAUI4KHHH6EIaAAk/dU2RKB5nWHS59gawQqAQAAACJRIFosLPW1LPMfg60ujaY/8DGD7Nj2CcdRCuikjgORCgdXAAAAAAABASsA8gUqAQAAACJRIFosLPW1LPMfg60ujaY/8DGD7Nj2CcdRCuikjgORCgdXAAABBSEC/jSQZMmNbiqFP6PJsSvYswShnBlcYO+n7iOTBG0/ojIA", + // Invalid output BIP32 derivation x-only pubkey in key. + 5: "cHNidP8BAH0CAAAAASd0Srq/MCf+DWzyOpbu4u+xiO9SMBlUWFiD5ptmJLJCAAAAAAD/////Aoh7AQAAAAAAFgAUI4KHHH6EIaAAk/dU2RKB5nWHS59gawQqAQAAACJRIFosLPW1LPMfg60ujaY/8DGD7Nj2CcdRCuikjgORCgdXAAAAAAABASsA8gUqAQAAACJRIFosLPW1LPMfg60ujaY/8DGD7Nj2CcdRCuikjgORCgdXAAAiBwL+NJBkyY1uKoU/o8mxK9izBKGcGVxg76fuI5MEbT+iMhkAdystp1YAAIABAACAAAAAgAEAAAAAAAAAAA==", + // Invalid input script spend signature key length. + 6: "cHNidP8BAF4CAAAAAZvUh2UjC/mnLmYgAflyVW5U8Mb5f+tWvLVgDYF/aZUmAQAAAAD/////AUjmBSoBAAAAIlEgAw2k/OT32yjCyylRYx4ANxOFZZf+ljiCy1AOaBEsymMAAAAAAAEBKwDyBSoBAAAAIlEgwiR++/2SrEf29AuNQtFpF1oZ+p+hDkol1/NetN2FtpJCFAIssTrGgkjegGqmo2Wc88A+toIdCcgRSk6Gj+vehlu20s2XDhX1P8DIL5UP1WD/qRm3YXK+AXNoqJkTrwdPQAsJQIl1aqNznMxonsD886NgvjLMC1mxbpOh6LtGBXJrLKej/3BsQXZkljKyzGjh+RK4pXjjcZzncQiFx6lm9JvNQ8sAAA==", + // Invalid input script spend signature length. + 7: "cHNidP8BAF4CAAAAAZvUh2UjC/mnLmYgAflyVW5U8Mb5f+tWvLVgDYF/aZUmAQAAAAD/////AUjmBSoBAAAAIlEgAw2k/OT32yjCyylRYx4ANxOFZZf+ljiCy1AOaBEsymMAAAAAAAEBKwDyBSoBAAAAIlEgwiR++/2SrEf29AuNQtFpF1oZ+p+hDkol1/NetN2FtpJBFCyxOsaCSN6AaqajZZzzwD62gh0JyBFKToaP696GW7bSzZcOFfU/wMgvlQ/VYP+pGbdhcr4Bc2iomROvB09ACwlCiXVqo3OczGiewPzzo2C+MswLWbFuk6Hou0YFcmssp6P/cGxBdmSWMrLMaOH5ErileONxnOdxCIXHqWb0m81DywEBAAA=", + // Invalid encoding of base64 stream. + 8: "cHNidP8BAF4CAAAAAZvUh2UjC/mnLmYgAflyVW5U8Mb5f+tWvLVgDYF/aZUmAQAAAAD/////AUjmBSoBAAAAIlEgAw2k/OT32yjCyylRYx4ANxOFZZf+ljiCy1AOaBEsymMAAAAAAAEBKwDyBSoBAAAAIlEgwiR++/2SrEf29AuNQtFpF1oZ+p+hDkol1/NetN2FtpJBFCyxOsaCSN6AaqajZZzzwD62gh0JyBFKToaP696GW7bSzZcOFfU/wMgvlQ/VYP+pGbdhcr4Bc2iomROvB09ACwk5iXVqo3OczGiewPzzo2C+MswLWbFuk6Hou0YFcmssp6P/cGxBdmSWMrLMaOH5ErileONxnOdxCIXHqWb0m81DywAA", + // Invalid input leaf script type control block. + 9: "cHNidP8BAF4CAAAAAZvUh2UjC/mnLmYgAflyVW5U8Mb5f+tWvLVgDYF/aZUmAQAAAAD/////AUjmBSoBAAAAIlEgAw2k/OT32yjCyylRYx4ANxOFZZf+ljiCy1AOaBEsymMAAAAAAAEBKwDyBSoBAAAAIlEgwiR++/2SrEf29AuNQtFpF1oZ+p+hDkol1/NetN2FtpJjFcFQkpt0waBJVLeLS2A16XpeB4paDyjsltVHv+6azoA6wG99YgWelJehpKJnVp2YdtpgEBr/OONSm5uTnOf5GulwEV8uSQr3zEXE94UR82BXzlxaXFYyWin7RN/CA/NW4fgAIyAssTrGgkjegGqmo2Wc88A+toIdCcgRSk6Gj+vehlu20qzAAAA=", + // Invalid input leaf script type control block. + 10: "cHNidP8BAF4CAAAAAZvUh2UjC/mnLmYgAflyVW5U8Mb5f+tWvLVgDYF/aZUmAQAAAAD/////AUjmBSoBAAAAIlEgAw2k/OT32yjCyylRYx4ANxOFZZf+ljiCy1AOaBEsymMAAAAAAAEBKwDyBSoBAAAAIlEgwiR++/2SrEf29AuNQtFpF1oZ+p+hDkol1/NetN2FtpJhFcFQkpt0waBJVLeLS2A16XpeB4paDyjsltVHv+6azoA6wG99YgWelJehpKJnVp2YdtpgEBr/OONSm5uTnOf5GulwEV8uSQr3zEXE94UR82BXzlxaXFYyWin7RN/CA/NW4SMgLLE6xoJI3oBqpqNlnPPAPraCHQnIEUpOho/r3oZbttKswAAA", +} + +// This tests that valid PSBT serializations can be parsed +// into Psbt structs. +func TestReadValidPsbtAndReserialize(t *testing.T) { + for key, v := range validPsbtHex { + psbtBytes, err := hex.DecodeString(v) + require.NoErrorf(t, err, "%d: hex decode", key) + + testPsbt, err := NewFromRawBytes( + bytes.NewReader(psbtBytes), false, + ) + require.NoErrorf(t, err, "%d: parse", key) + + t.Logf("Successfully parsed test %d, got transaction: %v", + key, spew.Sdump(testPsbt.UnsignedTx)) + + var b bytes.Buffer + err = testPsbt.Serialize(&b) + require.NoErrorf(t, err, "%d: serialize", key) + if err != nil { + t.Fatalf("Unable to serialize created Psbt: %v", err) + } + + require.Equal(t, psbtBytes, b.Bytes(), "%d: serialized", key) + } + + for key, v := range validPsbtBase64 { + testPsbt, err := NewFromRawBytes( + strings.NewReader(v), true, + ) + require.NoErrorf(t, err, "%d: parse", key) + + t.Logf("Successfully parsed test %d, got transaction: %v", + key, spew.Sdump(testPsbt.UnsignedTx)) + + var b bytes.Buffer + err = testPsbt.Serialize(&b) + require.NoErrorf(t, err, "%d: serialize", key) + if err != nil { + t.Fatalf("Unable to serialize created Psbt: %v", err) + } + + base64Packet := base64.StdEncoding.EncodeToString(b.Bytes()) + require.Equal(t, v, base64Packet, "%d: serialized", key) + } +} + +func TestReadInvalidPsbt(t *testing.T) { + for key, v := range invalidPsbtHex { + psbtBytes, err := hex.DecodeString(v) + require.NoErrorf(t, err, "%d: hex decode", key) + + _, err = NewFromRawBytes(bytes.NewReader(psbtBytes), false) + require.Errorf(t, err, "%d: new from raw bytes", key) + + t.Logf("Correctly got error: %v", err) + } + + for key, v := range invalidPsbtBase64 { + _, err := NewFromRawBytes(strings.NewReader(v), true) + require.Errorf(t, err, "%d: new from raw bytes", key) + + t.Logf("Correctly got error: %v", err) + } +} + +func TestSanityCheck(t *testing.T) { + // TODO(guggero): Remove when checks for segwit v1 are implemented. + t.Skip("Skipping PSBT sanity checks for segwit v0.") + + // Test strategy: + // 1. Create an invalid PSBT from a serialization + // Then ensure that the sanity check fails. + // 2. Create a valid PSBT from a serialization + // Then create an updater, add a witness utxo to a non-witness + // utxo. + // Then ensure that the sanity check fails. + // Then add a witnessScript field to a non-witness utxo. + // Then ensure that the sanity check fails. + + // index 1 contains a psbt with two inputs, first non-witness, + // second witness. + psbtraw1, err := hex.DecodeString(validPsbtHex[1]) + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + psbt1, err := NewFromRawBytes(bytes.NewReader(psbtraw1), false) + if err != nil { + t.Fatalf("Unable to create Psbt struct: %v", err) + } + + // Add a non-witness utxo field to input2 using raw insertion function, + // so that it becomes invalid, then NewUpdater should fail. + nonWitnessUtxoRaw, err := hex.DecodeString( + CUTestHexData["NonWitnessUtxo"], + ) + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + nonWitnessUtxo := wire.NewMsgTx(2) + err = nonWitnessUtxo.Deserialize(bytes.NewReader(nonWitnessUtxoRaw)) + if err != nil { + t.Fatalf("Unable to deserialize: %v", err) + } + inputs1 := &psbt1.Inputs[1] + inputs1.NonWitnessUtxo = nonWitnessUtxo + + // The PSBT is now in an inconsistent state; Updater creation should + // fail. + updater, err := NewUpdater(psbt1) + if err == nil { + t.Fatalf("Failed to identify invalid PSBT state ( " + + "witness, non-witness fields)") + } + + // Overwrite back with the correct psbt + psbtraw1, err = hex.DecodeString(validPsbtHex[1]) + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + psbt1, err = NewFromRawBytes(bytes.NewReader(psbtraw1), false) + updater, err = NewUpdater(psbt1) + if err != nil { + t.Fatalf("Unable to create Updater: %v", err) + } + + // Create a fake non-witness utxo field to overlap with + // the existing witness input at index 1. + tx := wire.NewMsgTx(2) + err = tx.Deserialize(bytes.NewReader(nonWitnessUtxoRaw)) + if err != nil { + t.Fatalf("Error deserializing transaction: %v", err) + } + err = updater.AddInNonWitnessUtxo(tx, 1) + if err == nil { + t.Fatalf("Incorrectly accepted Psbt with conflicting witness " + + "and non-witness utxo entries in the same input.") + } + + // Now we try again; this time we try to add a witnessScript + // key-value pair to an input which is non-witness, which should + // also be rejected. + psbt2, err := NewFromRawBytes( + bytes.NewReader(psbtraw1), false, + ) + if err != nil { + t.Fatalf("Unable to create Psbt struct: %v", err) + } + updater2, err := NewUpdater(psbt2) + if err != nil { + t.Fatalf("Got error creating updater2: %v", err) + } + witnessScript, err := hex.DecodeString( + CUTestHexData["Input2WitnessScript"]) + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + err = updater2.AddInWitnessScript(witnessScript, 0) + if err == nil { + t.Fatalf("Incorrectly accepted adding witness script field " + + "to non-witness utxo") + } +} + +// Data for creation and updating tests +// =============================================================================== +var CUTestHexData = map[string]string{ + "scriptPubkey1": "0014d85c2b71d0060b09c9886aeb815e50991dda124d", + "scriptPubkey2": "001400aea9a2e5f0f876a588df5546e8742d1d87008f", + "txid1": "75ddabb27b8845f5247975c8a5ba7c6f336c4570708ebe230caf6db5217ae858", + "txid2": "1dea7cd05979072a3578cab271c02244ea8a090bbb46aa680a65ecd027048d83", + "COPsbtHex": "70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f000000000000000000", + "NonWitnessUtxo": "0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f618765000000", + "WitnessUtxo": "00c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e887", + // After adding witnessutxo and nonwitness utxo to inputs: + "UOPsbtHex": "70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f6187650000000001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e887000000", + "Input1RedeemScript": "5221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae", + "Input2RedeemScript": "00208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903", + "Input2WitnessScript": "522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae", + // After adding redeemscripts and witness scripts to inputs: + "UOPsbtHex2": "70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f6187650000000104475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae0001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e88701042200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903010547522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae000000", + // After adding bip32 derivations to inputs and outputs: + "UOPsbtHex3": "70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f6187650000000104475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae2206029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f10d90c6a4f000000800000008000000080220602dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d710d90c6a4f0000008000000080010000800001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e88701042200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903010547522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae2206023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7310d90c6a4f000000800000008003000080220603089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc10d90c6a4f00000080000000800200008000220203a9a4c37f5996d3aa25dbac6b570af0650394492942460b354753ed9eeca5877110d90c6a4f000000800000008004000080002202027f6399757d2eff55a136ad02c684b1838b6556e5f1b6b34282a94b6b5005109610d90c6a4f00000080000000800500008000", + //After adding sighash types to inputs + "UOPsbtHex4": "70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f618765000000010304010000000104475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae2206029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f10d90c6a4f000000800000008000000080220602dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d710d90c6a4f0000008000000080010000800001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e8870103040100000001042200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903010547522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae2206023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7310d90c6a4f000000800000008003000080220603089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc10d90c6a4f00000080000000800200008000220203a9a4c37f5996d3aa25dbac6b570af0650394492942460b354753ed9eeca5877110d90c6a4f000000800000008004000080002202027f6399757d2eff55a136ad02c684b1838b6556e5f1b6b34282a94b6b5005109610d90c6a4f00000080000000800500008000", +} + +// Just one example sanity check of B64 construction; after sighash appending above +var CUTestB64Data = map[string]string{ + "UOPsbtB644": "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABTYXCtx0AYLCcmIauuBXlCZHdoSTQDh9QUAAAAAFgAUAK6pouXw+HaliN9VRuh0LR2HAI8AAAAAAAEAuwIAAAABqtc5MQGL0l+ErkALaISL4J23BurCrBgpi6vucatlb4sAAAAASEcwRAIgWPb8fGoz4bMVSNSByCbAFb0wE1qtQs1neQ2rZtKtJDsCIEoc7SYExnNbY5PltBaR3XiwDwxZQvufdRhW+qk4FX26Af7///8CgPD6AgAAAAAXqRQPuUY0IWlrgsgzryQceMF9295JNIfQ8gonAQAAABepFCnKdPigj4GZlCgYXJe12FLkBj9hh2UAAAABAwQBAAAAAQRHUiEClYO/Oa4KYJdHrRma3dY0+mEIVZ1sXNObTCGD8auW4H8hAtq2H/SaFNtqfQKwzR+7ePxLGDErW05U2uTbovv+9TbXUq4iBgKVg785rgpgl0etGZrd1jT6YQhVnWxc05tMIYPxq5bgfxDZDGpPAAAAgAAAAIAAAACAIgYC2rYf9JoU22p9ArDNH7t4/EsYMStbTlTa5Nui+/71NtcQ2QxqTwAAAIAAAACAAQAAgAABASAAwusLAAAAABepFLf1+vQOPUClpFmx2zU18rcvqSHohwEDBAEAAAABBCIAIIwjUxc3Q7WV37Sge3K6jkLjeX2nTof+fZ10l+OyAokDAQVHUiEDCJ3BDHrG21T5EymvYXMz2ziM6tDCMfcjN50bmQMLAtwhAjrdkE89bc9Z3bkGsN7iNSm3/7ntUOXoYVGSaGAiHw5zUq4iBgI63ZBPPW3PWd25BrDe4jUpt/+57VDl6GFRkmhgIh8OcxDZDGpPAAAAgAAAAIADAACAIgYDCJ3BDHrG21T5EymvYXMz2ziM6tDCMfcjN50bmQMLAtwQ2QxqTwAAAIAAAACAAgAAgAAiAgOppMN/WZbTqiXbrGtXCvBlA5RJKUJGCzVHU+2e7KWHcRDZDGpPAAAAgAAAAIAEAACAACICAn9jmXV9Lv9VoTatAsaEsYOLZVbl8bazQoKpS2tQBRCWENkMak8AAACAAAAAgAUAAIAA", +} + +var CUTestAmountData = map[string]int64{ + "amount1": 149990000, + "amount2": 100000000, + "amount3": 200000000, +} + +var CUTestIndexData = map[string]uint32{ + "index1": 0, + "index2": 1, +} + +var CUMasterKeyFingerPrint = "d90c6a4f" + +var CUTestPathData = map[string][]uint32{ + "dpath1": {0 + 0x80000000, 0 + 0x80000000, 0 + 0x80000000}, + "dpath2": {0 + 0x80000000, 0 + 0x80000000, 1 + 0x80000000}, + "dpath3": {0 + 0x80000000, 0 + 0x80000000, 2 + 0x80000000}, + "dpath4": {0 + 0x80000000, 0 + 0x80000000, 3 + 0x80000000}, + "dpath5": {0 + 0x80000000, 0 + 0x80000000, 4 + 0x80000000}, + "dpath6": {0 + 0x80000000, 0 + 0x80000000, 5 + 0x80000000}, +} + +var CUTestPubkeyData = map[string]string{ + "pub1": "029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f", + "pub2": "02dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d7", + "pub3": "03089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc", + "pub4": "023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e73", + "pub5": "03a9a4c37f5996d3aa25dbac6b570af0650394492942460b354753ed9eeca58771", + "pub6": "027f6399757d2eff55a136ad02c684b1838b6556e5f1b6b34282a94b6b50051096", +} + +// =============================================================================== + +func TestPsbtCreator(t *testing.T) { + spkOut1, err := hex.DecodeString(CUTestHexData["scriptPubkey1"]) + if err != nil { + t.Fatalf("Error: %v", err) + } + spkOut2, err := hex.DecodeString(CUTestHexData["scriptPubkey2"]) + if err != nil { + t.Fatalf("Error: %v", err) + } + out1 := wire.NewTxOut(CUTestAmountData["amount1"], spkOut1) + out2 := wire.NewTxOut(CUTestAmountData["amount2"], spkOut2) + outputs := []*wire.TxOut{out1, out2} + hash1, err := chainhash.NewHashFromStr(CUTestHexData["txid1"]) + if err != nil { + t.Fatalf("Error: %v", err) + } + prevOut1 := wire.NewOutPoint(hash1, uint32(0)) + hash2, err := chainhash.NewHashFromStr(CUTestHexData["txid2"]) + if err != nil { + t.Fatalf("Error: %v", err) + } + prevOut2 := wire.NewOutPoint(hash2, uint32(1)) + inputs := []*wire.OutPoint{prevOut1, prevOut2} + + // Check creation fails with invalid sequences: + nSequences := []uint32{wire.MaxTxInSequenceNum} + _, err = New(inputs, outputs, int32(3), uint32(0), nSequences) + if err == nil { + t.Fatalf("Did not error when creating transaction with " + + "invalid nSequences") + } + nSequences = append(nSequences, wire.MaxTxInSequenceNum) + + // Check creation fails with invalid version + _, err = New(inputs, outputs, int32(0), uint32(0), nSequences) + if err == nil { + t.Fatalf("Did not error when creating transaction with " + + "invalid version (3)") + } + + // Use valid data to create: + cPsbt, err := New(inputs, outputs, int32(2), uint32(0), nSequences) + var b bytes.Buffer + err = cPsbt.Serialize(&b) + if err != nil { + t.Fatalf("Unable to serialize created Psbt: %v", err) + } + if CUTestHexData["COPsbtHex"] != hex.EncodeToString(b.Bytes()) { + t.Fatalf("Failed to create expected psbt, instead got: %v", + hex.EncodeToString(b.Bytes())) + } + + // Now simulate passing the created PSBT to an Updater + updater, err := NewUpdater(cPsbt) + if err != nil { + t.Fatalf("Unable to create Updater object") + } + tx := wire.NewMsgTx(2) + nonWitnessUtxoHex, err := hex.DecodeString( + CUTestHexData["NonWitnessUtxo"]) + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + err = tx.Deserialize(bytes.NewReader(nonWitnessUtxoHex)) + if err != nil { + t.Fatalf("Error deserializing transaction: %v", err) + } + witnessUtxoHex, err := hex.DecodeString( + CUTestHexData["WitnessUtxo"]) + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + txout := wire.TxOut{Value: CUTestAmountData["amount3"], + PkScript: witnessUtxoHex[9:]} + err = updater.AddInNonWitnessUtxo(tx, 0) + if err != nil { + t.Fatalf("Unable to add NonWitness Utxo to inputs: %v", err) + } + err = updater.AddInWitnessUtxo(&txout, 1) + if err != nil { + t.Fatalf("Unable to add Witness Utxo to inputs: %v", err) + } + + b.Reset() + + err = updater.Upsbt.Serialize(&b) + if err != nil { + t.Fatalf("Unable to serialize updated Psbt: %v", err) + } + if CUTestHexData["UOPsbtHex"] != hex.EncodeToString(b.Bytes()) { + t.Fatal("Failed to create valid updated PSBT after utxos") + } + input1RedeemScript, err := hex.DecodeString(CUTestHexData["Input1RedeemScript"]) + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + err = updater.AddInRedeemScript(input1RedeemScript, 0) + if err != nil { + t.Fatalf("Unable to add redeem script: %v", err) + } + input2RedeemScript, err := hex.DecodeString(CUTestHexData["Input2RedeemScript"]) + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + err = updater.AddInRedeemScript(input2RedeemScript, 1) + if err != nil { + t.Fatalf("Unable to add redeem script: %v", err) + } + input2WitnessScript, err := hex.DecodeString(CUTestHexData["Input2WitnessScript"]) + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + err = updater.AddInWitnessScript(input2WitnessScript, 1) + if err != nil { + t.Fatalf("Unable to add witness script: %v", err) + } + + b.Reset() + err = updater.Upsbt.Serialize(&b) + if err != nil { + t.Fatalf("Unable to serialize updated Psbt: %v", err) + } + if CUTestHexData["UOPsbtHex2"] != hex.EncodeToString(b.Bytes()) { + t.Fatal("Failed to create valid updated PSBT after redeem scripts") + } + masterKey, err := hex.DecodeString(CUMasterKeyFingerPrint) + masterKeyInt := binary.LittleEndian.Uint32(masterKey) + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + input1Path1 := CUTestPathData["dpath1"] + input1Path2 := CUTestPathData["dpath2"] + input1Key1, err := hex.DecodeString(CUTestPubkeyData["pub1"]) + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + input1Key2, err := hex.DecodeString(CUTestPubkeyData["pub2"]) + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + err = updater.AddInBip32Derivation(masterKeyInt, input1Path1, input1Key1, 0) + if err != nil { + t.Fatal("Failed to add first key derivation for input 1") + } + err = updater.AddInBip32Derivation(masterKeyInt, input1Path2, input1Key2, 0) + if err != nil { + t.Fatal("Failed to add second key derivation for input 1") + } + input2Path1 := CUTestPathData["dpath3"] + input2Path2 := CUTestPathData["dpath4"] + input2Key1, err := hex.DecodeString(CUTestPubkeyData["pub3"]) + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + input2Key2, err := hex.DecodeString(CUTestPubkeyData["pub4"]) + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + + // check invalid pubkeys are not accepted + borkedInput2Key1 := append([]byte{0xff}, input2Key1...) + err = updater.AddInBip32Derivation(masterKeyInt, input2Path1, + borkedInput2Key1, 1) + if err == nil { + t.Fatalf("Expected invalid pubkey, got: %v", err) + } + + err = updater.AddInBip32Derivation(masterKeyInt, input2Path1, input2Key1, 1) + if err != nil { + t.Fatal("Failed to add first key derivation for input 2") + } + err = updater.AddInBip32Derivation(masterKeyInt, input2Path2, input2Key2, 1) + if err != nil { + t.Fatal("Failed to add second key derivation for input 2") + } + output1Key1, err := hex.DecodeString(CUTestPubkeyData["pub5"]) + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + output1Path := CUTestPathData["dpath5"] + + // check invalid pubkeys are not accepted + borkedOutput1Key1 := append([]byte{0xab}, output1Key1[:13]...) + err = updater.AddOutBip32Derivation(masterKeyInt, output1Path, + borkedOutput1Key1, 0) + if err == nil { + t.Fatalf("Expected invalid pubkey, got: %v", err) + } + + err = updater.AddOutBip32Derivation(masterKeyInt, output1Path, output1Key1, 0) + if err != nil { + t.Fatal("Failed to add key to first output") + } + output2Key1, err := hex.DecodeString(CUTestPubkeyData["pub6"]) + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + output2Path := CUTestPathData["dpath6"] + err = updater.AddOutBip32Derivation(masterKeyInt, output2Path, output2Key1, 1) + if err != nil { + t.Fatal("Failed to add key to second output") + } + + b.Reset() + err = updater.Upsbt.Serialize(&b) + if err != nil { + t.Fatalf("Unable to serialize updated Psbt: %v", err) + } + if CUTestHexData["UOPsbtHex3"] != hex.EncodeToString(b.Bytes()) { + t.Fatal("Failed to create valid updated PSBT after BIP32 derivations") + } + err = updater.AddInSighashType(txscript.SigHashType(1), 0) + if err != nil { + t.Fatal("Failed to add sighash type to first input") + } + err = updater.AddInSighashType(txscript.SigHashType(1), 1) + if err != nil { + t.Fatal("Failed to add sighash type to second input") + } + + b.Reset() + err = updater.Upsbt.Serialize(&b) + if err != nil { + t.Fatalf("Unable to serialize updated Psbt: %v", err) + } + if CUTestHexData["UOPsbtHex4"] != hex.EncodeToString(b.Bytes()) { + t.Fatal("Failed to create valid updated PSBT after sighash types") + } + b644, err := updater.Upsbt.B64Encode() + if err != nil { + t.Fatalf("Unable to B64Encode updated Psbt: %v", err) + } + if b644 != CUTestB64Data["UOPsbtB644"] { + t.Fatalf("Failed to base64 encode updated PSBT after sighash "+ + "types: %v", b644) + } +} + +// Signing test data taken from +// https://github.com/achow101/bitcoin/blob/020628e3a4e88e36647eaf92bac4b3552796ac6a/test/functional/data/rpc_psbt.json +var signerPsbtData = map[string]string{ + "signer1Privkey1": "cP53pDbR5WtAD8dYAW9hhTjuvvTVaEiQBdrz9XPrgLBeRFiyCbQr", + "signer1Privkey2": "cR6SXDoyfQrcp4piaiHE97Rsgta9mNhGTen9XeonVgwsh4iSgw6d", + "signer1PsbtB64": "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABTYXCtx0AYLCcmIauuBXlCZHdoSTQDh9QUAAAAAFgAUAK6pouXw+HaliN9VRuh0LR2HAI8AAAAAAAEAuwIAAAABqtc5MQGL0l+ErkALaISL4J23BurCrBgpi6vucatlb4sAAAAASEcwRAIgWPb8fGoz4bMVSNSByCbAFb0wE1qtQs1neQ2rZtKtJDsCIEoc7SYExnNbY5PltBaR3XiwDwxZQvufdRhW+qk4FX26Af7///8CgPD6AgAAAAAXqRQPuUY0IWlrgsgzryQceMF9295JNIfQ8gonAQAAABepFCnKdPigj4GZlCgYXJe12FLkBj9hh2UAAAABBEdSIQKVg785rgpgl0etGZrd1jT6YQhVnWxc05tMIYPxq5bgfyEC2rYf9JoU22p9ArDNH7t4/EsYMStbTlTa5Nui+/71NtdSriIGApWDvzmuCmCXR60Zmt3WNPphCFWdbFzTm0whg/GrluB/ENkMak8AAACAAAAAgAAAAIAiBgLath/0mhTban0CsM0fu3j8SxgxK1tOVNrk26L7/vU21xDZDGpPAAAAgAAAAIABAACAAQMEAQAAAAABASAAwusLAAAAABepFLf1+vQOPUClpFmx2zU18rcvqSHohwEEIgAgjCNTFzdDtZXftKB7crqOQuN5fadOh/59nXSX47ICiQMBBUdSIQMIncEMesbbVPkTKa9hczPbOIzq0MIx9yM3nRuZAwsC3CECOt2QTz1tz1nduQaw3uI1Kbf/ue1Q5ehhUZJoYCIfDnNSriIGAjrdkE89bc9Z3bkGsN7iNSm3/7ntUOXoYVGSaGAiHw5zENkMak8AAACAAAAAgAMAAIAiBgMIncEMesbbVPkTKa9hczPbOIzq0MIx9yM3nRuZAwsC3BDZDGpPAAAAgAAAAIACAACAAQMEAQAAAAAiAgOppMN/WZbTqiXbrGtXCvBlA5RJKUJGCzVHU+2e7KWHcRDZDGpPAAAAgAAAAIAEAACAACICAn9jmXV9Lv9VoTatAsaEsYOLZVbl8bazQoKpS2tQBRCWENkMak8AAACAAAAAgAUAAIAA", + "signer1Result": "70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f6187650000002202029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f473044022074018ad4180097b873323c0015720b3684cc8123891048e7dbcd9b55ad679c99022073d369b740e3eb53dcefa33823c8070514ca55a7dd9544f157c167913261118c01010304010000000104475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae2206029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f10d90c6a4f000000800000008000000080220602dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d710d90c6a4f0000008000000080010000800001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e887220203089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc473044022062eb7a556107a7c73f45ac4ab5a1dddf6f7075fb1275969a7f383efff784bcb202200c05dbb7470dbf2f08557dd356c7325c1ed30913e996cd3840945db12228da5f010103040100000001042200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903010547522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae2206023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7310d90c6a4f000000800000008003000080220603089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc10d90c6a4f00000080000000800200008000220203a9a4c37f5996d3aa25dbac6b570af0650394492942460b354753ed9eeca5877110d90c6a4f000000800000008004000080002202027f6399757d2eff55a136ad02c684b1838b6556e5f1b6b34282a94b6b5005109610d90c6a4f00000080000000800500008000", + "signer2Privkey1": "cT7J9YpCwY3AVRFSjN6ukeEeWY6mhpbJPxRaDaP5QTdygQRxP9Au", + "signer2Privkey2": "cNBc3SWUip9PPm1GjRoLEJT6T41iNzCYtD7qro84FMnM5zEqeJsE", + "signer2Psbt": "70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f6187650000000104475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae2206029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f10d90c6a4f000000800000008000000080220602dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d710d90c6a4f000000800000008001000080010304010000000001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e88701042200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903010547522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae2206023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7310d90c6a4f000000800000008003000080220603089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc10d90c6a4f0000008000000080020000800103040100000000220203a9a4c37f5996d3aa25dbac6b570af0650394492942460b354753ed9eeca5877110d90c6a4f000000800000008004000080002202027f6399757d2eff55a136ad02c684b1838b6556e5f1b6b34282a94b6b5005109610d90c6a4f00000080000000800500008000", + "signer2Result": "70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f618765000000220202dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d7483045022100f61038b308dc1da865a34852746f015772934208c6d24454393cd99bdf2217770220056e675a675a6d0a02b85b14e5e29074d8a25a9b5760bea2816f661910a006ea01010304010000000104475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae2206029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f10d90c6a4f000000800000008000000080220602dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d710d90c6a4f0000008000000080010000800001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e8872202023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e73473044022065f45ba5998b59a27ffe1a7bed016af1f1f90d54b3aa8f7450aa5f56a25103bd02207f724703ad1edb96680b284b56d4ffcb88f7fb759eabbe08aa30f29b851383d2010103040100000001042200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903010547522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae2206023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7310d90c6a4f000000800000008003000080220603089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc10d90c6a4f00000080000000800200008000220203a9a4c37f5996d3aa25dbac6b570af0650394492942460b354753ed9eeca5877110d90c6a4f000000800000008004000080002202027f6399757d2eff55a136ad02c684b1838b6556e5f1b6b34282a94b6b5005109610d90c6a4f00000080000000800500008000", +} + +func TestPsbtSigner(t *testing.T) { + psbt1, err := NewFromRawBytes( + bytes.NewReader([]byte(signerPsbtData["signer1PsbtB64"])), + true, + ) + if err != nil { + t.Fatalf("Failed to parse PSBT: %v", err) + } + psbtUpdater1 := Updater{ + Upsbt: psbt1, + } + sig1, err := hex.DecodeString("3044022074018ad4180097b873323c0015720b3684cc8123891048e7dbcd9b55ad679c99022073d369b740e3eb53dcefa33823c8070514ca55a7dd9544f157c167913261118c01") + pub1, err := hex.DecodeString("029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f") + res, err := psbtUpdater1.Sign(0, sig1, pub1, nil, nil) + if err != nil || res != 0 { + t.Fatalf("Error from adding signatures: %v %v", err, res) + } + sig2, err := hex.DecodeString("3044022062eb7a556107a7c73f45ac4ab5a1dddf6f7075fb1275969a7f383efff784bcb202200c05dbb7470dbf2f08557dd356c7325c1ed30913e996cd3840945db12228da5f01") + pub2, err := hex.DecodeString("03089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc") + res, err = psbtUpdater1.Sign(1, sig2, pub2, nil, nil) + if err != nil || res != 0 { + t.Fatalf("Error from adding signatures: %v %v", err, res) + } + signer1Result, err := hex.DecodeString(signerPsbtData["signer1Result"]) + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + + var b bytes.Buffer + err = psbtUpdater1.Upsbt.Serialize(&b) + if err != nil { + t.Fatalf("Unable to serialize updated Psbt: %v", err) + } + if !bytes.Equal(b.Bytes(), signer1Result) { + t.Fatalf("Failed to add signatures correctly") + } +} + +// Finalizer-extractor test + +var finalizerPsbtData = map[string]string{ + "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", + "finalize": "70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f6187650000002202029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f473044022074018ad4180097b873323c0015720b3684cc8123891048e7dbcd9b55ad679c99022073d369b740e3eb53dcefa33823c8070514ca55a7dd9544f157c167913261118c01220202dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d7483045022100f61038b308dc1da865a34852746f015772934208c6d24454393cd99bdf2217770220056e675a675a6d0a02b85b14e5e29074d8a25a9b5760bea2816f661910a006ea01010304010000000104475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae2206029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f10d90c6a4f000000800000008000000080220602dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d710d90c6a4f0000008000000080010000800001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e887220203089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc473044022062eb7a556107a7c73f45ac4ab5a1dddf6f7075fb1275969a7f383efff784bcb202200c05dbb7470dbf2f08557dd356c7325c1ed30913e996cd3840945db12228da5f012202023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e73473044022065f45ba5998b59a27ffe1a7bed016af1f1f90d54b3aa8f7450aa5f56a25103bd02207f724703ad1edb96680b284b56d4ffcb88f7fb759eabbe08aa30f29b851383d2010103040100000001042200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903010547522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae2206023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7310d90c6a4f000000800000008003000080220603089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc10d90c6a4f00000080000000800200008000220203a9a4c37f5996d3aa25dbac6b570af0650394492942460b354753ed9eeca5877110d90c6a4f000000800000008004000080002202027f6399757d2eff55a136ad02c684b1838b6556e5f1b6b34282a94b6b5005109610d90c6a4f00000080000000800500008000", + "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==", + "result": "70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f6187650000000107da00473044022074018ad4180097b873323c0015720b3684cc8123891048e7dbcd9b55ad679c99022073d369b740e3eb53dcefa33823c8070514ca55a7dd9544f157c167913261118c01483045022100f61038b308dc1da865a34852746f015772934208c6d24454393cd99bdf2217770220056e675a675a6d0a02b85b14e5e29074d8a25a9b5760bea2816f661910a006ea01475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae0001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e8870107232200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b20289030108da0400473044022062eb7a556107a7c73f45ac4ab5a1dddf6f7075fb1275969a7f383efff784bcb202200c05dbb7470dbf2f08557dd356c7325c1ed30913e996cd3840945db12228da5f01473044022065f45ba5998b59a27ffe1a7bed016af1f1f90d54b3aa8f7450aa5f56a25103bd02207f724703ad1edb96680b284b56d4ffcb88f7fb759eabbe08aa30f29b851383d20147522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae00220203a9a4c37f5996d3aa25dbac6b570af0650394492942460b354753ed9eeca5877110d90c6a4f000000800000008004000080002202027f6399757d2eff55a136ad02c684b1838b6556e5f1b6b34282a94b6b5005109610d90c6a4f00000080000000800500008000", + "network": "0200000000010258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd7500000000da00473044022074018ad4180097b873323c0015720b3684cc8123891048e7dbcd9b55ad679c99022073d369b740e3eb53dcefa33823c8070514ca55a7dd9544f157c167913261118c01483045022100f61038b308dc1da865a34852746f015772934208c6d24454393cd99bdf2217770220056e675a675a6d0a02b85b14e5e29074d8a25a9b5760bea2816f661910a006ea01475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752aeffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d01000000232200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f000400473044022062eb7a556107a7c73f45ac4ab5a1dddf6f7075fb1275969a7f383efff784bcb202200c05dbb7470dbf2f08557dd356c7325c1ed30913e996cd3840945db12228da5f01473044022065f45ba5998b59a27ffe1a7bed016af1f1f90d54b3aa8f7450aa5f56a25103bd02207f724703ad1edb96680b284b56d4ffcb88f7fb759eabbe08aa30f29b851383d20147522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae00000000", + "twoOfThree": "70736274ff01005e01000000019a5fdb3c36f2168ea34a031857863c63bb776fd8a8a9149efd7341dfaf81c9970000000000ffffffff01e013a8040000000022002001c3a65ccfa5b39e31e6bafa504446200b9c88c58b4f21eb7e18412aff154e3f000000000001012bc817a80400000000220020114c9ab91ea00eb3e81a7aa4d0d8f1bc6bd8761f8f00dbccb38060dc2b9fdd5522020242ecd19afda551d58f496c17e3f51df4488089df4caafac3285ed3b9c590f6a847304402207c6ab50f421c59621323460aaf0f731a1b90ca76eddc635aed40e4d2fc86f97e02201b3f8fe931f1f94fde249e2b5b4dbfaff2f9df66dd97c6b518ffa746a4390bd1012202039f0acfe5a292aafc5331f18f6360a3cc53d645ebf0cc7f0509630b22b5d9f547473044022075329343e01033ebe5a22ea6eecf6361feca58752716bdc2260d7f449360a0810220299740ed32f694acc5f99d80c988bb270a030f63947f775382daf4669b272da0010103040100000001056952210242ecd19afda551d58f496c17e3f51df4488089df4caafac3285ed3b9c590f6a821035a654524d301dd0265c2370225a6837298b8ca2099085568cc61a8491287b63921039f0acfe5a292aafc5331f18f6360a3cc53d645ebf0cc7f0509630b22b5d9f54753ae22060242ecd19afda551d58f496c17e3f51df4488089df4caafac3285ed3b9c590f6a818d5f7375b2c000080000000800000008000000000010000002206035a654524d301dd0265c2370225a6837298b8ca2099085568cc61a8491287b63918e2314cf32c000080000000800000008000000000010000002206039f0acfe5a292aafc5331f18f6360a3cc53d645ebf0cc7f0509630b22b5d9f54718e524a1ce2c000080000000800000008000000000010000000000", +} + +func TestFinalize2of3(t *testing.T) { + b, err := hex.DecodeString(finalizerPsbtData["twoOfThree"]) + if err != nil { + t.Fatalf("Error decoding hex: %v", err) + } + p, err := NewFromRawBytes(bytes.NewReader(b), false) + if err != nil { + t.Fatalf("Error parsing PSBT: %v", err) + } + if p.IsComplete() { + t.Fatalf("Psbt is complete") + } + err = MaybeFinalizeAll(p) + if err != nil { + t.Fatalf("Error in MaybeFinalizeAll: %v", err) + } + if !p.IsComplete() { + t.Fatalf("Psbt is not complete") + } +} + +func TestPsbtExtractor(t *testing.T) { + rawToFinalize, err := base64.StdEncoding.DecodeString( + finalizerPsbtData["finalizeb64"], + ) + if err != nil { + t.Fatalf("Error decoding b64: %v", err) + } + + psbt1, err := NewFromRawBytes( + bytes.NewReader(rawToFinalize), false, + ) + if err != nil { + t.Fatalf("Failed to parse PSBT: %v", err) + } + + for i := range psbt1.Inputs { + err = Finalize(psbt1, i) + if err != nil { + t.Fatalf("Error from finalizing PSBT: %v", err) + } + } + + finalizer1Result, err := base64.StdEncoding.DecodeString( + finalizerPsbtData["resultb64"], + ) + if err != nil { + t.Fatalf("Unable to decode b64: %v", err) + } + finalToNetworkExpected, err := hex.DecodeString(finalizerPsbtData["network"]) + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + tx, err := Extract(psbt1) + if err != nil { + t.Fatalf("Failed to extract: %v", err) + } + var resultToNetwork bytes.Buffer + if err := tx.Serialize(&resultToNetwork); err != nil { + t.Fatalf("unable to serialize: %v", err) + } + + var b bytes.Buffer + err = psbt1.Serialize(&b) + if err != nil { + t.Fatalf("Unable to serialize updated Psbt: %v", err) + } + if !bytes.Equal(b.Bytes(), finalizer1Result) { + t.Fatalf("Failed to finalize transaction: expected %x, "+ + "got %x", finalizer1Result, b.Bytes()) + } + if !bytes.Equal(finalToNetworkExpected, resultToNetwork.Bytes()) { + t.Fatalf("Failed to network serialize transaction: %x", b.Bytes()) + } +} + +func TestFinalizerAddSigHashFlags(t *testing.T) { + var signedPsbtData = map[string]string{ + "Default": "70736274ff01005e0200000001f1aabce974f1b242b36913f4f8a9f138a8042914dddc4117a578813a4dc32ee10000000000ffffffff017b0a0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad1000000000001012b430b0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad1011340e80246ac1955def419572514e50e4be47f56ccd51beae41ec80ad30cb77ed59ebca3c38dd8506e1b7c28fafa4bdf7d821464be1ee152416bdaf2c056fb4fb3290117206b1a4876464d6bfc6a7c106dd4c5a0f08af94b45a8200e47e02a7dc6148fd7b00000", + "All": "70736274ff01005e020000000193e988e9eebfe51c0f362741aaab1e0699175c83cfd8087c4a06e24e3b80bc220000000000ffffffff019b0d0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad1000000000001012b630e0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad101030401000000011340ee0a03b010e515e38553d4d96c65a9d6092d06756c47c16c5674c3bde6ad0c151f6d4074601f3c2967f12c3b624b4013591e65458a8b5f80b96a613132cee3bb0117206b1a4876464d6bfc6a7c106dd4c5a0f08af94b45a8200e47e02a7dc6148fd7b00000", + "None": "70736274ff01005e02000000013cfe0f5fd1b9a73230b003d336b5e4d7abf3452f6a5c4f266c434648a161eb170000000000ffffffff01d30c0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad1000000000001012b9b0d0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad10103040200000001134032573ce8ee8a9afac2008bcb45ce7f96ac95ee7ffad26d10388c97fb87f76f77dc414224ca98b01cbec361488ac29d11e018be412d2725be85dfe5c3fd3b6b4c0117206b1a4876464d6bfc6a7c106dd4c5a0f08af94b45a8200e47e02a7dc6148fd7b00000", + "Single": "70736274ff01005e02000000013173659bb6be7474b8d00efd3b38f2a225f5591bd4edd873170a1e0ff0ef15990000000000ffffffff01630e0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad1000000000001012b2b0f0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad101030403000000011340251ce90a8b36cd90bf430f9522772b09bd3ef90039e53cddc5bda6abb61f1c11db6505683d0b7778d4444549ae71df5012edb859251abca13bd819fa6ac9d6ac0117206b1a4876464d6bfc6a7c106dd4c5a0f08af94b45a8200e47e02a7dc6148fd7b00000", + "AllAnyOneCanPay": "70736274ff01005e020000000130ac25ec34af987b9e0518ff05cd491bd2d339660a4bfeea49a580c9233fbd9d0000000000ffffffff010b0c0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad1000000000001012bd30c0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad101030481000000011340e86b7ea8d6fc2cbd99b1091c25a2a37b333b5d82ea559579553cf7ba08c0fe3bead26c458f4917a6e069a3712c15f0999adb243603c783133676c1a09cc574b20117206b1a4876464d6bfc6a7c106dd4c5a0f08af94b45a8200e47e02a7dc6148fd7b00000", + "NoneAnyOneCanPay": "70736274ff01005e02000000015499da1d93851a8add52fcab05acab60eaaf16571e0015f678b68775937d11200000000000ffffffff01430b0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad1000000000001012b0b0c0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad1010304820000000113402d42b46429b739786020e52b69b969468aa69ca40af390ba13441c8e6dc9e53f679c2bd2ff0ef912f48922cd64f4a7bfe7e492e5ecc8603b63e0ea772385faab0117206b1a4876464d6bfc6a7c106dd4c5a0f08af94b45a8200e47e02a7dc6148fd7b00000", + "SingleAnyOneCanPay": "70736274ff01005e02000000011bbe693ee5b3d75a5c8ad190e151c81e5b1ff1090982ea712c375e7d4a6069ce0100000000ffffffff012b0f0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad1000000000001012bf30f0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad1010304830000000113408e018d0ae9cd730f7eae428a456e920b4ded67c9a7500a82ba25dd23f98418c1f060680daa4352b262fdffab691a4a67fc603352c1d21ace7cc6d83490facde70117206b1a4876464d6bfc6a7c106dd4c5a0f08af94b45a8200e47e02a7dc6148fd7b00000", + } + + var expectedTx = map[string]string{ + "Default": "02000000000101f1aabce974f1b242b36913f4f8a9f138a8042914dddc4117a578813a4dc32ee10000000000ffffffff017b0a0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad10140e80246ac1955def419572514e50e4be47f56ccd51beae41ec80ad30cb77ed59ebca3c38dd8506e1b7c28fafa4bdf7d821464be1ee152416bdaf2c056fb4fb32900000000", + "All": "0200000000010193e988e9eebfe51c0f362741aaab1e0699175c83cfd8087c4a06e24e3b80bc220000000000ffffffff019b0d0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad10141ee0a03b010e515e38553d4d96c65a9d6092d06756c47c16c5674c3bde6ad0c151f6d4074601f3c2967f12c3b624b4013591e65458a8b5f80b96a613132cee3bb0100000000", + "None": "020000000001013cfe0f5fd1b9a73230b003d336b5e4d7abf3452f6a5c4f266c434648a161eb170000000000ffffffff01d30c0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad1014132573ce8ee8a9afac2008bcb45ce7f96ac95ee7ffad26d10388c97fb87f76f77dc414224ca98b01cbec361488ac29d11e018be412d2725be85dfe5c3fd3b6b4c0200000000", + "Single": "020000000001013173659bb6be7474b8d00efd3b38f2a225f5591bd4edd873170a1e0ff0ef15990000000000ffffffff01630e0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad10141251ce90a8b36cd90bf430f9522772b09bd3ef90039e53cddc5bda6abb61f1c11db6505683d0b7778d4444549ae71df5012edb859251abca13bd819fa6ac9d6ac0300000000", + "AllAnyOneCanPay": "0200000000010130ac25ec34af987b9e0518ff05cd491bd2d339660a4bfeea49a580c9233fbd9d0000000000ffffffff010b0c0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad10141e86b7ea8d6fc2cbd99b1091c25a2a37b333b5d82ea559579553cf7ba08c0fe3bead26c458f4917a6e069a3712c15f0999adb243603c783133676c1a09cc574b28100000000", + "NoneAnyOneCanPay": "020000000001015499da1d93851a8add52fcab05acab60eaaf16571e0015f678b68775937d11200000000000ffffffff01430b0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad101412d42b46429b739786020e52b69b969468aa69ca40af390ba13441c8e6dc9e53f679c2bd2ff0ef912f48922cd64f4a7bfe7e492e5ecc8603b63e0ea772385faab8200000000", + "SingleAnyOneCanPay": "020000000001011bbe693ee5b3d75a5c8ad190e151c81e5b1ff1090982ea712c375e7d4a6069ce0100000000ffffffff012b0f0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad101418e018d0ae9cd730f7eae428a456e920b4ded67c9a7500a82ba25dd23f98418c1f060680daa4352b262fdffab691a4a67fc603352c1d21ace7cc6d83490facde78300000000", + } + + for key, signedPsbtStr := range signedPsbtData { + signedPsbtBytes, err := hex.DecodeString(signedPsbtStr) + require.NoErrorf(t, err, "Failed to decode signed psbt string") + + signedPsbt, err := NewFromRawBytes(bytes.NewReader(signedPsbtBytes), false) + require.NoErrorf(t, err, "Failed to parse psbt") + + // There is only one input in each psbt. + err = Finalize(signedPsbt, 0) + require.NoErrorf(t, err, "Failed to finalize") + + tx, err := Extract(signedPsbt) + require.NoErrorf(t, err, "Failed to extract") + + var b bytes.Buffer + err = tx.Serialize(&b) + require.NoErrorf(t, err, "Failed to serialize tx into buffer") + + expectedTxBytes, err := hex.DecodeString(expectedTx[key]) + require.NoErrorf(t, err, "Unable to decode expected tx") + require.Equal(t, expectedTxBytes, b.Bytes()) + } + +} + +func TestImportFromCore1(t *testing.T) { + // This example #1 was created manually using Bitcoin Core 0.17 regtest. + // It contains two inputs, one p2wkh and one p2pkh (non-witness). + // We take the created PSBT as input, then add the fields for each input + // separately, then finalize and extract, and compare with the network + // serialized tx output from Core. + imported := "cHNidP8BAJwCAAAAAjaoF6eKeGsPiDQxxqqhFDfHWjBtZzRqmaZmvyCVWZ5JAQAAAAD/////RhypNiFfnQSMNpo0SGsgIvDOyMQFAYEHZXD5jp4kCrUAAAAAAP////8CgCcSjAAAAAAXqRQFWy8ScSkkhlGMwfOnx15YwRzApofwX5MDAAAAABepFAt4TyLfGnL9QY6GLYHbpSQj+QclhwAAAAAAAAAAAA==" + psbt1, err := NewFromRawBytes(bytes.NewReader([]byte(imported)), true) + if err != nil { + t.Fatalf("Failed to parse PSBT: %v", err) + } + + // update with the first input's utxo (witness) and the second input's utxo + // (non-witness) + fundingTxInput1Hex := "02000000014f2cbac7d7691fafca30313097d79be9e78aa6670752fcb1fc15508e77586efb000000004847304402201b5568d7cab977ae0892840b779d84e36d62e42fd93b95e648aaebeacd2577d602201d2ebda2b0cddfa0c1a71d3cbcb602e7c9c860a41ed8b4d18d40c92ccbe92aed01feffffff028c636f91000000001600147447b6d7e6193499565779c8eb5184fcfdfee6ef00879303000000001600149e88f2828a074ebf64af23c2168d1816258311d72d010000" + fundingTxInput2Hex := "020000000001012f03f70c673d83d65da0e8d0db3867b3e7d7bfbd34fd6be65892042e57576eb00000000000feffffff028027128c000000001976a91485780899b61a5506f342bd67a2f635181f50c8b788acb8032c040000000017a914e2e3d32d42d6f043cab39708a6073301df5039db8702473044022047ae396fd8aba8f67482ad16e315fe680db585c1ac6422ffb18dacd9cf5bac350220321176fd6157ef51d9eae9230b0b5bd7dd29bb6247a879189e6aaa8091f3020201210368081f7ff37dfadbed407eba17b232f959e41e6ac78741192c805ebf80d487852f010000" + fundingTxInput1Bytes, err := hex.DecodeString(fundingTxInput1Hex) + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + txFund1 := wire.NewMsgTx(2) + err = txFund1.Deserialize(bytes.NewReader(fundingTxInput1Bytes)) + if err != nil { + t.Fatalf("Error deserializing transaction: %v", err) + } + // First input is witness, take correct output: + txFund1Out := txFund1.TxOut[1] + + fundingTxInput2Bytes, err := hex.DecodeString(fundingTxInput2Hex) + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + txFund2 := wire.NewMsgTx(2) + err = txFund2.Deserialize(bytes.NewReader(fundingTxInput2Bytes)) + if err != nil { + t.Fatalf("Error deserializing transaction: %v", err) + } + psbtupdater1 := Updater{Upsbt: psbt1} + psbtupdater1.AddInWitnessUtxo(txFund1Out, 0) + err = psbtupdater1.AddInNonWitnessUtxo(txFund2, 1) + if err != nil { + t.Fatalf("Error inserting non-witness utxo: %v", err) + } + + // Signing was done with Core; we manually insert the relevant input + // entries here. + sig1Hex := "304402200da03ac9890f5d724c42c83c2a62844c08425a274f1a5bca50dcde4126eb20dd02205278897b65cb8e390a0868c9582133c7157b2ad3e81c1c70d8fbd65f51a5658b01" + sig1, err := hex.DecodeString(sig1Hex) + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + pub1Hex := "024d6b24f372dd4551277c8df4ecc0655101e11c22894c8e05a3468409c865a72c" + pub1, err := hex.DecodeString(pub1Hex) + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + + // Check that invalid pubkeys are not accepted. + pubInvalid := append(pub1, 0x00) + + res, err := psbtupdater1.Sign(0, sig1, pubInvalid, nil, nil) + if err == nil { + t.Fatalf("Incorrectly accepted invalid pubkey: %v", + pubInvalid) + } + + res, err = psbtupdater1.Sign(0, sig1, pub1, nil, nil) + if err != nil || res != 0 { + t.Fatalf("Error from adding signatures: %v %v", err, res) + } + + sig2Hex := "3044022014eb9c4858f71c9f280bc68402aa742a5187f54c56c8eb07c902eb1eb5804e5502203d66656de8386b9b044346d5605f5ae2b200328fb30476f6ac993fc0dbb0455901" + sig2, err := hex.DecodeString(sig2Hex) + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + pub2Hex := "03b4c79acdf4e7d978bef4019c421e4c6c67044ed49d27322dc90e808d8080e862" + pub2, err := hex.DecodeString(pub2Hex) + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + + // =============================================================== + // Before adding the signature, we'll make a new PSBT with + // modifications to the input data and check it fails sanity checks. + + // First an invalid tx: + psbtBorkedInput2, _ := NewFromRawBytes(bytes.NewReader([]byte(imported)), true) + borkedUpdater, err := NewUpdater(psbtBorkedInput2) + if err != nil { + t.Fatalf("NewUpdater failed while trying to create borked "+ + "version: %v", err) + } + borkedUpdater.AddInWitnessUtxo(txFund1Out, 0) + + res, err = borkedUpdater.Sign(0, sig2, pub2, nil, nil) + if err != ErrInvalidSignatureForInput { + t.Fatalf("AddPartialSig succeeded, but should have failed "+ + "due to mismatch between pubkey and prevOut; err was: %v", err) + } + + // Next, a valid tx serialization, but not the right one + wrongTxBytes, err := hex.DecodeString("020000000001012d1d7b17356d0ad8232a5817d2d2fa5cd97d803c0ed03e013e97b65f4f1e5e7501000000171600147848cfb25bb163c7c63732615980a25eddbadc7bfeffffff022a8227630000000017a91472128ae6b6a1b74e499bedb5efb1cb09c9a6713287107240000000000017a91485f81cb970d854e2513ebf5c5b5d09e4509f4af3870247304402201c09aa8bcd18753ef01d8712a55eea5a0f69b6c4cc2944ac942264ff0662c91402201fc1390bf8b0023dd12ae78d7ec181124e106de57bc8f00812ae92bd024d3045012103ba077fc011aa59393bfe17cf491b3a02a9c4d39df122b2148322da0ec23508f459430800") + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + wrongTx := wire.NewMsgTx(2) + err = wrongTx.Deserialize(bytes.NewReader(wrongTxBytes)) + if err != nil { + t.Fatalf("Error deserializing transaction: %v", err) + } + psbtBorkedInput2.Inputs[1] = *NewPsbtInput(wrongTx, nil) + res, err = borkedUpdater.Sign(1, sig2, pub2, nil, nil) + if err != ErrInvalidSignatureForInput { + t.Fatalf("Error should have been invalid sig for input, was: %v", err) + } + // ====================================================== + + res, err = psbtupdater1.Sign(1, sig2, pub2, nil, nil) + if err != nil || res != 0 { + t.Fatalf("Failed to add signature to second input: %v %v", err, res) + } + + // Neither input (p2pkh and p2wkh) require redeem script nor witness script, + // so there are no more fields to add; we are ready to finalize. + err = Finalize(psbt1, 0) + if err != nil { + t.Fatalf("Failed to finalize the first input, %v", err) + } + if psbt1.IsComplete() { + t.Fatalf("PSBT was complete but has not been fully finalized") + } + err = Finalize(psbt1, 1) + if err != nil { + t.Fatalf("Failed to finalize second input, %v", err) + } + + tx, err := Extract(psbt1) + if err != nil { + t.Fatalf("unable to extract tx: %v", err) + } + var networkSerializedTx bytes.Buffer + if err := tx.Serialize(&networkSerializedTx); err != nil { + t.Fatalf("unable to encode tx: %v", err) + } + + expectedTx := "0200000000010236a817a78a786b0f883431c6aaa11437c75a306d67346a99a666bf2095599e490100000000ffffffff461ca936215f9d048c369a34486b2022f0cec8c4050181076570f98e9e240ab5000000006a473044022014eb9c4858f71c9f280bc68402aa742a5187f54c56c8eb07c902eb1eb5804e5502203d66656de8386b9b044346d5605f5ae2b200328fb30476f6ac993fc0dbb04559012103b4c79acdf4e7d978bef4019c421e4c6c67044ed49d27322dc90e808d8080e862ffffffff028027128c0000000017a914055b2f1271292486518cc1f3a7c75e58c11cc0a687f05f93030000000017a9140b784f22df1a72fd418e862d81dba52423f90725870247304402200da03ac9890f5d724c42c83c2a62844c08425a274f1a5bca50dcde4126eb20dd02205278897b65cb8e390a0868c9582133c7157b2ad3e81c1c70d8fbd65f51a5658b0121024d6b24f372dd4551277c8df4ecc0655101e11c22894c8e05a3468409c865a72c0000000000" + expectedTxBytes, err := hex.DecodeString(expectedTx) + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + if !bytes.Equal(expectedTxBytes, networkSerializedTx.Bytes()) { + t.Fatalf("The produced network transaction did not match the expected: %x \n %x \n", + networkSerializedTx.Bytes(), expectedTxBytes) + } + +} + +func TestImportFromCore2(t *testing.T) { + // This example #2 was created manually using Bitcoin Core 0.17 regtest. + // It contains two inputs, one p2sh-p2wkh and one fake utxo. + // The PSBT has been created with walletcreatepsbt and then partial-signed + // on the real input with walletprocessbst in Core. + // We first check that the updating here, using the Core created signature, + // redeem script and signature for the p2sh-p2wkh input, creates the + // same partial-signed intermediate transaction as Core did after + // walletprocesspsbt. + // We then attach a fake + // input of type p2sh-p2wsh, attach its witnessUtxo, redeemscript and + // witnessscript fields, and then finalize the whole transaction. Unlike + // the previous example, we cannot here compare with a Core produced + // network serialized final transaction, because of the fake input. + imported := "cHNidP8BAJsCAAAAAkxTQ+rig5QNnUS5nMc+Pccow4IcOJeQRcNNw+7p5ZA5AQAAAAD/////qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqoNAAAAAP////8CAIYOcAAAAAAWABQ1l7nn13RubTwqRQU2BnVV5WlXBWAxMbUAAAAAF6kUkiuXUjfWFgTp6nl/gf9+8zIWR6KHAAAAAAAAAAAA" + psbt1, err := NewFromRawBytes(bytes.NewReader([]byte(imported)), true) + if err != nil { + t.Fatalf("Failed to parse PSBT: %v", err) + } + + // update with the first input's utxo, taken from its funding + // transaction + fundingTxInput1Hex := "02000000017b260536a3c17aee49c41a9b36fdf01a418e0c04df06fbabcb0d4f590b95d175000000006a473044022074a5a13159b6c12d77881c9501aa5c18616fb76c1809fc4d55f18a2e63159a6702200d1aa72be6056a41808898d24da93c0c0192cad65b7c2cc86e00b3e0fbbd57f601210212cc429d61fde565d0c2271a3e4fdb063cb49ae2257fa71460be753ceb56d175feffffff02bc060d8f0000000017a9140b56c31b5dc5a5a22c45a7850e707ad602d94a3087008352840000000017a9149f3679d67a9a486238764f618a93b82a7d999103879a000000" + fundingTxInput1Bytes, err := hex.DecodeString(fundingTxInput1Hex) + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + txFund1 := wire.NewMsgTx(2) + err = txFund1.Deserialize(bytes.NewReader(fundingTxInput1Bytes)) + if err != nil { + t.Fatalf("Error deserializing transaction: %v", err) + } + // First input is witness, take correct output: + txFund1Out := txFund1.TxOut[1] + + psbtupdater1 := Updater{Upsbt: psbt1} + psbtupdater1.AddInWitnessUtxo(txFund1Out, 0) + + // This input is p2sh-p2wkh, so it requires a redeemscript but not + // a witness script. The redeemscript is the witness program. + redeemScript, err := hex.DecodeString("00147aed39420a8b7ab98a83791327ccb70819d1fbe2") + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + psbtupdater1.AddInRedeemScript(redeemScript, 0) + + // Signing for the first input was done with Core; we manually insert the + // relevant input entries here. + sig1Hex := "30440220546d182d00e45ef659c329dce6197dc19e0abc795e2c9279873f5a887998b273022044143113fc3475d04fc8d5113e0bbcb42d80514a9f1a2247e9b2a7878e20d44901" + sig1, err := hex.DecodeString(sig1Hex) + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + pub1Hex := "02bb3ce35af26f4c826eab3e5fc263ef56871b26686a8a995599b7ee6576613104" + pub1, err := hex.DecodeString(pub1Hex) + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + + res, err := psbtupdater1.Sign(0, sig1, pub1, nil, nil) + if err != nil || res != 0 { + t.Fatalf("Unable to add partial signature: %v %v", err, res) + } + + // Since this input is now finalizable, we do so: + err = Finalize(psbt1, 0) + if err != nil { + t.Fatalf("Failed to finalize the first input: %v", err) + } + if psbt1.IsComplete() { + t.Fatalf("PSBT was complete but has not been fully finalized") + } + + // Core also adds the OutRedeemScript field for the output it knows about. + // Note that usually we would not of course re-create, but rather start + // from the half-signed version; so this is needed only for a sanity check + // that we can recreate the half-signed. + output2RedeemScript, err := hex.DecodeString("0014e0846bd17848ab40ca1f56b655c6fa31667880cc") + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + psbtupdater1.AddOutRedeemScript(output2RedeemScript, 1) + // The main function of the test is to compare the thus-generated + // partially (not completely) signed transaction with that generated and + // encoded by Core. + expectedPsbtPartialB64 := "cHNidP8BAJsCAAAAAkxTQ+rig5QNnUS5nMc+Pccow4IcOJeQRcNNw+7p5ZA5AQAAAAD/////qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqoNAAAAAP////8CAIYOcAAAAAAWABQ1l7nn13RubTwqRQU2BnVV5WlXBWAxMbUAAAAAF6kUkiuXUjfWFgTp6nl/gf9+8zIWR6KHAAAAAAABASAAg1KEAAAAABepFJ82edZ6mkhiOHZPYYqTuCp9mZEDhwEHFxYAFHrtOUIKi3q5ioN5EyfMtwgZ0fviAQhrAkcwRAIgVG0YLQDkXvZZwync5hl9wZ4KvHleLJJ5hz9aiHmYsnMCIEQUMRP8NHXQT8jVET4LvLQtgFFKnxoiR+myp4eOINRJASECuzzjWvJvTIJuqz5fwmPvVocbJmhqiplVmbfuZXZhMQQAAAABABYAFOCEa9F4SKtAyh9WtlXG+jFmeIDMAA==" + generatedPsbtPartialB64, err := psbt1.B64Encode() + if err != nil { + t.Fatalf("Unable to B64Encode Psbt: %v", err) + } + if expectedPsbtPartialB64 != generatedPsbtPartialB64 { + t.Fatalf("Partial did not match expected: %v", generatedPsbtPartialB64) + } + + // We now simulate adding the signing data for the second (fake) input, + // and check that we can finalize and extract. This input is p2sh-p2wsh. + // the second input is fake, we're going to make it witness type, + // so create a TxOut struct that fits + fakeTxOutSerialized, err := hex.DecodeString("00c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e887") + if err != nil { + t.Fatalf("Failed to decode hex: %v", err) + } + fakevalSerialized := binary.LittleEndian.Uint64(fakeTxOutSerialized[:8]) + fakeScriptPubKey := fakeTxOutSerialized[9:] + txFund2Out := wire.NewTxOut(int64(fakevalSerialized), fakeScriptPubKey) + psbt2, err := NewFromRawBytes(bytes.NewReader([]byte(expectedPsbtPartialB64)), true) + if err != nil { + t.Fatalf("Failed to load partial PSBT: %v", err) + } + psbtupdater2, err := NewUpdater(psbt2) + if err != nil { + t.Fatalf("Failed to create updater: %v", err) + } + psbtupdater2.AddInWitnessUtxo(txFund2Out, 1) + // Add redeemScript, which is the witnessscript/program: + redeemScript, err = hex.DecodeString("00208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903") + if err != nil { + t.Fatalf("Failed to decode hex: %v", err) + } + err = psbtupdater2.AddInRedeemScript(redeemScript, 1) + if err != nil { + t.Fatalf("Failed to add redeemscript to second input: %v", err) + } + // Add witnessScript, which here is multisig: + witnessScript, err := hex.DecodeString("522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae") + if err != nil { + t.Fatalf("Failed to decode hex: %v", err) + } + // To test multisig checks, add a nonsense version of the multisig script + witnessScriptNonsense, err := hex.DecodeString("52ffff") + if err != nil { + t.Fatalf("Failed to decode hex: %v", err) + } + err = psbtupdater2.AddInWitnessScript(witnessScript, 1) + if err != nil { + t.Fatalf("Failed to add witnessscript to second input: %v", err) + } + // Construct the two partial signatures to be added + sig21, err := hex.DecodeString("3044022062eb7a556107a7c73f45ac4ab5a1dddf6f7075fb1275969a7f383efff784bcb202200c05dbb7470dbf2f08557dd356c7325c1ed30913e996cd3840945db12228da5f01") + if err != nil { + t.Fatalf("Failed to decode hex: %v", err) + } + pub21, err := hex.DecodeString("03089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc") + if err != nil { + t.Fatalf("Failed to decode hex: %v", err) + } + sig22, err := hex.DecodeString("3044022065f45ba5998b59a27ffe1a7bed016af1f1f90d54b3aa8f7450aa5f56a25103bd02207f724703ad1edb96680b284b56d4ffcb88f7fb759eabbe08aa30f29b851383d201") + if err != nil { + t.Fatalf("Failed to decode hex: %v", err) + } + pub22, err := hex.DecodeString("023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e73") + if err != nil { + t.Fatalf("Failed to decode hex: %v", err) + } + res, err = psbtupdater2.Sign(1, sig21, pub21, nil, nil) + + // Check that the finalization procedure fails here due to not + // meeting the multisig policy + success, err := MaybeFinalize(psbt2, 1) + if success { + t.Fatalf("Incorrectly succeeded in finalizing without sigs") + } + if err != ErrUnsupportedScriptType { + t.Fatalf("Got unexpected error type: %v", err) + } + + res, err = psbtupdater2.Sign(1, sig22, pub22, nil, nil) + + // Check that the finalization procedure also fails with a nonsense + // script + err = psbtupdater2.AddInWitnessScript(witnessScriptNonsense, 1) + if err != nil { + t.Fatalf("Failed to add witnessscript to second input: %v", err) + } + success, err = MaybeFinalize(psbt2, 1) + if success { + t.Fatalf("Incorrectly succeeded in finalizing with invalid msigscript") + } + if err != ErrUnsupportedScriptType { + t.Fatalf("Got unexpected error type: %v", err) + } + + // Restore the correct witnessScript to complete correctly + err = psbtupdater2.AddInWitnessScript(witnessScript, 1) + if err != nil { + t.Fatalf("Failed to add witnessscript to second input: %v", err) + } + + success, err = MaybeFinalize(psbt2, 1) + if !success { + if err != nil { + t.Fatalf("Failed to finalize second input: %v", err) + } else { + t.Fatalf("Input was not finalizable") + } + } + + // Add a (fake) witnessOut descriptor field to one of the outputs, + // for coverage purposes (we aren't currently using this field) + psbtupdater2.AddOutWitnessScript([]byte{0xff, 0xff, 0xff}, 0) + + // Sanity check; we should not have lost the additional output entry + // provided by Core initially + uoutput1 := psbtupdater2.Upsbt.Outputs[1] + if uoutput1.RedeemScript == nil { + t.Fatalf("PSBT should contain outredeemscript entry, but it does not.") + } + // Nor should we have lost our fake witnessscript output entry + uoutput2 := psbtupdater2.Upsbt.Outputs[0] + if uoutput2.WitnessScript == nil { + t.Fatalf("PSBT should contain outwitnessscript but it does not.") + } + var tx bytes.Buffer + networkSerializedTx, err := Extract(psbt2) + if err != nil { + t.Fatalf("unable to extract tx: %v", err) + } + if err := networkSerializedTx.Serialize(&tx); err != nil { + t.Fatalf("unable to encode tx: %v", err) + } + expectedSerializedTx, err := hex.DecodeString("020000000001024c5343eae283940d9d44b99cc73e3dc728c3821c38979045c34dc3eee9e5903901000000171600147aed39420a8b7ab98a83791327ccb70819d1fbe2ffffffffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0d000000232200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903ffffffff0200860e70000000001600143597b9e7d7746e6d3c2a450536067555e5695705603131b50000000017a914922b975237d61604e9ea797f81ff7ef3321647a287024730440220546d182d00e45ef659c329dce6197dc19e0abc795e2c9279873f5a887998b273022044143113fc3475d04fc8d5113e0bbcb42d80514a9f1a2247e9b2a7878e20d449012102bb3ce35af26f4c826eab3e5fc263ef56871b26686a8a995599b7ee65766131040400473044022062eb7a556107a7c73f45ac4ab5a1dddf6f7075fb1275969a7f383efff784bcb202200c05dbb7470dbf2f08557dd356c7325c1ed30913e996cd3840945db12228da5f01473044022065f45ba5998b59a27ffe1a7bed016af1f1f90d54b3aa8f7450aa5f56a25103bd02207f724703ad1edb96680b284b56d4ffcb88f7fb759eabbe08aa30f29b851383d20147522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae00000000") + if err != nil { + t.Fatalf("Failed to decode hex: %v", err) + } + if !bytes.Equal(expectedSerializedTx, tx.Bytes()) { + t.Fatalf("Failed to create correct network serialized "+ + "transaction: expected %x, got %x", + expectedSerializedTx, tx.Bytes()) + } +} + +func TestMaybeFinalizeAll(t *testing.T) { + // The following data is from a 3rd transaction from Core, + // using 3 inputs, all p2wkh. + imported := "cHNidP8BAKQCAAAAAzJyXH13IqBFvvZ7y1VSgUgkMvMoPgP5CfFNqsjQexKQAQAAAAD/////fMdLydu5bsoiHN9cFSaBL0Qnq2KLSKx0RA4b938CAgQAAAAAAP/////yKNgfsDAHr/zFz8R9k8EFI26allfg9DdE8Gzj6tGlegEAAAAA/////wHw9E0OAAAAABYAFDnPCRduiEWmmSc1j30SJ8k9u7PHAAAAAAAAAAAA" + psbt1, err := NewFromRawBytes(bytes.NewReader([]byte(imported)), true) + if err != nil { + t.Fatalf("Failed to parse PSBT: %v", err) + } + + // update with the first input's utxo, taken from its funding + // transaction + fundingTxInput1, err := hex.DecodeString("020000000001017b260536a3c17aee49c41a9b36fdf01a418e0c04df06fbabcb0d4f590b95d1750100000017160014af82cd4409241b1de892726324bd780e3b5cd8aafeffffff02a85f9800000000001600149d21f8b306ddfd4dd035080689e88b4c3471e3cc801d2c0400000000160014d97ccd3dfb60820d7d33d862371ca5a73039bd560247304402201a1d2fdb5a7190b7fa59907769f0fc9c91fd3b34f6424acf5868a8ac21ec287102200a59b9d076ecf98c88f2196ed2be0aafff4966ead754041182fff5f92115a783012103604ffd31dc71db2e32c20f09eafe6353cd7515d3648aff829bb4879b553e30629a000000") + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + fundingTxInput2, err := hex.DecodeString("020000000001019c27b886e420fcadb077706b0933efa8bb53e3a250c3ec45cfdba5e05e233f360100000000feffffff0200b4c404000000001600140853f50c7d2d5d2af326a75efdbc83b62551e89afce31c0d000000001600142d6936c082c35607ec3bdb334a932d928150b75802473044022000d962f5e5e6425f9de21da7ac65b4fd8af8f6bfbd33c7ba022827c73866b477022034c59935c1ea10b5ba335d93f55a200c2588ec6058b8c7aedd10d5cbc4654f99012102c30e9f0cd98f6a805464d6b8a326b5679b6c3262934341855ee0436eaedfd2869a000000") + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + fundingTxInput3, err := hex.DecodeString("02000000012bf4331bb95df4eadb14f7a28db3fecdc5e87f08c29c2332b66338dd606699f60000000048473044022075ed43f508528da47673550a785702e9a93eca84a11faea91c4e9c66fcab3c9e022054a37610bd40b12263a5933188f062b718e007f290cecde2b6e41da3e1ebbddf01feffffff020c99a8240100000016001483bd916985726094d6d1c5b969722da580b5966a804a5d05000000001600140a2ee13a6696d75006af5e8a026ea49316087dae9a000000") + if err != nil { + t.Fatalf("Unable to decode hex: %v", err) + } + + psbtupdater1 := Updater{Upsbt: psbt1} + tx := wire.NewMsgTx(2) + err = tx.Deserialize(bytes.NewReader(fundingTxInput1)) + if err != nil { + t.Fatalf("Error deserializing transaction: %v", err) + } + txFund1Out := tx.TxOut[1] + psbtupdater1.AddInWitnessUtxo(txFund1Out, 0) + + tx = wire.NewMsgTx(2) + err = tx.Deserialize(bytes.NewReader(fundingTxInput2)) + if err != nil { + t.Fatalf("Error deserializing transaction: %v", err) + } + txFund2Out := tx.TxOut[0] + psbtupdater1.AddInWitnessUtxo(txFund2Out, 1) + + tx = wire.NewMsgTx(2) + err = tx.Deserialize(bytes.NewReader(fundingTxInput3)) + if err != nil { + t.Fatalf("Error deserializing transaction: %v", err) + } + txFund3Out := tx.TxOut[1] + psbtupdater1.AddInWitnessUtxo(txFund3Out, 2) + + // To be ready for finalization, we need to have partial signature + // fields for each input + sig1, _ := hex.DecodeString("30440220027605ee8015970baf02a72652967a543e1b29a6882d799738ed1baee508822702203818a2f1b9770c46a473f47ad7ae90bcc129a5d047f00fae354c80197a7cf50601") + pub1, _ := hex.DecodeString("03235fc1f9dc8bbf6fa3df35dfeb0dd486f2d488f139579885eb684510f004f6c1") + sig2, _ := hex.DecodeString("304402206f5aea4621696610de48736b95a89b1d3a434a4e536d9aae65e039c477cf4c7202203b27a18b0f63be7d3bbf5be1bc2306a7ec8c2da12c2820ff07b73c7f3f1d4d7301") + pub2, _ := hex.DecodeString("022011b496f0603a268b55a781c7be0c3849f605f09cb2e917ed44288b8144a752") + sig3, _ := hex.DecodeString("3044022036dbc6f8f85a856e7803cbbcf0a97b7a74806fc592e92d7c06826f911610b98e0220111d43c4b20f756581791334d9c5cbb1a9c07558f28404cabf01c782897ad50501") + pub3, _ := hex.DecodeString("0381772a80c69e275e20d7f014555b13031e9cacf1c54a44a67ab2bc7eba64f227") + res, err := psbtupdater1.Sign(0, sig1, pub1, nil, nil) + if err != nil || res != 0 { + t.Fatalf("Failed to add partial signature for input 0: %v %v", err, res) + } + res, err = psbtupdater1.Sign(1, sig2, pub2, nil, nil) + if err != nil || res != 0 { + t.Fatalf("Failed to add partial signature for input 1: %v %v", err, res) + } + + // Not ready for finalize all, check it fails: + err = MaybeFinalizeAll(psbt1) + if err != ErrNotFinalizable { + t.Fatalf("Expected finalization failure, got: %v", err) + } + + res, err = psbtupdater1.Sign(2, sig3, pub3, nil, nil) + + // Since this input is now finalizable and is p2wkh only, we can do + // all at once: + err = MaybeFinalizeAll(psbt1) + if err != nil { + t.Fatalf("Failed to finalize PSBT: %v", err) + } + if !psbt1.IsComplete() { + t.Fatalf("PSBT was finalized but not marked complete") + } + +} + +func TestFromUnsigned(t *testing.T) { + serTx, err := hex.DecodeString("00000000000101e165f072311e71825b47a4797221d7ae56d4b40b7707c540049aee43302448a40000000000feffffff0212f1126a0000000017a9143e836801b2b15aa193449d815c62d6c4b6227c898780778e060000000017a914ba4bdb0b07d67bc60f59c1f4fe54170565254974870000000000") + if err != nil { + t.Fatalf("Error: %v", err) + } + tx := wire.NewMsgTx(2) + err = tx.Deserialize(bytes.NewReader(serTx)) + if err != nil { + t.Fatalf("Error: %v", err) + } + psbt1, err := NewFromUnsignedTx(tx) + if err != nil { + t.Fatalf("Error: %v", err) + } + encoded, err := psbt1.B64Encode() + if err != nil { + t.Fatalf("Unable to B64Encode Psbt: %v", err) + } + + // Compare with output of Core: + fromCoreB64 := "cHNidP8BAHMAAAAAAeFl8HIxHnGCW0ekeXIh165W1LQLdwfFQASa7kMwJEikAAAAAAD+////AhLxEmoAAAAAF6kUPoNoAbKxWqGTRJ2BXGLWxLYifImHgHeOBgAAAAAXqRS6S9sLB9Z7xg9ZwfT+VBcFZSVJdIcAAAAAAAAAAA==" + if encoded != fromCoreB64 { + t.Fatalf("Got incorrect b64: %v", encoded) + } + _, err = NewFromRawBytes(bytes.NewReader([]byte(fromCoreB64)), true) + if err != nil { + t.Fatalf("Error: %v", err) + } +} + +func TestNonWitnessToWitness(t *testing.T) { + // We'll start with a PSBT produced by Core for which + // the first input is signed and we'll provided the signatures for + // the other three inputs; they are p2sh-p2wkh, p2wkh and legacy + // respectively. + // In each case we'll *first* attach the NonWitnessUtxo field, + // and then call sign; in the first two but not the third case, the + // NonWitnessUtxo will automatically be replaced with the WitnessUtxo. + // Finally we'll check that the fully finalized PSBT produced matches + // the one produced by Core for the same keys. + + psbt1B64 := "cHNidP8BAM4CAAAABHtBMXY+SX95xidmWJP67CTQ02FPUpbNhIxNplAdlvk+AQAAAAD/////G2mt4bX7+sVi1jdbuBa5Q/xsJdgzFCgdHHSZq3ewK6YAAAAAAP/////NrbZb7GzfAg4kOqFWAIbXabq4cAvtVGv+eecIIv1KggEAAAAA/////73s9ifprgErlaONH1rgpNs3l6+t+mz2XGTHsTVWCem/AQAAAAD/////AfAmclMAAAAAF6kUQwsEC5nzbdY5meON2ZQ2thmeFgOHAAAAAAABASAAZc0dAAAAABepFPAv3VTMu5+4WN+/HIji6kG9RpzKhwEHFxYAFLN3PqXSyIHWKqm4ah5m9erc/3OoAQhrAkcwRAIgH7kzGO2iskfCvX0dgkDuzfqJ7tAu7KUZOeykTkJ1SYkCIBv4QRZK1hLz45D0gs+Lz93OE4s37lkPVE+SlXZtazWEASEC3jaf19MMferBn0Bn5lxXJGOqoqmfSvnHclQvB5gJ3nEAAAAAAQAWABTB+Qcq6iqdSvvc6959kd7XHrhYFgA=" + nwutxo1ser, _ := hex.DecodeString("02000000017f7baa6b7377541c4aca372d2dce8e1098ba44aa8379b7ea87644ef27e08ec240000000048473044022072e3b94c33cb5128518cd3903cc0ca19e8c234ac6d462e01ae2bb1da7768ed7d0220167d7ad89f6e1bbb3b866ae6fc2f67b5e7d51eb4f33f7bfe3f4b2673856b815001feffffff0200c2eb0b0000000017a9142dd25c78db2e2e09376eab9cb342e1b03005abe487e4ab953e0000000017a914120b8ca3fb4c7f852e30d4e3714fb64027a0b4c38721020000") + nwutxo2ser, _ := hex.DecodeString("0200000001f51b0bb5d945dd5532448a4d3fb88134d0bd90493813515f9c2ddb1fa15b9ba60000000048473044022047d83caf88d398245c006374bfa9f27ae968f5f51d640cacd5a214ed2cba397a02204519b26035496855f574a72b73bdcfa46d53995faf64c8f0ab394b628cc5383901feffffff020ccb9f3800000000160014e13544a3c718faa6c5ad7089a6660383c12b072700a3e11100000000160014a5439b477c116b79bd4c7c5131f3e58d54f27bb721020000") + nwutxo3ser, _ := hex.DecodeString("0200000001eb452f0fc9a8c39edb79f7174763f3cb25dc56db455926e411719a115ef16509000000004847304402205aa80cc615eb4b3f6e89696db4eadd192581a6c46f5c09807d3d98ece1d77355022025007e58c1992a1e5d877ee324bfe0a65db26d29f80941cfa277ac3efbcad2a701feffffff02bce9a9320000000017a9141590e852ac66eb8798afeb2a5ed67c568a2d6561870084d717000000001976a914a57ea05eacf94900d5fb92bccd273cfdb90af36f88ac21020000") + + nwutxo1 := wire.NewMsgTx(2) + err := nwutxo1.Deserialize(bytes.NewReader(nwutxo1ser)) + if err != nil { + t.Fatalf("Error deserializing transaction: %v", err) + } + nwutxo2 := wire.NewMsgTx(2) + err = nwutxo2.Deserialize(bytes.NewReader(nwutxo2ser)) + if err != nil { + t.Fatalf("Error deserializing transaction: %v", err) + } + nwutxo3 := wire.NewMsgTx(2) + err = nwutxo3.Deserialize(bytes.NewReader(nwutxo3ser)) + if err != nil { + t.Fatalf("Error deserializing transaction: %v", err) + } + + // import the PSBT + psbt1, err := NewFromRawBytes(bytes.NewReader([]byte(psbt1B64)), true) + if err != nil { + t.Fatalf("Failed to create PSBT: %v", err) + } + + // check that we recognize the finality of the first input + if !isFinalized(psbt1, 0) { + t.Fatalf("First input incorrectly read as not finalized.") + } + + // Add NonWitnessUtxo fields for each of the other three inputs + u := Updater{Upsbt: psbt1} + u.AddInNonWitnessUtxo(nwutxo1, 1) + u.AddInNonWitnessUtxo(nwutxo2, 2) + u.AddInNonWitnessUtxo(nwutxo3, 3) + + // Signatures for each of those inputs were created with Core: + sig1, _ := hex.DecodeString("304402205676877e6162ce40a49ee5a74443cdc1e7915637c42da7b872c2ec2298fd371b02203c1d4a05b1e2a7a588d9ec9b8d4892d2cd59bebe0e777483477a0ec692ebbe6d01") + pub1, _ := hex.DecodeString("02534f23cb88a048b649672967263bd7570312d5d31d066fa7b303970010a77b2b") + redeemScript1, _ := hex.DecodeString("00142412be29368c0260cb841eecd9b59d7e01174aa1") + + sig2, _ := hex.DecodeString("3044022065d0a349709b8d8043cfd644cf6c196c1f601a22e1b3fdfbf8c0cc2a80fe2f1702207c87d36b666a8862e81ec5df288707f517d2f35ea1548feb82019de2c8de90f701") + pub2, _ := hex.DecodeString("0257d88eaf1e79b72ea0a33ae89b57dae95ea68499bdc6770257e010ab899f0abb") + + sig3, _ := hex.DecodeString("30440220290abcaacbd759c4f989762a9ee3468a9231788aab8f50bf65955d8597d8dd3602204d7e394f4419dc5392c6edba6945837458dd750a030ac67a746231903a8eb7db01") + pub3, _ := hex.DecodeString("0388025f50bb51c0469421ed13381f22f9d46a070ec2837e055c49c5876f0d0968") + + // Add the signatures and any scripts needed to the inputs + res, err := u.Sign(1, sig1, pub1, redeemScript1, nil) + if res != 0 || err != nil { + t.Fatalf("Failed to sign at index %v res %v err %v", 1, res, err) + } + res, err = u.Sign(2, sig2, pub2, nil, nil) + if res != 0 || err != nil { + t.Fatalf("Failed to sign at index %v res %v err %v", 2, res, err) + } + res, err = u.Sign(3, sig3, pub3, nil, nil) + if res != 0 || err != nil { + t.Fatalf("Failed to sign at index %v res %v err %v", 3, res, err) + } + + // Attempt to finalize the rest of the transaction + _, err = MaybeFinalize(psbt1, 1) + if err != nil { + t.Fatalf("Failed to finalize input 1 %v", err) + } + _, err = MaybeFinalize(psbt1, 2) + if err != nil { + t.Fatalf("Failed to finalize input 2 %v", err) + } + _, err = MaybeFinalize(psbt1, 3) + if err != nil { + t.Fatalf("Failed to finalize input 3 %v", err) + } + + // Finally we can check whether both the B64 encoding of the PSBT, + // and the final network serialized signed transaction, that we generated + // with Core using the 2 wallets, matches what this code produces: + expectedFinalizedPsbt := "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" + calculatedPsbt, err := u.Upsbt.B64Encode() + if err != nil { + t.Fatalf("Failed to base64 encode") + } + if expectedFinalizedPsbt != calculatedPsbt { + t.Fatalf("Failed to generate correct PSBT") + } + + expectedNetworkSer, _ := hex.DecodeString("020000000001047b4131763e497f79c627665893faec24d0d3614f5296cd848c4da6501d96f93e0100000017160014b3773ea5d2c881d62aa9b86a1e66f5eadcff73a8ffffffff1b69ade1b5fbfac562d6375bb816b943fc6c25d83314281d1c7499ab77b02ba600000000171600142412be29368c0260cb841eecd9b59d7e01174aa1ffffffffcdadb65bec6cdf020e243aa1560086d769bab8700bed546bfe79e70822fd4a820100000000ffffffffbdecf627e9ae012b95a38d1f5ae0a4db3797afadfa6cf65c64c7b1355609e9bf010000006a4730440220290abcaacbd759c4f989762a9ee3468a9231788aab8f50bf65955d8597d8dd3602204d7e394f4419dc5392c6edba6945837458dd750a030ac67a746231903a8eb7db01210388025f50bb51c0469421ed13381f22f9d46a070ec2837e055c49c5876f0d0968ffffffff01f02672530000000017a914430b040b99f36dd63999e38dd99436b6199e1603870247304402201fb93318eda2b247c2bd7d1d8240eecdfa89eed02eeca51939eca44e4275498902201bf841164ad612f3e390f482cf8bcfddce138b37ee590f544f9295766d6b3584012102de369fd7d30c7deac19f4067e65c572463aaa2a99f4af9c772542f079809de710247304402205676877e6162ce40a49ee5a74443cdc1e7915637c42da7b872c2ec2298fd371b02203c1d4a05b1e2a7a588d9ec9b8d4892d2cd59bebe0e777483477a0ec692ebbe6d012102534f23cb88a048b649672967263bd7570312d5d31d066fa7b303970010a77b2b02473044022065d0a349709b8d8043cfd644cf6c196c1f601a22e1b3fdfbf8c0cc2a80fe2f1702207c87d36b666a8862e81ec5df288707f517d2f35ea1548feb82019de2c8de90f701210257d88eaf1e79b72ea0a33ae89b57dae95ea68499bdc6770257e010ab899f0abb0000000000") + tx, err := Extract(psbt1) + if err != nil { + t.Fatalf("Failed to extract: %v", err) + } + var b bytes.Buffer + if err := tx.Serialize(&b); err != nil { + t.Fatalf("unable to encode tx: %v", err) + } + if !bytes.Equal(expectedNetworkSer, b.Bytes()) { + t.Fatalf("Expected serialized transaction was not produced: %x", b.Bytes()) + } +} + +// TestEmptyInputSerialization tests the special serialization case for a wire +// transaction that has no inputs. +func TestEmptyInputSerialization(t *testing.T) { + // Create and serialize a new, empty PSBT. The wire package will assume + // it's a non-witness transaction, as there are no inputs. + psbt, err := New(nil, nil, 2, 0, nil) + if err != nil { + t.Fatalf("failed to create empty PSBT: %v", err) + } + var buf bytes.Buffer + err = psbt.Serialize(&buf) + if err != nil { + t.Fatalf("failed to serialize empty PSBT: %v", err) + } + + // Try to deserialize the empty transaction again. The wire package will + // assume it's a witness transaction because of the special case where + // there are no inputs. This assumption is wrong and the first attempt + // will fail. But a workaround should try again to deserialize the TX + // with the non-witness format. + psbt2, err := NewFromRawBytes(&buf, false) + if err != nil { + t.Fatalf("failed to deserialize empty PSBT: %v", err) + } + if len(psbt2.UnsignedTx.TxIn) > 0 || len(psbt2.UnsignedTx.TxOut) > 0 { + t.Fatalf("deserialized transaction not empty") + } +} + +// TestWitnessForNonWitnessUtxo makes sure that a packet that only has a non- +// witness UTXO set can still be signed correctly by adding witness data. This +// is to make sure that PSBTs following the CVE-2020-14199 bugfix are not +// rejected. See https://github.com/bitcoin/bitcoin/pull/19215. +func TestWitnessForNonWitnessUtxo(t *testing.T) { + // Our witness UTXO is index 1 of this raw transaction from the test + // vectors. + prevTxRaw, _ := hex.DecodeString("0200000000010158e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd7501000000171600145f275f436b09a8cc9a2eb2a2f528485c68a56323feffffff02d8231f1b0100000017a914aed962d6654f9a2b36608eb9d64d2b260db4f1118700c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e88702483045022100a22edcc6e5bc511af4cc4ae0de0fcd75c7e04d8c1c3a8aa9d820ed4b967384ec02200642963597b9b1bc22c75e9f3e117284a962188bf5e8a74c895089046a20ad770121035509a48eb623e10aace8bfd0212fdb8a8e5af3c94b0b133b95e114cab89e4f7965000000") + prevTx := wire.NewMsgTx(2) + err := prevTx.Deserialize(bytes.NewReader(prevTxRaw)) + if err != nil { + t.Fatalf("failed to deserialize previous TX: %v", err) + } + + // First create a packet that contains one input and one output. + outPkScript, _ := hex.DecodeString(CUTestHexData["scriptPubkey1"]) + packet := &Packet{ + UnsignedTx: &wire.MsgTx{ + Version: 2, + LockTime: 0, + TxIn: []*wire.TxIn{{ + PreviousOutPoint: wire.OutPoint{ + Hash: prevTx.TxHash(), + Index: 1, + }, + }}, + TxOut: []*wire.TxOut{{ + PkScript: outPkScript, + Value: 1.9 * btcutil.SatoshiPerBitcoin, + }}, + }, + Inputs: []PInput{{}}, + Outputs: []POutput{{}}, + } + + // Create an updater for the packet. This also performs a sanity check. + updater, err := NewUpdater(packet) + if err != nil { + t.Fatalf("failed to sanity check raw packet: %v", err) + } + + // Now add our witness UTXO to the input. But because hardware wallets + // that are patched against CVE-2020-14199 require the full non-witness + // UTXO to be set for all inputs, we do what Core does and add the full + // transaction in the NonWitnessUtxo instead of just the outpoint in + // WitnessUtxo. + err = updater.AddInNonWitnessUtxo(prevTx, 0) + if err != nil { + t.Fatalf("failed to update non-witness UTXO: %v", err) + } + + // Then add the redeem scripts and witness scripts. + redeemScript, _ := hex.DecodeString(CUTestHexData["Input2RedeemScript"]) + err = updater.AddInRedeemScript(redeemScript, 0) + if err != nil { + t.Fatalf("failed to update redeem script: %v", err) + } + witnessScript, _ := hex.DecodeString(CUTestHexData["Input2WitnessScript"]) + err = updater.AddInWitnessScript(witnessScript, 0) + if err != nil { + t.Fatalf("failed to update redeem script: %v", err) + } + + // Add the first of the two partial signatures. + sig1, _ := hex.DecodeString("3044022062eb7a556107a7c73f45ac4ab5a1dddf6f7075fb1275969a7f383efff784bcb202200c05dbb7470dbf2f08557dd356c7325c1ed30913e996cd3840945db12228da5f01") + pub1, _ := hex.DecodeString("03089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc") + res, err := updater.Sign(0, sig1, pub1, nil, nil) + if err != nil { + t.Fatalf("failed to sign with pubkey 1: %v", err) + } + if res != SignSuccesful { + t.Fatalf("signing was not successful, got result %v", res) + } + + // Check that the finalization procedure fails here due to not + // meeting the multisig policy + success, err := MaybeFinalize(packet, 0) + if success { + t.Fatalf("Incorrectly succeeded in finalizing without sigs") + } + if err != ErrUnsupportedScriptType { + t.Fatalf("Got unexpected error type: %v", err) + } + + // Add the second partial signature. + sig2, _ := hex.DecodeString("3044022065f45ba5998b59a27ffe1a7bed016af1f1f90d54b3aa8f7450aa5f56a25103bd02207f724703ad1edb96680b284b56d4ffcb88f7fb759eabbe08aa30f29b851383d201") + pub2, _ := hex.DecodeString("023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e73") + res, err = updater.Sign(0, sig2, pub2, nil, nil) + if err != nil { + t.Fatalf("failed to sign with pubkey 2: %v", err) + } + if res != SignSuccesful { + t.Fatalf("signing was not successful, got result %v", res) + } + + // Finally make sure we can finalize the packet and extract the raw TX. + err = MaybeFinalizeAll(packet) + if err != nil { + t.Fatalf("error finalizing PSBT: %v", err) + } + _, err = Extract(packet) + if err != nil { + t.Fatalf("unable to extract funding TX: %v", err) + } +} + +// TestUnknowns tests that we can parse and serialize unknown fields on all +// three levels (global, input, output). +func TestUnknowns(t *testing.T) { + packetWithUnknowns := "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" + + packet, err := NewFromRawBytes( + strings.NewReader(packetWithUnknowns), true, + ) + require.NoError(t, err) + + require.Len(t, packet.Unknowns, 2) + + require.Len(t, packet.Inputs, 1) + require.Len(t, packet.Inputs[0].Unknowns, 10) + + require.Len(t, packet.Outputs, 2) + require.Len(t, packet.Outputs[0].Unknowns, 7) + + // Convert it to base64 again to make sure the fields are also + // serialized. + encoded, err := packet.B64Encode() + require.NoError(t, err) + require.Equal(t, packetWithUnknowns, encoded) +} diff --git a/btcutil/psbt/signer.go b/btcutil/psbt/signer.go new file mode 100644 index 0000000000..dcbcf93fa3 --- /dev/null +++ b/btcutil/psbt/signer.go @@ -0,0 +1,157 @@ +// Copyright (c) 2018 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package psbt + +// signer encapsulates the role 'Signer' as specified in BIP174; it controls +// the insertion of signatures; the Sign() function will attempt to insert +// signatures using Updater.addPartialSignature, after first ensuring the Psbt +// is in the correct state. + +import ( + "github.com/btcsuite/btcd/txscript" +) + +// SignOutcome is a enum-like value that expresses the outcome of a call to the +// Sign method. +type SignOutcome int + +const ( + // SignSuccesful indicates that the partial signature was successfully + // attached. + SignSuccesful = 0 + + // SignFinalized indicates that this input is already finalized, so the + // provided signature was *not* attached + SignFinalized = 1 + + // SignInvalid indicates that the provided signature data was not valid. + // In this case an error will also be returned. + SignInvalid = -1 +) + +// Sign allows the caller to sign a PSBT at a particular input; they +// must provide a signature and a pubkey, both as byte slices; they can also +// optionally provide both witnessScript and/or redeemScript, otherwise these +// arguments must be set as nil (and in that case, they must already be present +// in the PSBT if required for signing to succeed). +// +// This serves as a wrapper around Updater.addPartialSignature; it ensures that +// the redeemScript and witnessScript are updated as needed (note that the +// Updater is allowed to add redeemScripts and witnessScripts independently, +// before signing), and ensures that the right form of utxo field +// (NonWitnessUtxo or WitnessUtxo) is included in the input so that signature +// insertion (and then finalization) can take place. +func (u *Updater) Sign(inIndex int, sig []byte, pubKey []byte, + redeemScript []byte, witnessScript []byte) (SignOutcome, error) { + + if isFinalized(u.Upsbt, inIndex) { + return SignFinalized, nil + } + + // Add the witnessScript to the PSBT in preparation. If it already + // exists, it will be overwritten. + if witnessScript != nil { + err := u.AddInWitnessScript(witnessScript, inIndex) + if err != nil { + return SignInvalid, err + } + } + + // Add the redeemScript to the PSBT in preparation. If it already + // exists, it will be overwritten. + if redeemScript != nil { + err := u.AddInRedeemScript(redeemScript, inIndex) + if err != nil { + return SignInvalid, err + } + } + + // At this point, the PSBT must have the requisite witnessScript or + // redeemScript fields for signing to succeed. + // + // Case 1: if witnessScript is present, it must be of type witness; + // if not, signature insertion will of course fail. + pInput := u.Upsbt.Inputs[inIndex] + switch { + case pInput.WitnessScript != nil: + if pInput.WitnessUtxo == nil { + err := nonWitnessToWitness(u.Upsbt, inIndex) + if err != nil { + return SignInvalid, err + } + } + + err := u.addPartialSignature(inIndex, sig, pubKey) + if err != nil { + return SignInvalid, err + } + + // Case 2: no witness script, only redeem script; can be legacy p2sh or + // p2sh-wrapped p2wkh. + case pInput.RedeemScript != nil: + // We only need to decide if the input is witness, and we don't + // rely on the witnessutxo/nonwitnessutxo in the PSBT, instead + // we check the redeemScript content. + if txscript.IsWitnessProgram(redeemScript) { + if pInput.WitnessUtxo == nil { + err := nonWitnessToWitness(u.Upsbt, inIndex) + if err != nil { + return SignInvalid, err + } + } + } + + // If it is not a valid witness program, we here assume that + // the provided WitnessUtxo/NonWitnessUtxo field was correct. + err := u.addPartialSignature(inIndex, sig, pubKey) + if err != nil { + return SignInvalid, err + } + + // Case 3: Neither provided only works for native p2wkh, or non-segwit + // non-p2sh. To check if it's segwit, check the scriptPubKey of the + // output. + default: + if pInput.WitnessUtxo == nil { + txIn := u.Upsbt.UnsignedTx.TxIn[inIndex] + outIndex := txIn.PreviousOutPoint.Index + script := pInput.NonWitnessUtxo.TxOut[outIndex].PkScript + + if txscript.IsWitnessProgram(script) { + err := nonWitnessToWitness(u.Upsbt, inIndex) + if err != nil { + return SignInvalid, err + } + } + } + + err := u.addPartialSignature(inIndex, sig, pubKey) + if err != nil { + return SignInvalid, err + } + } + + return SignSuccesful, nil +} + +// nonWitnessToWitness extracts the TxOut from the existing NonWitnessUtxo +// field in the given PSBT input and sets it as type witness by replacing the +// NonWitnessUtxo field with a WitnessUtxo field. See +// https://github.com/bitcoin/bitcoin/pull/14197. +func nonWitnessToWitness(p *Packet, inIndex int) error { + outIndex := p.UnsignedTx.TxIn[inIndex].PreviousOutPoint.Index + txout := p.Inputs[inIndex].NonWitnessUtxo.TxOut[outIndex] + + // TODO(guggero): For segwit v1, we'll want to remove the NonWitnessUtxo + // from the packet. For segwit v0 it is unsafe to only rely on the + // witness UTXO. See https://github.com/bitcoin/bitcoin/pull/19215. + // p.Inputs[inIndex].NonWitnessUtxo = nil + + u := Updater{ + Upsbt: p, + } + + return u.AddInWitnessUtxo(txout, inIndex) +} diff --git a/btcutil/psbt/sort.go b/btcutil/psbt/sort.go new file mode 100644 index 0000000000..2232d68feb --- /dev/null +++ b/btcutil/psbt/sort.go @@ -0,0 +1,102 @@ +package psbt + +import ( + "bytes" + "sort" + + "github.com/btcsuite/btcd/chaincfg/chainhash" +) + +// InPlaceSort modifies the passed packet's wire TX inputs and outputs to be +// sorted based on BIP 69. The sorting happens in a way that the packet's +// partial inputs and outputs are also modified to match the sorted TxIn and +// TxOuts of the wire transaction. +// +// WARNING: This function must NOT be called with packages that already contain +// (partial) witness data since it will mutate the transaction if it's not +// already sorted. This can cause issues if you mutate a tx in a block, for +// example, which would invalidate the block. It could also cause cached hashes, +// such as in a btcutil.Tx to become invalidated. +// +// The function should only be used if the caller is creating the transaction or +// is otherwise 100% positive mutating will not cause adverse affects due to +// other dependencies. +func InPlaceSort(packet *Packet) error { + // To make sure we don't run into any nil pointers or array index + // violations during sorting, do a very basic sanity check first. + err := VerifyInputOutputLen(packet, false, false) + if err != nil { + return err + } + + sort.Sort(&sortableInputs{p: packet}) + sort.Sort(&sortableOutputs{p: packet}) + + return nil +} + +// sortableInputs is a simple wrapper around a packet that implements the +// sort.Interface for sorting the wire and partial inputs of a packet. +type sortableInputs struct { + p *Packet +} + +// sortableOutputs is a simple wrapper around a packet that implements the +// sort.Interface for sorting the wire and partial outputs of a packet. +type sortableOutputs struct { + p *Packet +} + +// For sortableInputs and sortableOutputs, three functions are needed to make +// them sortable with sort.Sort() -- Len, Less, and Swap. +// Len and Swap are trivial. Less is BIP 69 specific. +func (s *sortableInputs) Len() int { return len(s.p.UnsignedTx.TxIn) } +func (s sortableOutputs) Len() int { return len(s.p.UnsignedTx.TxOut) } + +// Swap swaps two inputs. +func (s *sortableInputs) Swap(i, j int) { + tx := s.p.UnsignedTx + tx.TxIn[i], tx.TxIn[j] = tx.TxIn[j], tx.TxIn[i] + s.p.Inputs[i], s.p.Inputs[j] = s.p.Inputs[j], s.p.Inputs[i] +} + +// Swap swaps two outputs. +func (s *sortableOutputs) Swap(i, j int) { + tx := s.p.UnsignedTx + tx.TxOut[i], tx.TxOut[j] = tx.TxOut[j], tx.TxOut[i] + s.p.Outputs[i], s.p.Outputs[j] = s.p.Outputs[j], s.p.Outputs[i] +} + +// Less is the input comparison function. First sort based on input hash +// (reversed / rpc-style), then index. +func (s *sortableInputs) Less(i, j int) bool { + ins := s.p.UnsignedTx.TxIn + + // Input hashes are the same, so compare the index. + ihash := ins[i].PreviousOutPoint.Hash + jhash := ins[j].PreviousOutPoint.Hash + if ihash == jhash { + return ins[i].PreviousOutPoint.Index < + ins[j].PreviousOutPoint.Index + } + + // At this point, the hashes are not equal, so reverse them to + // big-endian and return the result of the comparison. + const hashSize = chainhash.HashSize + for b := 0; b < hashSize/2; b++ { + ihash[b], ihash[hashSize-1-b] = ihash[hashSize-1-b], ihash[b] + jhash[b], jhash[hashSize-1-b] = jhash[hashSize-1-b], jhash[b] + } + return bytes.Compare(ihash[:], jhash[:]) == -1 +} + +// Less is the output comparison function. First sort based on amount (smallest +// first), then PkScript. +func (s *sortableOutputs) Less(i, j int) bool { + outs := s.p.UnsignedTx.TxOut + + if outs[i].Value == outs[j].Value { + return bytes.Compare(outs[i].PkScript, outs[j].PkScript) < 0 + } + return outs[i].Value < outs[j].Value +} diff --git a/btcutil/psbt/sort_test.go b/btcutil/psbt/sort_test.go new file mode 100644 index 0000000000..3dee0f48d8 --- /dev/null +++ b/btcutil/psbt/sort_test.go @@ -0,0 +1,167 @@ +package psbt + +import ( + "reflect" + "testing" + + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/wire" +) + +func TestInPlaceSort(t *testing.T) { + testCases := []struct { + name string + packet *Packet + expectedTxIn []*wire.TxIn + expectedTxOut []*wire.TxOut + expectedPIn []PInput + expectedPOut []POutput + expectErr bool + }{{ + name: "packet nil", + packet: nil, + expectErr: true, + }, { + name: "no inputs or outputs", + packet: &Packet{UnsignedTx: &wire.MsgTx{}}, + expectErr: false, + }, { + name: "inputs only", + packet: &Packet{ + UnsignedTx: &wire.MsgTx{ + TxIn: []*wire.TxIn{{ + PreviousOutPoint: wire.OutPoint{ + Hash: chainhash.Hash{99, 88}, + Index: 7, + }, + }, { + PreviousOutPoint: wire.OutPoint{ + Hash: chainhash.Hash{77, 88}, + Index: 12, + }, + }, { + PreviousOutPoint: wire.OutPoint{ + Hash: chainhash.Hash{77, 88}, + Index: 7, + }, + }}, + }, + // Abuse the SighashType as an index to make sure the + // partial inputs are also sorted together with the wire + // inputs. + Inputs: []PInput{{ + SighashType: 0, + }, { + SighashType: 1, + }, { + SighashType: 2, + }}, + }, + expectedTxIn: []*wire.TxIn{{ + PreviousOutPoint: wire.OutPoint{ + Hash: chainhash.Hash{77, 88}, + Index: 7, + }, + }, { + PreviousOutPoint: wire.OutPoint{ + Hash: chainhash.Hash{77, 88}, + Index: 12, + }, + }, { + PreviousOutPoint: wire.OutPoint{ + Hash: chainhash.Hash{99, 88}, + Index: 7, + }, + }}, + expectedPIn: []PInput{{ + SighashType: 2, + }, { + SighashType: 1, + }, { + SighashType: 0, + }}, + expectErr: false, + }, { + name: "outputs only", + packet: &Packet{ + UnsignedTx: &wire.MsgTx{ + TxOut: []*wire.TxOut{{ + PkScript: []byte{99, 88}, + Value: 7, + }, { + PkScript: []byte{77, 88}, + Value: 12, + }, { + PkScript: []byte{77, 88}, + Value: 7, + }}, + }, + // Abuse the RedeemScript as an index to make sure the + // partial inputs are also sorted together with the wire + // inputs. + Outputs: []POutput{{ + RedeemScript: []byte{0}, + }, { + RedeemScript: []byte{1}, + }, { + RedeemScript: []byte{2}, + }}, + }, + expectedTxOut: []*wire.TxOut{{ + PkScript: []byte{77, 88}, + Value: 7, + }, { + PkScript: []byte{99, 88}, + Value: 7, + }, { + PkScript: []byte{77, 88}, + Value: 12, + }}, + expectedPOut: []POutput{{ + RedeemScript: []byte{2}, + }, { + RedeemScript: []byte{0}, + }, { + RedeemScript: []byte{1}, + }}, + expectErr: false, + }} + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + p := tc.packet + err := InPlaceSort(p) + if (tc.expectErr && err == nil) || + (!tc.expectErr && err != nil) { + + t.Fatalf("got error '%v' but wanted it to be "+ + "nil: %v", err, tc.expectErr) + } + + // Don't continue on this special test case. + if p == nil { + return + } + + tx := p.UnsignedTx + if !reflect.DeepEqual(tx.TxIn, tc.expectedTxIn) { + t.Fatalf("unexpected txin, got %#v wanted %#v", + tx.TxIn, tc.expectedTxIn) + } + if !reflect.DeepEqual(tx.TxOut, tc.expectedTxOut) { + t.Fatalf("unexpected txout, got %#v wanted %#v", + tx.TxOut, tc.expectedTxOut) + } + + if !reflect.DeepEqual(p.Inputs, tc.expectedPIn) { + t.Fatalf("unexpected pin, got %#v wanted %#v", + p.Inputs, tc.expectedPIn) + } + if !reflect.DeepEqual(p.Outputs, tc.expectedPOut) { + t.Fatalf("unexpected pout, got %#v wanted %#v", + p.Inputs, tc.expectedPOut) + } + }) + } +} diff --git a/btcutil/psbt/taproot.go b/btcutil/psbt/taproot.go new file mode 100644 index 0000000000..b9df860c95 --- /dev/null +++ b/btcutil/psbt/taproot.go @@ -0,0 +1,207 @@ +package psbt + +import ( + "bytes" + + "github.com/btcsuite/btcd/btcec/v2/schnorr" + "github.com/btcsuite/btcd/txscript" + "github.com/btcsuite/btcd/wire" +) + +const ( + // schnorrSigMinLength is the minimum length of a Schnorr signature + // which is 64 bytes. + schnorrSigMinLength = schnorr.SignatureSize + + // schnorrSigMaxLength is the maximum length of a Schnorr signature + // which is 64 bytes plus one byte for the appended sighash flag. + schnorrSigMaxLength = schnorrSigMinLength + 1 +) + +// TaprootScriptSpendSig encapsulates an individual Schnorr signature for a +// given public key and leaf hash. +type TaprootScriptSpendSig struct { + XOnlyPubKey []byte + LeafHash []byte + Signature []byte + SigHash txscript.SigHashType +} + +// checkValid checks that both the pubkey and the signature are valid. +func (s *TaprootScriptSpendSig) checkValid() bool { + return validateXOnlyPubkey(s.XOnlyPubKey) && + validateSchnorrSignature(s.Signature) +} + +// EqualKey returns true if this script spend signature's key data is the same +// as the given script spend signature. +func (s *TaprootScriptSpendSig) EqualKey(other *TaprootScriptSpendSig) bool { + return bytes.Equal(s.XOnlyPubKey, other.XOnlyPubKey) && + bytes.Equal(s.LeafHash, other.LeafHash) +} + +// SortBefore returns true if this script spend signature's key is +// lexicographically smaller than the given other script spend signature's key +// and should come first when being sorted. +func (s *TaprootScriptSpendSig) SortBefore(other *TaprootScriptSpendSig) bool { + return bytes.Compare(s.XOnlyPubKey, other.XOnlyPubKey) < 0 && + bytes.Compare(s.LeafHash, other.LeafHash) < 0 +} + +// TaprootTapLeafScript represents a single taproot leaf script that is +// identified by its control block. +type TaprootTapLeafScript struct { + ControlBlock []byte + Script []byte + LeafVersion txscript.TapscriptLeafVersion +} + +// checkValid checks that the control block is valid. +func (s *TaprootTapLeafScript) checkValid() bool { + return validateControlBlock(s.ControlBlock) +} + +// SortBefore returns true if this leaf script's key is lexicographically +// smaller than the given other leaf script's key and should come first when +// being sorted. +func (s *TaprootTapLeafScript) SortBefore(other *TaprootTapLeafScript) bool { + return bytes.Compare(s.ControlBlock, other.ControlBlock) < 0 +} + +// TaprootBip32Derivation encapsulates the data for the input and output +// taproot specific BIP-32 derivation key-value fields. +type TaprootBip32Derivation struct { + // XOnlyPubKey is the raw public key serialized in the x-only BIP-340 + // format. + XOnlyPubKey []byte + + // LeafHashes is a list of leaf hashes that the given public key is + // involved in. + LeafHashes [][]byte + + // MasterKeyFingerprint is the fingerprint of the master pubkey. + MasterKeyFingerprint uint32 + + // Bip32Path is the BIP 32 path with child index as a distinct integer. + Bip32Path []uint32 +} + +// SortBefore returns true if this derivation info's key is lexicographically +// smaller than the given other derivation info's key and should come first when +// being sorted. +func (s *TaprootBip32Derivation) SortBefore(other *TaprootBip32Derivation) bool { + return bytes.Compare(s.XOnlyPubKey, other.XOnlyPubKey) < 0 +} + +// ReadTaprootBip32Derivation deserializes a byte slice containing the Taproot +// BIP32 derivation info that consists of a list of leaf hashes as well as the +// normal BIP32 derivation info. +func ReadTaprootBip32Derivation(xOnlyPubKey, + value []byte) (*TaprootBip32Derivation, error) { + + // The taproot key BIP 32 derivation path is defined as: + // * <4 byte fingerprint> <32-bit uint>* + // So we get at least 5 bytes for the length and the 4 byte fingerprint. + if len(value) < 5 { + return nil, ErrInvalidPsbtFormat + } + + // The first element is the number of hashes that will follow. + reader := bytes.NewReader(value) + numHashes, err := wire.ReadVarInt(reader, 0) + if err != nil { + return nil, ErrInvalidPsbtFormat + } + + // A hash is 32 bytes in size, so we need at least numHashes*32 + 5 + // bytes to be present. + if len(value) < (int(numHashes)*32)+5 { + return nil, ErrInvalidPsbtFormat + } + + derivation := TaprootBip32Derivation{ + XOnlyPubKey: xOnlyPubKey, + LeafHashes: make([][]byte, int(numHashes)), + } + + for i := 0; i < int(numHashes); i++ { + derivation.LeafHashes[i] = make([]byte, 32) + n, err := reader.Read(derivation.LeafHashes[i]) + if err != nil || n != 32 { + return nil, ErrInvalidPsbtFormat + } + } + + // Extract the remaining bytes from the reader (we don't actually know + // how many bytes we read due to the compact size integer at the + // beginning). + var leftoverBuf bytes.Buffer + _, err = reader.WriteTo(&leftoverBuf) + if err != nil { + return nil, err + } + + // Read the BIP32 derivation info. + fingerprint, path, err := ReadBip32Derivation(leftoverBuf.Bytes()) + if err != nil { + return nil, err + } + + derivation.MasterKeyFingerprint = fingerprint + derivation.Bip32Path = path + + return &derivation, nil +} + +// SerializeTaprootBip32Derivation serializes a TaprootBip32Derivation to its +// raw byte representation. +func SerializeTaprootBip32Derivation(d *TaprootBip32Derivation) ([]byte, + error) { + + var buf bytes.Buffer + + // The taproot key BIP 32 derivation path is defined as: + // * <4 byte fingerprint> <32-bit uint>* + err := wire.WriteVarInt(&buf, 0, uint64(len(d.LeafHashes))) + if err != nil { + return nil, ErrInvalidPsbtFormat + } + + for _, hash := range d.LeafHashes { + n, err := buf.Write(hash) + if err != nil || n != 32 { + return nil, ErrInvalidPsbtFormat + } + } + + _, err = buf.Write(SerializeBIP32Derivation( + d.MasterKeyFingerprint, d.Bip32Path, + )) + if err != nil { + return nil, ErrInvalidPsbtFormat + } + + return buf.Bytes(), nil +} + +// validateXOnlyPubkey checks if pubKey is *any* valid pubKey serialization in a +// BIP-340 context (x-only serialization). +func validateXOnlyPubkey(pubKey []byte) bool { + _, err := schnorr.ParsePubKey(pubKey) + return err == nil +} + +// validateSchnorrSignature checks that the passed byte slice is a valid Schnorr +// signature, _NOT_ including the sighash flag. It does *not* of course +// validate the signature against any message or public key. +func validateSchnorrSignature(sig []byte) bool { + _, err := schnorr.ParseSignature(sig) + return err == nil +} + +// validateControlBlock checks that the passed byte slice is a valid control +// block as it would appear in a BIP-341 witness stack as the last element. +func validateControlBlock(controlBlock []byte) bool { + _, err := txscript.ParseControlBlock(controlBlock) + return err == nil +} diff --git a/btcutil/psbt/types.go b/btcutil/psbt/types.go new file mode 100644 index 0000000000..e833e1af35 --- /dev/null +++ b/btcutil/psbt/types.go @@ -0,0 +1,203 @@ +package psbt + +// GlobalType is the set of types that are used at the global scope level +// within the PSBT. +type GlobalType uint8 + +const ( + // UnsignedTxType is the global scope key that houses the unsigned + // transaction of the PSBT. The value is a transaction in network + // serialization. The scriptSigs and witnesses for each input must be + // empty. The transaction must be in the old serialization format + // (without witnesses). A PSBT must have a transaction, otherwise it is + // invalid. + UnsignedTxType GlobalType = 0 + + // XpubType houses a global xpub for the entire PSBT packet. + // + // The key ({0x01}|{xpub}) is he 78 byte serialized extended public key + // as defined by BIP 32. Extended public keys are those that can be + // used to derive public keys used in the inputs and outputs of this + // transaction. It should be the public key at the highest hardened + // derivation index so that + // the unhardened child keys used in the transaction can be derived. + // + // The value is the master key fingerprint as defined by BIP 32 + // concatenated with the derivation path of the public key. The + // derivation path is represented as 32-bit little endian unsigned + // integer indexes concatenated with each other. The number of 32 bit + // unsigned integer indexes must match the depth provided in the + // extended public key. + XpubType GlobalType = 1 + + // VersionType houses the global version number of this PSBT. There is + // no key (only contains the byte type), then the value if omitted, is + // assumed to be zero. + VersionType GlobalType = 0xFB + + // ProprietaryGlobalType is used to house any proper chary global-scope + // keys within the PSBT. + // + // The key is ({0xFC}||{subtype}|{key data}) a variable length + // identifier prefix, followed by a subtype, followed by the key data + // itself. + // + // The value is any data as defined by the proprietary type user. + ProprietaryGlobalType = 0xFC +) + +// InputType is the set of types that are defined for each input included +// within the PSBT. +type InputType uint32 + +const ( + // NonWitnessUtxoType has no key ({0x00}) and houses the transaction in + // network serialization format the current input spends from. This + // should only be present for inputs which spend non-segwit outputs. + // However, if it is unknown whether an input spends a segwit output, + // this type should be used. The entire input transaction is needed in + // order to be able to verify the values of the input (pre-segwit they + // aren't in the signature digest). + NonWitnessUtxoType InputType = 0 + + // WitnessUtxoType has no key ({0x01}), and houses the entire + // transaction output in network serialization which the current input + // spends from. This should only be present for inputs which spend + // segwit outputs, including P2SH embedded ones (value || script). + WitnessUtxoType InputType = 1 + + // PartialSigType is used to include a partial signature with key + // ({0x02}|{public key}). + // + // The value is the signature as would be pushed to the stack from a + // scriptSig or witness.. + PartialSigType InputType = 2 + + // SighashType is an empty key ({0x03}). + // + // The value contains the 32-bit unsigned integer specifying the + // sighash type to be used for this input. Signatures for this input + // must use the sighash type, finalizers must fail to finalize inputs + // which have signatures that do not match the specified sighash type. + // Signers who cannot produce signatures with the sighash type must not + // provide a signature. + SighashType InputType = 3 + + // RedeemScriptInputType is an empty key ({0x40}). + // + // The value is the redeem script of the input if present. + RedeemScriptInputType InputType = 4 + + // WitnessScriptInputType is an empty key ({0x05}). + // + // The value is the witness script of this input, if it has one. + WitnessScriptInputType InputType = 5 + + // Bip32DerivationInputType is a type that carries the pubkey along + // with the key ({0x06}|{public key}). + // + // The value is master key fingerprint as defined by BIP 32 + // concatenated with the derivation path of the public key. The + // derivation path is represented as 32 bit unsigned integer indexes + // concatenated with each other. Public keys are those that will be + // needed to sign this input. + Bip32DerivationInputType InputType = 6 + + // FinalScriptSigType is an empty key ({0x07}). + // + // The value contains a fully constructed scriptSig with signatures and + // any other scripts necessary for the input to pass validation. + FinalScriptSigType InputType = 7 + + // FinalScriptWitnessType is an empty key ({0x08}). The value is a + // fully constructed scriptWitness with signatures and any other + // scripts necessary for the input to pass validation. + FinalScriptWitnessType InputType = 8 + + // TaprootKeySpendSignatureType is an empty key ({0x13}). The value is + // a 64-byte Schnorr signature or a 65-byte Schnorr signature with the + // one byte sighash type appended to it. + TaprootKeySpendSignatureType InputType = 0x13 + + // TaprootScriptSpendSignatureType is a type that carries the + // x-only pubkey and leaf hash along with the key + // ({0x14}|{xonlypubkey}|{leafhash}). + // + // The value is a 64-byte Schnorr signature or a 65-byte Schnorr + // signature with the one byte sighash type appended to it. + TaprootScriptSpendSignatureType InputType = 0x14 + + // TaprootLeafScriptType is a type that carries the control block along + // with the key ({0x15}|{control block}). + // + // The value is a script followed by a one byte unsigned integer that + // represents the leaf version. + TaprootLeafScriptType InputType = 0x15 + + // TaprootBip32DerivationInputType is a type that carries the x-only + // pubkey along with the key ({0x16}|{xonlypubkey}). + // + // The value is a compact integer denoting the number of hashes, + // followed by said number of 32-byte leaf hashes. The rest of the value + // is then identical to the Bip32DerivationInputType value. + TaprootBip32DerivationInputType InputType = 0x16 + + // TaprootInternalKeyInputType is an empty key ({0x17}). The value is + // an x-only pubkey denoting the internal public key used for + // constructing a taproot key. + TaprootInternalKeyInputType InputType = 0x17 + + // TaprootMerkleRootType is an empty key ({0x18}). The value is a + // 32-byte hash denoting the root hash of a merkle tree of scripts. + TaprootMerkleRootType InputType = 0x18 + + // ProprietaryInputType is a custom type for use by devs. + // + // The key ({0xFC}||{subtype}|{key data}), is a Variable length + // identifier prefix, followed by a subtype, followed by the key data + // itself. + // + // The value is any value data as defined by the proprietary type user. + ProprietaryInputType InputType = 0xFC +) + +// OutputType is the set of types defined per output within the PSBT. +type OutputType uint32 + +const ( + // RedeemScriptOutputType is an empty key ({0x00}> + // + // The value is the redeemScript for this output if it has one. + RedeemScriptOutputType OutputType = 0 + + // WitnessScriptOutputType is an empty key ({0x01}). + // + // The value is the witness script of this input, if it has one. + WitnessScriptOutputType OutputType = 1 + + // Bip32DerivationOutputType is used to communicate derivation information + // needed to spend this output. The key is ({0x02}|{public key}). + // + // The value is master key fingerprint concatenated with the derivation + // path of the public key. The derivation path is represented as 32-bit + // little endian unsigned integer indexes concatenated with each other. + // Public keys are those needed to spend this output. + Bip32DerivationOutputType OutputType = 2 + + // TaprootInternalKeyOutputType is an empty key ({0x05}). The value is + // an x-only pubkey denoting the internal public key used for + // constructing a taproot key. + TaprootInternalKeyOutputType OutputType = 5 + + // TaprootTapTreeType is an empty key ({0x06}). The value is a + // serialized taproot tree. + TaprootTapTreeType OutputType = 6 + + // TaprootBip32DerivationOutputType is a type that carries the x-only + // pubkey along with the key ({0x07}|{xonlypubkey}). + // + // The value is a compact integer denoting the number of hashes, + // followed by said number of 32-byte leaf hashes. The rest of the value + // is then identical to the Bip32DerivationInputType value. + TaprootBip32DerivationOutputType OutputType = 7 +) diff --git a/btcutil/psbt/updater.go b/btcutil/psbt/updater.go new file mode 100644 index 0000000000..66c8d1d83c --- /dev/null +++ b/btcutil/psbt/updater.go @@ -0,0 +1,377 @@ +// Copyright (c) 2018 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package psbt + +// The Updater requires provision of a single PSBT and is able to add data to +// both input and output sections. It can be called repeatedly to add more +// data. It also allows addition of signatures via the addPartialSignature +// function; this is called internally to the package in the Sign() function of +// Updater, located in signer.go + +import ( + "bytes" + "crypto/sha256" + + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/txscript" + "github.com/btcsuite/btcd/wire" +) + +// Updater encapsulates the role 'Updater' as specified in BIP174; it accepts +// Psbt structs and has methods to add fields to the inputs and outputs. +type Updater struct { + Upsbt *Packet +} + +// NewUpdater returns a new instance of Updater, if the passed Psbt struct is +// in a valid form, else an error. +func NewUpdater(p *Packet) (*Updater, error) { + if err := p.SanityCheck(); err != nil { + return nil, err + } + + return &Updater{Upsbt: p}, nil + +} + +// AddInNonWitnessUtxo adds the utxo information for an input which is +// non-witness. This requires provision of a full transaction (which is the +// source of the corresponding prevOut), and the input index. If addition of +// this key-value pair to the Psbt fails, an error is returned. +func (u *Updater) AddInNonWitnessUtxo(tx *wire.MsgTx, inIndex int) error { + if inIndex > len(u.Upsbt.Inputs)-1 { + return ErrInvalidPrevOutNonWitnessTransaction + } + + u.Upsbt.Inputs[inIndex].NonWitnessUtxo = tx + + if err := u.Upsbt.SanityCheck(); err != nil { + return ErrInvalidPsbtFormat + } + + return nil +} + +// AddInWitnessUtxo adds the utxo information for an input which is witness. +// This requires provision of a full transaction *output* (which is the source +// of the corresponding prevOut); not the full transaction because BIP143 means +// the output information is sufficient, and the input index. If addition of +// this key-value pair to the Psbt fails, an error is returned. +func (u *Updater) AddInWitnessUtxo(txout *wire.TxOut, inIndex int) error { + if inIndex > len(u.Upsbt.Inputs)-1 { + return ErrInvalidPsbtFormat + } + + u.Upsbt.Inputs[inIndex].WitnessUtxo = txout + + if err := u.Upsbt.SanityCheck(); err != nil { + return ErrInvalidPsbtFormat + } + + return nil +} + +// addPartialSignature allows the Updater role to insert fields of type partial +// signature into a Psbt, consisting of both the pubkey (as keydata) and the +// ECDSA signature (as value). Note that the Signer role is encapsulated in +// this function; signatures are only allowed to be added that follow the +// sanity-check on signing rules explained in the BIP under `Signer`; if the +// rules are not satisfied, an ErrInvalidSignatureForInput is returned. +// +// NOTE: This function does *not* validate the ECDSA signature itself. +func (u *Updater) addPartialSignature(inIndex int, sig []byte, + pubkey []byte) error { + + partialSig := PartialSig{ + PubKey: pubkey, Signature: sig, + } + + // First validate the passed (sig, pub). + if !partialSig.checkValid() { + return ErrInvalidPsbtFormat + } + + pInput := u.Upsbt.Inputs[inIndex] + + // First check; don't add duplicates. + for _, x := range pInput.PartialSigs { + if bytes.Equal(x.PubKey, partialSig.PubKey) { + return ErrDuplicateKey + } + } + + // Attaching signature without utxo field is not allowed. + if pInput.WitnessUtxo == nil && pInput.NonWitnessUtxo == nil { + return ErrInvalidPsbtFormat + } + + // Next, we perform a series of additional sanity checks. + if pInput.NonWitnessUtxo != nil { + if len(u.Upsbt.UnsignedTx.TxIn) < inIndex+1 { + return ErrInvalidPrevOutNonWitnessTransaction + } + + if pInput.NonWitnessUtxo.TxHash() != + u.Upsbt.UnsignedTx.TxIn[inIndex].PreviousOutPoint.Hash { + return ErrInvalidSignatureForInput + } + + // To validate that the redeem script matches, we must pull out + // the scriptPubKey of the corresponding output and compare + // that with the P2SH scriptPubKey that is generated by + // redeemScript. + if pInput.RedeemScript != nil { + outIndex := u.Upsbt.UnsignedTx.TxIn[inIndex].PreviousOutPoint.Index + scriptPubKey := pInput.NonWitnessUtxo.TxOut[outIndex].PkScript + scriptHash := btcutil.Hash160(pInput.RedeemScript) + + scriptHashScript, err := txscript.NewScriptBuilder(). + AddOp(txscript.OP_HASH160). + AddData(scriptHash). + AddOp(txscript.OP_EQUAL). + Script() + if err != nil { + return err + } + + if !bytes.Equal(scriptHashScript, scriptPubKey) { + return ErrInvalidSignatureForInput + } + } + + } + + // It could be that we set both the non-witness and witness UTXO fields + // in case it's from a wallet that patched the CVE-2020-14199 + // vulnerability. We detect whether the input being spent is actually a + // witness input and then copy it over to the witness UTXO field in the + // signer. Run the witness checks as well, even if we might already have + // checked the script hash. But that should be a negligible performance + // penalty. + if pInput.WitnessUtxo != nil { + scriptPubKey := pInput.WitnessUtxo.PkScript + + var script []byte + if pInput.RedeemScript != nil { + scriptHash := btcutil.Hash160(pInput.RedeemScript) + scriptHashScript, err := txscript.NewScriptBuilder(). + AddOp(txscript.OP_HASH160). + AddData(scriptHash). + AddOp(txscript.OP_EQUAL). + Script() + if err != nil { + return err + } + + if !bytes.Equal(scriptHashScript, scriptPubKey) { + return ErrInvalidSignatureForInput + } + + script = pInput.RedeemScript + } else { + script = scriptPubKey + } + + // If a witnessScript field is present, this is a P2WSH, + // whether nested or not (that is handled by the assignment to + // `script` above); in that case, sanity check that `script` is + // the p2wsh of witnessScript. Contrariwise, if no + // witnessScript field is present, this will be signed as + // p2wkh. + if pInput.WitnessScript != nil { + witnessScriptHash := sha256.Sum256(pInput.WitnessScript) + witnessScriptHashScript, err := txscript.NewScriptBuilder(). + AddOp(txscript.OP_0). + AddData(witnessScriptHash[:]). + Script() + if err != nil { + return err + } + + if !bytes.Equal(script, witnessScriptHashScript[:]) { + return ErrInvalidSignatureForInput + } + } else { + // Otherwise, this is a p2wkh input. + pubkeyHash := btcutil.Hash160(pubkey) + pubkeyHashScript, err := txscript.NewScriptBuilder(). + AddOp(txscript.OP_0). + AddData(pubkeyHash). + Script() + if err != nil { + return err + } + + // Validate that we're able to properly reconstruct the + // witness program. + if !bytes.Equal(pubkeyHashScript, script) { + return ErrInvalidSignatureForInput + } + } + } + + u.Upsbt.Inputs[inIndex].PartialSigs = append( + u.Upsbt.Inputs[inIndex].PartialSigs, &partialSig, + ) + + if err := u.Upsbt.SanityCheck(); err != nil { + return err + } + + // Addition of a non-duplicate-key partial signature cannot violate + // sanity-check rules. + return nil +} + +// AddInSighashType adds the sighash type information for an input. The +// sighash type is passed as a 32 bit unsigned integer, along with the index +// for the input. An error is returned if addition of this key-value pair to +// the Psbt fails. +func (u *Updater) AddInSighashType(sighashType txscript.SigHashType, + inIndex int) error { + + u.Upsbt.Inputs[inIndex].SighashType = sighashType + + if err := u.Upsbt.SanityCheck(); err != nil { + return err + } + return nil +} + +// AddInRedeemScript adds the redeem script information for an input. The +// redeem script is passed serialized, as a byte slice, along with the index of +// the input. An error is returned if addition of this key-value pair to the +// Psbt fails. +func (u *Updater) AddInRedeemScript(redeemScript []byte, + inIndex int) error { + + u.Upsbt.Inputs[inIndex].RedeemScript = redeemScript + + if err := u.Upsbt.SanityCheck(); err != nil { + return ErrInvalidPsbtFormat + } + + return nil +} + +// AddInWitnessScript adds the witness script information for an input. The +// witness script is passed serialized, as a byte slice, along with the index +// of the input. An error is returned if addition of this key-value pair to the +// Psbt fails. +func (u *Updater) AddInWitnessScript(witnessScript []byte, + inIndex int) error { + + u.Upsbt.Inputs[inIndex].WitnessScript = witnessScript + + if err := u.Upsbt.SanityCheck(); err != nil { + return err + } + + return nil +} + +// AddInBip32Derivation takes a master key fingerprint as defined in BIP32, a +// BIP32 path as a slice of uint32 values, and a serialized pubkey as a byte +// slice, along with the integer index of the input, and inserts this data into +// that input. +// +// NOTE: This can be called multiple times for the same input. An error is +// returned if addition of this key-value pair to the Psbt fails. +func (u *Updater) AddInBip32Derivation(masterKeyFingerprint uint32, + bip32Path []uint32, pubKeyData []byte, inIndex int) error { + + bip32Derivation := Bip32Derivation{ + PubKey: pubKeyData, + MasterKeyFingerprint: masterKeyFingerprint, + Bip32Path: bip32Path, + } + + if !bip32Derivation.checkValid() { + return ErrInvalidPsbtFormat + } + + // Don't allow duplicate keys + for _, x := range u.Upsbt.Inputs[inIndex].Bip32Derivation { + if bytes.Equal(x.PubKey, bip32Derivation.PubKey) { + return ErrDuplicateKey + } + } + + u.Upsbt.Inputs[inIndex].Bip32Derivation = append( + u.Upsbt.Inputs[inIndex].Bip32Derivation, &bip32Derivation, + ) + + if err := u.Upsbt.SanityCheck(); err != nil { + return err + } + + return nil +} + +// AddOutBip32Derivation takes a master key fingerprint as defined in BIP32, a +// BIP32 path as a slice of uint32 values, and a serialized pubkey as a byte +// slice, along with the integer index of the output, and inserts this data +// into that output. +// +// NOTE: That this can be called multiple times for the same output. An error +// is returned if addition of this key-value pair to the Psbt fails. +func (u *Updater) AddOutBip32Derivation(masterKeyFingerprint uint32, + bip32Path []uint32, pubKeyData []byte, outIndex int) error { + + bip32Derivation := Bip32Derivation{ + PubKey: pubKeyData, + MasterKeyFingerprint: masterKeyFingerprint, + Bip32Path: bip32Path, + } + + if !bip32Derivation.checkValid() { + return ErrInvalidPsbtFormat + } + + // Don't allow duplicate keys + for _, x := range u.Upsbt.Outputs[outIndex].Bip32Derivation { + if bytes.Equal(x.PubKey, bip32Derivation.PubKey) { + return ErrDuplicateKey + } + } + + u.Upsbt.Outputs[outIndex].Bip32Derivation = append( + u.Upsbt.Outputs[outIndex].Bip32Derivation, &bip32Derivation, + ) + + if err := u.Upsbt.SanityCheck(); err != nil { + return err + } + + return nil +} + +// AddOutRedeemScript takes a redeem script as a byte slice and appends it to +// the output at index outIndex. +func (u *Updater) AddOutRedeemScript(redeemScript []byte, + outIndex int) error { + + u.Upsbt.Outputs[outIndex].RedeemScript = redeemScript + + if err := u.Upsbt.SanityCheck(); err != nil { + return ErrInvalidPsbtFormat + } + + return nil +} + +// AddOutWitnessScript takes a witness script as a byte slice and appends it to +// the output at index outIndex. +func (u *Updater) AddOutWitnessScript(witnessScript []byte, + outIndex int) error { + + u.Upsbt.Outputs[outIndex].WitnessScript = witnessScript + + if err := u.Upsbt.SanityCheck(); err != nil { + return err + } + + return nil +} diff --git a/btcutil/psbt/utils.go b/btcutil/psbt/utils.go new file mode 100644 index 0000000000..c47f6afd4d --- /dev/null +++ b/btcutil/psbt/utils.go @@ -0,0 +1,480 @@ +// Copyright (c) 2018 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package psbt + +import ( + "bytes" + "encoding/binary" + "errors" + "fmt" + "io" + "sort" + + "github.com/btcsuite/btcd/txscript" + "github.com/btcsuite/btcd/wire" +) + +// WriteTxWitness is a utility function due to non-exported witness +// serialization (writeTxWitness encodes the bitcoin protocol encoding for a +// transaction input's witness into w). +func WriteTxWitness(w io.Writer, wit [][]byte) error { + if err := wire.WriteVarInt(w, 0, uint64(len(wit))); err != nil { + return err + } + + for _, item := range wit { + err := wire.WriteVarBytes(w, 0, item) + if err != nil { + return err + } + } + return nil +} + +// writePKHWitness writes a witness for a p2wkh spending input +func writePKHWitness(sig []byte, pub []byte) ([]byte, error) { + return writeWitness(sig, pub) +} + +// writeWitness serializes a witness stack from the given items. +func writeWitness(stackElements ...[]byte) ([]byte, error) { + var ( + buf bytes.Buffer + witnessItems = append([][]byte{}, stackElements...) + ) + + if err := WriteTxWitness(&buf, witnessItems); err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +// checkIsMultisigScript is a utility function to check whether a given +// redeemscript fits the standard multisig template used in all P2SH based +// multisig, given a set of pubkeys for redemption. +func checkIsMultiSigScript(pubKeys [][]byte, sigs [][]byte, + script []byte) bool { + + // First insist that the script type is multisig. + if txscript.GetScriptClass(script) != txscript.MultiSigTy { + return false + } + + // Inspect the script to ensure that the number of sigs and pubkeys is + // correct + _, numSigs, err := txscript.CalcMultiSigStats(script) + if err != nil { + return false + } + + // If the number of sigs provided, doesn't match the number of required + // pubkeys, then we can't proceed as we're not yet final. + if numSigs != len(pubKeys) || numSigs != len(sigs) { + return false + } + + return true +} + +// extractKeyOrderFromScript is a utility function to extract an ordered list +// of signatures, given a serialized script (redeemscript or witness script), a +// list of pubkeys and the signatures corresponding to those pubkeys. This +// function is used to ensure that the signatures will be embedded in the final +// scriptSig or scriptWitness in the correct order. +func extractKeyOrderFromScript(script []byte, expectedPubkeys [][]byte, + sigs [][]byte) ([][]byte, error) { + + // If this isn't a proper finalized multi-sig script, then we can't + // proceed. + if !checkIsMultiSigScript(expectedPubkeys, sigs, script) { + return nil, ErrUnsupportedScriptType + } + + // Arrange the pubkeys and sigs into a slice of format: + // * [[pub,sig], [pub,sig],..] + type sigWithPub struct { + pubKey []byte + sig []byte + } + var pubsSigs []sigWithPub + for i, pub := range expectedPubkeys { + pubsSigs = append(pubsSigs, sigWithPub{ + pubKey: pub, + sig: sigs[i], + }) + } + + // Now that we have the set of (pubkey, sig) pairs, we'll construct a + // position map that we can use to swap the order in the slice above to + // match how things are laid out in the script. + type positionEntry struct { + index int + value sigWithPub + } + var positionMap []positionEntry + + // For each pubkey in our pubsSigs slice, we'll now construct a proper + // positionMap entry, based on _where_ in the script the pubkey first + // appears. + for _, p := range pubsSigs { + pos := bytes.Index(script, p.pubKey) + if pos < 0 { + return nil, errors.New("script does not contain pubkeys") + } + + positionMap = append(positionMap, positionEntry{ + index: pos, + value: p, + }) + } + + // Now that we have the position map full populated, we'll use the + // index data to properly sort the entries in the map based on where + // they appear in the script. + sort.Slice(positionMap, func(i, j int) bool { + return positionMap[i].index < positionMap[j].index + }) + + // Finally, we can simply iterate through the position map in order to + // extract the proper signature ordering. + sortedSigs := make([][]byte, 0, len(positionMap)) + for _, x := range positionMap { + sortedSigs = append(sortedSigs, x.value.sig) + } + + return sortedSigs, nil +} + +// getMultisigScriptWitness creates a full psbt serialized Witness field for +// the transaction, given the public keys and signatures to be appended. This +// function will only accept witnessScripts of the type M of N multisig. This +// is used for both p2wsh and nested p2wsh multisig cases. +func getMultisigScriptWitness(witnessScript []byte, pubKeys [][]byte, + sigs [][]byte) ([]byte, error) { + + // First using the script as a guide, we'll properly order the sigs + // according to how their corresponding pubkeys appear in the + // witnessScript. + orderedSigs, err := extractKeyOrderFromScript( + witnessScript, pubKeys, sigs, + ) + if err != nil { + return nil, err + } + + // Now that we know the proper order, we'll append each of the + // signatures into a new witness stack, then top it off with the + // witness script at the end, prepending the nil as we need the extra + // pop.. + witnessElements := make(wire.TxWitness, 0, len(sigs)+2) + witnessElements = append(witnessElements, nil) + for _, os := range orderedSigs { + witnessElements = append(witnessElements, os) + } + witnessElements = append(witnessElements, witnessScript) + + // Now that we have the full witness stack, we'll serialize it in the + // expected format, and return the final bytes. + var buf bytes.Buffer + if err = WriteTxWitness(&buf, witnessElements); err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +// checkSigHashFlags compares the sighash flag byte on a signature with the +// value expected according to any PsbtInSighashType field in this section of +// the PSBT, and returns true if they match, false otherwise. +// If no SighashType field exists, it is assumed to be SIGHASH_ALL. +// +// TODO(waxwing): sighash type not restricted to one byte in future? +func checkSigHashFlags(sig []byte, input *PInput) bool { + expectedSighashType := txscript.SigHashAll + if input.SighashType != 0 { + expectedSighashType = input.SighashType + } + + return expectedSighashType == txscript.SigHashType(sig[len(sig)-1]) +} + +// serializeKVpair writes out a kv pair using a varbyte prefix for each. +func serializeKVpair(w io.Writer, key []byte, value []byte) error { + if err := wire.WriteVarBytes(w, 0, key); err != nil { + return err + } + + return wire.WriteVarBytes(w, 0, value) +} + +// serializeKVPairWithType writes out to the passed writer a type coupled with +// a key. +func serializeKVPairWithType(w io.Writer, kt uint8, keydata []byte, + value []byte) error { + + // If the key has no data, then we write a blank slice. + if keydata == nil { + keydata = []byte{} + } + + // The final key to be written is: {type} || {keyData} + serializedKey := append([]byte{kt}, keydata...) + return serializeKVpair(w, serializedKey, value) +} + +// getKey retrieves a single key - both the key type and the keydata (if +// present) from the stream and returns the key type as an integer, or -1 if +// the key was of zero length. This integer is used to indicate the presence +// of a separator byte which indicates the end of a given key-value pair list, +// and the keydata as a byte slice or nil if none is present. +func getKey(r io.Reader) (int, []byte, error) { + + // For the key, we read the varint separately, instead of using the + // available ReadVarBytes, because we have a specific treatment of 0x00 + // here: + count, err := wire.ReadVarInt(r, 0) + if err != nil { + return -1, nil, ErrInvalidPsbtFormat + } + if count == 0 { + // A separator indicates end of key-value pair list. + return -1, nil, nil + } + + // Check that we don't attempt to decode a dangerously large key. + if count > MaxPsbtKeyLength { + return -1, nil, ErrInvalidKeyData + } + + // Next, we ready out the designated number of bytes, which may include + // a type, key, and optional data. + keyTypeReader := io.LimitReader(r, int64(count)) + keyType, err := wire.ReadVarInt(keyTypeReader, 0) + if err != nil { + return -1, nil, ErrInvalidPsbtFormat + } + + // The maximum value of a compact size int is capped in bitcoind, do the + // same here to mimic the behavior. + if keyType > MaxPsbtKeyValue { + return -1, nil, ErrInvalidPsbtFormat + } + + keyData, err := io.ReadAll(keyTypeReader) + if err != nil { + return -1, nil, ErrInvalidPsbtFormat + } + + // Note that the second return value will usually be empty, since most + // keys contain no more than the key type byte. + if len(keyData) == 0 { + return int(keyType), nil, nil + } + + // Otherwise, we return the key, along with any data that it may + // contain. + return int(keyType), keyData, nil +} + +// readTxOut is a limited version of wire.ReadTxOut, because the latter is not +// exported. +func readTxOut(txout []byte) (*wire.TxOut, error) { + if len(txout) < 10 { + return nil, ErrInvalidPsbtFormat + } + + valueSer := binary.LittleEndian.Uint64(txout[:8]) + scriptPubKey := txout[9:] + + return wire.NewTxOut(int64(valueSer), scriptPubKey), nil +} + +// SumUtxoInputValues tries to extract the sum of all inputs specified in the +// UTXO fields of the PSBT. An error is returned if an input is specified that +// does not contain any UTXO information. +func SumUtxoInputValues(packet *Packet) (int64, error) { + // We take the TX ins of the unsigned TX as the truth for how many + // inputs there should be, as the fields in the extra data part of the + // PSBT can be empty. + if len(packet.UnsignedTx.TxIn) != len(packet.Inputs) { + return 0, fmt.Errorf("TX input length doesn't match PSBT " + + "input length") + } + + inputSum := int64(0) + for idx, in := range packet.Inputs { + switch { + case in.WitnessUtxo != nil: + // Witness UTXOs only need to reference the TxOut. + inputSum += in.WitnessUtxo.Value + + case in.NonWitnessUtxo != nil: + // Non-witness UTXOs reference to the whole transaction + // the UTXO resides in. + utxOuts := in.NonWitnessUtxo.TxOut + txIn := packet.UnsignedTx.TxIn[idx] + + // Check that utxOuts actually has enough space to + // contain the previous outpoint's index. + opIdx := txIn.PreviousOutPoint.Index + if opIdx >= uint32(len(utxOuts)) { + return 0, fmt.Errorf("input %d has malformed "+ + "TxOut field", idx) + } + + inputSum += utxOuts[txIn.PreviousOutPoint.Index].Value + + default: + return 0, fmt.Errorf("input %d has no UTXO information", + idx) + } + } + return inputSum, nil +} + +// TxOutsEqual returns true if two transaction outputs are equal. +func TxOutsEqual(out1, out2 *wire.TxOut) bool { + if out1 == nil || out2 == nil { + return out1 == out2 + } + return out1.Value == out2.Value && + bytes.Equal(out1.PkScript, out2.PkScript) +} + +// VerifyOutputsEqual verifies that the two slices of transaction outputs are +// deep equal to each other. We do the length check and manual loop to provide +// better error messages to the user than just returning "not equal". +func VerifyOutputsEqual(outs1, outs2 []*wire.TxOut) error { + if len(outs1) != len(outs2) { + return fmt.Errorf("number of outputs are different") + } + for idx, out := range outs1 { + // There is a byte slice in the output so we can't use the + // equality operator. + if !TxOutsEqual(out, outs2[idx]) { + return fmt.Errorf("output %d is different", idx) + } + } + return nil +} + +// VerifyInputPrevOutpointsEqual verifies that the previous outpoints of the +// two slices of transaction inputs are deep equal to each other. We do the +// length check and manual loop to provide better error messages to the user +// than just returning "not equal". +func VerifyInputPrevOutpointsEqual(ins1, ins2 []*wire.TxIn) error { + if len(ins1) != len(ins2) { + return fmt.Errorf("number of inputs are different") + } + for idx, in := range ins1 { + if in.PreviousOutPoint != ins2[idx].PreviousOutPoint { + return fmt.Errorf("previous outpoint of input %d is "+ + "different", idx) + } + } + return nil +} + +// VerifyInputOutputLen makes sure a packet is non-nil, contains a non-nil wire +// transaction and that the wire input/output lengths match the partial input/ +// output lengths. A caller also can specify if they expect any inputs and/or +// outputs to be contained in the packet. +func VerifyInputOutputLen(packet *Packet, needInputs, needOutputs bool) error { + if packet == nil || packet.UnsignedTx == nil { + return fmt.Errorf("PSBT packet cannot be nil") + } + + if len(packet.UnsignedTx.TxIn) != len(packet.Inputs) { + return fmt.Errorf("invalid PSBT, wire inputs don't match " + + "partial inputs") + } + if len(packet.UnsignedTx.TxOut) != len(packet.Outputs) { + return fmt.Errorf("invalid PSBT, wire outputs don't match " + + "partial outputs") + } + + if needInputs && len(packet.UnsignedTx.TxIn) == 0 { + return fmt.Errorf("PSBT packet must contain at least one " + + "input") + } + if needOutputs && len(packet.UnsignedTx.TxOut) == 0 { + return fmt.Errorf("PSBT packet must contain at least one " + + "output") + } + + return nil +} + +// InputsReadyToSign makes sure that all input data have the previous output +// specified meaning that either nonwitness UTXO or the witness UTXO data is +// specified in the psbt package. This check is necessary because of 2 reasons. +// The sighash calculation is now different for witnessV0 and witnessV1 inputs +// this means we need to check the previous output pkScript for the specific +// type and the second reason is that the sighash calculation for taproot inputs +// include the previous output pkscripts. +func InputsReadyToSign(packet *Packet) error { + err := VerifyInputOutputLen(packet, true, true) + if err != nil { + return err + } + + for i := range packet.UnsignedTx.TxIn { + input := packet.Inputs[i] + if input.NonWitnessUtxo == nil && input.WitnessUtxo == nil { + return fmt.Errorf("invalid PSBT, input with index %d "+ + "missing utxo information", i) + } + } + + return nil +} + +// NewFromSignedTx is a utility function to create a packet from an +// already-signed transaction. Returned are: an unsigned transaction +// serialization, a list of scriptSigs, one per input, and a list of witnesses, +// one per input. +func NewFromSignedTx(tx *wire.MsgTx) (*Packet, [][]byte, + []wire.TxWitness, error) { + + scriptSigs := make([][]byte, 0, len(tx.TxIn)) + witnesses := make([]wire.TxWitness, 0, len(tx.TxIn)) + tx2 := tx.Copy() + + // Blank out signature info in inputs + for i, tin := range tx2.TxIn { + tin.SignatureScript = nil + scriptSigs = append(scriptSigs, tx.TxIn[i].SignatureScript) + tin.Witness = nil + witnesses = append(witnesses, tx.TxIn[i].Witness) + } + + // Outputs always contain: (value, scriptPubkey) so don't need + // amending. Now tx2 is tx with all signing data stripped out + unsignedPsbt, err := NewFromUnsignedTx(tx2) + if err != nil { + return nil, nil, nil, err + } + return unsignedPsbt, scriptSigs, witnesses, nil +} + +// FindLeafScript attempts to locate the leaf script of a given target Tap Leaf +// hash in the list of leaf scripts of the given input. +func FindLeafScript(pInput *PInput, + targetLeafHash []byte) (*TaprootTapLeafScript, error) { + + for _, leaf := range pInput.TaprootLeafScript { + leafHash := txscript.TapLeaf{ + LeafVersion: leaf.LeafVersion, + Script: leaf.Script, + }.TapHash() + + if bytes.Equal(targetLeafHash, leafHash[:]) { + return leaf, nil + } + } + + return nil, fmt.Errorf("leaf script for target leaf hash %x not "+ + "found in input", targetLeafHash) +} diff --git a/btcutil/psbt/utils_test.go b/btcutil/psbt/utils_test.go new file mode 100644 index 0000000000..90593ffca5 --- /dev/null +++ b/btcutil/psbt/utils_test.go @@ -0,0 +1,370 @@ +package psbt + +import ( + "bytes" + "reflect" + "testing" + + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/wire" +) + +func TestSumUtxoInputValues(t *testing.T) { + // Expect sum to fail for packet with non-matching txIn and PInputs. + tx := wire.NewMsgTx(2) + badPacket, err := NewFromUnsignedTx(tx) + if err != nil { + t.Fatalf("could not create packet from TX: %v", err) + } + badPacket.Inputs = append(badPacket.Inputs, PInput{}) + + _, err = SumUtxoInputValues(badPacket) + if err == nil { + t.Fatalf("expected sum of bad packet to fail") + } + + // Expect sum to fail if any inputs don't have UTXO information added. + op := []*wire.OutPoint{{}, {}} + noUtxoInfoPacket, err := New(op, nil, 2, 0, []uint32{0, 0}) + if err != nil { + t.Fatalf("could not create new packet: %v", err) + } + + _, err = SumUtxoInputValues(noUtxoInfoPacket) + if err == nil { + t.Fatalf("expected sum of missing UTXO info to fail") + } + + // Create a packet that is OK and contains both witness and non-witness + // UTXO information. + okPacket, err := New(op, nil, 2, 0, []uint32{0, 0}) + if err != nil { + t.Fatalf("could not create new packet: %v", err) + } + okPacket.Inputs[0].WitnessUtxo = &wire.TxOut{Value: 1234} + okPacket.Inputs[1].NonWitnessUtxo = &wire.MsgTx{ + TxOut: []*wire.TxOut{{Value: 6543}}, + } + + sum, err := SumUtxoInputValues(okPacket) + if err != nil { + t.Fatalf("could not sum input: %v", err) + } + if sum != (1234 + 6543) { + t.Fatalf("unexpected sum, got %d wanted %d", sum, 1234+6543) + } + + // Create a malformed packet where NonWitnessUtxo.TxOut does not + // contain the index specified by the PreviousOutPoint in the + // packet's Unsigned.TxIn field. + badOp := []*wire.OutPoint{{}, {Index: 500}} + malformedPacket, err := New(badOp, nil, 2, 0, []uint32{0, 0}) + if err != nil { + t.Fatalf("could not create malformed packet: %v", err) + } + malformedPacket.Inputs[0].WitnessUtxo = &wire.TxOut{Value: 1234} + malformedPacket.Inputs[1].NonWitnessUtxo = &wire.MsgTx{ + TxOut: []*wire.TxOut{{Value: 6543}}, + } + + _, err = SumUtxoInputValues(malformedPacket) + if err == nil { + t.Fatalf("expected sum of malformed packet to fail") + } +} + +func TestTxOutsEqual(t *testing.T) { + testCases := []struct { + name string + out1 *wire.TxOut + out2 *wire.TxOut + expectEqual bool + }{{ + name: "both nil", + out1: nil, + out2: nil, + expectEqual: true, + }, { + name: "one nil", + out1: nil, + out2: &wire.TxOut{}, + expectEqual: false, + }, { + name: "both empty", + out1: &wire.TxOut{}, + out2: &wire.TxOut{}, + expectEqual: true, + }, { + name: "one pk script set", + out1: &wire.TxOut{}, + out2: &wire.TxOut{ + PkScript: []byte("foo"), + }, + expectEqual: false, + }, { + name: "both fully set", + out1: &wire.TxOut{ + Value: 1234, + PkScript: []byte("bar"), + }, + out2: &wire.TxOut{ + Value: 1234, + PkScript: []byte("bar"), + }, + expectEqual: true, + }} + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + result := TxOutsEqual(tc.out1, tc.out2) + if result != tc.expectEqual { + t.Fatalf("unexpected result, got %v wanted %v", + result, tc.expectEqual) + } + }) + } +} + +func TestVerifyOutputsEqual(t *testing.T) { + testCases := []struct { + name string + outs1 []*wire.TxOut + outs2 []*wire.TxOut + expectErr bool + }{{ + name: "both nil", + outs1: nil, + outs2: nil, + expectErr: false, + }, { + name: "one nil", + outs1: nil, + outs2: []*wire.TxOut{{}}, + expectErr: true, + }, { + name: "both empty", + outs1: []*wire.TxOut{{}}, + outs2: []*wire.TxOut{{}}, + expectErr: false, + }, { + name: "one pk script set", + outs1: []*wire.TxOut{{}}, + outs2: []*wire.TxOut{{ + PkScript: []byte("foo"), + }}, + expectErr: true, + }, { + name: "both fully set", + outs1: []*wire.TxOut{{ + Value: 1234, + PkScript: []byte("bar"), + }, {}}, + outs2: []*wire.TxOut{{ + Value: 1234, + PkScript: []byte("bar"), + }, {}}, + expectErr: false, + }} + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + err := VerifyOutputsEqual(tc.outs1, tc.outs2) + if (tc.expectErr && err == nil) || + (!tc.expectErr && err != nil) { + + t.Fatalf("got error '%v' but wanted it to be "+ + "nil: %v", err, tc.expectErr) + } + }) + } +} + +func TestVerifyInputPrevOutpointsEqual(t *testing.T) { + testCases := []struct { + name string + ins1 []*wire.TxIn + ins2 []*wire.TxIn + expectErr bool + }{{ + name: "both nil", + ins1: nil, + ins2: nil, + expectErr: false, + }, { + name: "one nil", + ins1: nil, + ins2: []*wire.TxIn{{}}, + expectErr: true, + }, { + name: "both empty", + ins1: []*wire.TxIn{{}}, + ins2: []*wire.TxIn{{}}, + expectErr: false, + }, { + name: "one previous output set", + ins1: []*wire.TxIn{{}}, + ins2: []*wire.TxIn{{ + PreviousOutPoint: wire.OutPoint{ + Hash: chainhash.Hash{11, 22, 33}, + Index: 7, + }, + }}, + expectErr: true, + }, { + name: "both fully set", + ins1: []*wire.TxIn{{ + PreviousOutPoint: wire.OutPoint{ + Hash: chainhash.Hash{11, 22, 33}, + Index: 7, + }, + }, {}}, + ins2: []*wire.TxIn{{ + PreviousOutPoint: wire.OutPoint{ + Hash: chainhash.Hash{11, 22, 33}, + Index: 7, + }, + }, {}}, + expectErr: false, + }} + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + err := VerifyInputPrevOutpointsEqual(tc.ins1, tc.ins2) + if (tc.expectErr && err == nil) || + (!tc.expectErr && err != nil) { + + t.Fatalf("got error '%v' but wanted it to be "+ + "nil: %v", err, tc.expectErr) + } + }) + } +} + +func TestVerifyInputOutputLen(t *testing.T) { + testCases := []struct { + name string + packet *Packet + needInputs bool + needOutputs bool + expectErr bool + }{{ + name: "packet nil", + packet: nil, + expectErr: true, + }, { + name: "wire tx nil", + packet: &Packet{}, + expectErr: true, + }, { + name: "both empty don't need outputs", + packet: &Packet{ + UnsignedTx: &wire.MsgTx{}, + }, + expectErr: false, + }, { + name: "both empty but need outputs", + packet: &Packet{ + UnsignedTx: &wire.MsgTx{}, + }, + needOutputs: true, + expectErr: true, + }, { + name: "both empty but need inputs", + packet: &Packet{ + UnsignedTx: &wire.MsgTx{}, + }, + needInputs: true, + expectErr: true, + }, { + name: "input len mismatch", + packet: &Packet{ + UnsignedTx: &wire.MsgTx{ + TxIn: []*wire.TxIn{{}}, + }, + }, + needInputs: true, + expectErr: true, + }, { + name: "output len mismatch", + packet: &Packet{ + UnsignedTx: &wire.MsgTx{ + TxOut: []*wire.TxOut{{}}, + }, + }, + needOutputs: true, + expectErr: true, + }, { + name: "all fully set", + packet: &Packet{ + UnsignedTx: &wire.MsgTx{ + TxIn: []*wire.TxIn{{}}, + TxOut: []*wire.TxOut{{}}, + }, + Inputs: []PInput{{}}, + Outputs: []POutput{{}}, + }, + needInputs: true, + needOutputs: true, + expectErr: false, + }} + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + err := VerifyInputOutputLen( + tc.packet, tc.needInputs, tc.needOutputs, + ) + if (tc.expectErr && err == nil) || + (!tc.expectErr && err != nil) { + + t.Fatalf("got error '%v' but wanted it to be "+ + "nil: %v", err, tc.expectErr) + } + }) + } +} + +func TestNewFromSignedTx(t *testing.T) { + orig := &wire.MsgTx{ + TxIn: []*wire.TxIn{{ + PreviousOutPoint: wire.OutPoint{}, + SignatureScript: []byte("script"), + Witness: [][]byte{[]byte("witness")}, + Sequence: 1234, + }}, + TxOut: []*wire.TxOut{{ + PkScript: []byte{77, 88}, + Value: 99, + }}, + } + + packet, scripts, witnesses, err := NewFromSignedTx(orig) + if err != nil { + t.Fatalf("could not create packet from signed TX: %v", err) + } + + tx := packet.UnsignedTx + expectedTxIn := []*wire.TxIn{{ + PreviousOutPoint: wire.OutPoint{}, + Sequence: 1234, + }} + if !reflect.DeepEqual(tx.TxIn, expectedTxIn) { + t.Fatalf("unexpected txin, got %#v wanted %#v", + tx.TxIn, expectedTxIn) + } + if !reflect.DeepEqual(tx.TxOut, orig.TxOut) { + t.Fatalf("unexpected txout, got %#v wanted %#v", + tx.TxOut, orig.TxOut) + } + if len(scripts) != 1 || !bytes.Equal(scripts[0], []byte("script")) { + t.Fatalf("script not extracted correctly") + } + if len(witnesses) != 1 || + !bytes.Equal(witnesses[0][0], []byte("witness")) { + + t.Fatalf("witness not extracted correctly") + } +} diff --git a/btcutil/tx.go b/btcutil/tx.go new file mode 100644 index 0000000000..4f26befe32 --- /dev/null +++ b/btcutil/tx.go @@ -0,0 +1,194 @@ +// Copyright (c) 2013-2016 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package btcutil + +import ( + "bytes" + "io" + + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/wire" +) + +// TxIndexUnknown is the value returned for a transaction index that is unknown. +// This is typically because the transaction has not been inserted into a block +// yet. +const TxIndexUnknown = -1 + +// Tx defines a bitcoin transaction that provides easier and more efficient +// manipulation of raw transactions. It also memoizes the hash for the +// transaction on its first access so subsequent accesses don't have to repeat +// the relatively expensive hashing operations. +type Tx struct { + msgTx *wire.MsgTx // Underlying MsgTx + txHash *chainhash.Hash // Cached transaction hash + txHashWitness *chainhash.Hash // Cached transaction witness hash + txHasWitness *bool // If the transaction has witness data + txIndex int // Position within a block or TxIndexUnknown + rawBytes []byte // Raw bytes for the tx in the raw block. +} + +// MsgTx returns the underlying wire.MsgTx for the transaction. +func (t *Tx) MsgTx() *wire.MsgTx { + // Return the cached transaction. + return t.msgTx +} + +// Hash returns the hash of the transaction. This is equivalent to calling +// TxHash on the underlying wire.MsgTx, however it caches the result so +// subsequent calls are more efficient. If the Tx has the raw bytes of the tx +// cached, it will use that and skip serialization. +func (t *Tx) Hash() *chainhash.Hash { + // Return the cached hash if it has already been generated. + if t.txHash != nil { + return t.txHash + } + + // If the rawBytes aren't available, call msgtx.TxHash. + if t.rawBytes == nil { + hash := t.msgTx.TxHash() + t.txHash = &hash + return &hash + } + + // If we have the raw bytes, then don't call msgTx.TxHash as that has + // the overhead of serialization. Instead, we can take the existing + // serialized bytes and hash them to speed things up. + var hash chainhash.Hash + if t.HasWitness() { + // If the raw bytes contain the witness, we must strip it out + // before calculating the hash. + baseSize := t.msgTx.SerializeSizeStripped() + nonWitnessBytes := make([]byte, 0, baseSize) + + // Append the version bytes. + offset := 4 + nonWitnessBytes = append( + nonWitnessBytes, t.rawBytes[:offset]..., + ) + + // Append the input and output bytes. -8 to account for the + // version bytes and the locktime bytes. + // + // Skip the 2 bytes for the witness encoding. + offset += 2 + nonWitnessBytes = append( + nonWitnessBytes, + t.rawBytes[offset:offset+baseSize-8]..., + ) + + // Append the last 4 bytes which are the locktime bytes. + nonWitnessBytes = append( + nonWitnessBytes, t.rawBytes[len(t.rawBytes)-4:]..., + ) + + // We purposely call doublehashh here instead of doublehashraw + // as we don't have the serialization overhead and avoiding the + // 1 alloc is better in this case. + hash = chainhash.DoubleHashRaw(func(w io.Writer) error { + _, err := w.Write(nonWitnessBytes) + return err + }) + } else { + // If the raw bytes don't have the witness, we can use it + // directly. + // + // We purposely call doublehashh here instead of doublehashraw + // as we don't have the serialization overhead and avoiding the + // 1 alloc is better in this case. + hash = chainhash.DoubleHashRaw(func(w io.Writer) error { + _, err := w.Write(t.rawBytes) + return err + }) + } + + t.txHash = &hash + return &hash +} + +// WitnessHash returns the witness hash (wtxid) of the transaction. This is +// equivalent to calling WitnessHash on the underlying wire.MsgTx, however it +// caches the result so subsequent calls are more efficient. If the Tx has the +// raw bytes of the tx cached, it will use that and skip serialization. +func (t *Tx) WitnessHash() *chainhash.Hash { + // Return the cached hash if it has already been generated. + if t.txHashWitness != nil { + return t.txHashWitness + } + + // Cache the hash and return it. + var hash chainhash.Hash + if len(t.rawBytes) > 0 { + hash = chainhash.DoubleHashH(t.rawBytes) + } else { + hash = t.msgTx.WitnessHash() + } + + t.txHashWitness = &hash + return &hash +} + +// HasWitness returns false if none of the inputs within the transaction +// contain witness data, true false otherwise. This equivalent to calling +// HasWitness on the underlying wire.MsgTx, however it caches the result so +// subsequent calls are more efficient. +func (t *Tx) HasWitness() bool { + if t.txHasWitness != nil { + return *t.txHasWitness + } + + hasWitness := t.msgTx.HasWitness() + t.txHasWitness = &hasWitness + return hasWitness +} + +// Index returns the saved index of the transaction within a block. This value +// will be TxIndexUnknown if it hasn't already explicitly been set. +func (t *Tx) Index() int { + return t.txIndex +} + +// SetIndex sets the index of the transaction in within a block. +func (t *Tx) SetIndex(index int) { + t.txIndex = index +} + +// NewTx returns a new instance of a bitcoin transaction given an underlying +// wire.MsgTx. See Tx. +func NewTx(msgTx *wire.MsgTx) *Tx { + return &Tx{ + msgTx: msgTx, + txIndex: TxIndexUnknown, + } +} + +// setBytes sets the raw bytes of the tx. +func (t *Tx) setBytes(bytes []byte) { + t.rawBytes = bytes +} + +// NewTxFromBytes returns a new instance of a bitcoin transaction given the +// serialized bytes. See Tx. +func NewTxFromBytes(serializedTx []byte) (*Tx, error) { + br := bytes.NewReader(serializedTx) + return NewTxFromReader(br) +} + +// NewTxFromReader returns a new instance of a bitcoin transaction given a +// Reader to deserialize the transaction. See Tx. +func NewTxFromReader(r io.Reader) (*Tx, error) { + // Deserialize the bytes into a MsgTx. + var msgTx wire.MsgTx + err := msgTx.Deserialize(r) + if err != nil { + return nil, err + } + + t := Tx{ + msgTx: &msgTx, + txIndex: TxIndexUnknown, + } + return &t, nil +} diff --git a/btcutil/tx_test.go b/btcutil/tx_test.go new file mode 100644 index 0000000000..71b7488e9d --- /dev/null +++ b/btcutil/tx_test.go @@ -0,0 +1,136 @@ +// Copyright (c) 2013-2016 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package btcutil_test + +import ( + "bytes" + "io" + "reflect" + "testing" + + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/davecgh/go-spew/spew" +) + +// TestTx tests the API for Tx. +func TestTx(t *testing.T) { + testTx := Block100000.Transactions[0] + tx := btcutil.NewTx(testTx) + + // Ensure we get the same data back out. + if msgTx := tx.MsgTx(); !reflect.DeepEqual(msgTx, testTx) { + t.Errorf("MsgTx: mismatched MsgTx - got %v, want %v", + spew.Sdump(msgTx), spew.Sdump(testTx)) + } + + // Ensure transaction index set and get work properly. + wantIndex := 0 + tx.SetIndex(0) + if gotIndex := tx.Index(); gotIndex != wantIndex { + t.Errorf("Index: mismatched index - got %v, want %v", + gotIndex, wantIndex) + } + + // Hash for block 100,000 transaction 0. + wantHashStr := "8c14f0db3df150123e6f3dbbf30f8b955a8249b62ac1d1ff16284aefa3d06d87" + wantHash, err := chainhash.NewHashFromStr(wantHashStr) + if err != nil { + t.Errorf("NewHashFromStr: %v", err) + } + + // Request the hash multiple times to test generation and caching. + for i := 0; i < 2; i++ { + hash := tx.Hash() + if !hash.IsEqual(wantHash) { + t.Errorf("Hash #%d mismatched hash - got %v, want %v", i, + hash, wantHash) + } + } +} + +// TestNewTxFromBytes tests creation of a Tx from serialized bytes. +func TestNewTxFromBytes(t *testing.T) { + // Serialize the test transaction. + testTx := Block100000.Transactions[0] + var testTxBuf bytes.Buffer + err := testTx.Serialize(&testTxBuf) + if err != nil { + t.Errorf("Serialize: %v", err) + } + testTxBytes := testTxBuf.Bytes() + + // Create a new transaction from the serialized bytes. + tx, err := btcutil.NewTxFromBytes(testTxBytes) + if err != nil { + t.Errorf("NewTxFromBytes: %v", err) + return + } + + // Ensure the generated MsgTx is correct. + if msgTx := tx.MsgTx(); !reflect.DeepEqual(msgTx, testTx) { + t.Errorf("MsgTx: mismatched MsgTx - got %v, want %v", + spew.Sdump(msgTx), spew.Sdump(testTx)) + } +} + +// TestTxErrors tests the error paths for the Tx API. +func TestTxErrors(t *testing.T) { + // Serialize the test transaction. + testTx := Block100000.Transactions[0] + var testTxBuf bytes.Buffer + err := testTx.Serialize(&testTxBuf) + if err != nil { + t.Errorf("Serialize: %v", err) + } + testTxBytes := testTxBuf.Bytes() + + // Truncate the transaction byte buffer to force errors. + shortBytes := testTxBytes[:4] + _, err = btcutil.NewTxFromBytes(shortBytes) + if err != io.EOF { + t.Errorf("NewTxFromBytes: did not get expected error - "+ + "got %v, want %v", err, io.EOF) + } +} + +// TestTxHasWitness tests the HasWitness() method. +func TestTxHasWitness(t *testing.T) { + msgTx := Block100000.Transactions[0] // contains witness data + tx := btcutil.NewTx(msgTx) + + tx.WitnessHash() // Populate the witness hash cache + tx.HasWitness() // Should not fail (see btcsuite/btcd#1543) + + if !tx.HasWitness() { + t.Errorf("HasWitness: got false, want true") + } + + for _, msgTxWithoutWitness := range Block100000.Transactions[1:] { + txWithoutWitness := btcutil.NewTx(msgTxWithoutWitness) + if txWithoutWitness.HasWitness() { + t.Errorf("HasWitness: got false, want true") + } + } +} + +// TestTxWitnessHash tests the WitnessHash() method. +func TestTxWitnessHash(t *testing.T) { + msgTx := Block100000.Transactions[0] // contains witness data + tx := btcutil.NewTx(msgTx) + + if tx.WitnessHash().IsEqual(tx.Hash()) { + t.Errorf("WitnessHash: witness hash and tx id must NOT be same - "+ + "got %v, want %v", tx.WitnessHash(), tx.Hash()) + } + + for _, msgTxWithoutWitness := range Block100000.Transactions[1:] { + txWithoutWitness := btcutil.NewTx(msgTxWithoutWitness) + if !txWithoutWitness.WitnessHash().IsEqual(txWithoutWitness.Hash()) { + t.Errorf("WitnessHash: witness hash and tx id must be same - "+ + "got %v, want %v", txWithoutWitness.WitnessHash(), txWithoutWitness.Hash()) + } + } +} diff --git a/btcutil/txsort/README.md b/btcutil/txsort/README.md new file mode 100644 index 0000000000..cb8e4130d1 --- /dev/null +++ b/btcutil/txsort/README.md @@ -0,0 +1,31 @@ +txsort +====== + +[![Build Status](http://img.shields.io/travis/btcsuite/btcutil.svg)](https://travis-ci.org/btcsuite/btcutil) +[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) +[![GoDoc](http://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/btcsuite/btcd/btcutil/txsort) + +Package txsort provides the transaction sorting according to [BIP 69](https://github.com/bitcoin/bips/blob/master/bip-0069.mediawiki). + +BIP 69 defines a standard lexicographical sort order of transaction inputs and +outputs. This is useful to standardize transactions for faster multi-party +agreement as well as preventing information leaks in a single-party use case. + +The BIP goes into more detail, but for a quick and simplistic overview, the +order for inputs is defined as first sorting on the previous output hash and +then on the index as a tie breaker. The order for outputs is defined as first +sorting on the amount and then on the raw public key script bytes as a tie +breaker. + +A comprehensive suite of tests is provided to ensure proper functionality. + +## Installation and Updating + +```bash +$ go get -u github.com/btcsuite/btcd/btcutil/txsort +``` + +## License + +Package txsort is licensed under the [copyfree](http://copyfree.org) ISC +License. diff --git a/btcutil/txsort/doc.go b/btcutil/txsort/doc.go new file mode 100644 index 0000000000..9f5095ce8b --- /dev/null +++ b/btcutil/txsort/doc.go @@ -0,0 +1,20 @@ +// Copyright (c) 2015 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +/* +Package txsort provides the transaction sorting according to BIP 69. + +# Overview + +BIP 69 defines a standard lexicographical sort order of transaction inputs and +outputs. This is useful to standardize transactions for faster multi-party +agreement as well as preventing information leaks in a single-party use case. + +The BIP goes into more detail, but for a quick and simplistic overview, the +order for inputs is defined as first sorting on the previous output hash and +then on the index as a tie breaker. The order for outputs is defined as first +sorting on the amount and then on the raw public key script bytes as a tie +breaker. +*/ +package txsort diff --git a/btcutil/txsort/testdata/bip69-1.hex b/btcutil/txsort/testdata/bip69-1.hex new file mode 100644 index 0000000000..dbd18422b7 --- /dev/null +++ b/btcutil/txsort/testdata/bip69-1.hex @@ -0,0 +1 @@ +0100000011aad553bb1650007e9982a8ac79d227cd8c831e1573b11f25573a37664e5f3e64000000006a47304402205438cedd30ee828b0938a863e08d810526123746c1f4abee5b7bc2312373450c02207f26914f4275f8f0040ab3375bacc8c5d610c095db8ed0785de5dc57456591a601210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffffc26f3eb7932f7acddc5ddd26602b77e7516079b03090a16e2c2f5485d1fde028000000006b483045022100f81d98c1de9bb61063a5e6671d191b400fda3a07d886e663799760393405439d0220234303c9af4bad3d665f00277fe70cdd26cd56679f114a40d9107249d29c979401210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffff456a9e597129f5df2e11b842833fc19a94c563f57449281d3cd01249a830a1f0000000006a47304402202310b00924794ef68a8f09564fd0bb128838c66bc45d1a3f95c5cab52680f166022039fc99138c29f6c434012b14aca651b1c02d97324d6bd9dd0ffced0782c7e3bd01210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffff571fb3e02278217852dd5d299947e2b7354a639adc32ec1fa7b82cfb5dec530e000000006b483045022100d276251f1f4479d8521269ec8b1b45c6f0e779fcf1658ec627689fa8a55a9ca50220212a1e307e6182479818c543e1b47d62e4fc3ce6cc7fc78183c7071d245839df01210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffff5d8de50362ff33d3526ac3602e9ee25c1a349def086a7fc1d9941aaeb9e91d38010000006b4830450221008768eeb1240451c127b88d89047dd387d13357ce5496726fc7813edc6acd55ac022015187451c3fb66629af38fdb061dfb39899244b15c45e4a7ccc31064a059730d01210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffff60ad3408b89ea19caf3abd5e74e7a084344987c64b1563af52242e9d2a8320f3000000006b4830450221009be4261ec050ebf33fa3d47248c7086e4c247cafbb100ea7cee4aa81cd1383f5022008a70d6402b153560096c849d7da6fe61c771a60e41ff457aac30673ceceafee01210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffffe9b483a8ac4129780c88d1babe41e89dc10a26dedbf14f80a28474e9a11104de010000006b4830450221009bc40eee321b39b5dc26883f79cd1f5a226fc6eed9e79e21d828f4c23190c57e022078182fd6086e265589105023d9efa4cba83f38c674a499481bd54eee196b033f01210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffffe28db9462d3004e21e765e03a45ecb147f136a20ba8bca78ba60ebfc8e2f8b3b000000006a47304402200fb572b7c6916515452e370c2b6f97fcae54abe0793d804a5a53e419983fae1602205191984b6928bf4a1e25b00e5b5569a0ce1ecb82db2dea75fe4378673b53b9e801210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffff7a1ef65ff1b7b7740c662ab6c9735ace4a16279c23a1db5709ed652918ffff54010000006a47304402206bc218a925f7280d615c8ea4f0131a9f26e7fc64cff6eeeb44edb88aba14f1910220779d5d67231bc2d2d93c3c5ab74dcd193dd3d04023e58709ad7ffbf95161be6201210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffff850cecf958468ca7ffa6a490afe13b8c271b1326b0ddc1fdfdf9f3c7e365fdba000000006a473044022047df98cc26bd2bfdc5b2b97c27aead78a214810ff023e721339292d5ce50823d02205fe99dc5f667908974dae40cc7a9475af7fa6671ba44f64a00fcd01fa12ab523012102ca46fa75454650afba1784bc7b079d687e808634411e4beff1f70e44596308a1ffffffff8640e312040e476cf6727c60ca3f4a3ad51623500aacdda96e7728dbdd99e8a5000000006a47304402205566aa84d3d84226d5ab93e6f253b57b3ef37eb09bb73441dae35de86271352a02206ee0b7f800f73695a2073a2967c9ad99e19f6ddf18ce877adf822e408ba9291e01210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffff91c1889c5c24b93b56e643121f7a05a34c10c5495c450504c7b5afcb37e11d7a000000006b483045022100df61d45bbaa4571cdd6c5c822cba458cdc55285cdf7ba9cd5bb9fc18096deb9102201caf8c771204df7fd7c920c4489da7bc3a60e1d23c1a97e237c63afe53250b4a01210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffff2470947216eb81ea0eeeb4fe19362ec05767db01c3aa3006bb499e8b6d6eaa26010000006a473044022031501a0b2846b8822a32b9947b058d89d32fc758e009fc2130c2e5effc925af70220574ef3c9e350cef726c75114f0701fd8b188c6ec5f84adce0ed5c393828a5ae001210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffff0abcd77d65cc14363f8262898335f184d6da5ad060ff9e40bf201741022c2b40010000006b483045022100a6ac110802b699f9a2bff0eea252d32e3d572b19214d49d8bb7405efa2af28f1022033b7563eb595f6d7ed7ec01734e17b505214fe0851352ed9c3c8120d53268e9a01210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffffa43bebbebf07452a893a95bfea1d5db338d23579be172fe803dce02eeb7c037d010000006b483045022100ebc77ed0f11d15fe630fe533dc350c2ddc1c81cfeb81d5a27d0587163f58a28c02200983b2a32a1014bab633bfc9258083ac282b79566b6b3fa45c1e6758610444f401210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffffb102113fa46ce949616d9cda00f6b10231336b3928eaaac6bfe42d1bf3561d6c010000006a473044022010f8731929a55c1c49610722e965635529ed895b2292d781b183d465799906b20220098359adcbc669cd4b294cc129b110fe035d2f76517248f4b7129f3bf793d07f01210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffffb861fab2cde188499758346be46b5fbec635addfc4e7b0c8a07c0a908f2b11b4000000006a47304402207328142bb02ef5d6496a210300f4aea71f67683b842fa3df32cae6c88b49a9bb022020f56ddff5042260cfda2c9f39b7dec858cc2f4a76a987cd2dc25945b04e15fe01210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffff027064d817000000001976a9144a5fba237213a062f6f57978f796390bdcf8d01588ac00902f50090000001976a9145be32612930b8323add2212a4ec03c1562084f8488ac00000000 \ No newline at end of file diff --git a/btcutil/txsort/testdata/bip69-2.hex b/btcutil/txsort/testdata/bip69-2.hex new file mode 100644 index 0000000000..c42d0d2dc1 --- /dev/null +++ b/btcutil/txsort/testdata/bip69-2.hex @@ -0,0 +1 @@ +010000000255605dc6f5c3dc148b6da58442b0b2cd422be385eab2ebea4119ee9c268d28350000000049483045022100aa46504baa86df8a33b1192b1b9367b4d729dc41e389f2c04f3e5c7f0559aae702205e82253a54bf5c4f65b7428551554b2045167d6d206dfe6a2e198127d3f7df1501ffffffff55605dc6f5c3dc148b6da58442b0b2cd422be385eab2ebea4119ee9c268d2835010000004847304402202329484c35fa9d6bb32a55a70c0982f606ce0e3634b69006138683bcd12cbb6602200c28feb1e2555c3210f1dddb299738b4ff8bbe9667b68cb8764b5ac17b7adf0001ffffffff0200e1f505000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00180d8f000000004341044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45afac00000000 \ No newline at end of file diff --git a/btcutil/txsort/testdata/bip69-3.hex b/btcutil/txsort/testdata/bip69-3.hex new file mode 100644 index 0000000000..6fd859a9cf --- /dev/null +++ b/btcutil/txsort/testdata/bip69-3.hex @@ -0,0 +1 @@ +0100000001d992e5a888a86d4c7a6a69167a4728ee69497509740fc5f456a24528c340219a000000008b483045022100f0519bdc9282ff476da1323b8ef7ffe33f495c1a8d52cc522b437022d83f6a230220159b61d197fbae01b4a66622a23bc3f1def65d5fa24efd5c26fa872f3a246b8e014104839f9023296a1fabb133140128ca2709f6818c7d099491690bd8ac0fd55279def6a2ceb6ab7b5e4a71889b6e739f09509565eec789e86886f6f936fa42097adeffffffff02000fe208010000001976a914948c765a6914d43f2a7ac177da2c2f6b52de3d7c88ac00e32321000000001976a9140c34f4e29ab5a615d5ea28d4817f12b137d62ed588ac00000000 \ No newline at end of file diff --git a/btcutil/txsort/testdata/bip69-4.hex b/btcutil/txsort/testdata/bip69-4.hex new file mode 100644 index 0000000000..f41d23f8b2 --- /dev/null +++ b/btcutil/txsort/testdata/bip69-4.hex @@ -0,0 +1 @@ +01000000059daf0abe7a92618546a9dbcfd65869b6178c66ec21ccfda878c1175979cfd9ef000000004a493046022100c2f7f25be5de6ce88ac3c1a519514379e91f39b31ddff279a3db0b1a229b708b022100b29efbdbd9837cc6a6c7318aa4900ed7e4d65662c34d1622a2035a3a5534a99a01ffffffffd516330ebdf075948da56db13d22632a4fb941122df2884397dda45d451acefb0000000048473044022051243debe6d4f2b433bee0cee78c5c4073ead0e3bde54296dbed6176e128659c022044417bfe16f44eb7b6eb0cdf077b9ce972a332e15395c09ca5e4f602958d266101ffffffffe1f5aa33961227b3c344e57179417ce01b7ccd421117fe2336289b70489883f900000000484730440220593252bb992ce3c85baf28d6e3aa32065816271d2c822398fe7ee28a856bc943022066d429dd5025d3c86fd8fd8a58e183a844bd94aa312cefe00388f57c85b0ca3201ffffffffe207e83718129505e6a7484831442f668164ae659fddb82e9e5421a081fb90d50000000049483045022067cf27eb733e5bcae412a586b25a74417c237161a084167c2a0b439abfebdcb2022100efcc6baa6824b4c5205aa967e0b76d31abf89e738d4b6b014e788c9a8cccaf0c01ffffffffe23b8d9d80a9e9d977fab3c94dbe37befee63822443c3ec5ae5a713ede66c3940000000049483045022020f2eb35036666b1debe0d1d2e77a36d5d9c4e96c1dba23f5100f193dbf524790221008ce79bc1321fb4357c6daee818038d41544749127751726e46b2b320c8b565a201ffffffff0200ba1dd2050000001976a914366a27645806e817a6cd40bc869bdad92fe5509188ac40420f00000000001976a914ee8bd501094a7d5ca318da2506de35e1cb025ddc88ac00000000 \ No newline at end of file diff --git a/btcutil/txsort/testdata/bip69-5.hex b/btcutil/txsort/testdata/bip69-5.hex new file mode 100644 index 0000000000..e1cb4d6131 --- /dev/null +++ b/btcutil/txsort/testdata/bip69-5.hex @@ -0,0 +1 @@ +01000000011f636d0003f673b3aeea4971daef16b8eed784cf6e8019a5ae7da4985fbb06e5000000008a47304402205103941e2b11e746dfa817888d422f6e7f4d16dbbfb8ffa61d15ffb924a84b8802202fe861b0f23f17139d15a3374bfc6c7196d371f3d1a324e31cc0aadbba87e53c0141049e7e1b251a7e26cae9ee7553b278ef58ef3c28b4b20134d51b747d9b18b0a19b94b66cef320e2549dec0ea3d725cb4c742f368928b1fb74b4603e24a1e262c80ffffffff0240420f00000000001976a914bcfa0e27218a7c97257b351b03a9eac95c25a23988ac40420f00000000001976a9140c6a68f20bafc678164d171ee4f077adfa9b091688ac00000000 \ No newline at end of file diff --git a/btcutil/txsort/txsort.go b/btcutil/txsort/txsort.go new file mode 100644 index 0000000000..f72a7db970 --- /dev/null +++ b/btcutil/txsort/txsort.go @@ -0,0 +1,95 @@ +// Copyright (c) 2015-2016 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +// Provides functions for sorting tx inputs and outputs according to BIP 69 +// (https://github.com/bitcoin/bips/blob/master/bip-0069.mediawiki) + +package txsort + +import ( + "bytes" + "sort" + + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/wire" +) + +// InPlaceSort modifies the passed transaction inputs and outputs to be sorted +// based on BIP 69. +// +// WARNING: This function must NOT be called with published transactions since +// it will mutate the transaction if it's not already sorted. This can cause +// issues if you mutate a tx in a block, for example, which would invalidate the +// block. It could also cause cached hashes, such as in a btcutil.Tx to become +// invalidated. +// +// The function should only be used if the caller is creating the transaction or +// is otherwise 100% positive mutating will not cause adverse affects due to +// other dependencies. +func InPlaceSort(tx *wire.MsgTx) { + sort.Sort(sortableInputSlice(tx.TxIn)) + sort.Sort(sortableOutputSlice(tx.TxOut)) +} + +// Sort returns a new transaction with the inputs and outputs sorted based on +// BIP 69. The passed transaction is not modified and the new transaction +// might have a different hash if any sorting was done. +func Sort(tx *wire.MsgTx) *wire.MsgTx { + txCopy := tx.Copy() + sort.Sort(sortableInputSlice(txCopy.TxIn)) + sort.Sort(sortableOutputSlice(txCopy.TxOut)) + return txCopy +} + +// IsSorted checks whether tx has inputs and outputs sorted according to BIP +// 69. +func IsSorted(tx *wire.MsgTx) bool { + if !sort.IsSorted(sortableInputSlice(tx.TxIn)) { + return false + } + if !sort.IsSorted(sortableOutputSlice(tx.TxOut)) { + return false + } + return true +} + +type sortableInputSlice []*wire.TxIn +type sortableOutputSlice []*wire.TxOut + +// For SortableInputSlice and SortableOutputSlice, three functions are needed +// to make it sortable with sort.Sort() -- Len, Less, and Swap +// Len and Swap are trivial. Less is BIP 69 specific. +func (s sortableInputSlice) Len() int { return len(s) } +func (s sortableOutputSlice) Len() int { return len(s) } +func (s sortableOutputSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s sortableInputSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +// Input comparison function. +// First sort based on input hash (reversed / rpc-style), then index. +func (s sortableInputSlice) Less(i, j int) bool { + // Input hashes are the same, so compare the index. + ihash := s[i].PreviousOutPoint.Hash + jhash := s[j].PreviousOutPoint.Hash + if ihash == jhash { + return s[i].PreviousOutPoint.Index < s[j].PreviousOutPoint.Index + } + + // At this point, the hashes are not equal, so reverse them to + // big-endian and return the result of the comparison. + const hashSize = chainhash.HashSize + for b := 0; b < hashSize/2; b++ { + ihash[b], ihash[hashSize-1-b] = ihash[hashSize-1-b], ihash[b] + jhash[b], jhash[hashSize-1-b] = jhash[hashSize-1-b], jhash[b] + } + return bytes.Compare(ihash[:], jhash[:]) == -1 +} + +// Output comparison function. +// First sort based on amount (smallest first), then PkScript. +func (s sortableOutputSlice) Less(i, j int) bool { + if s[i].Value == s[j].Value { + return bytes.Compare(s[i].PkScript, s[j].PkScript) < 0 + } + return s[i].Value < s[j].Value +} diff --git a/btcutil/txsort/txsort_test.go b/btcutil/txsort/txsort_test.go new file mode 100644 index 0000000000..16a3e61c83 --- /dev/null +++ b/btcutil/txsort/txsort_test.go @@ -0,0 +1,124 @@ +// Copyright (c) 2015-2016 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package txsort_test + +import ( + "bytes" + "encoding/hex" + "os" + "path/filepath" + "testing" + + "github.com/btcsuite/btcd/btcutil/txsort" + "github.com/btcsuite/btcd/wire" +) + +// TestSort ensures the transaction sorting works according to the BIP. +func TestSort(t *testing.T) { + tests := []struct { + name string + hexFile string + isSorted bool + unsortedHash string + sortedHash string + }{ + { + name: "first test case from BIP 69 - sorts inputs only, based on hash", + hexFile: "bip69-1.hex", + isSorted: false, + unsortedHash: "0a6a357e2f7796444e02638749d9611c008b253fb55f5dc88b739b230ed0c4c3", + sortedHash: "839503cb611a3e3734bd521c608f881be2293ff77b7384057ab994c794fce623", + }, + { + name: "second test case from BIP 69 - already sorted", + hexFile: "bip69-2.hex", + isSorted: true, + unsortedHash: "28204cad1d7fc1d199e8ef4fa22f182de6258a3eaafe1bbe56ebdcacd3069a5f", + sortedHash: "28204cad1d7fc1d199e8ef4fa22f182de6258a3eaafe1bbe56ebdcacd3069a5f", + }, + { + name: "block 100001 tx[1] - sorts outputs only, based on amount", + hexFile: "bip69-3.hex", + isSorted: false, + unsortedHash: "fbde5d03b027d2b9ba4cf5d4fecab9a99864df2637b25ea4cbcb1796ff6550ca", + sortedHash: "0a8c246c55f6b82f094d211f4f57167bf2ea4898741d218b09bdb2536fd8d13f", + }, + { + name: "block 100001 tx[2] - sorts both inputs and outputs", + hexFile: "bip69-4.hex", + isSorted: false, + unsortedHash: "8131ffb0a2c945ecaf9b9063e59558784f9c3a74741ce6ae2a18d0571dac15bb", + sortedHash: "a3196553b928b0b6154b002fa9a1ce875adabc486fedaaaf4c17430fd4486329", + }, + { + name: "block 100998 tx[6] - sorts outputs only, based on output script", + hexFile: "bip69-5.hex", + isSorted: false, + unsortedHash: "ff85e8fc92e71bbc217e3ea9a3bacb86b435e52b6df0b089d67302c293a2b81d", + sortedHash: "9a6c24746de024f77cac9b2138694f11101d1c66289261224ca52a25155a7c94", + }, + } + + for _, test := range tests { + // Load and deserialize the test transaction. + filePath := filepath.Join("testdata", test.hexFile) + txHexBytes, err := os.ReadFile(filePath) + if err != nil { + t.Errorf("ReadFile (%s): failed to read test file: %v", + test.name, err) + continue + } + txBytes, err := hex.DecodeString(string(txHexBytes)) + if err != nil { + t.Errorf("DecodeString (%s): failed to decode tx: %v", + test.name, err) + continue + } + var tx wire.MsgTx + err = tx.Deserialize(bytes.NewReader(txBytes)) + if err != nil { + t.Errorf("Deserialize (%s): unexpected error %v", + test.name, err) + continue + } + + // Ensure the sort order of the original transaction matches the + // expected value. + if got := txsort.IsSorted(&tx); got != test.isSorted { + t.Errorf("IsSorted (%s): sort does not match "+ + "expected - got %v, want %v", test.name, got, + test.isSorted) + continue + } + + // Sort the transaction and ensure the resulting hash is the + // expected value. + sortedTx := txsort.Sort(&tx) + if got := sortedTx.TxHash().String(); got != test.sortedHash { + t.Errorf("Sort (%s): sorted hash does not match "+ + "expected - got %v, want %v", test.name, got, + test.sortedHash) + continue + } + + // Ensure the original transaction is not modified. + if got := tx.TxHash().String(); got != test.unsortedHash { + t.Errorf("Sort (%s): unsorted hash does not match "+ + "expected - got %v, want %v", test.name, got, + test.unsortedHash) + continue + } + + // Now sort the transaction using the mutable version and ensure + // the resulting hash is the expected value. + txsort.InPlaceSort(&tx) + if got := tx.TxHash().String(); got != test.sortedHash { + t.Errorf("SortMutate (%s): sorted hash does not match "+ + "expected - got %v, want %v", test.name, got, + test.sortedHash) + continue + } + } +} diff --git a/btcutil/wif.go b/btcutil/wif.go new file mode 100644 index 0000000000..26316dd7ff --- /dev/null +++ b/btcutil/wif.go @@ -0,0 +1,157 @@ +// Copyright (c) 2013-2016 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package btcutil + +import ( + "bytes" + "errors" + + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcutil/base58" + "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/chaincfg/chainhash" +) + +// ErrMalformedPrivateKey describes an error where a WIF-encoded private +// key cannot be decoded due to being improperly formatted. This may occur +// if the byte length is incorrect or an unexpected magic number was +// encountered. +var ErrMalformedPrivateKey = errors.New("malformed private key") + +// compressMagic is the magic byte used to identify a WIF encoding for +// an address created from a compressed serialized public key. +const compressMagic byte = 0x01 + +// WIF contains the individual components described by the Wallet Import Format +// (WIF). A WIF string is typically used to represent a private key and its +// associated address in a way that may be easily copied and imported into or +// exported from wallet software. WIF strings may be decoded into this +// structure by calling DecodeWIF or created with a user-provided private key +// by calling NewWIF. +type WIF struct { + // PrivKey is the private key being imported or exported. + PrivKey *btcec.PrivateKey + + // CompressPubKey specifies whether the address controlled by the + // imported or exported private key was created by hashing a + // compressed (33-byte) serialized public key, rather than an + // uncompressed (65-byte) one. + CompressPubKey bool + + // netID is the bitcoin network identifier byte used when + // WIF encoding the private key. + netID byte +} + +// NewWIF creates a new WIF structure to export an address and its private key +// as a string encoded in the Wallet Import Format. The compress argument +// specifies whether the address intended to be imported or exported was created +// by serializing the public key compressed rather than uncompressed. +func NewWIF(privKey *btcec.PrivateKey, net *chaincfg.Params, compress bool) (*WIF, error) { + if net == nil { + return nil, errors.New("no network") + } + return &WIF{privKey, compress, net.PrivateKeyID}, nil +} + +// IsForNet returns whether or not the decoded WIF structure is associated +// with the passed bitcoin network. +func (w *WIF) IsForNet(net *chaincfg.Params) bool { + return w.netID == net.PrivateKeyID +} + +// DecodeWIF creates a new WIF structure by decoding the string encoding of +// the import format. +// +// The WIF string must be a base58-encoded string of the following byte +// sequence: +// +// - 1 byte to identify the network, must be 0x80 for mainnet or 0xef for +// either testnet3 or the regression test network +// - 32 bytes of a binary-encoded, big-endian, zero-padded private key +// - Optional 1 byte (equal to 0x01) if the address being imported or exported +// was created by taking the RIPEMD160 after SHA256 hash of a serialized +// compressed (33-byte) public key +// - 4 bytes of checksum, must equal the first four bytes of the double SHA256 +// of every byte before the checksum in this sequence +// +// If the base58-decoded byte sequence does not match this, DecodeWIF will +// return a non-nil error. ErrMalformedPrivateKey is returned when the WIF +// is of an impossible length or the expected compressed pubkey magic number +// does not equal the expected value of 0x01. ErrChecksumMismatch is returned +// if the expected WIF checksum does not match the calculated checksum. +func DecodeWIF(wif string) (*WIF, error) { + decoded := base58.Decode(wif) + decodedLen := len(decoded) + var compress bool + + // Length of base58 decoded WIF must be 32 bytes + an optional 1 byte + // (0x01) if compressed, plus 1 byte for netID + 4 bytes of checksum. + switch decodedLen { + case 1 + btcec.PrivKeyBytesLen + 1 + 4: + if decoded[33] != compressMagic { + return nil, ErrMalformedPrivateKey + } + compress = true + case 1 + btcec.PrivKeyBytesLen + 4: + compress = false + default: + return nil, ErrMalformedPrivateKey + } + + // Checksum is first four bytes of double SHA256 of the identifier byte + // and privKey. Verify this matches the final 4 bytes of the decoded + // private key. + var tosum []byte + if compress { + tosum = decoded[:1+btcec.PrivKeyBytesLen+1] + } else { + tosum = decoded[:1+btcec.PrivKeyBytesLen] + } + cksum := chainhash.DoubleHashB(tosum)[:4] + if !bytes.Equal(cksum, decoded[decodedLen-4:]) { + return nil, ErrChecksumMismatch + } + + netID := decoded[0] + privKeyBytes := decoded[1 : 1+btcec.PrivKeyBytesLen] + privKey, _ := btcec.PrivKeyFromBytes(privKeyBytes) + return &WIF{privKey, compress, netID}, nil +} + +// String creates the Wallet Import Format string encoding of a WIF structure. +// See DecodeWIF for a detailed breakdown of the format and requirements of +// a valid WIF string. +func (w *WIF) String() string { + // Precalculate size. Maximum number of bytes before base58 encoding + // is one byte for the network, 32 bytes of private key, possibly one + // extra byte if the pubkey is to be compressed, and finally four + // bytes of checksum. + encodeLen := 1 + btcec.PrivKeyBytesLen + 4 + if w.CompressPubKey { + encodeLen++ + } + + a := make([]byte, 0, encodeLen) + a = append(a, w.netID) + a = append(a, w.PrivKey.Serialize()...) + if w.CompressPubKey { + a = append(a, compressMagic) + } + cksum := chainhash.DoubleHashB(a)[:4] + a = append(a, cksum...) + return base58.Encode(a) +} + +// SerializePubKey serializes the associated public key of the imported or +// exported private key in either a compressed or uncompressed format. The +// serialization format chosen depends on the value of w.CompressPubKey. +func (w *WIF) SerializePubKey() []byte { + pk := w.PrivKey.PubKey() + if w.CompressPubKey { + return pk.SerializeCompressed() + } + return pk.SerializeUncompressed() +} diff --git a/btcutil/wif_test.go b/btcutil/wif_test.go new file mode 100644 index 0000000000..c255c1b54f --- /dev/null +++ b/btcutil/wif_test.go @@ -0,0 +1,160 @@ +// Copyright (c) 2013 - 2020 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package btcutil_test + +import ( + "bytes" + "encoding/hex" + "testing" + + "github.com/btcsuite/btcd/btcec/v2" + . "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg" +) + +func TestEncodeDecodeWIF(t *testing.T) { + validEncodeCases := []struct { + privateKey []byte // input + net *chaincfg.Params // input + compress bool // input + wif string // output + publicKey []byte // output + name string // name of subtest + }{ + { + privateKey: []byte{ + 0x0c, 0x28, 0xfc, 0xa3, 0x86, 0xc7, 0xa2, 0x27, + 0x60, 0x0b, 0x2f, 0xe5, 0x0b, 0x7c, 0xae, 0x11, + 0xec, 0x86, 0xd3, 0xbf, 0x1f, 0xbe, 0x47, 0x1b, + 0xe8, 0x98, 0x27, 0xe1, 0x9d, 0x72, 0xaa, 0x1d}, + net: &chaincfg.MainNetParams, + compress: false, + wif: "5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ", + publicKey: []byte{ + 0x04, 0xd0, 0xde, 0x0a, 0xae, 0xae, 0xfa, 0xd0, + 0x2b, 0x8b, 0xdc, 0x8a, 0x01, 0xa1, 0xb8, 0xb1, + 0x1c, 0x69, 0x6b, 0xd3, 0xd6, 0x6a, 0x2c, 0x5f, + 0x10, 0x78, 0x0d, 0x95, 0xb7, 0xdf, 0x42, 0x64, + 0x5c, 0xd8, 0x52, 0x28, 0xa6, 0xfb, 0x29, 0x94, + 0x0e, 0x85, 0x8e, 0x7e, 0x55, 0x84, 0x2a, 0xe2, + 0xbd, 0x11, 0x5d, 0x1e, 0xd7, 0xcc, 0x0e, 0x82, + 0xd9, 0x34, 0xe9, 0x29, 0xc9, 0x76, 0x48, 0xcb, + 0x0a}, + name: "encodeValidUncompressedMainNetWif", + }, + { + privateKey: []byte{ + 0xdd, 0xa3, 0x5a, 0x14, 0x88, 0xfb, 0x97, 0xb6, + 0xeb, 0x3f, 0xe6, 0xe9, 0xef, 0x2a, 0x25, 0x81, + 0x4e, 0x39, 0x6f, 0xb5, 0xdc, 0x29, 0x5f, 0xe9, + 0x94, 0xb9, 0x67, 0x89, 0xb2, 0x1a, 0x03, 0x98}, + net: &chaincfg.TestNet3Params, + compress: true, + wif: "cV1Y7ARUr9Yx7BR55nTdnR7ZXNJphZtCCMBTEZBJe1hXt2kB684q", + publicKey: []byte{ + 0x02, 0xee, 0xc2, 0x54, 0x06, 0x61, 0xb0, 0xc3, + 0x9d, 0x27, 0x15, 0x70, 0x74, 0x24, 0x13, 0xbd, + 0x02, 0x93, 0x2d, 0xd0, 0x09, 0x34, 0x93, 0xfd, + 0x0b, 0xec, 0xed, 0x0b, 0x7f, 0x93, 0xad, 0xde, + 0xc4}, + name: "encodeValidCompressedTestNet3Wif", + }, + } + + for _, validCase := range validEncodeCases { + validCase := validCase + + t.Run(validCase.name, func(t *testing.T) { + priv, _ := btcec.PrivKeyFromBytes(validCase.privateKey) + wif, err := NewWIF(priv, validCase.net, validCase.compress) + if err != nil { + t.Fatalf("NewWIF failed: expected no error, got '%v'", err) + } + + if !wif.IsForNet(validCase.net) { + t.Fatal("IsForNet failed: got 'false', want 'true'") + } + + if gotPubKey := wif.SerializePubKey(); !bytes.Equal(gotPubKey, validCase.publicKey) { + t.Fatalf("SerializePubKey failed: got '%s', want '%s'", + hex.EncodeToString(gotPubKey), hex.EncodeToString(validCase.publicKey)) + } + + // Test that encoding the WIF structure matches the expected string. + got := wif.String() + if got != validCase.wif { + t.Fatalf("NewWIF failed: want '%s', got '%s'", + validCase.wif, got) + } + + // Test that decoding the expected string results in the original WIF + // structure. + decodedWif, err := DecodeWIF(got) + if err != nil { + t.Fatalf("DecodeWIF failed: expected no error, got '%v'", err) + } + if decodedWifString := decodedWif.String(); decodedWifString != validCase.wif { + t.Fatalf("NewWIF failed: want '%v', got '%v'", validCase.wif, decodedWifString) + } + }) + } + + invalidDecodeCases := []struct { + name string + wif string + err error + }{ + { + name: "decodeInvalidLengthWif", + wif: "deadbeef", + err: ErrMalformedPrivateKey, + }, + { + name: "decodeInvalidCompressMagicWif", + wif: "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sfZr2ym", + err: ErrMalformedPrivateKey, + }, + { + name: "decodeInvalidChecksumWif", + wif: "5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTj", + err: ErrChecksumMismatch, + }, + } + + for _, invalidCase := range invalidDecodeCases { + invalidCase := invalidCase + + t.Run(invalidCase.name, func(t *testing.T) { + decodedWif, err := DecodeWIF(invalidCase.wif) + if decodedWif != nil { + t.Fatalf("DecodeWIF: unexpectedly succeeded - got '%v', want '%v'", + decodedWif, nil) + } + if err != invalidCase.err { + t.Fatalf("DecodeWIF: expected error '%v', got '%v'", + invalidCase.err, err) + } + }) + } + + t.Run("encodeInvalidNetworkWif", func(t *testing.T) { + privateKey := []byte{ + 0x0c, 0x28, 0xfc, 0xa3, 0x86, 0xc7, 0xa2, 0x27, + 0x60, 0x0b, 0x2f, 0xe5, 0x0b, 0x7c, 0xae, 0x11, + 0xec, 0x86, 0xd3, 0xbf, 0x1f, 0xbe, 0x47, 0x1b, + 0xe8, 0x98, 0x27, 0xe1, 0x9d, 0x72, 0xaa, 0x1d} + priv, _ := btcec.PrivKeyFromBytes(privateKey) + + wif, err := NewWIF(priv, nil, true) + + if wif != nil { + t.Fatalf("NewWIF: unexpectedly succeeded - got '%v', want '%v'", + wif, nil) + } + if err == nil || err.Error() != "no network" { + t.Fatalf("NewWIF: expected error 'no network', got '%v'", err) + } + }) +} diff --git a/chaincfg/README.md b/chaincfg/README.md index 880446fdc7..d1a534bafe 100644 --- a/chaincfg/README.md +++ b/chaincfg/README.md @@ -1,9 +1,9 @@ chaincfg ======== -[![Build Status](http://img.shields.io/travis/btcsuite/btcd.svg)](https://travis-ci.org/btcsuite/btcd) +[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions) [![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) -[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/btcsuite/btcd/chaincfg) +[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/chaincfg) Package chaincfg defines chain configuration parameters for the three standard Bitcoin networks and provides the ability for callers to define their own custom @@ -24,7 +24,7 @@ import ( "fmt" "log" - "github.com/btcsuite/btcutil" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" ) diff --git a/chaincfg/chainhash/README.md b/chaincfg/chainhash/README.md index fc49d9cd93..b7ddf19ef7 100644 --- a/chaincfg/chainhash/README.md +++ b/chaincfg/chainhash/README.md @@ -1,9 +1,9 @@ chainhash ========= -[![Build Status](http://img.shields.io/travis/btcsuite/btcd.svg)](https://travis-ci.org/btcsuite/btcd) +[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions) [![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) -[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/btcsuite/btcd/chaincfg/chainhash) +[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/chaincfg/chainhash) ======= chainhash provides a generic hash type and associated functions that allows the diff --git a/chaincfg/chainhash/go.mod b/chaincfg/chainhash/go.mod new file mode 100644 index 0000000000..1d865254dd --- /dev/null +++ b/chaincfg/chainhash/go.mod @@ -0,0 +1,3 @@ +module github.com/btcsuite/btcd/chaincfg/chainhash + +go 1.17 diff --git a/chaincfg/chainhash/hash.go b/chaincfg/chainhash/hash.go index 2b1cec022b..4aa7aeb64c 100644 --- a/chaincfg/chainhash/hash.go +++ b/chaincfg/chainhash/hash.go @@ -6,7 +6,9 @@ package chainhash import ( + "crypto/sha256" "encoding/hex" + "encoding/json" "fmt" ) @@ -16,6 +18,46 @@ const HashSize = 32 // MaxHashStringSize is the maximum length of a Hash hash string. const MaxHashStringSize = HashSize * 2 +var ( + // TagBIP0340Challenge is the BIP-0340 tag for challenges. + TagBIP0340Challenge = []byte("BIP0340/challenge") + + // TagBIP0340Aux is the BIP-0340 tag for aux data. + TagBIP0340Aux = []byte("BIP0340/aux") + + // TagBIP0340Nonce is the BIP-0340 tag for nonces. + TagBIP0340Nonce = []byte("BIP0340/nonce") + + // TagTapSighash is the tag used by BIP 341 to generate the sighash + // flags. + TagTapSighash = []byte("TapSighash") + + // TagTagTapLeaf is the message tag prefix used to compute the hash + // digest of a tapscript leaf. + TagTapLeaf = []byte("TapLeaf") + + // TagTapBranch is the message tag prefix used to compute the + // hash digest of two tap leaves into a taproot branch node. + TagTapBranch = []byte("TapBranch") + + // TagTapTweak is the message tag prefix used to compute the hash tweak + // used to enable a public key to commit to the taproot branch root + // for the witness program. + TagTapTweak = []byte("TapTweak") + + // precomputedTags is a map containing the SHA-256 hash of the BIP-0340 + // tags. + precomputedTags = map[string]Hash{ + string(TagBIP0340Challenge): sha256.Sum256(TagBIP0340Challenge), + string(TagBIP0340Aux): sha256.Sum256(TagBIP0340Aux), + string(TagBIP0340Nonce): sha256.Sum256(TagBIP0340Nonce), + string(TagTapSighash): sha256.Sum256(TagTapSighash), + string(TagTapLeaf): sha256.Sum256(TagTapLeaf), + string(TagTapBranch): sha256.Sum256(TagTapBranch), + string(TagTapTweak): sha256.Sum256(TagTapTweak), + } +) + // ErrHashStrSize describes an error that indicates the caller specified a hash // string that has too many characters. var ErrHashStrSize = fmt.Errorf("max hash string length is %v bytes", MaxHashStringSize) @@ -69,6 +111,32 @@ func (hash *Hash) IsEqual(target *Hash) bool { return *hash == *target } +// MarshalJSON serialises the hash as a JSON appropriate string value. +func (hash Hash) MarshalJSON() ([]byte, error) { + return json.Marshal(hash.String()) +} + +// UnmarshalJSON parses the hash with JSON appropriate string value. +func (hash *Hash) UnmarshalJSON(input []byte) error { + // If the first byte indicates an array, the hash could have been marshalled + // using the legacy method and e.g. persisted. + if len(input) > 0 && input[0] == '[' { + return decodeLegacy(hash, input) + } + + var sh string + err := json.Unmarshal(input, &sh) + if err != nil { + return err + } + newHash, err := NewHashFromStr(sh) + if err != nil { + return err + } + + return hash.SetBytes(newHash[:]) +} + // NewHash returns a new Hash from a byte slice. An error is returned if // the number of bytes passed in is not HashSize. func NewHash(newHash []byte) (*Hash, error) { @@ -80,6 +148,35 @@ func NewHash(newHash []byte) (*Hash, error) { return &sh, err } +// TaggedHash implements the tagged hash scheme described in BIP-340. We use +// sha-256 to bind a message hash to a specific context using a tag: +// sha256(sha256(tag) || sha256(tag) || msg). +func TaggedHash(tag []byte, msgs ...[]byte) *Hash { + // Check to see if we've already pre-computed the hash of the tag. If + // so then this'll save us an extra sha256 hash. + shaTag, ok := precomputedTags[string(tag)] + if !ok { + shaTag = sha256.Sum256(tag) + } + + // h = sha256(sha256(tag) || sha256(tag) || msg) + h := sha256.New() + h.Write(shaTag[:]) + h.Write(shaTag[:]) + + for _, msg := range msgs { + h.Write(msg) + } + + taggedHash := h.Sum(nil) + + // The function can't error out since the above hash is guaranteed to + // be 32 bytes. + hash, _ := NewHash(taggedHash) + + return hash +} + // NewHashFromStr creates a Hash from a hash string. The string should be // the hexadecimal string of a byte-reversed hash, but any missing characters // result in zero padding at the end of the Hash. @@ -126,3 +223,17 @@ func Decode(dst *Hash, src string) error { return nil } + +// decodeLegacy decodes an Hash that has been encoded with the legacy method +// (i.e. represented as a bytes array) to a destination. +func decodeLegacy(dst *Hash, src []byte) error { + var hashBytes []byte + err := json.Unmarshal(src, &hashBytes) + if err != nil { + return err + } + if len(hashBytes) != HashSize { + return ErrHashStrSize + } + return dst.SetBytes(hashBytes) +} diff --git a/chaincfg/chainhash/hash_test.go b/chaincfg/chainhash/hash_test.go index 07f54c7763..85738a66c3 100644 --- a/chaincfg/chainhash/hash_test.go +++ b/chaincfg/chainhash/hash_test.go @@ -7,6 +7,7 @@ package chainhash import ( "bytes" "encoding/hex" + "encoding/json" "testing" ) @@ -194,3 +195,38 @@ func TestNewHashFromStr(t *testing.T) { } } } + +// TestHashJsonMarshal tests json marshal and unmarshal. +func TestHashJsonMarshal(t *testing.T) { + hashStr := "000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506" + legacyHashStr := []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]") + + hash, err := NewHashFromStr(hashStr) + if err != nil { + t.Errorf("NewHashFromStr error:%v, hashStr:%s", err, hashStr) + } + + hashBytes, err := json.Marshal(hash) + if err != nil { + t.Errorf("Marshal json error:%v, hash:%v", err, hashBytes) + } + + var newHash Hash + err = json.Unmarshal(hashBytes, &newHash) + if err != nil { + t.Errorf("Unmarshal json error:%v, hash:%v", err, hashBytes) + } + + if !hash.IsEqual(&newHash) { + t.Errorf("String: wrong hash string - got %v, want %v", newHash.String(), hashStr) + } + + err = newHash.UnmarshalJSON(legacyHashStr) + if err != nil { + t.Errorf("Unmarshal legacy json error:%v, hash:%v", err, legacyHashStr) + } + + if !hash.IsEqual(&newHash) { + t.Errorf("String: wrong hash string - got %v, want %v", newHash.String(), hashStr) + } +} diff --git a/chaincfg/chainhash/hashfuncs.go b/chaincfg/chainhash/hashfuncs.go index bf74f73c39..5be8a4d467 100644 --- a/chaincfg/chainhash/hashfuncs.go +++ b/chaincfg/chainhash/hashfuncs.go @@ -5,7 +5,10 @@ package chainhash -import "crypto/sha256" +import ( + "crypto/sha256" + "io" +) // HashB calculates hash(b) and returns the resulting bytes. func HashB(b []byte) []byte { @@ -31,3 +34,24 @@ func DoubleHashH(b []byte) Hash { first := sha256.Sum256(b) return Hash(sha256.Sum256(first[:])) } + +// DoubleHashRaw calculates hash(hash(w)) where w is the resulting bytes from +// the given serialize function and returns the resulting bytes as a Hash. +func DoubleHashRaw(serialize func(w io.Writer) error) Hash { + // Encode the transaction into the hash. Ignore the error returns + // since the only way the encode could fail is being out of memory + // or due to nil pointers, both of which would cause a run-time panic. + h := sha256.New() + _ = serialize(h) + + // This buf is here because Sum() will append the result to the passed + // in byte slice. Pre-allocating here saves an allocation on the second + // hash as we can reuse it. This allocation also does not escape to the + // heap, saving an allocation. + buf := make([]byte, 0, HashSize) + first := h.Sum(buf) + h.Reset() + h.Write(first) + res := h.Sum(buf) + return *(*Hash)(res) +} diff --git a/chaincfg/chainhash/hashfuncs_test.go b/chaincfg/chainhash/hashfuncs_test.go index bcd6f22200..6b9ff9a97f 100644 --- a/chaincfg/chainhash/hashfuncs_test.go +++ b/chaincfg/chainhash/hashfuncs_test.go @@ -6,6 +6,7 @@ package chainhash import ( "fmt" + "io" "testing" ) @@ -133,4 +134,20 @@ func TestDoubleHashFuncs(t *testing.T) { continue } } + + // Ensure the hash function which accepts a hash.Hash returns the expected + // result when given a hash.Hash that is of type SHA256. + for _, test := range tests { + serialize := func(w io.Writer) error { + w.Write([]byte(test.in)) + return nil + } + hash := DoubleHashRaw(serialize) + h := fmt.Sprintf("%x", hash[:]) + if h != test.out { + t.Errorf("DoubleHashRaw(%q) = %s, want %s", test.in, h, + test.out) + continue + } + } } diff --git a/chaincfg/deployment_time_frame.go b/chaincfg/deployment_time_frame.go new file mode 100644 index 0000000000..f26d429090 --- /dev/null +++ b/chaincfg/deployment_time_frame.go @@ -0,0 +1,185 @@ +package chaincfg + +import ( + "fmt" + "time" + + "github.com/btcsuite/btcd/wire" +) + +var ( + // ErrNoBlockClock is returned when an operation fails due to lack of + // synchornization with the current up to date block clock. + ErrNoBlockClock = fmt.Errorf("no block clock synchronized") +) + +// BlockClock is an abstraction over the past median time computation. The past +// median time computation is used in several consensus checks such as CSV, and +// also BIP 9 version bits. This interface allows callers to abstract away the +// computation of the past median time from the perspective of a given block +// header. +type BlockClock interface { + // PastMedianTime returns the past median time from the PoV of the + // passed block header. The past median time is the median time of the + // 11 blocks prior to the passed block header. + PastMedianTime(*wire.BlockHeader) (time.Time, error) +} + +// ConsensusDeploymentStarter determines if a given consensus deployment has +// started. A deployment has started once according to the current "time", the +// deployment is eligible for activation once a perquisite condition has +// passed. +type ConsensusDeploymentStarter interface { + // HasStarted returns true if the consensus deployment has started. + HasStarted(*wire.BlockHeader) (bool, error) +} + +// ClockConsensusDeploymentStarter is a more specialized version of the +// ConsensusDeploymentStarter that uses a BlockClock in order to determine if a +// deployment has started or not. +// +// NOTE: Any calls to HasStarted will _fail_ with ErrNoBlockClock if they +// happen before SynchronizeClock is executed. +type ClockConsensusDeploymentStarter interface { + ConsensusDeploymentStarter + + // SynchronizeClock synchronizes the target ConsensusDeploymentStarter + // with the current up-to date BlockClock. + SynchronizeClock(clock BlockClock) +} + +// ConsensusDeploymentEnder determines if a given consensus deployment has +// ended. A deployment has ended once according got eh current "time", the +// deployment is no longer eligible for activation. +type ConsensusDeploymentEnder interface { + // HasEnded returns true if the consensus deployment has ended. + HasEnded(*wire.BlockHeader) (bool, error) +} + +// ClockConsensusDeploymentEnder is a more specialized version of the +// ConsensusDeploymentEnder that uses a BlockClock in order to determine if a +// deployment has started or not. +// +// NOTE: Any calls to HasEnded will _fail_ with ErrNoBlockClock if they +// happen before SynchronizeClock is executed. +type ClockConsensusDeploymentEnder interface { + ConsensusDeploymentEnder + + // SynchronizeClock synchronizes the target ConsensusDeploymentStarter + // with the current up-to date BlockClock. + SynchronizeClock(clock BlockClock) +} + +// MedianTimeDeploymentStarter is a ClockConsensusDeploymentStarter that uses +// the median time past of a target block node to determine if a deployment has +// started. +type MedianTimeDeploymentStarter struct { + blockClock BlockClock + + startTime time.Time +} + +// NewMedianTimeDeploymentStarter returns a new instance of a +// MedianTimeDeploymentStarter for a given start time. Using a time.Time +// instance where IsZero() is true, indicates that a deployment should be +// considered to always have been started. +func NewMedianTimeDeploymentStarter(startTime time.Time) *MedianTimeDeploymentStarter { + return &MedianTimeDeploymentStarter{ + startTime: startTime, + } +} + +// SynchronizeClock synchronizes the target ConsensusDeploymentStarter with the +// current up-to date BlockClock. +func (m *MedianTimeDeploymentStarter) SynchronizeClock(clock BlockClock) { + m.blockClock = clock +} + +// HasStarted returns true if the consensus deployment has started. +func (m *MedianTimeDeploymentStarter) HasStarted(blkHeader *wire.BlockHeader) (bool, error) { + switch { + // If we haven't yet been synchronized with a block clock, then we + // can't tell the time, so we'll fail. + case m.blockClock == nil: + return false, ErrNoBlockClock + + // If the time is "zero", then the deployment has always started. + case m.startTime.IsZero(): + return true, nil + } + + medianTime, err := m.blockClock.PastMedianTime(blkHeader) + if err != nil { + return false, err + } + + // We check both after and equal here as after will fail for equivalent + // times, and we want to be inclusive. + return medianTime.After(m.startTime) || medianTime.Equal(m.startTime), nil +} + +// StartTime returns the raw start time of the deployment. +func (m *MedianTimeDeploymentStarter) StartTime() time.Time { + return m.startTime +} + +// A compile-time assertion to ensure MedianTimeDeploymentStarter implements +// the ClockConsensusDeploymentStarter interface. +var _ ClockConsensusDeploymentStarter = (*MedianTimeDeploymentStarter)(nil) + +// MedianTimeDeploymentEnder is a ClockConsensusDeploymentEnder that uses the +// median time past of a target block to determine if a deployment has ended. +type MedianTimeDeploymentEnder struct { + blockClock BlockClock + + endTime time.Time +} + +// NewMedianTimeDeploymentEnder returns a new instance of the +// MedianTimeDeploymentEnder anchored around the passed endTime. Using a +// time.Time instance where IsZero() is true, indicates that a deployment +// should be considered to never end. +func NewMedianTimeDeploymentEnder(endTime time.Time) *MedianTimeDeploymentEnder { + return &MedianTimeDeploymentEnder{ + endTime: endTime, + } +} + +// HasEnded returns true if the deployment has ended. +func (m *MedianTimeDeploymentEnder) HasEnded(blkHeader *wire.BlockHeader) (bool, error) { + switch { + // If we haven't yet been synchronized with a block clock, then we can't tell + // the time, so we'll we haven't yet been synchronized with a block + // clock, then w can't tell the time, so we'll fail. + case m.blockClock == nil: + return false, ErrNoBlockClock + + // If the time is "zero", then the deployment never ends. + case m.endTime.IsZero(): + return false, nil + } + + medianTime, err := m.blockClock.PastMedianTime(blkHeader) + if err != nil { + return false, err + } + + // We check both after and equal here as after will fail for equivalent + // times, and we want to be inclusive. + return medianTime.After(m.endTime) || medianTime.Equal(m.endTime), nil +} + +// MedianTimeDeploymentEnder returns the raw end time of the deployment. +func (m *MedianTimeDeploymentEnder) EndTime() time.Time { + return m.endTime +} + +// SynchronizeClock synchronizes the target ConsensusDeploymentEnder with the +// current up-to date BlockClock. +func (m *MedianTimeDeploymentEnder) SynchronizeClock(clock BlockClock) { + m.blockClock = clock +} + +// A compile-time assertion to ensure MedianTimeDeploymentEnder implements the +// ClockConsensusDeploymentStarter interface. +var _ ClockConsensusDeploymentEnder = (*MedianTimeDeploymentEnder)(nil) diff --git a/chaincfg/doc.go b/chaincfg/doc.go index 3659adbf46..65efb54f66 100644 --- a/chaincfg/doc.go +++ b/chaincfg/doc.go @@ -18,40 +18,40 @@ // When a network parameter is needed, it may then be looked up through this // variable (either directly, or hidden in a library call). // -// package main +// package main // -// import ( -// "flag" -// "fmt" -// "log" +// import ( +// "flag" +// "fmt" +// "log" // -// "github.com/btcsuite/btcutil" -// "github.com/btcsuite/btcd/chaincfg" -// ) +// "github.com/btcsuite/btcd/btcutil" +// "github.com/btcsuite/btcd/chaincfg" +// ) // -// var testnet = flag.Bool("testnet", false, "operate on the testnet Bitcoin network") +// var testnet = flag.Bool("testnet", false, "operate on the testnet Bitcoin network") // -// // By default (without -testnet), use mainnet. -// var chainParams = &chaincfg.MainNetParams +// // By default (without -testnet), use mainnet. +// var chainParams = &chaincfg.MainNetParams // -// func main() { -// flag.Parse() +// func main() { +// flag.Parse() // -// // Modify active network parameters if operating on testnet. -// if *testnet { -// chainParams = &chaincfg.TestNet3Params -// } +// // Modify active network parameters if operating on testnet. +// if *testnet { +// chainParams = &chaincfg.TestNet3Params +// } // -// // later... +// // later... // -// // Create and print new payment address, specific to the active network. -// pubKeyHash := make([]byte, 20) -// addr, err := btcutil.NewAddressPubKeyHash(pubKeyHash, chainParams) -// if err != nil { -// log.Fatal(err) -// } -// fmt.Println(addr) -// } +// // Create and print new payment address, specific to the active network. +// pubKeyHash := make([]byte, 20) +// addr, err := btcutil.NewAddressPubKeyHash(pubKeyHash, chainParams) +// if err != nil { +// log.Fatal(err) +// } +// fmt.Println(addr) +// } // // If an application does not use one of the three standard Bitcoin networks, // a new Params struct may be created which defines the parameters for the diff --git a/chaincfg/genesis.go b/chaincfg/genesis.go index ee47b84ce4..73d286102b 100644 --- a/chaincfg/genesis.go +++ b/chaincfg/genesis.go @@ -170,3 +170,31 @@ var simNetGenesisBlock = wire.MsgBlock{ }, Transactions: []*wire.MsgTx{&genesisCoinbaseTx}, } + +// sigNetGenesisHash is the hash of the first block in the block chain for the +// signet test network. +var sigNetGenesisHash = chainhash.Hash{ + 0xf6, 0x1e, 0xee, 0x3b, 0x63, 0xa3, 0x80, 0xa4, + 0x77, 0xa0, 0x63, 0xaf, 0x32, 0xb2, 0xbb, 0xc9, + 0x7c, 0x9f, 0xf9, 0xf0, 0x1f, 0x2c, 0x42, 0x25, + 0xe9, 0x73, 0x98, 0x81, 0x08, 0x00, 0x00, 0x00, +} + +// sigNetGenesisMerkleRoot is the hash of the first transaction in the genesis +// block for the signet test network. It is the same as the merkle root for +// the main network. +var sigNetGenesisMerkleRoot = genesisMerkleRoot + +// sigNetGenesisBlock defines the genesis block of the block chain which serves +// as the public transaction ledger for the signet test network. +var sigNetGenesisBlock = wire.MsgBlock{ + Header: wire.BlockHeader{ + Version: 1, + PrevBlock: chainhash.Hash{}, // 0000000000000000000000000000000000000000000000000000000000000000 + MerkleRoot: sigNetGenesisMerkleRoot, // 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b + Timestamp: time.Unix(1598918400, 0), // 2020-09-01 00:00:00 +0000 UTC + Bits: 0x1e0377ae, // 503543726 [00000377ae000000000000000000000000000000000000000000000000000000] + Nonce: 52613770, + }, + Transactions: []*wire.MsgTx{&genesisCoinbaseTx}, +} diff --git a/chaincfg/genesis_test.go b/chaincfg/genesis_test.go index d04a72f758..1daf847916 100644 --- a/chaincfg/genesis_test.go +++ b/chaincfg/genesis_test.go @@ -118,6 +118,33 @@ func TestSimNetGenesisBlock(t *testing.T) { } } +// TestSigNetGenesisBlock tests the genesis block of the signet test network for +// validity by checking the encoded bytes and hashes. +func TestSigNetGenesisBlock(t *testing.T) { + // Encode the genesis block to raw bytes. + var buf bytes.Buffer + err := SigNetParams.GenesisBlock.Serialize(&buf) + if err != nil { + t.Fatalf("TestSigNetGenesisBlock: %v", err) + } + + // Ensure the encoded block matches the expected bytes. + if !bytes.Equal(buf.Bytes(), sigNetGenesisBlockBytes) { + t.Fatalf("TestSigNetGenesisBlock: Genesis block does not "+ + "appear valid - got %v, want %v", + spew.Sdump(buf.Bytes()), + spew.Sdump(sigNetGenesisBlockBytes)) + } + + // Check hash of the block against expected hash. + hash := SigNetParams.GenesisBlock.BlockHash() + if !SigNetParams.GenesisHash.IsEqual(&hash) { + t.Fatalf("TestSigNetGenesisBlock: Genesis block hash does "+ + "not appear valid - got %v, want %v", spew.Sdump(hash), + spew.Sdump(SigNetParams.GenesisHash)) + } +} + // genesisBlockBytes are the wire encoded bytes for the genesis block of the // main network as of protocol version 60002. var genesisBlockBytes = []byte{ @@ -281,3 +308,44 @@ var simNetGenesisBlockBytes = []byte{ 0x8a, 0x4c, 0x70, 0x2b, 0x6b, 0xf1, 0x1d, 0x5f, /* |.Lp+k.._|*/ 0xac, 0x00, 0x00, 0x00, 0x00, /* |.....| */ } + +// sigNetGenesisBlockBytes are the wire encoded bytes for the genesis block of +// the signet test network as of protocol version 70002. +var sigNetGenesisBlockBytes = []byte{ + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |...@....| */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */ + 0x00, 0x00, 0x00, 0x00, 0x3b, 0xa3, 0xed, 0xfd, /* |........| */ + 0x7a, 0x7b, 0x12, 0xb2, 0x7a, 0xc7, 0x2c, 0x3e, /* |....;...| */ + 0x67, 0x76, 0x8f, 0x61, 0x7f, 0xc8, 0x1b, 0xc3, /* |z{..z.,>| */ + 0x88, 0x8a, 0x51, 0x32, 0x3a, 0x9f, 0xb8, 0xaa, /* |gv.a....| */ + 0x4b, 0x1e, 0x5e, 0x4a, 0x00, 0x8f, 0x4d, 0x5f, /* |..Q2:...| */ + 0xae, 0x77, 0x03, 0x1e, 0x8a, 0xd2, 0x22, 0x03, /* |K.^J..M_| */ + 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, /* |.w....".| */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, /* |........| */ + 0xff, 0xff, 0x4d, 0x04, 0xff, 0xff, 0x00, 0x1d, /* |........| */ + 0x01, 0x04, 0x45, 0x54, 0x68, 0x65, 0x20, 0x54, /* |..M.....| */ + 0x69, 0x6d, 0x65, 0x73, 0x20, 0x30, 0x33, 0x2f, /* |..EThe T| */ + 0x4a, 0x61, 0x6e, 0x2f, 0x32, 0x30, 0x30, 0x39, /* |imes 03/| */ + 0x20, 0x43, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x6c, /* |Jan/2009| */ + 0x6c, 0x6f, 0x72, 0x20, 0x6f, 0x6e, 0x20, 0x62, /* | Chancel| */ + 0x72, 0x69, 0x6e, 0x6b, 0x20, 0x6f, 0x66, 0x20, /* |lor on b| */ + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x62, /* |rink of| */ + 0x61, 0x69, 0x6c, 0x6f, 0x75, 0x74, 0x20, 0x66, /* |second b| */ + 0x6f, 0x72, 0x20, 0x62, 0x61, 0x6e, 0x6b, 0x73, /* |ailout f| */ + 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0xf2, 0x05, /* |or banks| */ + 0x2a, 0x01, 0x00, 0x00, 0x00, 0x43, 0x41, 0x04, /* |........| */ + 0x67, 0x8a, 0xfd, 0xb0, 0xfe, 0x55, 0x48, 0x27, /* |*....CA.| */ + 0x19, 0x67, 0xf1, 0xa6, 0x71, 0x30, 0xb7, 0x10, /* |g....UH'| */ + 0x5c, 0xd6, 0xa8, 0x28, 0xe0, 0x39, 0x09, 0xa6, /* |.g..q0..| */ + 0x79, 0x62, 0xe0, 0xea, 0x1f, 0x61, 0xde, 0xb6, /* |\..(.9..| */ + 0x49, 0xf6, 0xbc, 0x3f, 0x4c, 0xef, 0x38, 0xc4, /* |yb...a..| */ + 0xf3, 0x55, 0x04, 0xe5, 0x1e, 0xc1, 0x12, 0xde, /* |I..?L.8.| */ + 0x5c, 0x38, 0x4d, 0xf7, 0xba, 0x0b, 0x8d, 0x57, /* |.U......| */ + 0x8a, 0x4c, 0x70, 0x2b, 0x6b, 0xf1, 0x1d, 0x5f, /* |\8M....W| */ + 0xac, 0x00, 0x00, 0x00, 0x00, /* |.....| */ +} diff --git a/chaincfg/params.go b/chaincfg/params.go index 54117b8713..1c329cb50f 100644 --- a/chaincfg/params.go +++ b/chaincfg/params.go @@ -5,8 +5,9 @@ package chaincfg import ( + "encoding/binary" + "encoding/hex" "errors" - "math" "math/big" "strings" "time" @@ -38,6 +39,31 @@ var ( // simNetPowLimit is the highest proof of work value a Bitcoin block // can have for the simulation test network. It is the value 2^255 - 1. simNetPowLimit = new(big.Int).Sub(new(big.Int).Lsh(bigOne, 255), bigOne) + + // sigNetPowLimit is the highest proof of work value a bitcoin block can + // have for the signet test network. It is the value 0x0377ae << 216. + sigNetPowLimit = new(big.Int).Lsh(new(big.Int).SetInt64(0x0377ae), 216) + + // DefaultSignetChallenge is the byte representation of the signet + // challenge for the default (public, Taproot enabled) signet network. + // This is the binary equivalent of the bitcoin script + // 1 03ad5e0edad18cb1f0fc0d28a3d4f1f3e445640337489abb10404f2d1e086be430 + // 0359ef5021964fe22d6f8e05b2463c9540ce96883fe3b278760f048f5189f2e6c4 2 + // OP_CHECKMULTISIG + DefaultSignetChallenge, _ = hex.DecodeString( + "512103ad5e0edad18cb1f0fc0d28a3d4f1f3e445640337489abb10404f2d" + + "1e086be430210359ef5021964fe22d6f8e05b2463c9540ce9688" + + "3fe3b278760f048f5189f2e6c452ae", + ) + + // DefaultSignetDNSSeeds is the list of seed nodes for the default + // (public, Taproot enabled) signet network. + DefaultSignetDNSSeeds = []DNSSeed{ + {"seed.signet.bitcoin.sprovoost.nl", true}, + {"178.128.221.177", false}, + {"2a01:7c8:d005:390::5", false}, + {"v7ajjeirttkbnt32wpy3c6w3emwnfr3fkla7hpxcfokr3ysd3kqtzmqd.onion:38333", false}, + } ) // Checkpoint identifies a known good point in the block chain. Using @@ -69,13 +95,26 @@ type ConsensusDeployment struct { // this particular soft-fork deployment refers to. BitNumber uint8 - // StartTime is the median block time after which voting on the - // deployment starts. - StartTime uint64 - - // ExpireTime is the median block time after which the attempted - // deployment expires. - ExpireTime uint64 + // MinActivationHeight is an optional field that when set (default + // value being zero), modifies the traditional BIP 9 state machine by + // only transitioning from LockedIn to Active once the block height is + // greater than (or equal to) thus specified height. + MinActivationHeight uint32 + + // CustomActivationThreshold if set (non-zero), will _override_ the + // existing RuleChangeActivationThreshold value set at the + // network/chain level. This value divided by the active + // MinerConfirmationWindow denotes the threshold required for + // activation. A value of 1815 block denotes a 90% threshold. + CustomActivationThreshold uint32 + + // DeploymentStarter is used to determine if the given + // ConsensusDeployment has started or not. + DeploymentStarter ConsensusDeploymentStarter + + // DeploymentEnder is used to determine if the given + // ConsensusDeployment has ended or not. + DeploymentEnder ConsensusDeploymentEnder } // Constants that define the deployment offset in the deployments field of the @@ -86,6 +125,12 @@ const ( // purposes. DeploymentTestDummy = iota + // DeploymentTestDummyMinActivation defines the rule change deployment + // ID for testing purposes. This differs from the DeploymentTestDummy + // in that it specifies the newer params the taproot fork used for + // activation: a custom threshold and a min activation height. + DeploymentTestDummyMinActivation + // DeploymentCSV defines the rule change deployment ID for the CSV // soft-fork package. The CSV package includes the deployment of BIPS // 68, 112, and 113. @@ -96,6 +141,11 @@ const ( // includes the deployment of BIPS 141, 142, 144, 145, 147 and 173. DeploymentSegwit + // DeploymentTaproot defines the rule change deployment ID for the + // Taproot (+Schnorr) soft-fork package. The taproot package includes + // the deployment of BIPS 340, 341 and 342. + DeploymentTaproot + // NOTE: DefinedDeployments must always come last since it is used to // determine how many defined deployments there currently are. @@ -134,6 +184,11 @@ type Params struct { // block in compact form. PowLimitBits uint32 + // PoWNoRetargeting defines whether the network has difficulty + // retargeting enabled or not. This should only be set to true for + // regtest like networks. + PoWNoRetargeting bool + // These fields define the block heights at which the specified softfork // BIP became active. BIP0034Height int32 @@ -230,9 +285,11 @@ var MainNetParams = Params{ {"seed.bitcoin.sipa.be", true}, {"dnsseed.bluematt.me", true}, {"dnsseed.bitcoin.dashjr.org", false}, - {"seed.bitcoinstats.com", true}, {"seed.bitnodes.io", false}, {"seed.bitcoin.jonasschnelli.ch", true}, + {"seed.btc.petertodd.net", true}, + {"seed.bitcoin.sprovoost.nl", true}, + {"seed.bitcoin.wiz.biz", true}, }, // Chain parameters @@ -279,6 +336,16 @@ var MainNetParams = Params{ {520000, newHashFromStr("0000000000000000000d26984c0229c9f6962dc74db0a6d525f2f1640396f69c")}, {550000, newHashFromStr("000000000000000000223b7a2298fb1c6c75fb0efc28a4c56853ff4112ec6bc9")}, {560000, newHashFromStr("0000000000000000002c7b276daf6efb2b6aa68e2ce3be67ef925b3264ae7122")}, + {563378, newHashFromStr("0000000000000000000f1c54590ee18d15ec70e68c8cd4cfbadb1b4f11697eee")}, + {597379, newHashFromStr("00000000000000000005f8920febd3925f8272a6a71237563d78c2edfdd09ddf")}, + {623950, newHashFromStr("0000000000000000000f2adce67e49b0b6bdeb9de8b7c3d7e93b21e7fc1e819d")}, + {654683, newHashFromStr("0000000000000000000b9d2ec5a352ecba0592946514a92f14319dc2b367fc72")}, + {691719, newHashFromStr("00000000000000000008a89e854d57e5667df88f1cdef6fde2fbca1de5b639ad")}, + {724466, newHashFromStr("000000000000000000052d314a259755ca65944e68df6b12a067ea8f1f5a7091")}, + {751565, newHashFromStr("00000000000000000009c97098b5295f7e5f183ac811fb5d1534040adb93cabd")}, + {781565, newHashFromStr("00000000000000000002b8c04999434c33b8e033f11a977b288f8411766ee61c")}, + {800000, newHashFromStr("00000000000000000002a7c4c1e48d76c5a37902165a270156b7a8d72728a054")}, + {810000, newHashFromStr("000000000000000000028028ca82b6aa81ce789e4eb9e0321b74c3cbaf405dd1")}, }, // Consensus rule change deployments. @@ -289,19 +356,53 @@ var MainNetParams = Params{ MinerConfirmationWindow: 2016, // Deployments: [DefinedDeployments]ConsensusDeployment{ DeploymentTestDummy: { - BitNumber: 28, - StartTime: 1199145601, // January 1, 2008 UTC - ExpireTime: 1230767999, // December 31, 2008 UTC + BitNumber: 28, + DeploymentStarter: NewMedianTimeDeploymentStarter( + time.Unix(11991456010, 0), // January 1, 2008 UTC + ), + DeploymentEnder: NewMedianTimeDeploymentEnder( + time.Unix(1230767999, 0), // December 31, 2008 UTC + ), + }, + DeploymentTestDummyMinActivation: { + BitNumber: 22, + CustomActivationThreshold: 1815, // Only needs 90% hash rate. + MinActivationHeight: 10_0000, // Can only activate after height 10k. + DeploymentStarter: NewMedianTimeDeploymentStarter( + time.Time{}, // Always available for vote + ), + DeploymentEnder: NewMedianTimeDeploymentEnder( + time.Time{}, // Never expires + ), }, DeploymentCSV: { - BitNumber: 0, - StartTime: 1462060800, // May 1st, 2016 - ExpireTime: 1493596800, // May 1st, 2017 + BitNumber: 0, + DeploymentStarter: NewMedianTimeDeploymentStarter( + time.Unix(1462060800, 0), // May 1st, 2016 + ), + DeploymentEnder: NewMedianTimeDeploymentEnder( + time.Unix(1493596800, 0), // May 1st, 2017 + ), }, DeploymentSegwit: { - BitNumber: 1, - StartTime: 1479168000, // November 15, 2016 UTC - ExpireTime: 1510704000, // November 15, 2017 UTC. + BitNumber: 1, + DeploymentStarter: NewMedianTimeDeploymentStarter( + time.Unix(1479168000, 0), // November 15, 2016 UTC + ), + DeploymentEnder: NewMedianTimeDeploymentEnder( + time.Unix(1510704000, 0), // November 15, 2017 UTC. + ), + }, + DeploymentTaproot: { + BitNumber: 2, + DeploymentStarter: NewMedianTimeDeploymentStarter( + time.Unix(1619222400, 0), // April 24th, 2021 UTC. + ), + DeploymentEnder: NewMedianTimeDeploymentEnder( + time.Unix(1628640000, 0), // August 11th, 2021 UTC. + ), + CustomActivationThreshold: 1815, // 90% + MinActivationHeight: 709_632, }, }, @@ -342,6 +443,7 @@ var RegressionNetParams = Params{ GenesisHash: ®TestGenesisHash, PowLimit: regressionPowLimit, PowLimitBits: 0x207fffff, + PoWNoRetargeting: true, CoinbaseMaturity: 100, BIP0034Height: 100000000, // Not active - Permit ver 1 blocks BIP0065Height: 1351, // Used by regression tests @@ -365,19 +467,52 @@ var RegressionNetParams = Params{ MinerConfirmationWindow: 144, Deployments: [DefinedDeployments]ConsensusDeployment{ DeploymentTestDummy: { - BitNumber: 28, - StartTime: 0, // Always available for vote - ExpireTime: math.MaxInt64, // Never expires + BitNumber: 28, + DeploymentStarter: NewMedianTimeDeploymentStarter( + time.Time{}, // Always available for vote + ), + DeploymentEnder: NewMedianTimeDeploymentEnder( + time.Time{}, // Never expires + ), + }, + DeploymentTestDummyMinActivation: { + BitNumber: 22, + CustomActivationThreshold: 72, // Only needs 50% hash rate. + MinActivationHeight: 600, // Can only activate after height 600. + DeploymentStarter: NewMedianTimeDeploymentStarter( + time.Time{}, // Always available for vote + ), + DeploymentEnder: NewMedianTimeDeploymentEnder( + time.Time{}, // Never expires + ), }, DeploymentCSV: { - BitNumber: 0, - StartTime: 0, // Always available for vote - ExpireTime: math.MaxInt64, // Never expires + BitNumber: 0, + DeploymentStarter: NewMedianTimeDeploymentStarter( + time.Time{}, // Always available for vote + ), + DeploymentEnder: NewMedianTimeDeploymentEnder( + time.Time{}, // Never expires + ), }, DeploymentSegwit: { - BitNumber: 1, - StartTime: 0, // Always available for vote - ExpireTime: math.MaxInt64, // Never expires. + BitNumber: 1, + DeploymentStarter: NewMedianTimeDeploymentStarter( + time.Time{}, // Always available for vote + ), + DeploymentEnder: NewMedianTimeDeploymentEnder( + time.Time{}, // Never expires. + ), + }, + DeploymentTaproot: { + BitNumber: 2, + DeploymentStarter: NewMedianTimeDeploymentStarter( + time.Time{}, // Always available for vote + ), + DeploymentEnder: NewMedianTimeDeploymentEnder( + time.Time{}, // Never expires. + ), + CustomActivationThreshold: 108, // Only needs 75% hash rate. }, }, @@ -411,8 +546,8 @@ var TestNet3Params = Params{ DefaultPort: "18333", DNSSeeds: []DNSSeed{ {"testnet-seed.bitcoin.jonasschnelli.ch", true}, - {"testnet-seed.bitcoin.schildbach.de", false}, - {"seed.tbtc.petertodd.org", true}, + {"seed.tbtc.petertodd.net", true}, + {"seed.testnet.bitcoin.sprovoost.nl", true}, {"testnet-seed.bluematt.me", false}, }, @@ -449,6 +584,13 @@ var TestNet3Params = Params{ {1100007, newHashFromStr("00000000000abc7b2cd18768ab3dee20857326a818d1946ed6796f42d66dd1e8")}, {1200007, newHashFromStr("00000000000004f2dc41845771909db57e04191714ed8c963f7e56713a7b6cea")}, {1300007, newHashFromStr("0000000072eab69d54df75107c052b26b0395b44f77578184293bf1bb1dbd9fa")}, + {1354312, newHashFromStr("0000000000000037a8cd3e06cd5edbfe9dd1dbcc5dacab279376ef7cfc2b4c75")}, + {1580000, newHashFromStr("00000000000000b7ab6ce61eb6d571003fbe5fe892da4c9b740c49a07542462d")}, + {1692000, newHashFromStr("000000000000056c49030c174179b52a928c870e6e8a822c75973b7970cfbd01")}, + {1864000, newHashFromStr("000000000000006433d1efec504c53ca332b64963c425395515b01977bd7b3b0")}, + {2010000, newHashFromStr("0000000000004ae2f3896ca8ecd41c460a35bf6184e145d91558cece1c688a76")}, + {2143398, newHashFromStr("00000000000163cfb1f97c4e4098a3692c8053ad9cab5ad9c86b338b5c00b8b7")}, + {2344474, newHashFromStr("0000000000000004877fa2d36316398528de4f347df2f8a96f76613a298ce060")}, }, // Consensus rule change deployments. @@ -459,19 +601,52 @@ var TestNet3Params = Params{ MinerConfirmationWindow: 2016, Deployments: [DefinedDeployments]ConsensusDeployment{ DeploymentTestDummy: { - BitNumber: 28, - StartTime: 1199145601, // January 1, 2008 UTC - ExpireTime: 1230767999, // December 31, 2008 UTC + BitNumber: 28, + DeploymentStarter: NewMedianTimeDeploymentStarter( + time.Unix(1199145601, 0), // January 1, 2008 UTC + ), + DeploymentEnder: NewMedianTimeDeploymentEnder( + time.Unix(1230767999, 0), // December 31, 2008 UTC + ), + }, + DeploymentTestDummyMinActivation: { + BitNumber: 22, + CustomActivationThreshold: 1815, // Only needs 90% hash rate. + MinActivationHeight: 10_0000, // Can only activate after height 10k. + DeploymentStarter: NewMedianTimeDeploymentStarter( + time.Time{}, // Always available for vote + ), + DeploymentEnder: NewMedianTimeDeploymentEnder( + time.Time{}, // Never expires + ), }, DeploymentCSV: { - BitNumber: 0, - StartTime: 1456790400, // March 1st, 2016 - ExpireTime: 1493596800, // May 1st, 2017 + BitNumber: 0, + DeploymentStarter: NewMedianTimeDeploymentStarter( + time.Unix(1456790400, 0), // March 1st, 2016 + ), + DeploymentEnder: NewMedianTimeDeploymentEnder( + time.Unix(1493596800, 0), // May 1st, 2017 + ), }, DeploymentSegwit: { - BitNumber: 1, - StartTime: 1462060800, // May 1, 2016 UTC - ExpireTime: 1493596800, // May 1, 2017 UTC. + BitNumber: 1, + DeploymentStarter: NewMedianTimeDeploymentStarter( + time.Unix(1462060800, 0), // May 1, 2016 UTC + ), + DeploymentEnder: NewMedianTimeDeploymentEnder( + time.Unix(1493596800, 0), // May 1, 2017 UTC. + ), + }, + DeploymentTaproot: { + BitNumber: 2, + DeploymentStarter: NewMedianTimeDeploymentStarter( + time.Unix(1619222400, 0), // April 24th, 2021 UTC. + ), + DeploymentEnder: NewMedianTimeDeploymentEnder( + time.Unix(1628640000, 0), // August 11th, 2021 UTC + ), + CustomActivationThreshold: 1512, // 75% }, }, @@ -539,19 +714,52 @@ var SimNetParams = Params{ MinerConfirmationWindow: 100, Deployments: [DefinedDeployments]ConsensusDeployment{ DeploymentTestDummy: { - BitNumber: 28, - StartTime: 0, // Always available for vote - ExpireTime: math.MaxInt64, // Never expires + BitNumber: 28, + DeploymentStarter: NewMedianTimeDeploymentStarter( + time.Time{}, // Always available for vote + ), + DeploymentEnder: NewMedianTimeDeploymentEnder( + time.Time{}, // Never expires + ), + }, + DeploymentTestDummyMinActivation: { + BitNumber: 22, + CustomActivationThreshold: 50, // Only needs 50% hash rate. + MinActivationHeight: 600, // Can only activate after height 600. + DeploymentStarter: NewMedianTimeDeploymentStarter( + time.Time{}, // Always available for vote + ), + DeploymentEnder: NewMedianTimeDeploymentEnder( + time.Time{}, // Never expires + ), }, DeploymentCSV: { - BitNumber: 0, - StartTime: 0, // Always available for vote - ExpireTime: math.MaxInt64, // Never expires + BitNumber: 0, + DeploymentStarter: NewMedianTimeDeploymentStarter( + time.Time{}, // Always available for vote + ), + DeploymentEnder: NewMedianTimeDeploymentEnder( + time.Time{}, // Never expires + ), }, DeploymentSegwit: { - BitNumber: 1, - StartTime: 0, // Always available for vote - ExpireTime: math.MaxInt64, // Never expires. + BitNumber: 1, + DeploymentStarter: NewMedianTimeDeploymentStarter( + time.Time{}, // Always available for vote + ), + DeploymentEnder: NewMedianTimeDeploymentEnder( + time.Time{}, // Never expires. + ), + }, + DeploymentTaproot: { + BitNumber: 2, + DeploymentStarter: NewMedianTimeDeploymentStarter( + time.Time{}, // Always available for vote + ), + DeploymentEnder: NewMedianTimeDeploymentEnder( + time.Time{}, // Never expires. + ), + CustomActivationThreshold: 75, // Only needs 75% hash rate. }, }, @@ -578,6 +786,134 @@ var SimNetParams = Params{ HDCoinType: 115, // ASCII for s } +// SigNetParams defines the network parameters for the default public signet +// Bitcoin network. Not to be confused with the regression test network, this +// network is sometimes simply called "signet" or "taproot signet". +var SigNetParams = CustomSignetParams( + DefaultSignetChallenge, DefaultSignetDNSSeeds, +) + +// CustomSignetParams creates network parameters for a custom signet network +// from a challenge. The challenge is the binary compiled version of the block +// challenge script. +func CustomSignetParams(challenge []byte, dnsSeeds []DNSSeed) Params { + // The message start is defined as the first four bytes of the sha256d + // of the challenge script, as a single push (i.e. prefixed with the + // challenge script length). + challengeLength := byte(len(challenge)) + hashDouble := chainhash.DoubleHashB( + append([]byte{challengeLength}, challenge...), + ) + + // We use little endian encoding of the hash prefix to be in line with + // the other wire network identities. + net := binary.LittleEndian.Uint32(hashDouble[0:4]) + return Params{ + Name: "signet", + Net: wire.BitcoinNet(net), + DefaultPort: "38333", + DNSSeeds: dnsSeeds, + + // Chain parameters + GenesisBlock: &sigNetGenesisBlock, + GenesisHash: &sigNetGenesisHash, + PowLimit: sigNetPowLimit, + PowLimitBits: 0x1e0377ae, + BIP0034Height: 1, + BIP0065Height: 1, + BIP0066Height: 1, + CoinbaseMaturity: 100, + SubsidyReductionInterval: 210000, + TargetTimespan: time.Hour * 24 * 14, // 14 days + TargetTimePerBlock: time.Minute * 10, // 10 minutes + RetargetAdjustmentFactor: 4, // 25% less, 400% more + ReduceMinDifficulty: false, + MinDiffReductionTime: time.Minute * 20, // TargetTimePerBlock * 2 + GenerateSupported: false, + + // Checkpoints ordered from oldest to newest. + Checkpoints: nil, + + // Consensus rule change deployments. + // + // The miner confirmation window is defined as: + // target proof of work timespan / target proof of work spacing + RuleChangeActivationThreshold: 1916, // 95% of 2016 + MinerConfirmationWindow: 2016, + Deployments: [DefinedDeployments]ConsensusDeployment{ + DeploymentTestDummy: { + BitNumber: 28, + DeploymentStarter: NewMedianTimeDeploymentStarter( + time.Unix(1199145601, 0), // January 1, 2008 UTC + ), + DeploymentEnder: NewMedianTimeDeploymentEnder( + time.Unix(1230767999, 0), // December 31, 2008 UTC + ), + }, + DeploymentTestDummyMinActivation: { + BitNumber: 22, + CustomActivationThreshold: 1815, // Only needs 90% hash rate. + MinActivationHeight: 10_0000, // Can only activate after height 10k. + DeploymentStarter: NewMedianTimeDeploymentStarter( + time.Time{}, // Always available for vote + ), + DeploymentEnder: NewMedianTimeDeploymentEnder( + time.Time{}, // Never expires + ), + }, + DeploymentCSV: { + BitNumber: 29, + DeploymentStarter: NewMedianTimeDeploymentStarter( + time.Time{}, // Always available for vote + ), + DeploymentEnder: NewMedianTimeDeploymentEnder( + time.Time{}, // Never expires + ), + }, + DeploymentSegwit: { + BitNumber: 29, + DeploymentStarter: NewMedianTimeDeploymentStarter( + time.Time{}, // Always available for vote + ), + DeploymentEnder: NewMedianTimeDeploymentEnder( + time.Time{}, // Never expires + ), + }, + DeploymentTaproot: { + BitNumber: 29, + DeploymentStarter: NewMedianTimeDeploymentStarter( + time.Time{}, // Always available for vote + ), + DeploymentEnder: NewMedianTimeDeploymentEnder( + time.Time{}, // Never expires + ), + }, + }, + + // Mempool parameters + RelayNonStdTxs: false, + + // Human-readable part for Bech32 encoded segwit addresses, as defined in + // BIP 173. + Bech32HRPSegwit: "tb", // always tb for test net + + // Address encoding magics + PubKeyHashAddrID: 0x6f, // starts with m or n + ScriptHashAddrID: 0xc4, // starts with 2 + WitnessPubKeyHashAddrID: 0x03, // starts with QW + WitnessScriptHashAddrID: 0x28, // starts with T7n + PrivateKeyID: 0xef, // starts with 9 (uncompressed) or c (compressed) + + // BIP32 hierarchical deterministic extended key magics + HDPrivateKeyID: [4]byte{0x04, 0x35, 0x83, 0x94}, // starts with tprv + HDPublicKeyID: [4]byte{0x04, 0x35, 0x87, 0xcf}, // starts with tpub + + // BIP44 coin type used in the hierarchical deterministic path for + // address generation. + HDCoinType: 1, + } +} + var ( // ErrDuplicateNet describes an error where the parameters for a Bitcoin // network could not be set due to the network already being a standard @@ -588,6 +924,10 @@ var ( // is intended to identify the network for a hierarchical deterministic // private extended key is not registered. ErrUnknownHDKeyID = errors.New("unknown hd private extended key bytes") + + // ErrInvalidHDKeyID describes an error where the provided hierarchical + // deterministic version bytes, or hd key id, is malformed. + ErrInvalidHDKeyID = errors.New("invalid hd extended key version bytes") ) var ( @@ -619,7 +959,11 @@ func Register(params *Params) error { registeredNets[params.Net] = struct{}{} pubKeyHashAddrIDs[params.PubKeyHashAddrID] = struct{}{} scriptHashAddrIDs[params.ScriptHashAddrID] = struct{}{} - hdPrivToPubKeyIDs[params.HDPrivateKeyID] = params.HDPublicKeyID[:] + + err := RegisterHDKeyID(params.HDPublicKeyID[:], params.HDPrivateKeyID[:]) + if err != nil { + return err + } // A valid Bech32 encoded segwit address always has as prefix the // human-readable part for the given net followed by '1'. @@ -666,6 +1010,30 @@ func IsBech32SegwitPrefix(prefix string) bool { return ok } +// RegisterHDKeyID registers a public and private hierarchical deterministic +// extended key ID pair. +// +// Non-standard HD version bytes, such as the ones documented in SLIP-0132, +// should be registered using this method for library packages to lookup key +// IDs (aka HD version bytes). When the provided key IDs are invalid, the +// ErrInvalidHDKeyID error will be returned. +// +// Reference: +// +// SLIP-0132 : Registered HD version bytes for BIP-0032 +// https://github.com/satoshilabs/slips/blob/master/slip-0132.md +func RegisterHDKeyID(hdPublicKeyID []byte, hdPrivateKeyID []byte) error { + if len(hdPublicKeyID) != 4 || len(hdPrivateKeyID) != 4 { + return ErrInvalidHDKeyID + } + + var keyID [4]byte + copy(keyID[:], hdPrivateKeyID) + hdPrivToPubKeyIDs[keyID] = hdPublicKeyID + + return nil +} + // HDPrivateKeyToPublicKeyID accepts a private hierarchical deterministic // extended key id and returns the associated public key id. When the provided // id is not registered, the ErrUnknownHDKeyID error will be returned. diff --git a/chaincfg/params_test.go b/chaincfg/params_test.go index 277a56bdd5..4166ce0a23 100644 --- a/chaincfg/params_test.go +++ b/chaincfg/params_test.go @@ -4,7 +4,12 @@ package chaincfg -import "testing" +import ( + "bytes" + "encoding/hex" + "math/big" + "testing" +) // TestInvalidHashStr ensures the newShaHashFromStr function panics when used to // with an invalid hash string. @@ -33,3 +38,98 @@ func TestMustRegisterPanic(t *testing.T) { // Intentionally try to register duplicate params to force a panic. mustRegister(&MainNetParams) } + +func TestRegisterHDKeyID(t *testing.T) { + t.Parallel() + + // Ref: https://github.com/satoshilabs/slips/blob/master/slip-0132.md + hdKeyIDZprv := []byte{0x02, 0xaa, 0x7a, 0x99} + hdKeyIDZpub := []byte{0x02, 0xaa, 0x7e, 0xd3} + + if err := RegisterHDKeyID(hdKeyIDZpub, hdKeyIDZprv); err != nil { + t.Fatalf("RegisterHDKeyID: expected no error, got %v", err) + } + + got, err := HDPrivateKeyToPublicKeyID(hdKeyIDZprv) + if err != nil { + t.Fatalf("HDPrivateKeyToPublicKeyID: expected no error, got %v", err) + } + + if !bytes.Equal(got, hdKeyIDZpub) { + t.Fatalf("HDPrivateKeyToPublicKeyID: expected result %v, got %v", + hdKeyIDZpub, got) + } +} + +func TestInvalidHDKeyID(t *testing.T) { + t.Parallel() + + prvValid := []byte{0x02, 0xaa, 0x7a, 0x99} + pubValid := []byte{0x02, 0xaa, 0x7e, 0xd3} + prvInvalid := []byte{0x00} + pubInvalid := []byte{0x00} + + if err := RegisterHDKeyID(pubInvalid, prvValid); err != ErrInvalidHDKeyID { + t.Fatalf("RegisterHDKeyID: want err ErrInvalidHDKeyID, got %v", err) + } + + if err := RegisterHDKeyID(pubValid, prvInvalid); err != ErrInvalidHDKeyID { + t.Fatalf("RegisterHDKeyID: want err ErrInvalidHDKeyID, got %v", err) + } + + if err := RegisterHDKeyID(pubInvalid, prvInvalid); err != ErrInvalidHDKeyID { + t.Fatalf("RegisterHDKeyID: want err ErrInvalidHDKeyID, got %v", err) + } + + // FIXME: The error type should be changed to ErrInvalidHDKeyID. + if _, err := HDPrivateKeyToPublicKeyID(prvInvalid); err != ErrUnknownHDKeyID { + t.Fatalf("HDPrivateKeyToPublicKeyID: want err ErrUnknownHDKeyID, got %v", err) + } +} + +func TestSigNetPowLimit(t *testing.T) { + sigNetPowLimitHex, _ := hex.DecodeString( + "00000377ae000000000000000000000000000000000000000000000000000000", + ) + powLimit := new(big.Int).SetBytes(sigNetPowLimitHex) + if sigNetPowLimit.Cmp(powLimit) != 0 { + t.Fatalf("Signet PoW limit bits (%s) not equal to big int (%s)", + sigNetPowLimit.Text(16), powLimit.Text(16)) + } + + if compactToBig(sigNetGenesisBlock.Header.Bits).Cmp(powLimit) != 0 { + t.Fatalf("Signet PoW limit header bits (%d) not equal to big "+ + "int (%s)", sigNetGenesisBlock.Header.Bits, + powLimit.Text(16)) + } +} + +// compactToBig is a copy of the blockchain.CompactToBig function. We copy it +// here so we don't run into a circular dependency just because of a test. +func compactToBig(compact uint32) *big.Int { + // Extract the mantissa, sign bit, and exponent. + mantissa := compact & 0x007fffff + isNegative := compact&0x00800000 != 0 + exponent := uint(compact >> 24) + + // Since the base for the exponent is 256, the exponent can be treated + // as the number of bytes to represent the full 256-bit number. So, + // treat the exponent as the number of bytes and shift the mantissa + // right or left accordingly. This is equivalent to: + // N = mantissa * 256^(exponent-3) + var bn *big.Int + if exponent <= 3 { + mantissa >>= 8 * (3 - exponent) + bn = big.NewInt(int64(mantissa)) + } else { + bn = big.NewInt(int64(mantissa)) + bn.Lsh(bn, 8*(exponent-3)) + } + + // Make it negative if the sign bit is set. + if isNegative { + bn = bn.Neg(bn) + } + + return bn +} diff --git a/cmd/addblock/addblock.go b/cmd/addblock/addblock.go index 15b61b6880..8b44f307e4 100644 --- a/cmd/addblock/addblock.go +++ b/cmd/addblock/addblock.go @@ -7,7 +7,6 @@ package main import ( "os" "path/filepath" - "runtime" "github.com/btcsuite/btcd/blockchain" "github.com/btcsuite/btcd/blockchain/indexers" @@ -119,8 +118,7 @@ func realMain() error { } func main() { - // Use all processor cores and up some limits. - runtime.GOMAXPROCS(runtime.NumCPU()) + // up some limits. if err := limits.SetLimits(); err != nil { os.Exit(1) } diff --git a/cmd/addblock/config.go b/cmd/addblock/config.go index ae7a52fd2e..d49df0a11d 100644 --- a/cmd/addblock/config.go +++ b/cmd/addblock/config.go @@ -9,11 +9,11 @@ import ( "os" "path/filepath" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/database" _ "github.com/btcsuite/btcd/database/ffldb" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" flags "github.com/jessevdk/go-flags" ) @@ -34,18 +34,18 @@ var ( // // See loadConfig for details on the configuration load process. type config struct { + AddrIndex bool `long:"addrindex" description:"Build a full address-based transaction index which makes the searchrawtransactions RPC available"` DataDir string `short:"b" long:"datadir" description:"Location of the btcd data directory"` DbType string `long:"dbtype" description:"Database backend to use for the Block Chain"` - TestNet3 bool `long:"testnet" description:"Use the test network"` + InFile string `short:"i" long:"infile" description:"File containing the block(s)"` + Progress int `short:"p" long:"progress" description:"Show a progress message each time this number of seconds have passed -- Use 0 to disable progress announcements"` RegressionTest bool `long:"regtest" description:"Use the regression test network"` SimNet bool `long:"simnet" description:"Use the simulation test network"` - InFile string `short:"i" long:"infile" description:"File containing the block(s)"` + TestNet3 bool `long:"testnet" description:"Use the test network"` TxIndex bool `long:"txindex" description:"Build a full hash-based transaction index which makes all transactions available via the getrawtransaction RPC"` - AddrIndex bool `long:"addrindex" description:"Build a full address-based transaction index which makes the searchrawtransactions RPC available"` - Progress int `short:"p" long:"progress" description:"Show a progress message each time this number of seconds have passed -- Use 0 to disable progress announcements"` } -// filesExists reports whether the named file or directory exists. +// fileExists reports whether the named file or directory exists. func fileExists(name string) bool { if _, err := os.Stat(name); err != nil { if os.IsNotExist(err) { diff --git a/cmd/addblock/import.go b/cmd/addblock/import.go index b7a30369ec..8eda8f8c9b 100644 --- a/cmd/addblock/import.go +++ b/cmd/addblock/import.go @@ -13,10 +13,10 @@ import ( "github.com/btcsuite/btcd/blockchain" "github.com/btcsuite/btcd/blockchain/indexers" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/database" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) var zeroHash = chainhash.Hash{} @@ -287,6 +287,16 @@ func (bi *blockImporter) Import() chan *importResults { // the status handler when done. go func() { bi.wg.Wait() + + // Flush the changes made to the blockchain. + log.Info("Flushing blockchain caches to the disk...") + if err := bi.chain.FlushUtxoCache(blockchain.FlushRequired); err != nil { + log.Errorf("Error while flushing the blockchain state: %v", err) + bi.errChan <- err + return + } + log.Info("Done flushing blockchain caches to disk") + bi.doneChan <- true }() diff --git a/cmd/btcctl/btcctl.go b/cmd/btcctl/btcctl.go index 5c412f867f..771d5f7ed7 100644 --- a/cmd/btcctl/btcctl.go +++ b/cmd/btcctl/btcctl.go @@ -127,7 +127,7 @@ func main() { // Marshal the command into a JSON-RPC byte slice in preparation for // sending it to the RPC server. - marshalledJSON, err := btcjson.MarshalCmd(1, cmd) + marshalledJSON, err := btcjson.MarshalCmd(btcjson.RpcVersion1, 1, cmd) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) diff --git a/cmd/btcctl/config.go b/cmd/btcctl/config.go index cd232a9e0a..f6ca8846ec 100644 --- a/cmd/btcctl/config.go +++ b/cmd/btcctl/config.go @@ -14,7 +14,8 @@ import ( "strings" "github.com/btcsuite/btcd/btcjson" - "github.com/btcsuite/btcutil" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg" flags "github.com/jessevdk/go-flags" ) @@ -92,42 +93,58 @@ func listCommands() { // // See loadConfig for details on the configuration load process. type config struct { - ShowVersion bool `short:"V" long:"version" description:"Display version information and exit"` - ListCommands bool `short:"l" long:"listcommands" description:"List all of the supported commands and exit"` - ConfigFile string `short:"C" long:"configfile" description:"Path to configuration file"` - RPCUser string `short:"u" long:"rpcuser" description:"RPC username"` - RPCPassword string `short:"P" long:"rpcpass" default-mask:"-" description:"RPC password"` - RPCServer string `short:"s" long:"rpcserver" description:"RPC server to connect to"` - RPCCert string `short:"c" long:"rpccert" description:"RPC server certificate chain for validation"` - NoTLS bool `long:"notls" description:"Disable TLS"` - Proxy string `long:"proxy" description:"Connect via SOCKS5 proxy (eg. 127.0.0.1:9050)"` - ProxyUser string `long:"proxyuser" description:"Username for proxy server"` - ProxyPass string `long:"proxypass" default-mask:"-" description:"Password for proxy server"` - TestNet3 bool `long:"testnet" description:"Connect to testnet"` - SimNet bool `long:"simnet" description:"Connect to the simulation test network"` - TLSSkipVerify bool `long:"skipverify" description:"Do not verify tls certificates (not recommended!)"` - Wallet bool `long:"wallet" description:"Connect to wallet"` + ConfigFile string `short:"C" long:"configfile" description:"Path to configuration file"` + ListCommands bool `short:"l" long:"listcommands" description:"List all of the supported commands and exit"` + NoTLS bool `long:"notls" description:"Disable TLS"` + Proxy string `long:"proxy" description:"Connect via SOCKS5 proxy (eg. 127.0.0.1:9050)"` + ProxyPass string `long:"proxypass" default-mask:"-" description:"Password for proxy server"` + ProxyUser string `long:"proxyuser" description:"Username for proxy server"` + RegressionTest bool `long:"regtest" description:"Connect to the regression test network"` + RPCCert string `short:"c" long:"rpccert" description:"RPC server certificate chain for validation"` + RPCPassword string `short:"P" long:"rpcpass" default-mask:"-" description:"RPC password"` + RPCServer string `short:"s" long:"rpcserver" description:"RPC server to connect to"` + RPCUser string `short:"u" long:"rpcuser" description:"RPC username"` + SimNet bool `long:"simnet" description:"Connect to the simulation test network"` + TLSSkipVerify bool `long:"skipverify" description:"Do not verify tls certificates (not recommended!)"` + TestNet3 bool `long:"testnet" description:"Connect to testnet"` + SigNet bool `long:"signet" description:"Connect to signet"` + ShowVersion bool `short:"V" long:"version" description:"Display version information and exit"` + Wallet bool `long:"wallet" description:"Connect to wallet"` } // normalizeAddress returns addr with the passed default port appended if // there is not already a port specified. -func normalizeAddress(addr string, useTestNet3, useSimNet, useWallet bool) string { +func normalizeAddress(addr string, chain *chaincfg.Params, useWallet bool) (string, error) { _, _, err := net.SplitHostPort(addr) if err != nil { var defaultPort string - switch { - case useTestNet3: + switch chain { + case &chaincfg.TestNet3Params: if useWallet { defaultPort = "18332" } else { defaultPort = "18334" } - case useSimNet: + case &chaincfg.SimNetParams: if useWallet { defaultPort = "18554" } else { defaultPort = "18556" } + case &chaincfg.RegressionNetParams: + if useWallet { + // TODO: add port once regtest is supported in btcwallet + paramErr := fmt.Errorf("cannot use -wallet with -regtest, btcwallet not yet compatible with regtest") + return "", paramErr + } else { + defaultPort = "18334" + } + case &chaincfg.SigNetParams: + if useWallet { + defaultPort = "38332" + } else { + defaultPort = "38334" + } default: if useWallet { defaultPort = "8332" @@ -136,12 +153,12 @@ func normalizeAddress(addr string, useTestNet3, useSimNet, useWallet bool) strin } } - return net.JoinHostPort(addr, defaultPort) + return net.JoinHostPort(addr, defaultPort), nil } - return addr + return addr, nil } -// cleanAndExpandPath expands environement variables and leading ~ in the +// cleanAndExpandPath expands environment variables and leading ~ in the // passed path, cleans the result, and returns it. func cleanAndExpandPath(path string) string { // Expand initial ~ to OS specific home directory. @@ -159,10 +176,10 @@ func cleanAndExpandPath(path string) string { // line options. // // The configuration proceeds as follows: -// 1) Start with a default config with sane settings -// 2) Pre-parse the command line to check for an alternative config file -// 3) Load configuration file overwriting defaults with any specified options -// 4) Parse CLI options and overwrite/add any specified options +// 1. Start with a default config with sane settings +// 2. Pre-parse the command line to check for an alternative config file +// 3. Load configuration file overwriting defaults with any specified options +// 4. Parse CLI options and overwrite/add any specified options // // The above results in functioning properly without any config settings // while still allowing the user to override settings with config files and @@ -246,17 +263,31 @@ func loadConfig() (*config, []string, error) { return nil, nil, err } + // default network is mainnet + network := &chaincfg.MainNetParams + // Multiple networks can't be selected simultaneously. numNets := 0 if cfg.TestNet3 { numNets++ + network = &chaincfg.TestNet3Params } if cfg.SimNet { numNets++ + network = &chaincfg.SimNetParams + } + if cfg.RegressionTest { + numNets++ + network = &chaincfg.RegressionNetParams } + if cfg.SigNet { + numNets++ + network = &chaincfg.SigNetParams + } + if numNets > 1 { - str := "%s: The testnet and simnet params can't be used " + - "together -- choose one of the two" + str := "%s: Multiple network params can't be used " + + "together -- choose one" err := fmt.Errorf(str, "loadConfig") fmt.Fprintln(os.Stderr, err) return nil, nil, err @@ -273,8 +304,10 @@ func loadConfig() (*config, []string, error) { // Add default port to RPC server based on --testnet and --wallet flags // if needed. - cfg.RPCServer = normalizeAddress(cfg.RPCServer, cfg.TestNet3, - cfg.SimNet, cfg.Wallet) + cfg.RPCServer, err = normalizeAddress(cfg.RPCServer, network, cfg.Wallet) + if err != nil { + return nil, nil, err + } return &cfg, remainingArgs, nil } @@ -295,10 +328,7 @@ func createDefaultConfigFile(destinationPath, serverConfigPath string) error { } // Extract the rpcuser - rpcUserRegexp, err := regexp.Compile(`(?m)^\s*rpcuser=([^\s]+)`) - if err != nil { - return err - } + rpcUserRegexp := regexp.MustCompile(`(?m)^\s*rpcuser=([^\s]+)`) userSubmatches := rpcUserRegexp.FindSubmatch(content) if userSubmatches == nil { // No user found, nothing to do @@ -306,10 +336,7 @@ func createDefaultConfigFile(destinationPath, serverConfigPath string) error { } // Extract the rpcpass - rpcPassRegexp, err := regexp.Compile(`(?m)^\s*rpcpass=([^\s]+)`) - if err != nil { - return err - } + rpcPassRegexp := regexp.MustCompile(`(?m)^\s*rpcpass=([^\s]+)`) passSubmatches := rpcPassRegexp.FindSubmatch(content) if passSubmatches == nil { // No password found, nothing to do @@ -317,10 +344,7 @@ func createDefaultConfigFile(destinationPath, serverConfigPath string) error { } // Extract the notls - noTLSRegexp, err := regexp.Compile(`(?m)^\s*notls=(0|1)(?:\s|$)`) - if err != nil { - return err - } + noTLSRegexp := regexp.MustCompile(`(?m)^\s*notls=(0|1)(?:\s|$)`) noTLSSubmatches := noTLSRegexp.FindSubmatch(content) // Create the destination directory if it does not exists diff --git a/cmd/btcctl/httpclient.go b/cmd/btcctl/httpclient.go index 2a0f6dffd4..c7b4b7e3a1 100644 --- a/cmd/btcctl/httpclient.go +++ b/cmd/btcctl/httpclient.go @@ -6,9 +6,10 @@ import ( "crypto/x509" "encoding/json" "fmt" - "io/ioutil" + "io" "net" "net/http" + "os" "github.com/btcsuite/btcd/btcjson" "github.com/btcsuite/go-socks/socks" @@ -37,7 +38,7 @@ func newHTTPClient(cfg *config) (*http.Client, error) { // Configure TLS if needed. var tlsConfig *tls.Config if !cfg.NoTLS && cfg.RPCCert != "" { - pem, err := ioutil.ReadFile(cfg.RPCCert) + pem, err := os.ReadFile(cfg.RPCCert) if err != nil { return nil, err } @@ -95,7 +96,7 @@ func sendPostRequest(marshalledJSON []byte, cfg *config) ([]byte, error) { } // Read the raw bytes and close the response. - respBytes, err := ioutil.ReadAll(httpResponse.Body) + respBytes, err := io.ReadAll(httpResponse.Body) httpResponse.Body.Close() if err != nil { err = fmt.Errorf("error reading json reply: %v", err) diff --git a/cmd/btcctl/version.go b/cmd/btcctl/version.go index f65cacef7e..8da196bea8 100644 --- a/cmd/btcctl/version.go +++ b/cmd/btcctl/version.go @@ -17,7 +17,7 @@ const semanticAlphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr // versioning 2.0.0 spec (http://semver.org/). const ( appMajor uint = 0 - appMinor uint = 20 + appMinor uint = 23 appPatch uint = 1 // appPreRelease MUST only contain characters from semanticAlphabet @@ -66,7 +66,7 @@ func normalizeVerString(str string) string { for _, r := range str { if strings.ContainsRune(semanticAlphabet, r) { // Ignoring the error here since it can only fail if - // the the system is out of memory and there are much + // the system is out of memory and there are much // bigger issues at that point. _, _ = result.WriteRune(r) } diff --git a/cmd/findcheckpoint/config.go b/cmd/findcheckpoint/config.go index 1539db334c..203ed27faf 100644 --- a/cmd/findcheckpoint/config.go +++ b/cmd/findcheckpoint/config.go @@ -9,11 +9,11 @@ import ( "os" "path/filepath" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/database" _ "github.com/btcsuite/btcd/database/ffldb" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" flags "github.com/jessevdk/go-flags" ) @@ -37,11 +37,11 @@ var ( type config struct { DataDir string `short:"b" long:"datadir" description:"Location of the btcd data directory"` DbType string `long:"dbtype" description:"Database backend to use for the Block Chain"` - TestNet3 bool `long:"testnet" description:"Use the test network"` + UseGoOutput bool `short:"g" long:"gooutput" description:"Display the candidates using Go syntax that is ready to insert into the btcchain checkpoint list"` + NumCandidates int `short:"n" long:"numcandidates" description:"Max num of checkpoint candidates to show {1-20}"` RegressionTest bool `long:"regtest" description:"Use the regression test network"` SimNet bool `long:"simnet" description:"Use the simulation test network"` - NumCandidates int `short:"n" long:"numcandidates" description:"Max num of checkpoint candidates to show {1-20}"` - UseGoOutput bool `short:"g" long:"gooutput" description:"Display the candidates using Go syntax that is ready to insert into the btcchain checkpoint list"` + TestNet3 bool `long:"testnet" description:"Use the test network"` } // validDbType returns whether or not dbType is a supported database type. diff --git a/cmd/gencerts/gencerts.go b/cmd/gencerts/gencerts.go index a3a506363a..0c91b6fb85 100644 --- a/cmd/gencerts/gencerts.go +++ b/cmd/gencerts/gencerts.go @@ -6,22 +6,21 @@ package main import ( "fmt" - "io/ioutil" "os" "path/filepath" "strings" "time" - "github.com/btcsuite/btcutil" + "github.com/btcsuite/btcd/btcutil" flags "github.com/jessevdk/go-flags" ) type config struct { Directory string `short:"d" long:"directory" description:"Directory to write certificate pair"` - Years int `short:"y" long:"years" description:"How many years a certificate is valid for"` - Organization string `short:"o" long:"org" description:"Organization in certificate"` - ExtraHosts []string `short:"H" long:"host" description:"Additional hosts/IPs to create certificate for"` Force bool `short:"f" long:"force" description:"Force overwriting of any old certs and keys"` + ExtraHosts []string `short:"H" long:"host" description:"Additional hosts/IPs to create certificate for"` + Organization string `short:"o" long:"org" description:"Organization in certificate"` + Years int `short:"y" long:"years" description:"How many years a certificate is valid for"` } func main() { @@ -65,18 +64,18 @@ func main() { } // Write cert and key files. - if err = ioutil.WriteFile(certFile, cert, 0666); err != nil { + if err = os.WriteFile(certFile, cert, 0666); err != nil { fmt.Fprintf(os.Stderr, "cannot write cert: %v\n", err) os.Exit(1) } - if err = ioutil.WriteFile(keyFile, key, 0600); err != nil { + if err = os.WriteFile(keyFile, key, 0600); err != nil { os.Remove(certFile) fmt.Fprintf(os.Stderr, "cannot write key: %v\n", err) os.Exit(1) } } -// cleanAndExpandPath expands environement variables and leading ~ in the +// cleanAndExpandPath expands environment variables and leading ~ in the // passed path, cleans the result, and returns it. func cleanAndExpandPath(path string) string { // Expand initial ~ to OS specific home directory. @@ -91,7 +90,7 @@ func cleanAndExpandPath(path string) string { return filepath.Clean(os.ExpandEnv(path)) } -// filesExists reports whether the named file or directory exists. +// fileExists reports whether the named file or directory exists. func fileExists(name string) bool { if _, err := os.Stat(name); err != nil { if os.IsNotExist(err) { diff --git a/config.go b/config.go index 3bcc65dacd..2d2e9c98a6 100644 --- a/config.go +++ b/config.go @@ -8,6 +8,7 @@ import ( "bufio" "crypto/rand" "encoding/base64" + "encoding/hex" "errors" "fmt" "io" @@ -21,6 +22,7 @@ import ( "time" "github.com/btcsuite/btcd/blockchain" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/connmgr" @@ -28,7 +30,7 @@ import ( _ "github.com/btcsuite/btcd/database/ffldb" "github.com/btcsuite/btcd/mempool" "github.com/btcsuite/btcd/peer" - "github.com/btcsuite/btcutil" + "github.com/btcsuite/btcd/wire" "github.com/btcsuite/go-socks/socks" flags "github.com/jessevdk/go-flags" ) @@ -61,9 +63,11 @@ const ( defaultMaxOrphanTransactions = 100 defaultMaxOrphanTxSize = 100000 defaultSigCacheMaxSize = 100000 + defaultUtxoCacheMaxSizeMiB = 250 sampleConfigFilename = "sample-btcd.conf" defaultTxIndex = false defaultAddrIndex = false + pruneMinSize = 1536 ) var ( @@ -93,79 +97,88 @@ func minUint32(a, b uint32) uint32 { // // See loadConfig for details on the configuration load process. type config struct { - ShowVersion bool `short:"V" long:"version" description:"Display version information and exit"` - ConfigFile string `short:"C" long:"configfile" description:"Path to configuration file"` - DataDir string `short:"b" long:"datadir" description:"Directory to store data"` - LogDir string `long:"logdir" description:"Directory to log output."` + AddCheckpoints []string `long:"addcheckpoint" description:"Add a custom checkpoint. Format: ':'"` AddPeers []string `short:"a" long:"addpeer" description:"Add a peer to connect with at startup"` + AddrIndex bool `long:"addrindex" description:"Maintain a full address-based transaction index which makes the searchrawtransactions RPC available"` + AgentBlacklist []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."` + AgentWhitelist []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."` + BanDuration time.Duration `long:"banduration" description:"How long to ban misbehaving peers. Valid time units are {s, m, h}. Minimum 1 second"` + BanThreshold uint32 `long:"banthreshold" description:"Maximum allowed ban score before disconnecting and banning misbehaving peers."` + BlockMaxSize uint32 `long:"blockmaxsize" description:"Maximum block size in bytes to be used when creating a block"` + BlockMinSize uint32 `long:"blockminsize" description:"Minimum block size in bytes to be used when creating a block"` + BlockMaxWeight uint32 `long:"blockmaxweight" description:"Maximum block weight to be used when creating a block"` + BlockMinWeight uint32 `long:"blockminweight" description:"Minimum block weight to be used when creating a block"` + BlockPrioritySize uint32 `long:"blockprioritysize" description:"Size in bytes for high-priority/low-fee transactions when creating a block"` + BlocksOnly bool `long:"blocksonly" description:"Do not accept transactions from remote peers."` + ConfigFile string `short:"C" long:"configfile" description:"Path to configuration file"` ConnectPeers []string `long:"connect" description:"Connect only to the specified peers at startup"` - DisableListen 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"` + CPUProfile string `long:"cpuprofile" description:"Write CPU profile to the specified file"` + MemoryProfile string `long:"memprofile" description:"Write memory profile to the specified file"` + TraceProfile string `long:"traceprofile" description:"Write execution trace to the specified file"` + DataDir string `short:"b" long:"datadir" description:"Directory to store data"` + DbType string `long:"dbtype" description:"Database backend to use for the Block Chain"` + DebugLevel string `short:"d" long:"debuglevel" description:"Logging level for all subsystems {trace, debug, info, warn, error, critical} -- You may also specify =,=,... to set the log level for individual subsystems -- Use show to list available subsystems"` + DropAddrIndex bool `long:"dropaddrindex" description:"Deletes the address-based transaction index from the database on start up and then exits."` + DropCfIndex bool `long:"dropcfindex" description:"Deletes the index used for committed filtering (CF) support from the database on start up and then exits."` + DropTxIndex bool `long:"droptxindex" description:"Deletes the hash-based transaction index from the database on start up and then exits."` + ExternalIPs []string `long:"externalip" description:"Add an ip to the list of local addresses we claim to listen on to peers"` + Generate bool `long:"generate" description:"Generate (mine) bitcoins using the CPU"` + FreeTxRelayLimit float64 `long:"limitfreerelay" description:"Limit relay of transactions with no transaction fee to the given amount in thousands of bytes per minute"` Listeners []string `long:"listen" description:"Add an interface/port to listen for connections (default all interfaces port: 8333, testnet: 18333)"` + LogDir string `long:"logdir" description:"Directory to log output."` + MaxOrphanTxs int `long:"maxorphantx" description:"Max number of orphan transactions to keep in memory"` MaxPeers int `long:"maxpeers" description:"Max number of inbound and outbound peers"` + MiningAddrs []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"` + MinRelayTxFee float64 `long:"minrelaytxfee" description:"The minimum transaction fee in BTC/kB to be considered a non-zero fee."` DisableBanning bool `long:"nobanning" description:"Disable banning of misbehaving peers"` - BanDuration time.Duration `long:"banduration" description:"How long to ban misbehaving peers. Valid time units are {s, m, h}. Minimum 1 second"` - BanThreshold uint32 `long:"banthreshold" description:"Maximum allowed ban score before disconnecting and banning misbehaving peers."` - Whitelists []string `long:"whitelist" description:"Add an IP network or IP that will not be banned. (eg. 192.168.1.0/24 or ::1)"` - AgentBlacklist []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."` - AgentWhitelist []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 blacklist, and an empty whitelist will allow all agents that do not fail the blacklist."` - RPCUser string `short:"u" long:"rpcuser" description:"Username for RPC connections"` - RPCPass string `short:"P" long:"rpcpass" default-mask:"-" description:"Password for RPC connections"` - RPCLimitUser string `long:"rpclimituser" description:"Username for limited RPC connections"` - RPCLimitPass string `long:"rpclimitpass" default-mask:"-" description:"Password for limited RPC connections"` - RPCListeners []string `long:"rpclisten" description:"Add an interface/port to listen for RPC connections (default port: 8334, testnet: 18334)"` - RPCCert string `long:"rpccert" description:"File containing the certificate file"` - RPCKey string `long:"rpckey" description:"File containing the certificate key"` - RPCMaxClients int `long:"rpcmaxclients" description:"Max number of RPC clients for standard connections"` - RPCMaxWebsockets int `long:"rpcmaxwebsockets" description:"Max number of RPC websocket connections"` - RPCMaxConcurrentReqs int `long:"rpcmaxconcurrentreqs" description:"Max number of concurrent RPC requests that may be processed concurrently"` - RPCQuirks bool `long:"rpcquirks" description:"Mirror some JSON-RPC quirks of Bitcoin Core -- NOTE: Discouraged unless interoperability issues need to be worked around"` + NoCFilters bool `long:"nocfilters" description:"Disable committed filtering (CF) support"` + DisableCheckpoints bool `long:"nocheckpoints" description:"Disable built-in checkpoints. Don't do this unless you know what you're doing."` + DisableDNSSeed bool `long:"nodnsseed" description:"Disable DNS seeding for peers"` + DisableListen 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"` + NoOnion bool `long:"noonion" description:"Disable connecting to tor hidden services"` + NoPeerBloomFilters bool `long:"nopeerbloomfilters" description:"Disable bloom filtering support"` + NoRelayPriority bool `long:"norelaypriority" description:"Do not require free or low-fee transactions to have high priority for relaying"` + NoWinService 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"` DisableRPC 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"` + DisableStallHandler bool `long:"nostalldetect" description:"Disables the stall handler system for each peer, useful in simnet/regtest integration tests frameworks"` DisableTLS bool `long:"notls" description:"Disable TLS for the RPC server -- NOTE: This is only allowed if the RPC server is bound to localhost"` - DisableDNSSeed bool `long:"nodnsseed" description:"Disable DNS seeding for peers"` - ExternalIPs []string `long:"externalip" description:"Add an ip to the list of local addresses we claim to listen on to peers"` - Proxy string `long:"proxy" description:"Connect via SOCKS5 proxy (eg. 127.0.0.1:9050)"` - ProxyUser string `long:"proxyuser" description:"Username for proxy server"` - ProxyPass string `long:"proxypass" default-mask:"-" description:"Password for proxy server"` OnionProxy string `long:"onion" description:"Connect to tor hidden services via SOCKS5 proxy (eg. 127.0.0.1:9050)"` - OnionProxyUser string `long:"onionuser" description:"Username for onion proxy server"` OnionProxyPass string `long:"onionpass" default-mask:"-" description:"Password for onion proxy server"` - NoOnion bool `long:"noonion" description:"Disable connecting to tor hidden services"` - TorIsolation bool `long:"torisolation" description:"Enable Tor stream isolation by randomizing user credentials for each connection."` - TestNet3 bool `long:"testnet" description:"Use the test network"` + OnionProxyUser string `long:"onionuser" description:"Username for onion proxy server"` + Profile string `long:"profile" description:"Enable HTTP profiling on given port -- NOTE port must be between 1024 and 65536"` + Proxy string `long:"proxy" description:"Connect via SOCKS5 proxy (eg. 127.0.0.1:9050)"` + ProxyPass string `long:"proxypass" default-mask:"-" description:"Password for proxy server"` + ProxyUser string `long:"proxyuser" description:"Username for proxy server"` + Prune 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)"` RegressionTest bool `long:"regtest" description:"Use the regression test network"` + RejectNonStd bool `long:"rejectnonstd" description:"Reject non-standard transactions regardless of the default settings for the active network."` + RejectReplacement bool `long:"rejectreplacement" description:"Reject transactions that attempt to replace existing transactions within the mempool through the Replace-By-Fee (RBF) signaling policy."` + RelayNonStd bool `long:"relaynonstd" description:"Relay non-standard transactions regardless of the default settings for the active network."` + RPCCert string `long:"rpccert" description:"File containing the certificate file"` + RPCKey string `long:"rpckey" description:"File containing the certificate key"` + RPCLimitPass string `long:"rpclimitpass" default-mask:"-" description:"Password for limited RPC connections"` + RPCLimitUser string `long:"rpclimituser" description:"Username for limited RPC connections"` + RPCListeners []string `long:"rpclisten" description:"Add an interface/port to listen for RPC connections (default port: 8334, testnet: 18334)"` + RPCMaxClients int `long:"rpcmaxclients" description:"Max number of RPC clients for standard connections"` + RPCMaxConcurrentReqs int `long:"rpcmaxconcurrentreqs" description:"Max number of concurrent RPC requests that may be processed concurrently"` + RPCMaxWebsockets int `long:"rpcmaxwebsockets" description:"Max number of RPC websocket connections"` + RPCQuirks bool `long:"rpcquirks" description:"Mirror some JSON-RPC quirks of Bitcoin Core -- NOTE: Discouraged unless interoperability issues need to be worked around"` + RPCPass string `short:"P" long:"rpcpass" default-mask:"-" description:"Password for RPC connections"` + RPCUser string `short:"u" long:"rpcuser" description:"Username for RPC connections"` + SigCacheMaxSize uint `long:"sigcachemaxsize" description:"The maximum number of entries in the signature verification cache"` SimNet bool `long:"simnet" description:"Use the simulation test network"` - AddCheckpoints []string `long:"addcheckpoint" description:"Add a custom checkpoint. Format: ':'"` - DisableCheckpoints bool `long:"nocheckpoints" description:"Disable built-in checkpoints. Don't do this unless you know what you're doing."` - DbType string `long:"dbtype" description:"Database backend to use for the Block Chain"` - Profile string `long:"profile" description:"Enable HTTP profiling on given port -- NOTE port must be between 1024 and 65536"` - CPUProfile string `long:"cpuprofile" description:"Write CPU profile to the specified file"` - DebugLevel string `short:"d" long:"debuglevel" description:"Logging level for all subsystems {trace, debug, info, warn, error, critical} -- You may also specify =,=,... to set the log level for individual subsystems -- Use show to list available subsystems"` - Upnp bool `long:"upnp" description:"Use UPnP to map our listening port outside of NAT"` - MinRelayTxFee float64 `long:"minrelaytxfee" description:"The minimum transaction fee in BTC/kB to be considered a non-zero fee."` - FreeTxRelayLimit float64 `long:"limitfreerelay" description:"Limit relay of transactions with no transaction fee to the given amount in thousands of bytes per minute"` - NoRelayPriority bool `long:"norelaypriority" description:"Do not require free or low-fee transactions to have high priority for relaying"` + SigNet bool `long:"signet" description:"Use the signet test network"` + SigNetChallenge 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"` + SigNetSeedNode []string `long:"signetseednode" description:"Specify a seed node for the signet network instead of using the global default signet network seed nodes"` + TestNet3 bool `long:"testnet" description:"Use the test network"` + TorIsolation bool `long:"torisolation" description:"Enable Tor stream isolation by randomizing user credentials for each connection."` TrickleInterval time.Duration `long:"trickleinterval" description:"Minimum time between attempts to send new inventory to a connected peer"` - MaxOrphanTxs int `long:"maxorphantx" description:"Max number of orphan transactions to keep in memory"` - Generate bool `long:"generate" description:"Generate (mine) bitcoins using the CPU"` - MiningAddrs []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"` - BlockMinSize uint32 `long:"blockminsize" description:"Mininum block size in bytes to be used when creating a block"` - BlockMaxSize uint32 `long:"blockmaxsize" description:"Maximum block size in bytes to be used when creating a block"` - BlockMinWeight uint32 `long:"blockminweight" description:"Mininum block weight to be used when creating a block"` - BlockMaxWeight uint32 `long:"blockmaxweight" description:"Maximum block weight to be used when creating a block"` - BlockPrioritySize uint32 `long:"blockprioritysize" description:"Size in bytes for high-priority/low-fee transactions when creating a block"` - UserAgentComments []string `long:"uacomment" description:"Comment to add to the user agent -- See BIP 14 for more information."` - NoPeerBloomFilters bool `long:"nopeerbloomfilters" description:"Disable bloom filtering support"` - NoCFilters bool `long:"nocfilters" description:"Disable committed filtering (CF) support"` - DropCfIndex bool `long:"dropcfindex" description:"Deletes the index used for committed filtering (CF) support from the database on start up and then exits."` - SigCacheMaxSize uint `long:"sigcachemaxsize" description:"The maximum number of entries in the signature verification cache"` - BlocksOnly bool `long:"blocksonly" description:"Do not accept transactions from remote peers."` + UtxoCacheMaxSizeMiB uint `long:"utxocachemaxsize" description:"The maximum size in MiB of the UTXO cache"` TxIndex bool `long:"txindex" description:"Maintain a full hash-based transaction index which makes all transactions available via the getrawtransaction RPC"` - DropTxIndex bool `long:"droptxindex" description:"Deletes the hash-based transaction index from the database on start up and then exits."` - AddrIndex bool `long:"addrindex" description:"Maintain a full address-based transaction index which makes the searchrawtransactions RPC available"` - DropAddrIndex bool `long:"dropaddrindex" description:"Deletes the address-based transaction index from the database on start up and then exits."` - RelayNonStd bool `long:"relaynonstd" description:"Relay non-standard transactions regardless of the default settings for the active network."` - RejectNonStd bool `long:"rejectnonstd" description:"Reject non-standard transactions regardless of the default settings for the active network."` - RejectReplacement bool `long:"rejectreplacement" description:"Reject transactions that attempt to replace existing transactions within the mempool through the Replace-By-Fee (RBF) signaling policy."` + UserAgentComments []string `long:"uacomment" description:"Comment to add to the user agent -- See BIP 14 for more information."` + Upnp bool `long:"upnp" description:"Use UPnP to map our listening port outside of NAT"` + ShowVersion bool `short:"V" long:"version" description:"Display version information and exit"` + Whitelists []string `long:"whitelist" description:"Add an IP network or IP that will not be banned. (eg. 192.168.1.0/24 or ::1)"` lookup func(string) ([]net.IP, error) oniondial func(string, string, time.Duration) (net.Conn, error) dial func(string, string, time.Duration) (net.Conn, error) @@ -232,7 +245,7 @@ func supportedSubsystems() []string { // the levels accordingly. An appropriate error is returned if anything is // invalid. func parseAndSetDebugLevels(debugLevel string) error { - // When the specified string doesn't have any delimters, treat it as + // When the specified string doesn't have any delimiters, treat it as // the log level for all subsystems. if !strings.Contains(debugLevel, ",") && !strings.Contains(debugLevel, "=") { // Validate debug log level. @@ -263,7 +276,7 @@ func parseAndSetDebugLevels(debugLevel string) error { // Validate subsystem. if _, exists := subsystemLoggers[subsysID]; !exists { str := "The specified subsystem [%v] is invalid -- " + - "supported subsytems %v" + "supported subsystems %v" return fmt.Errorf(str, subsysID, supportedSubsystems()) } @@ -372,7 +385,7 @@ func parseCheckpoints(checkpointStrings []string) ([]chaincfg.Checkpoint, error) return checkpoints, nil } -// filesExists reports whether the named file or directory exists. +// fileExists reports whether the named file or directory exists. func fileExists(name string) bool { if _, err := os.Stat(name); err != nil { if os.IsNotExist(err) { @@ -395,10 +408,10 @@ func newConfigParser(cfg *config, so *serviceOptions, options flags.Options) *fl // line options. // // The configuration proceeds as follows: -// 1) Start with a default config with sane settings -// 2) Pre-parse the command line to check for an alternative config file -// 3) Load configuration file overwriting defaults with any specified options -// 4) Parse CLI options and overwrite/add any specified options +// 1. Start with a default config with sane settings +// 2. Pre-parse the command line to check for an alternative config file +// 3. Load configuration file overwriting defaults with any specified options +// 4. Parse CLI options and overwrite/add any specified options // // The above results in btcd functioning properly without any config settings // while still allowing the user to override settings with config files and @@ -429,6 +442,7 @@ func loadConfig() (*config, []string, error) { BlockPrioritySize: mempool.DefaultBlockPrioritySize, MaxOrphanTxs: defaultMaxOrphanTransactions, SigCacheMaxSize: defaultSigCacheMaxSize, + UtxoCacheMaxSizeMiB: defaultUtxoCacheMaxSizeMiB, Generate: defaultGenerate, TxIndex: defaultTxIndex, AddrIndex: defaultAddrIndex, @@ -474,8 +488,8 @@ func loadConfig() (*config, []string, error) { // Load additional config from file. var configFileError error parser := newConfigParser(&cfg, &serviceOpts, flags.Default) - if !(preCfg.RegressionTest || preCfg.SimNet) || preCfg.ConfigFile != - defaultConfigFile { + if !(preCfg.RegressionTest || preCfg.SimNet || preCfg.SigNet) || + preCfg.ConfigFile != defaultConfigFile { if _, err := os.Stat(preCfg.ConfigFile); os.IsNotExist(err) { err := createDefaultConfigFile(preCfg.ConfigFile) @@ -549,9 +563,59 @@ func loadConfig() (*config, []string, error) { activeNetParams = &simNetParams cfg.DisableDNSSeed = true } + if cfg.SigNet { + numNets++ + activeNetParams = &sigNetParams + + // Let the user overwrite the default signet parameters. The + // challenge defines the actual signet network to join and the + // seed nodes are needed for network discovery. + sigNetChallenge := chaincfg.DefaultSignetChallenge + sigNetSeeds := chaincfg.DefaultSignetDNSSeeds + if cfg.SigNetChallenge != "" { + challenge, err := hex.DecodeString(cfg.SigNetChallenge) + if err != nil { + str := "%s: Invalid signet challenge, hex " + + "decode failed: %v" + err := fmt.Errorf(str, funcName, err) + fmt.Fprintln(os.Stderr, err) + fmt.Fprintln(os.Stderr, usageMessage) + return nil, nil, err + } + sigNetChallenge = challenge + } + + if len(cfg.SigNetSeedNode) > 0 { + sigNetSeeds = make( + []chaincfg.DNSSeed, len(cfg.SigNetSeedNode), + ) + for idx, seed := range cfg.SigNetSeedNode { + sigNetSeeds[idx] = chaincfg.DNSSeed{ + Host: seed, + HasFiltering: false, + } + } + } + + chainParams := chaincfg.CustomSignetParams( + sigNetChallenge, sigNetSeeds, + ) + activeNetParams.Params = &chainParams + } if numNets > 1 { - str := "%s: The testnet, regtest, segnet, and simnet params " + - "can't be used together -- choose one of the four" + str := "%s: The testnet, regtest, segnet, signet and simnet " + + "params can't be used together -- choose one of the " + + "five" + err := fmt.Errorf(str, funcName) + fmt.Fprintln(os.Stderr, err) + fmt.Fprintln(os.Stderr, usageMessage) + return nil, nil, err + } + + // If mainnet is active, then we won't allow the stall handler to be + // disabled. + if activeNetParams.Params.Net == wire.MainNet && cfg.DisableStallHandler { + str := "%s: stall handler cannot be disabled on mainnet" err := fmt.Errorf(str, funcName) fmt.Fprintln(os.Stderr, err) fmt.Fprintln(os.Stderr, usageMessage) @@ -755,7 +819,7 @@ func loadConfig() (*config, []string, error) { return nil, nil, err } - // Validate the the minrelaytxfee. + // Validate the minrelaytxfee. cfg.minRelayTxFee, err = btcutil.NewAmount(cfg.MinRelayTxFee) if err != nil { str := "%s: invalid minrelaytxfee: %v" @@ -1079,6 +1143,30 @@ func loadConfig() (*config, []string, error) { } } + if cfg.Prune != 0 && cfg.Prune < pruneMinSize { + err := fmt.Errorf("%s: the minimum value for --prune is %d. Got %d", + funcName, pruneMinSize, cfg.Prune) + fmt.Fprintln(os.Stderr, err) + fmt.Fprintln(os.Stderr, usageMessage) + return nil, nil, err + } + + if cfg.Prune != 0 && cfg.TxIndex { + err := fmt.Errorf("%s: the --prune and --txindex options may "+ + "not be activated at the same time", funcName) + fmt.Fprintln(os.Stderr, err) + fmt.Fprintln(os.Stderr, usageMessage) + return nil, nil, err + } + + if cfg.Prune != 0 && cfg.AddrIndex { + err := fmt.Errorf("%s: the --prune and --addrindex options may "+ + "not be activated at the same time", funcName) + fmt.Fprintln(os.Stderr, err) + fmt.Fprintln(os.Stderr, usageMessage) + return nil, nil, err + } + // Warn about missing config file only after all other configuration is // done. This prevents the warning on help messages and invalid // options. Note this should go directly before the return. diff --git a/config_test.go b/config_test.go index e54a9f5f20..42a0cd4b90 100644 --- a/config_test.go +++ b/config_test.go @@ -1,7 +1,6 @@ package main import ( - "io/ioutil" "os" "path/filepath" "regexp" @@ -23,14 +22,14 @@ func TestCreateDefaultConfigFile(t *testing.T) { sampleConfigFile := filepath.Join(filepath.Dir(path), "sample-btcd.conf") // Setup a temporary directory - tmpDir, err := ioutil.TempDir("", "btcd") + tmpDir, err := os.MkdirTemp("", "btcd") if err != nil { t.Fatalf("Failed creating a temporary directory: %v", err) } testpath := filepath.Join(tmpDir, "test.conf") // copy config file to location of btcd binary - data, err := ioutil.ReadFile(sampleConfigFile) + data, err := os.ReadFile(sampleConfigFile) if err != nil { t.Fatalf("Failed reading sample config file: %v", err) } @@ -39,7 +38,7 @@ func TestCreateDefaultConfigFile(t *testing.T) { t.Fatalf("Failed obtaining app path: %v", err) } tmpConfigFile := filepath.Join(appPath, "sample-btcd.conf") - err = ioutil.WriteFile(tmpConfigFile, data, 0644) + err = os.WriteFile(tmpConfigFile, data, 0644) if err != nil { t.Fatalf("Failed copying sample config file: %v", err) } @@ -57,7 +56,7 @@ func TestCreateDefaultConfigFile(t *testing.T) { t.Fatalf("Failed to create a default config file: %v", err) } - content, err := ioutil.ReadFile(testpath) + content, err := os.ReadFile(testpath) if err != nil { t.Fatalf("Failed to read generated default config file: %v", err) } diff --git a/connmgr/README.md b/connmgr/README.md index 6f3968cecb..b1aa3cc7d0 100644 --- a/connmgr/README.md +++ b/connmgr/README.md @@ -1,9 +1,9 @@ connmgr ======= -[![Build Status](http://img.shields.io/travis/btcsuite/btcd.svg)](https://travis-ci.org/btcsuite/btcd) +[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions) [![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) -[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/btcsuite/btcd/connmgr) +[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/connmgr) Package connmgr implements a generic Bitcoin network connection manager. diff --git a/connmgr/connmanager.go b/connmgr/connmanager.go index 9a68190267..e88f8af0cb 100644 --- a/connmgr/connmanager.go +++ b/connmgr/connmanager.go @@ -210,11 +210,16 @@ func (cm *ConnManager) handleFailedConn(c *ConnReq) { log.Debugf("Max failed connection attempts reached: [%d] "+ "-- retrying connection in: %v", maxFailedAttempts, cm.cfg.RetryDuration) + theId := c.id time.AfterFunc(cm.cfg.RetryDuration, func() { + cm.Remove(theId) cm.NewConnReq() }) } else { - go cm.NewConnReq() + go func(theId uint64) { + cm.Remove(theId) + cm.NewConnReq() + }(c.id) } } } @@ -520,9 +525,9 @@ func (cm *ConnManager) Start() { // Start all the listeners so long as the caller requested them and // provided a callback to be invoked when connections are accepted. if cm.cfg.OnAccept != nil { - for _, listner := range cm.cfg.Listeners { + for _, listener := range cm.cfg.Listeners { cm.wg.Add(1) - go cm.listenHandler(listner) + go cm.listenHandler(listener) } } diff --git a/connmgr/connmanager_test.go b/connmgr/connmanager_test.go index 67769deb96..94cb65ff2a 100644 --- a/connmgr/connmanager_test.go +++ b/connmgr/connmanager_test.go @@ -464,7 +464,7 @@ func TestRemovePendingConnection(t *testing.T) { time.Sleep(10 * time.Millisecond) // Now examine the status of the connection request, it should read a - // status of failed. + // status of ConnCanceled. if cr.State() != ConnCanceled { t.Fatalf("request wasn't canceled, status is: %v", cr.State()) } diff --git a/connmgr/doc.go b/connmgr/doc.go index acb90c31a9..d101c4347f 100644 --- a/connmgr/doc.go +++ b/connmgr/doc.go @@ -5,7 +5,7 @@ /* Package connmgr implements a generic Bitcoin network connection manager. -Connection Manager Overview +# Connection Manager Overview Connection Manager handles all the general connection concerns such as maintaining a set number of outbound connections, sourcing peers, banning, diff --git a/connmgr/dynamicbanscore.go b/connmgr/dynamicbanscore.go index bc3c2a4581..38180bac12 100644 --- a/connmgr/dynamicbanscore.go +++ b/connmgr/dynamicbanscore.go @@ -71,7 +71,7 @@ type DynamicBanScore struct { func (s *DynamicBanScore) String() string { s.mtx.Lock() r := fmt.Sprintf("persistent %v + transient %v at %v = %v as of now", - s.persistent, s.transient, s.lastUnix, s.Int()) + s.persistent, s.transient, s.lastUnix, s.int(time.Now())) s.mtx.Unlock() return r } diff --git a/connmgr/dynamicbanscore_test.go b/connmgr/dynamicbanscore_test.go index 6dcd64d476..c6d67b4910 100644 --- a/connmgr/dynamicbanscore_test.go +++ b/connmgr/dynamicbanscore_test.go @@ -66,3 +66,15 @@ func TestDynamicBanScoreReset(t *testing.T) { t.Errorf("Failed to reset ban score.") } } + +// TestDynamicBanScoreString +func TestDynamicBanScoreString(t *testing.T) { + var bs DynamicBanScore + base := time.Now() + + r := bs.increase(100, 50, base) + if r != 150 { + t.Errorf("Unexpected result %d after ban score increase.", r) + } + t.Log(bs.String()) +} diff --git a/connmgr/seed.go b/connmgr/seed.go index 063b546ab8..705618f778 100644 --- a/connmgr/seed.go +++ b/connmgr/seed.go @@ -23,8 +23,8 @@ const ( ) // OnSeed is the signature of the callback function which is invoked when DNS -// seeding is succesfull. -type OnSeed func(addrs []*wire.NetAddress) +// seeding is successful. +type OnSeed func(addrs []*wire.NetAddressV2) // LookupFunc is the signature of the DNS lookup function. type LookupFunc func(string) ([]net.IP, error) @@ -56,11 +56,11 @@ func SeedFromDNS(chainParams *chaincfg.Params, reqServices wire.ServiceFlag, if numPeers == 0 { return } - addresses := make([]*wire.NetAddress, len(seedpeers)) + addresses := make([]*wire.NetAddressV2, len(seedpeers)) // if this errors then we have *real* problems intPort, _ := strconv.Atoi(chainParams.DefaultPort) for i, peer := range seedpeers { - addresses[i] = wire.NewNetAddressTimestamp( + addresses[i] = wire.NetAddressV2FromBytes( // bitcoind seeds with addresses from // a time randomly selected between 3 // and 7 days ago. diff --git a/database/README.md b/database/README.md index c51c9cc66b..21563d1af8 100644 --- a/database/README.md +++ b/database/README.md @@ -1,9 +1,9 @@ database ======== -[![Build Status](http://img.shields.io/travis/btcsuite/btcd.svg)](https://travis-ci.org/btcsuite/btcd) +[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions) [![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) -[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/btcsuite/btcd/database) +[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/database) Package database provides a block and metadata storage database. @@ -42,11 +42,11 @@ $ go get -u github.com/btcsuite/btcd/database ## Examples -* [Basic Usage Example](http://godoc.org/github.com/btcsuite/btcd/database#example-package--BasicUsage) +* [Basic Usage Example](https://pkg.go.dev/github.com/btcsuite/btcd/database#example-package--BasicUsage) Demonstrates creating a new database and using a managed read-write transaction to store and retrieve metadata. -* [Block Storage and Retrieval Example](http://godoc.org/github.com/btcsuite/btcd/database#example-package--BlockStorageAndRetrieval) +* [Block Storage and Retrieval Example](https://pkg.go.dev/github.com/btcsuite/btcd/database#example-package--BlockStorageAndRetrieval) Demonstrates creating a new database, using a managed read-write transaction to store a block, and then using a managed read-only transaction to fetch the block. diff --git a/database/cmd/dbtool/globalconfig.go b/database/cmd/dbtool/globalconfig.go index 5cbd9b3af9..4e58168a33 100644 --- a/database/cmd/dbtool/globalconfig.go +++ b/database/cmd/dbtool/globalconfig.go @@ -10,11 +10,11 @@ import ( "os" "path/filepath" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/database" _ "github.com/btcsuite/btcd/database/ffldb" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) var ( @@ -33,9 +33,9 @@ var ( type config struct { DataDir string `short:"b" long:"datadir" description:"Location of the btcd data directory"` DbType string `long:"dbtype" description:"Database backend to use for the Block Chain"` - TestNet3 bool `long:"testnet" description:"Use the test network"` RegressionTest bool `long:"regtest" description:"Use the regression test network"` SimNet bool `long:"simnet" description:"Use the simulation test network"` + TestNet3 bool `long:"testnet" description:"Use the test network"` } // fileExists reports whether the named file or directory exists. diff --git a/database/cmd/dbtool/insecureimport.go b/database/cmd/dbtool/insecureimport.go index 7564eb68ad..744e29f57b 100644 --- a/database/cmd/dbtool/insecureimport.go +++ b/database/cmd/dbtool/insecureimport.go @@ -12,10 +12,10 @@ import ( "sync" "time" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/database" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) // importCmd defines the configuration options for the insecureimport command. diff --git a/database/cmd/dbtool/main.go b/database/cmd/dbtool/main.go index 9eccd5989b..73c59a6e7d 100644 --- a/database/cmd/dbtool/main.go +++ b/database/cmd/dbtool/main.go @@ -7,7 +7,6 @@ package main import ( "os" "path/filepath" - "runtime" "strings" "github.com/btcsuite/btcd/database" @@ -106,9 +105,6 @@ func realMain() error { } func main() { - // Use all processor cores. - runtime.GOMAXPROCS(runtime.NumCPU()) - // Work around defer not working after os.Exit() if err := realMain(); err != nil { os.Exit(1) diff --git a/database/doc.go b/database/doc.go index 497206713f..80a2669da1 100644 --- a/database/doc.go +++ b/database/doc.go @@ -5,7 +5,7 @@ /* Package database provides a block and metadata storage database. -Overview +# Overview As of Feb 2016, there are over 400,000 blocks in the Bitcoin block chain and and over 112 million transactions (which turns out to be over 60GB of data). @@ -18,15 +18,15 @@ storage, and strict checksums in key areas to ensure data integrity. A quick overview of the features database provides are as follows: - - Key/value metadata store - - Bitcoin block storage - - Efficient retrieval of block headers and regions (transactions, scripts, etc) - - Read-only and read-write transactions with both manual and managed modes - - Nested buckets - - Supports registration of backend databases - - Comprehensive test coverage + - Key/value metadata store + - Bitcoin block storage + - Efficient retrieval of block headers and regions (transactions, scripts, etc) + - Read-only and read-write transactions with both manual and managed modes + - Nested buckets + - Supports registration of backend databases + - Comprehensive test coverage -Database +# Database The main entry point is the DB interface. It exposes functionality for transactional-based access and storage of metadata and block data. It is @@ -43,14 +43,14 @@ The Begin function provides an unmanaged transaction while the View and Update functions provide a managed transaction. These are described in more detail below. -Transactions +# Transactions The Tx interface provides facilities for rolling back or committing changes that took place while the transaction was active. It also provides the root metadata bucket under which all keys, values, and nested buckets are stored. A transaction can either be read-only or read-write and managed or unmanaged. -Managed versus Unmanaged Transactions +# Managed versus Unmanaged Transactions A managed transaction is one where the caller provides a function to execute within the context of the transaction and the commit or rollback is handled @@ -63,7 +63,7 @@ call Commit or Rollback when they are finished with it. Leaving transactions open for long periods of time can have several adverse effects, so it is recommended that managed transactions are used instead. -Buckets +# Buckets The Bucket interface provides the ability to manipulate key/value pairs and nested buckets as well as iterate through them. @@ -73,7 +73,7 @@ CreateBucket, CreateBucketIfNotExists, and DeleteBucket functions work with buckets. The ForEach function allows the caller to provide a function to be called with each key/value pair and nested bucket in the current bucket. -Metadata Bucket +# Metadata Bucket As discussed above, all of the functions which are used to manipulate key/value pairs and nested buckets exist on the Bucket interface. The root metadata @@ -81,7 +81,7 @@ bucket is the upper-most bucket in which data is stored and is created at the same time as the database. Use the Metadata function on the Tx interface to retrieve it. -Nested Buckets +# Nested Buckets The CreateBucket and CreateBucketIfNotExists functions on the Bucket interface provide the ability to create an arbitrary number of nested buckets. It is diff --git a/database/driver.go b/database/driver.go index 2999b61157..cb76d2fc62 100644 --- a/database/driver.go +++ b/database/driver.go @@ -62,7 +62,7 @@ func SupportedDrivers() []string { // arguments are specific to the database type driver. See the documentation // for the database driver for further details. // -// ErrDbUnknownType will be returned if the the database type is not registered. +// ErrDbUnknownType will be returned if the database type is not registered. func Create(dbType string, args ...interface{}) (DB, error) { drv, exists := drivers[dbType] if !exists { @@ -77,7 +77,7 @@ func Create(dbType string, args ...interface{}) (DB, error) { // specific to the database type driver. See the documentation for the database // driver for further details. // -// ErrDbUnknownType will be returned if the the database type is not registered. +// ErrDbUnknownType will be returned if the database type is not registered. func Open(dbType string, args ...interface{}) (DB, error) { drv, exists := drivers[dbType] if !exists { diff --git a/database/error.go b/database/error.go index 49c250eef5..3470c49749 100644 --- a/database/error.go +++ b/database/error.go @@ -87,7 +87,7 @@ const ( // should be relatively, so this should rarely be an issue. ErrKeyTooLarge - // ErrValueTooLarge indicates an attmpt to insert a value that is larger + // ErrValueTooLarge indicates an attempt to insert a value that is larger // than max allowed value size. The max key size depends on the // specific backend driver being used. ErrValueTooLarge diff --git a/database/example_test.go b/database/example_test.go index 8b6fe7bce4..1110d0dbc3 100644 --- a/database/example_test.go +++ b/database/example_test.go @@ -10,11 +10,11 @@ import ( "os" "path/filepath" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/database" _ "github.com/btcsuite/btcd/database/ffldb" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) // This example demonstrates creating a new database. @@ -122,9 +122,14 @@ func Example_blockStorageAndRetrieval() { // Typically you wouldn't want to remove the database right away like // this, nor put it in the temp directory, but it's done here to ensure // the example cleans up after itself. - dbPath := filepath.Join(os.TempDir(), "exampleblkstorage") + dbPath, err := os.MkdirTemp("", "exampleblkstorage") + if err != nil { + fmt.Println(err) + return + } db, err := database.Create("ffldb", dbPath, wire.MainNet) if err != nil { + fmt.Println("fail here") fmt.Println(err) return } diff --git a/database/ffldb/README.md b/database/ffldb/README.md index ebaa5a7e01..5b855faa55 100644 --- a/database/ffldb/README.md +++ b/database/ffldb/README.md @@ -1,9 +1,9 @@ ffldb ===== -[![Build Status](https://travis-ci.org/btcsuite/btcd.png?branch=master)](https://travis-ci.org/btcsuite/btcd) +[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions) [![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) -[![GoDoc](https://godoc.org/github.com/btcsuite/btcd/database/ffldb?status.png)](http://godoc.org/github.com/btcsuite/btcd/database/ffldb) +[![GoDoc](https://pkg.go.dev/github.com/btcsuite/btcd/database/ffldb?status.png)](https://pkg.go.dev/github.com/btcsuite/btcd/database/ffldb) ======= Package ffldb implements a driver for the database package that uses leveldb for diff --git a/database/ffldb/bench_test.go b/database/ffldb/bench_test.go index 8d020313d8..95e498b274 100644 --- a/database/ffldb/bench_test.go +++ b/database/ffldb/bench_test.go @@ -9,9 +9,9 @@ import ( "path/filepath" "testing" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/database" - "github.com/btcsuite/btcutil" ) // BenchmarkBlockHeader benchmarks how long it takes to load the mainnet genesis diff --git a/database/ffldb/blockio.go b/database/ffldb/blockio.go index 3d7782f93c..c4952373db 100644 --- a/database/ffldb/blockio.go +++ b/database/ffldb/blockio.go @@ -15,6 +15,9 @@ import ( "io" "os" "path/filepath" + "sort" + "strconv" + "strings" "sync" "github.com/btcsuite/btcd/chaincfg/chainhash" @@ -23,6 +26,10 @@ import ( ) const ( + // blockFileExtension is the extension that's used to store the block + // files on the disk. + blockFileExtension = ".fdb" + // The Bitcoin protocol encodes block height as int32, so max number of // blocks is 2^31. Max block size per the protocol is 32MiB per block. // So the theoretical max at the time this comment was written is 64PiB @@ -32,7 +39,7 @@ const ( // 512MiB each for a total of ~476.84PiB (roughly 7.4 times the current // theoretical max), so there is room for the max block size to grow in // the future. - blockFilenameTemplate = "%09d.fdb" + blockFilenameTemplate = "%09d" + blockFileExtension // maxOpenFiles is the max number of open files to maintain in the // open blocks cache. Note that this does not include the current @@ -130,10 +137,10 @@ type blockStore struct { // lruMutex protects concurrent access to the least recently used list // and lookup map. // - // openBlocksLRU tracks how the open files are refenced by pushing the + // openBlocksLRU tracks how the open files are referenced by pushing the // most recently used files to the front of the list thereby trickling // the least recently used files to end of the list. When a file needs - // to be closed due to exceeding the the max number of allowed open + // to be closed due to exceeding the max number of allowed open // files, the one at the end of the list is closed. // // fileNumToLRUElem is a mapping between a specific block file number @@ -217,7 +224,7 @@ func serializeBlockLoc(loc blockLocation) []byte { return serializedData[:] } -// blockFilePath return the file path for the provided block file number. +// blockFilePath returns the file path for the provided block file number. func blockFilePath(dbPath string, fileNum uint32) string { fileName := fmt.Sprintf(blockFilenameTemplate, fileNum) return filepath.Join(dbPath, fileName) @@ -274,17 +281,7 @@ func (s *blockStore) openFile(fileNum uint32) (*lockableFile, error) { lruList := s.openBlocksLRU if lruList.Len() >= maxOpenFiles { lruFileNum := lruList.Remove(lruList.Back()).(uint32) - oldBlockFile := s.openBlockFiles[lruFileNum] - - // Close the old file under the write lock for the file in case - // any readers are currently reading from it so it's not closed - // out from under them. - oldBlockFile.Lock() - _ = oldBlockFile.file.Close() - oldBlockFile.Unlock() - - delete(s.openBlockFiles, lruFileNum) - delete(s.fileNumToLRUElem, lruFileNum) + s.closeFile(lruFileNum) } s.fileNumToLRUElem[fileNum] = lruList.PushFront(fileNum) s.lruMutex.Unlock() @@ -295,11 +292,36 @@ func (s *blockStore) openFile(fileNum uint32) (*lockableFile, error) { return blockFile, nil } +// closeFile checks that the file corresponding to the file number is open and +// if it is, it closes it in a concurrency safe manner and cleans up associated +// data in the blockstore struct. +func (s *blockStore) closeFile(fileNum uint32) { + blockFile := s.openBlockFiles[fileNum] + if blockFile == nil { + return + } + + // Close the old file under the write lock for the file in case + // any readers are currently reading from it so it's not closed + // out from under them. + blockFile.Lock() + _ = blockFile.file.Close() + blockFile.Unlock() + + delete(s.openBlockFiles, fileNum) + delete(s.fileNumToLRUElem, fileNum) +} + // deleteFile removes the block file for the passed flat file number. The file // must already be closed and it is the responsibility of the caller to do any // other state cleanup necessary. func (s *blockStore) deleteFile(fileNum uint32) error { filePath := blockFilePath(s.basePath, fileNum) + blockFile := s.openBlockFiles[fileNum] + if blockFile != nil { + err := fmt.Errorf("attempted to delete open file at %v", filePath) + return makeDbErr(database.ErrDriverSpecific, err.Error(), err) + } if err := os.Remove(filePath); err != nil { return makeDbErr(database.ErrDriverSpecific, err.Error(), err) } @@ -474,7 +496,7 @@ func (s *blockStore) writeBlock(rawBlock []byte) (blockLocation, error) { _, _ = hasher.Write(scratch[:]) // Serialized block. - if err := s.writeData(rawBlock[:], "block"); err != nil { + if err := s.writeData(rawBlock, "block"); err != nil { return blockLocation{}, err } _, _ = hasher.Write(rawBlock) @@ -622,8 +644,8 @@ func (s *blockStore) syncBlocks() error { // were partially written. // // There are effectively two scenarios to consider here: -// 1) Transient write failures from which recovery is possible -// 2) More permanent failures such as hard disk death and/or removal +// 1. Transient write failures from which recovery is possible +// 2. More permanent failures such as hard disk death and/or removal // // In either case, the write cursor will be repositioned to the old block file // offset regardless of any other errors that occur while attempting to undo @@ -713,36 +735,57 @@ func (s *blockStore) handleRollback(oldBlockFileNum, oldBlockOffset uint32) { } // scanBlockFiles searches the database directory for all flat block files to -// find the end of the most recent file. This position is considered the -// current write cursor which is also stored in the metadata. Thus, it is used -// to detect unexpected shutdowns in the middle of writes so the block files -// can be reconciled. -func scanBlockFiles(dbPath string) (int, uint32) { - lastFile := -1 - fileLen := uint32(0) - for i := 0; ; i++ { - filePath := blockFilePath(dbPath, uint32(i)) - st, err := os.Stat(filePath) - if err != nil { - break - } - lastFile = i +// find the first file, last file, and the end of the most recent file. The +// position at the last file is considered the current write cursor which is +// also stored in the metadata. Thus, it is used to detect unexpected shutdowns +// in the middle of writes so the block files can be reconciled. +func scanBlockFiles(dbPath string) (int, int, uint32, error) { + firstFile, lastFile, lastFileLen, err := int(-1), int(-1), uint32(0), error(nil) + + files, err := filepath.Glob(filepath.Join(dbPath, "*"+blockFileExtension)) + if err != nil { + return 0, 0, 0, err + } + sort.Strings(files) - fileLen = uint32(st.Size()) + // Return early if there's no block files. + if len(files) == 0 { + return firstFile, lastFile, lastFileLen, nil } - log.Tracef("Scan found latest block file #%d with length %d", lastFile, - fileLen) - return lastFile, fileLen + // Grab the first and last file's number. + firstFile, err = strconv.Atoi(strings.TrimSuffix(filepath.Base(files[0]), blockFileExtension)) + if err != nil { + return 0, 0, 0, fmt.Errorf("scanBlockFiles error: %v", err) + } + lastFile, err = strconv.Atoi(strings.TrimSuffix(filepath.Base(files[len(files)-1]), blockFileExtension)) + if err != nil { + return 0, 0, 0, fmt.Errorf("scanBlockFiles error: %v", err) + } + + // Get the last file's length. + filePath := blockFilePath(dbPath, uint32(lastFile)) + st, err := os.Stat(filePath) + if err != nil { + return 0, 0, 0, err + } + lastFileLen = uint32(st.Size()) + + log.Tracef("Scan found latest block file #%d with length %d", lastFile, lastFileLen) + + return firstFile, lastFile, lastFileLen, err } // newBlockStore returns a new block store with the current block file number // and offset set and all fields initialized. -func newBlockStore(basePath string, network wire.BitcoinNet) *blockStore { +func newBlockStore(basePath string, network wire.BitcoinNet) (*blockStore, error) { // Look for the end of the latest block to file to determine what the - // write cursor position is from the viewpoing of the block files on + // write cursor position is from the viewpoint of the block files on // disk. - fileNum, fileOff := scanBlockFiles(basePath) + _, fileNum, fileOff, err := scanBlockFiles(basePath) + if err != nil { + return nil, err + } if fileNum == -1 { fileNum = 0 fileOff = 0 @@ -765,5 +808,5 @@ func newBlockStore(basePath string, network wire.BitcoinNet) *blockStore { store.openFileFunc = store.openFile store.openWriteFileFunc = store.openWriteFile store.deleteFileFunc = store.deleteFile - return store + return store, nil } diff --git a/database/ffldb/db.go b/database/ffldb/db.go index fd1ff895c3..60103aaa58 100644 --- a/database/ffldb/db.go +++ b/database/ffldb/db.go @@ -14,18 +14,18 @@ import ( "sort" "sync" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/database" "github.com/btcsuite/btcd/database/internal/treap" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" - "github.com/btcsuite/goleveldb/leveldb" - "github.com/btcsuite/goleveldb/leveldb/comparer" - ldberrors "github.com/btcsuite/goleveldb/leveldb/errors" - "github.com/btcsuite/goleveldb/leveldb/filter" - "github.com/btcsuite/goleveldb/leveldb/iterator" - "github.com/btcsuite/goleveldb/leveldb/opt" - "github.com/btcsuite/goleveldb/leveldb/util" + "github.com/syndtr/goleveldb/leveldb" + "github.com/syndtr/goleveldb/leveldb/comparer" + ldberrors "github.com/syndtr/goleveldb/leveldb/errors" + "github.com/syndtr/goleveldb/leveldb/filter" + "github.com/syndtr/goleveldb/leveldb/iterator" + "github.com/syndtr/goleveldb/leveldb/opt" + "github.com/syndtr/goleveldb/leveldb/util" ) const ( @@ -950,7 +950,7 @@ type pendingBlock struct { } // transaction represents a database transaction. It can either be read-only or -// read-write and implements the database.Bucket interface. The transaction +// read-write and implements the database.Tx interface. The transaction // provides a root bucket against which all read and writes occur. type transaction struct { managed bool // Is the transaction managed? @@ -966,6 +966,10 @@ type transaction struct { pendingBlocks map[chainhash.Hash]int pendingBlockData []pendingBlock + // Files that need to be deleted on commit. These are the files that + // are marked as files to be deleted during pruning. + pendingDelFileNums []uint32 + // Keys that need to be stored or deleted on commit. pendingKeys *treap.Mutable pendingRemove *treap.Mutable @@ -1015,7 +1019,7 @@ func (tx *transaction) notifyActiveIters() { tx.activeIterLock.RUnlock() } -// checkClosed returns an error if the the database or transaction is closed. +// checkClosed returns an error if the database or transaction is closed. func (tx *transaction) checkClosed() error { // The transaction is no longer valid if it has been closed. if tx.closed { @@ -1593,6 +1597,9 @@ func (tx *transaction) close() { tx.pendingBlocks = nil tx.pendingBlockData = nil + // Clear pending file deletions. + tx.pendingDelFileNums = nil + // Clear pending keys that would have been written or deleted on commit. tx.pendingKeys = nil tx.pendingRemove = nil @@ -1619,6 +1626,21 @@ func (tx *transaction) close() { // // This function MUST only be called when there is pending data to be written. func (tx *transaction) writePendingAndCommit() error { + // Loop through all the pending file deletions and delete them. + // We do this first before doing any of the writes as we can't undo + // deletions of files. + for _, fileNum := range tx.pendingDelFileNums { + // Make sure the file is closed before attempting to delete it. + tx.db.store.closeFile(fileNum) + + err := tx.db.store.deleteFileFunc(fileNum) + if err != nil { + // Nothing we can do if we fail to delete blocks besides + // return an error. + return err + } + } + // Save the current block store write position for potential rollback. // These variables are only updated here in this function and there can // only be one write transaction active at a time, so it's safe to store @@ -1669,6 +1691,117 @@ func (tx *transaction) writePendingAndCommit() error { return tx.db.cache.commitTx(tx) } +// PruneBlocks deletes the block files until it reaches the target size +// (specified in bytes). Throws an error if the target size is below +// the maximum size of a single block file. +// +// This function is part of the database.Tx interface implementation. +func (tx *transaction) PruneBlocks(targetSize uint64) ([]chainhash.Hash, error) { + // Ensure transaction state is valid. + if err := tx.checkClosed(); err != nil { + return nil, err + } + + // Ensure the transaction is writable. + if !tx.writable { + str := "prune blocks requires a writable database transaction" + return nil, makeDbErr(database.ErrTxNotWritable, str, nil) + } + + // Make a local alias for the maxBlockFileSize. + maxSize := uint64(tx.db.store.maxBlockFileSize) + if targetSize < maxSize { + return nil, fmt.Errorf("got target size of %d but it must be greater "+ + "than %d, the max size of a single block file", + targetSize, maxSize) + } + + first, last, lastFileSize, err := scanBlockFiles(tx.db.store.basePath) + if err != nil { + return nil, err + } + + // If we have no files on disk or just a single file on disk, return early. + if first == last { + return nil, nil + } + + // Last file number minus the first file number gives us the count of files + // on disk minus 1. We don't want to count the last file since we can't assume + // that it is of max size. + maxSizeFileCount := last - first + + // If the total size of block files are under the target, return early and + // don't prune. + totalSize := uint64(lastFileSize) + (maxSize * uint64(maxSizeFileCount)) + if totalSize <= targetSize { + return nil, nil + } + + log.Tracef("Using %d more bytes than the target of %d MiB. Pruning files...", + totalSize-targetSize, + targetSize/(1024*1024)) + + deletedFiles := make(map[uint32]struct{}) + + // We use < not <= so that the last file is never deleted. There are other checks in place + // but setting it to < here doesn't hurt. + for i := uint32(first); i < uint32(last); i++ { + // Add the block file to be deleted to the list of files pending deletion to + // delete when the transaction is committed. + if tx.pendingDelFileNums == nil { + tx.pendingDelFileNums = make([]uint32, 0, 1) + } + tx.pendingDelFileNums = append(tx.pendingDelFileNums, i) + + // Add the file index to the deleted files map so that we can later + // delete the block location index. + deletedFiles[i] = struct{}{} + + // If we're already at or below the target usage, break and don't + // try to delete more files. + totalSize -= maxSize + if totalSize <= targetSize { + break + } + } + + // Delete the indexed block locations for the files that we've just deleted. + var deletedBlockHashes []chainhash.Hash + cursor := tx.blockIdxBucket.Cursor() + for ok := cursor.First(); ok; ok = cursor.Next() { + loc := deserializeBlockLoc(cursor.Value()) + + _, found := deletedFiles[loc.blockFileNum] + if found { + deletedBlockHashes = append(deletedBlockHashes, *(*chainhash.Hash)(cursor.Key())) + err := cursor.Delete() + if err != nil { + return nil, err + } + } + } + + log.Tracef("Finished pruning. Database now at %d bytes", totalSize) + + return deletedBlockHashes, nil +} + +// BeenPruned returns if the block storage has ever been pruned. +// +// This function is part of the database.Tx interface implementation. +func (tx *transaction) BeenPruned() (bool, error) { + first, last, _, err := scanBlockFiles(tx.db.store.basePath) + if err != nil { + return false, err + } + + // If the database is pruned, then the first .fdb will not be there. + // We also check that there isn't just 1 file on disk or if there are + // no files on disk by checking if first != last. + return first != 0 && (first != last), nil +} + // Commit commits all changes that have been made to the root metadata bucket // and all of its sub-buckets to the database cache which is periodically synced // to persistent storage. In addition, it commits all new blocks directly to @@ -1941,7 +2074,7 @@ func (db *db) Close() error { return closeErr } -// filesExists reports whether the named file or directory exists. +// fileExists reports whether the named file or directory exists. func fileExists(name string) bool { if _, err := os.Stat(name); err != nil { if os.IsNotExist(err) { @@ -2016,7 +2149,10 @@ func openDB(dbPath string, network wire.BitcoinNet, create bool) (database.DB, e // according to the data that is actually on disk. Also create the // database cache which wraps the underlying leveldb database to provide // write caching. - store := newBlockStore(dbPath, network) + store, err := newBlockStore(dbPath, network) + if err != nil { + return nil, convertErr(err.Error(), err) + } cache := newDbCache(ldb, store, defaultCacheSize, defaultFlushSecs) pdb := &db{store: store, cache: cache} diff --git a/database/ffldb/dbcache.go b/database/ffldb/dbcache.go index a2346b58df..ec42ee969e 100644 --- a/database/ffldb/dbcache.go +++ b/database/ffldb/dbcache.go @@ -11,9 +11,9 @@ import ( "time" "github.com/btcsuite/btcd/database/internal/treap" - "github.com/btcsuite/goleveldb/leveldb" - "github.com/btcsuite/goleveldb/leveldb/iterator" - "github.com/btcsuite/goleveldb/leveldb/util" + "github.com/syndtr/goleveldb/leveldb" + "github.com/syndtr/goleveldb/leveldb/iterator" + "github.com/syndtr/goleveldb/leveldb/util" ) const ( diff --git a/database/ffldb/doc.go b/database/ffldb/doc.go index 96a2992cb9..0001196746 100644 --- a/database/ffldb/doc.go +++ b/database/ffldb/doc.go @@ -10,7 +10,7 @@ This driver is the recommended driver for use with btcd. It makes use leveldb for the metadata, flat files for block storage, and checksums in key areas to ensure data integrity. -Usage +# Usage This package is a driver to the database package and provides the database type of "ffldb". The parameters the Open and Create functions take are the diff --git a/database/ffldb/driver.go b/database/ffldb/driver.go index 28ab8277e9..01290bf09a 100644 --- a/database/ffldb/driver.go +++ b/database/ffldb/driver.go @@ -78,7 +78,7 @@ func init() { UseLogger: useLogger, } if err := database.RegisterDriver(driver); err != nil { - panic(fmt.Sprintf("Failed to regiser database driver '%s': %v", + panic(fmt.Sprintf("Failed to register database driver '%s': %v", dbType, err)) } } diff --git a/database/ffldb/driver_test.go b/database/ffldb/driver_test.go index 8ba6691af3..e48491a12d 100644 --- a/database/ffldb/driver_test.go +++ b/database/ffldb/driver_test.go @@ -5,17 +5,18 @@ package ffldb_test import ( + "bytes" "fmt" "os" "path/filepath" "reflect" - "runtime" "testing" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/database" "github.com/btcsuite/btcd/database/ffldb" - "github.com/btcsuite/btcutil" ) // dbType is the database type name for this driver. @@ -254,6 +255,193 @@ func TestPersistence(t *testing.T) { } } +// TestPrune tests that the older .fdb files are deleted with a call to prune. +func TestPrune(t *testing.T) { + t.Parallel() + + // Create a new database to run tests against. + dbPath := t.TempDir() + db, err := database.Create(dbType, dbPath, blockDataNet) + if err != nil { + t.Errorf("Failed to create test database (%s) %v", dbType, err) + return + } + defer db.Close() + + blockFileSize := uint64(2048) + + testfn := func(t *testing.T, db database.DB) { + // Load the test blocks and save in the test context for use throughout + // the tests. + blocks, err := loadBlocks(t, blockDataFile, blockDataNet) + if err != nil { + t.Errorf("loadBlocks: Unexpected error: %v", err) + return + } + err = db.Update(func(tx database.Tx) error { + for i, block := range blocks { + err := tx.StoreBlock(block) + if err != nil { + return fmt.Errorf("StoreBlock #%d: unexpected error: "+ + "%v", i, err) + } + } + return nil + }) + if err != nil { + t.Fatal(err) + } + + blockHashMap := make(map[chainhash.Hash][]byte, len(blocks)) + for _, block := range blocks { + bytes, err := block.Bytes() + if err != nil { + t.Fatal(err) + } + blockHashMap[*block.Hash()] = bytes + } + + err = db.Update(func(tx database.Tx) error { + _, err := tx.PruneBlocks(1024) + if err == nil { + return fmt.Errorf("Expected an error when attempting to prune" + + "below the maxFileSize") + } + + _, err = tx.PruneBlocks(0) + if err == nil { + return fmt.Errorf("Expected an error when attempting to prune" + + "below the maxFileSize") + } + + return nil + }) + if err != nil { + t.Fatal(err) + } + err = db.View(func(tx database.Tx) error { + pruned, err := tx.BeenPruned() + if err != nil { + return err + } + + if pruned { + err = fmt.Errorf("The database hasn't been pruned but " + + "BeenPruned returned true") + } + return err + }) + if err != nil { + t.Fatal(err) + } + + // Open the first block file before the pruning happens in the + // code snippet below. This let's us test that block files are + // properly closed before attempting to delete them. + err = db.View(func(tx database.Tx) error { + _, err := tx.FetchBlock(blocks[0].Hash()) + if err != nil { + return err + } + return nil + }) + if err != nil { + t.Fatal(err) + } + + var deletedBlocks []chainhash.Hash + + // This should leave 3 files on disk. + err = db.Update(func(tx database.Tx) error { + deletedBlocks, err = tx.PruneBlocks(blockFileSize * 3) + if err != nil { + return err + } + + pruned, err := tx.BeenPruned() + if err != nil { + return err + } + + if pruned { + err = fmt.Errorf("The database hasn't been committed yet " + + "but files were already deleted") + } + return err + }) + if err != nil { + t.Fatal(err) + } + + // The only error we can get is a bad pattern error. Since we're hardcoding + // the pattern, we should not have an error at runtime. + files, _ := filepath.Glob(filepath.Join(dbPath, "*.fdb")) + if len(files) != 3 { + t.Fatalf("Expected to find %d files but got %d", + 3, len(files)) + } + + err = db.View(func(tx database.Tx) error { + pruned, err := tx.BeenPruned() + if err != nil { + return err + } + + if !pruned { + err = fmt.Errorf("The database has been pruned but " + + "BeenPruned returned false") + } + return err + }) + if err != nil { + t.Fatal(err) + } + + // Check that all the blocks that say were deleted are deleted from the + // block index bucket as well. + err = db.View(func(tx database.Tx) error { + for _, deletedBlock := range deletedBlocks { + _, err := tx.FetchBlock(&deletedBlock) + if dbErr, ok := err.(database.Error); !ok || + dbErr.ErrorCode != database.ErrBlockNotFound { + + return fmt.Errorf("Expected ErrBlockNotFound "+ + "but got %v", dbErr) + } + } + + return nil + }) + if err != nil { + t.Fatal(err) + } + + // Check that the not deleted blocks are present. + for _, deletedBlock := range deletedBlocks { + delete(blockHashMap, deletedBlock) + } + err = db.View(func(tx database.Tx) error { + for hash, wantBytes := range blockHashMap { + gotBytes, err := tx.FetchBlock(&hash) + if err != nil { + return err + } + if !bytes.Equal(gotBytes, wantBytes) { + return fmt.Errorf("got bytes %x, want bytes %x", + gotBytes, wantBytes) + } + } + return nil + }) + if err != nil { + t.Fatal(err) + } + } + ffldb.TstRunWithMaxBlockFileSize(db, uint32(blockFileSize), func() { + testfn(t, db) + }) +} + // TestInterface performs all interfaces tests for this database driver. func TestInterface(t *testing.T) { t.Parallel() @@ -278,7 +466,6 @@ func TestInterface(t *testing.T) { } // Run all of the interface tests against the database. - runtime.GOMAXPROCS(runtime.NumCPU()) // Change the maximum file size to a small value to force multiple flat // files with the test data set. diff --git a/database/ffldb/export_test.go b/database/ffldb/export.go similarity index 63% rename from database/ffldb/export_test.go rename to database/ffldb/export.go index 2d8e4d2a2b..0802167ee0 100644 --- a/database/ffldb/export_test.go +++ b/database/ffldb/export.go @@ -2,20 +2,17 @@ // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. -/* -This test file is part of the ffldb package rather than than the ffldb_test -package so it can bridge access to the internals to properly test cases which -are either not possible or can't reliably be tested via the public interface. -The functions are only exported while the tests are being run. -*/ - package ffldb -import "github.com/btcsuite/btcd/database" +import ( + "github.com/btcsuite/btcd/database" +) // TstRunWithMaxBlockFileSize runs the passed function with the maximum allowed // file size for the database set to the provided value. The value will be set // back to the original value upon completion. +// +// Callers should only use this for testing. func TstRunWithMaxBlockFileSize(idb database.DB, size uint32, fn func()) { ffldb := idb.(*db) origSize := ffldb.store.maxBlockFileSize diff --git a/database/ffldb/interface_test.go b/database/ffldb/interface_test.go index 4989913de9..36db769b01 100644 --- a/database/ffldb/interface_test.go +++ b/database/ffldb/interface_test.go @@ -25,11 +25,11 @@ import ( "testing" "time" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/database" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) var ( @@ -255,7 +255,7 @@ func testDeleteValues(tc *testContext, bucket database.Bucket, values []keyPair) return true } -// testCursorInterface ensures the cursor itnerface is working properly by +// testCursorInterface ensures the cursor interface is working properly by // exercising all of its functions on the passed bucket. func testCursorInterface(tc *testContext, bucket database.Bucket) bool { // Ensure a cursor can be obtained for the bucket. @@ -639,7 +639,7 @@ func rollbackOnPanic(t *testing.T, tx database.Tx) { func testMetadataManualTxInterface(tc *testContext) bool { // populateValues tests that populating values works as expected. // - // When the writable flag is false, a read-only tranasction is created, + // When the writable flag is false, a read-only transaction is created, // standard bucket tests for read-only transactions are performed, and // the Commit function is checked to ensure it fails as expected. // @@ -1212,7 +1212,7 @@ func testFetchBlockIOMissing(tc *testContext, tx database.Tx) bool { // testFetchBlockIO ensures all of the block retrieval API functions work as // expected for the provide set of blocks. The blocks must already be stored in -// the database, or at least stored into the the passed transaction. It also +// the database, or at least stored into the passed transaction. It also // tests several error conditions such as ensuring the expected errors are // returned when fetching blocks, headers, and regions that don't exist. func testFetchBlockIO(tc *testContext, tx database.Tx) bool { @@ -1299,8 +1299,7 @@ func testFetchBlockIO(tc *testContext, tx database.Tx) bool { return false } - // Ensure the block header fetched from the database matches the - // expected bytes. + // Ensure block hash exists as expected. hasBlock, err := tx.HasBlock(blockHash) if err != nil { tc.t.Errorf("HasBlock(%s): unexpected error: %v", diff --git a/database/ffldb/ldbtreapiter.go b/database/ffldb/ldbtreapiter.go index b3d6b6bd58..10ce207c7f 100644 --- a/database/ffldb/ldbtreapiter.go +++ b/database/ffldb/ldbtreapiter.go @@ -6,8 +6,8 @@ package ffldb import ( "github.com/btcsuite/btcd/database/internal/treap" - "github.com/btcsuite/goleveldb/leveldb/iterator" - "github.com/btcsuite/goleveldb/leveldb/util" + "github.com/syndtr/goleveldb/leveldb/iterator" + "github.com/syndtr/goleveldb/leveldb/util" ) // ldbTreapIter wraps a treap iterator to provide the additional functionality diff --git a/database/ffldb/whitebox_test.go b/database/ffldb/whitebox_test.go index 4e529363dc..cac4984077 100644 --- a/database/ffldb/whitebox_test.go +++ b/database/ffldb/whitebox_test.go @@ -17,12 +17,12 @@ import ( "path/filepath" "testing" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/database" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" - "github.com/btcsuite/goleveldb/leveldb" - ldberrors "github.com/btcsuite/goleveldb/leveldb/errors" + "github.com/syndtr/goleveldb/leveldb" + ldberrors "github.com/syndtr/goleveldb/leveldb/errors" ) var ( @@ -218,7 +218,7 @@ func TestCornerCases(t *testing.T) { ldb := idb.(*db).cache.ldb ldb.Close() - // Ensure initilization errors in the underlying database work as + // Ensure initialization errors in the underlying database work as // expected. testName = "initDB: reinitialization" wantErrCode = database.ErrDbNotOpen @@ -643,9 +643,9 @@ func TestFailureScenarios(t *testing.T) { // context. maxSize := int64(-1) if maxFileSize, ok := tc.maxFileSizes[fileNum]; ok { - maxSize = int64(maxFileSize) + maxSize = maxFileSize } - file := &mockFile{maxSize: int64(maxSize)} + file := &mockFile{maxSize: maxSize} tc.files[fileNum] = &lockableFile{file: file} return file, nil } diff --git a/database/interface.go b/database/interface.go index 435a8ff581..7c4dd85122 100644 --- a/database/interface.go +++ b/database/interface.go @@ -8,8 +8,8 @@ package database import ( + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg/chainhash" - "github.com/btcsuite/btcutil" ) // Cursor represents a cursor over key/value pairs and nested buckets of a @@ -389,6 +389,26 @@ type Tx interface { // implementations. FetchBlockRegions(regions []BlockRegion) ([][]byte, error) + // PruneBlocks deletes the block files until it reaches the target size + // (specified in bytes). + // + // The interface contract guarantees at least the following errors will + // be returned (other implementation-specific errors are possible): + // - ErrTxNotWritable if attempted against a read-only transaction + // - ErrTxClosed if the transaction has already been closed + // + // NOTE: The data returned by this function is only valid during a + // database transaction. Attempting to access it after a transaction + // has ended results in undefined behavior. This constraint prevents + // additional data copies and allows support for memory-mapped database + // implementations. + PruneBlocks(targetSize uint64) ([]chainhash.Hash, error) + + // BeenPruned returns if the block storage has ever been pruned. + // + // Implementation specific errors are possible. + BeenPruned() (bool, error) + // ****************************************************************** // Methods related to both atomic metadata storage and block storage. // ****************************************************************** diff --git a/database/internal/treap/README.md b/database/internal/treap/README.md index ee49ef9bf6..14c3159a50 100644 --- a/database/internal/treap/README.md +++ b/database/internal/treap/README.md @@ -1,14 +1,14 @@ treap ===== -[![Build Status](https://travis-ci.org/btcsuite/btcd.png?branch=master)](https://travis-ci.org/btcsuite/btcd) +[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions) [![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) -[![GoDoc](https://godoc.org/github.com/btcsuite/btcd/database/internal/treap?status.png)](http://godoc.org/github.com/btcsuite/btcd/database/internal/treap) +[![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) Package treap implements a treap data structure that is used to hold ordered key/value pairs using a combination of binary search tree and heap semantics. It is a self-organizing and randomized data structure that doesn't require -complex operations to to maintain balance. Search, insert, and delete +complex operations to maintain balance. Search, insert, and delete operations are all O(log n). Both mutable and immutable variants are provided. The mutable variant is typically faster since it is able to simply update the diff --git a/database/internal/treap/immutable_test.go b/database/internal/treap/immutable_test.go index e8952c3846..e0a1cb4af6 100644 --- a/database/internal/treap/immutable_test.go +++ b/database/internal/treap/immutable_test.go @@ -344,7 +344,7 @@ func TestImmutableDuplicatePut(t *testing.T) { testTreap = testTreap.Put(key, key) expectedSize += nodeFieldsSize + uint64(len(key)+len(key)) - // Put a duplicate key with the the expected final value. + // Put a duplicate key with the expected final value. testTreap = testTreap.Put(key, expectedVal) // Ensure the key still exists and is the new value. diff --git a/database/internal/treap/treapiter.go b/database/internal/treap/treapiter.go index d6981aafd8..ae7ed853b8 100644 --- a/database/internal/treap/treapiter.go +++ b/database/internal/treap/treapiter.go @@ -318,13 +318,14 @@ func (iter *Iterator) ForceReseek() { // unexpected keys and/or values. // // For example: -// iter := t.Iterator(nil, nil) -// for iter.Next() { -// if someCondition { -// t.Delete(iter.Key()) -// iter.ForceReseek() -// } -// } +// +// iter := t.Iterator(nil, nil) +// for iter.Next() { +// if someCondition { +// t.Delete(iter.Key()) +// iter.ForceReseek() +// } +// } func (t *Mutable) Iterator(startKey, limitKey []byte) *Iterator { iter := &Iterator{ t: t, diff --git a/doc.go b/doc.go index ace26b0f99..47e4e626b7 100644 --- a/doc.go +++ b/doc.go @@ -18,111 +18,145 @@ on Windows. The -C (--configfile) flag, as shown below, can be used to override this location. Usage: - btcd [OPTIONS] + + btcd [OPTIONS] Application Options: - -V, --version Display version information and exit - -C, --configfile= Path to configuration file - -b, --datadir= Directory to store data - --logdir= Directory to log output. - -a, --addpeer= Add a peer to connect with at startup - --connect= Connect only to the specified peers at startup - --nolisten 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 - --listen= Add an interface/port to listen for connections - (default all interfaces port: 8333, testnet: 18333) - --maxpeers= Max number of inbound and outbound peers (125) - --nobanning Disable banning of misbehaving peers - --banduration= How long to ban misbehaving peers. Valid time units - are {s, m, h}. Minimum 1 second (24h0m0s) - --banthreshold= Maximum allowed ban score before disconnecting and - banning misbehaving peers. - --whitelist= Add an IP network or IP that will not be banned. - (eg. 192.168.1.0/24 or ::1) - -u, --rpcuser= Username for RPC connections - -P, --rpcpass= Password for RPC connections - --rpclimituser= Username for limited RPC connections - --rpclimitpass= Password for limited RPC connections - --rpclisten= Add an interface/port to listen for RPC connections - (default port: 8334, testnet: 18334) - --rpccert= File containing the certificate file - --rpckey= File containing the certificate key - --rpcmaxclients= Max number of RPC clients for standard connections - (10) - --rpcmaxwebsockets= Max number of RPC websocket connections (25) - --rpcquirks Mirror some JSON-RPC quirks of Bitcoin Core -- NOTE: - Discouraged unless interoperability issues need to - be worked around - --norpc Disable built-in RPC server -- NOTE: The RPC server - is disabled by default if no rpcuser/rpcpass or - rpclimituser/rpclimitpass is specified - --notls Disable TLS for the RPC server -- NOTE: This is only - allowed if the RPC server is bound to localhost - --nodnsseed Disable DNS seeding for peers - --externalip= Add an ip to the list of local addresses we claim to - listen on to peers - --proxy= Connect via SOCKS5 proxy (eg. 127.0.0.1:9050) - --proxyuser= Username for proxy server - --proxypass= Password for proxy server - --onion= Connect to tor hidden services via SOCKS5 proxy - (eg. 127.0.0.1:9050) - --onionuser= Username for onion proxy server - --onionpass= Password for onion proxy server - --noonion Disable connecting to tor hidden services - --torisolation Enable Tor stream isolation by randomizing user - credentials for each connection. - --testnet Use the test network - --regtest Use the regression test network - --simnet Use the simulation test network - --addcheckpoint= Add a custom checkpoint. Format: ':' - --nocheckpoints Disable built-in checkpoints. Don't do this unless - you know what you're doing. - --uacomment= Comment to add to the user agent -- - See BIP 14 for more information. - --dbtype= Database backend to use for the Block Chain (ffldb) - --profile= Enable HTTP profiling on given port -- NOTE port - must be between 1024 and 65536 - --cpuprofile= Write CPU profile to the specified file - -d, --debuglevel= Logging level for all subsystems {trace, debug, - info, warn, error, critical} -- You may also specify - =,=,... to set - the log level for individual subsystems -- Use show - to list available subsystems (info) - --upnp Use UPnP to map our listening port outside of NAT - --minrelaytxfee= The minimum transaction fee in BTC/kB to be - considered a non-zero fee. - --limitfreerelay= Limit relay of transactions with no transaction fee - to the given amount in thousands of bytes per - minute (15) - --norelaypriority Do not require free or low-fee transactions to have - high priority for relaying - --maxorphantx= Max number of orphan transactions to keep in memory - (100) - --generate Generate (mine) bitcoins using the CPU - --miningaddr= 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 - --blockminsize= Mininum block size in bytes to be used when creating - a block - --blockmaxsize= Maximum block size in bytes to be used when creating - a block (750000) - --blockprioritysize= Size in bytes for high-priority/low-fee transactions - when creating a block (50000) - --nopeerbloomfilters Disable bloom filtering support. - --nocfilters Disable committed filtering (CF) support. - --sigcachemaxsize= The maximum number of entries in the signature - verification cache. - --blocksonly Do not accept transactions from remote peers. - --relaynonstd Relay non-standard transactions regardless of the - default settings for the active network. - --rejectnonstd Reject non-standard transactions regardless of the - default settings for the active network. + + --addcheckpoint= Add a custom checkpoint. Format: + ':' + -a, --addpeer= Add a peer to connect with at startup + --addrindex Maintain a full address-based transaction index + which makes the searchrawtransactions RPC + available + --banduration= How long to ban misbehaving peers. Valid time + units are {s, m, h}. Minimum 1 second (default: + 24h0m0s) + --banthreshold= Maximum allowed ban score before disconnecting + and banning misbehaving peers. (default: 100) + --blockmaxsize= Maximum block size in bytes to be used when + creating a block (default: 750000) + --blockminsize= Minimum block size in bytes to be used when + creating a block + --blockmaxweight= Maximum block weight to be used when creating a + block (default: 3000000) + --blockminweight= Minimum block weight to be used when creating a + block + --blockprioritysize= Size in bytes for high-priority/low-fee + transactions when creating a block (default: + 50000) + --blocksonly Do not accept transactions from remote peers. + -C, --configfile= Path to configuration file + --connect= Connect only to the specified peers at startup + --cpuprofile= Write CPU profile to the specified file + -b, --datadir= Directory to store data + --dbtype= Database backend to use for the Block Chain + (default: ffldb) + -d, --debuglevel= Logging level for all subsystems {trace, debug, + info, warn, error, critical} -- You may also + specify + =,=,... to + set the log level for individual subsystems -- + Use show to list available subsystems (default: + info) + --dropaddrindex Deletes the address-based transaction index from + the database on start up and then exits. + --dropcfindex Deletes the index used for committed filtering + (CF) support from the database on start up and + then exits. + --droptxindex Deletes the hash-based transaction index from the + database on start up and then exits. + --externalip= Add an ip to the list of local addresses we claim + to listen on to peers + --generate Generate (mine) bitcoins using the CPU + --limitfreerelay= Limit relay of transactions with no transaction + fee to the given amount in thousands of bytes per + minute (default: 15) + --listen= Add an interface/port to listen for connections + (default all interfaces port: 8333, testnet: + 18333, signet: 38333) + --logdir= Directory to log output + --maxorphantx= Max number of orphan transactions to keep in + memory (default: 100) + --maxpeers= Max number of inbound and outbound peers + (default: 125) + --miningaddr= 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 + --minrelaytxfee= The minimum transaction fee in BTC/kB to be + considered a non-zero fee. (default: 1e-05) + --nobanning Disable banning of misbehaving peers + --nocfilters Disable committed filtering (CF) support + --nocheckpoints Disable built-in checkpoints. Don't do this + unless you know what you're doing. + --nodnsseed Disable DNS seeding for peers + --nolisten 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 + --noonion Disable connecting to tor hidden services + --nopeerbloomfilters Disable bloom filtering support + --norelaypriority Do not require free or low-fee transactions to + have high priority for relaying + --norpc Disable built-in RPC server -- NOTE: The RPC + server is disabled by default if no + rpcuser/rpcpass or rpclimituser/rpclimitpass is + specified + --notls Disable TLS for the RPC server -- NOTE: This is + only allowed if the RPC server is bound to + localhost + --onion= Connect to tor hidden services via SOCKS5 proxy + (eg. 127.0.0.1:9050) + --onionpass= Password for onion proxy server + --onionuser= Username for onion proxy server + --profile= Enable HTTP profiling on given port -- NOTE port + must be between 1024 and 65536 + --proxy= Connect via SOCKS5 proxy (eg. 127.0.0.1:9050) + --proxypass= Password for proxy server + --proxyuser= Username for proxy server + --regtest Use the regression test network + --rejectnonstd Reject non-standard transactions regardless of + the default settings for the active network. + --relaynonstd Relay non-standard transactions regardless of the + default settings for the active network. + --rpccert= File containing the certificate file + --rpckey= File containing the certificate key + --rpclimitpass= Password for limited RPC connections + --rpclimituser= Username for limited RPC connections + --rpclisten= Add an interface/port to listen for RPC + connections (default port: 8334, testnet: 18334) + --rpcmaxclients= Max number of RPC clients for standard + connections (default: 10) + --rpcmaxconcurrentreqs= Max number of concurrent RPC requests that may be + processed concurrently (default: 20) + --rpcmaxwebsockets= Max number of RPC websocket connections (default: + 25) + --rpcquirks Mirror some JSON-RPC quirks of Bitcoin Core -- + NOTE: Discouraged unless interoperability issues + need to be worked around + -P, --rpcpass= Password for RPC connections + -u, --rpcuser= Username for RPC connections + --sigcachemaxsize= The maximum number of entries in the signature + verification cache (default: 100000) + --simnet Use the simulation test network + --testnet Use the test network + --torisolation Enable Tor stream isolation by randomizing user + credentials for each connection. + --trickleinterval= Minimum time between attempts to send new + inventory to a connected peer (default: 10s) + --txindex Maintain a full hash-based transaction index + which makes all transactions available via the + getrawtransaction RPC + --uacomment= Comment to add to the user agent -- See BIP 14 + for more information. + --upnp Use UPnP to map our listening port outside of NAT + -V, --version Display version information and exit + --whitelist= Add an IP network or IP that will not be banned. + (eg. 192.168.1.0/24 or ::1) Help Options: - -h, --help Show this help message + -h, --help Show this help message */ package main diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000000..a485625d42 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1 @@ +/_build diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000000..d4bb2cbb9e --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index afc58a631e..0000000000 --- a/docs/README.md +++ /dev/null @@ -1,296 +0,0 @@ -### Table of Contents -1. [About](#About) -2. [Getting Started](#GettingStarted) - 1. [Installation](#Installation) - 1. [Windows](#WindowsInstallation) - 2. [Linux/BSD/MacOSX/POSIX](#PosixInstallation) - 1. [Gentoo Linux](#GentooInstallation) - 2. [Configuration](#Configuration) - 3. [Controlling and Querying btcd via btcctl](#BtcctlConfig) - 4. [Mining](#Mining) -3. [Help](#Help) - 1. [Startup](#Startup) - 1. [Using bootstrap.dat](#BootstrapDat) - 2. [Network Configuration](#NetworkConfig) - 3. [Wallet](#Wallet) -4. [Contact](#Contact) - 1. [IRC](#ContactIRC) - 2. [Mailing Lists](#MailingLists) -5. [Developer Resources](#DeveloperResources) - 1. [Code Contribution Guidelines](#ContributionGuidelines) - 2. [JSON-RPC Reference](#JSONRPCReference) - 3. [The btcsuite Bitcoin-related Go Packages](#GoPackages) - - - -### 1. About - -btcd is a full node bitcoin implementation written in [Go](http://golang.org), -licensed under the [copyfree](http://www.copyfree.org) ISC License. - -This project is currently under active development and is in a Beta state. It -is extremely stable and has been in production use since October 2013. - -It properly downloads, validates, and serves the block chain using the exact -rules (including consensus bugs) for block acceptance as Bitcoin Core. We have -taken great care to avoid btcd causing a fork to the block chain. It includes a -full block validation testing framework which contains all of the 'official' -block acceptance tests (and some additional ones) that is run on every pull -request to help ensure it properly follows consensus. Also, it passes all of -the JSON test data in the Bitcoin Core code. - -It also properly relays newly mined blocks, maintains a transaction pool, and -relays individual transactions that have not yet made it into a block. It -ensures all individual transactions admitted to the pool follow the rules -required by the block chain and also includes more strict checks which filter -transactions based on miner requirements ("standard" transactions). - -One key difference between btcd and Bitcoin Core is that btcd does *NOT* include -wallet functionality and this was a very intentional design decision. See the -blog entry [here](https://web.archive.org/web/20171125143919/https://blog.conformal.com/btcd-not-your-moms-bitcoin-daemon) -for more details. This means you can't actually make or receive payments -directly with btcd. That functionality is provided by the -[btcwallet](https://github.com/btcsuite/btcwallet) and -[Paymetheus](https://github.com/btcsuite/Paymetheus) (Windows-only) projects -which are both under active development. - - - -### 2. Getting Started - - - -**2.1 Installation** - -The first step is to install btcd. See one of the following sections for -details on how to install on the supported operating systems. - - - -**2.1.1 Windows Installation**
- -* Install the MSI available at: https://github.com/btcsuite/btcd/releases -* Launch btcd from the Start Menu - -
- -**2.1.2 Linux/BSD/MacOSX/POSIX Installation** - - -- Install Go according to the installation instructions here: - http://golang.org/doc/install - -- Ensure Go was installed properly and is a supported version: - -```bash -$ go version -$ go env GOROOT GOPATH -``` - -NOTE: The `GOROOT` and `GOPATH` above must not be the same path. It is -recommended that `GOPATH` is set to a directory in your home directory such as -`~/goprojects` to avoid write permission issues. It is also recommended to add -`$GOPATH/bin` to your `PATH` at this point. - -- Run the following commands to obtain btcd, all dependencies, and install it: - -```bash -$ git clone https://github.com/btcsuite/btcd $GOPATH/src/github.com/btcsuite/btcd -$ cd $GOPATH/src/github.com/btcsuite/btcd -$ GO111MODULE=on go install -v . ./cmd/... -``` - -- btcd (and utilities) will now be installed in ```$GOPATH/bin```. If you did - not already add the bin directory to your system path during Go installation, - we recommend you do so now. - -**Updating** - -- Run the following commands to update btcd, all dependencies, and install it: - -```bash -$ cd $GOPATH/src/github.com/btcsuite/btcd -$ git pull && GO111MODULE=on go install -v . ./cmd/... -``` - - - -**2.1.2.1 Gentoo Linux Installation** - -* Install Layman and enable the Bitcoin overlay. - * https://gitlab.com/bitcoin/gentoo -* Copy or symlink `/var/lib/layman/bitcoin/Documentation/package.keywords/btcd-live` to `/etc/portage/package.keywords/` -* Install btcd: `$ emerge net-p2p/btcd` - - - -**2.2 Configuration** - -btcd has a number of [configuration](http://godoc.org/github.com/btcsuite/btcd) -options, which can be viewed by running: `$ btcd --help`. - - - -**2.3 Controlling and Querying btcd via btcctl** - -btcctl is a command line utility that can be used to both control and query btcd -via [RPC](http://www.wikipedia.org/wiki/Remote_procedure_call). btcd does -**not** enable its RPC server by default; You must configure at minimum both an -RPC username and password or both an RPC limited username and password: - -* btcd.conf configuration file -``` -[Application Options] -rpcuser=myuser -rpcpass=SomeDecentp4ssw0rd -rpclimituser=mylimituser -rpclimitpass=Limitedp4ssw0rd -``` -* btcctl.conf configuration file -``` -[Application Options] -rpcuser=myuser -rpcpass=SomeDecentp4ssw0rd -``` -OR -``` -[Application Options] -rpclimituser=mylimituser -rpclimitpass=Limitedp4ssw0rd -``` -For a list of available options, run: `$ btcctl --help` - - - -**2.4 Mining** - -btcd supports the `getblocktemplate` RPC. -The limited user cannot access this RPC. - - -**1. Add the payment addresses with the `miningaddr` option.** - -``` -[Application Options] -rpcuser=myuser -rpcpass=SomeDecentp4ssw0rd -miningaddr=12c6DSiU4Rq3P4ZxziKxzrL5LmMBrzjrJX -miningaddr=1M83ju3EChKYyysmM2FXtLNftbacagd8FR -``` - -**2. Add btcd's RPC TLS certificate to system Certificate Authority list.** - -`cgminer` uses [curl](http://curl.haxx.se/) to fetch data from the RPC server. -Since curl validates the certificate by default, we must install the `btcd` RPC -certificate into the default system Certificate Authority list. - -**Ubuntu** - -1. Copy rpc.cert to /usr/share/ca-certificates: `# cp /home/user/.btcd/rpc.cert /usr/share/ca-certificates/btcd.crt` -2. Add btcd.crt to /etc/ca-certificates.conf: `# echo btcd.crt >> /etc/ca-certificates.conf` -3. Update the CA certificate list: `# update-ca-certificates` - -**3. Set your mining software url to use https.** - -`$ cgminer -o https://127.0.0.1:8334 -u rpcuser -p rpcpassword` - - - -### 3. Help - - - -**3.1 Startup** - -Typically btcd will run and start downloading the block chain with no extra -configuration necessary, however, there is an optional method to use a -`bootstrap.dat` file that may speed up the initial block chain download process. - - - -**3.1.1 bootstrap.dat** - -* [Using bootstrap.dat](https://github.com/btcsuite/btcd/tree/master/docs/using_bootstrap_dat.md) - - - -**3.1.2 Network Configuration** - -* [What Ports Are Used by Default?](https://github.com/btcsuite/btcd/tree/master/docs/default_ports.md) -* [How To Listen on Specific Interfaces](https://github.com/btcsuite/btcd/tree/master/docs/configure_peer_server_listen_interfaces.md) -* [How To Configure RPC Server to Listen on Specific Interfaces](https://github.com/btcsuite/btcd/tree/master/docs/configure_rpc_server_listen_interfaces.md) -* [Configuring btcd with Tor](https://github.com/btcsuite/btcd/tree/master/docs/configuring_tor.md) - - - -**3.1 Wallet** - -btcd was intentionally developed without an integrated wallet for security -reasons. Please see [btcwallet](https://github.com/btcsuite/btcwallet) for more -information. - - - - -### 4. Contact - - - -**4.1 IRC** - -* [irc.freenode.net](irc://irc.freenode.net), channel `#btcd` - - - -**4.2 Mailing Lists** - -* btcd: discussion - of btcd and its packages. -* btcd-commits: - readonly mail-out of source code changes. - - - -### 5. Developer Resources - - - -* [Code Contribution Guidelines](https://github.com/btcsuite/btcd/tree/master/docs/code_contribution_guidelines.md) - - - -* [JSON-RPC Reference](https://github.com/btcsuite/btcd/tree/master/docs/json_rpc_api.md) - * [RPC Examples](https://github.com/btcsuite/btcd/tree/master/docs/json_rpc_api.md#ExampleCode) - - - -* The btcsuite Bitcoin-related Go Packages: - * [btcrpcclient](https://github.com/btcsuite/btcd/tree/master/rpcclient) - Implements a - robust and easy to use Websocket-enabled Bitcoin JSON-RPC client - * [btcjson](https://github.com/btcsuite/btcd/tree/master/btcjson) - Provides an extensive API - for the underlying JSON-RPC command and return values - * [wire](https://github.com/btcsuite/btcd/tree/master/wire) - Implements the - Bitcoin wire protocol - * [peer](https://github.com/btcsuite/btcd/tree/master/peer) - - Provides a common base for creating and managing Bitcoin network peers. - * [blockchain](https://github.com/btcsuite/btcd/tree/master/blockchain) - - Implements Bitcoin block handling and chain selection rules - * [blockchain/fullblocktests](https://github.com/btcsuite/btcd/tree/master/blockchain/fullblocktests) - - Provides a set of block tests for testing the consensus validation rules - * [txscript](https://github.com/btcsuite/btcd/tree/master/txscript) - - Implements the Bitcoin transaction scripting language - * [btcec](https://github.com/btcsuite/btcd/tree/master/btcec) - Implements - support for the elliptic curve cryptographic functions needed for the - Bitcoin scripts - * [database](https://github.com/btcsuite/btcd/tree/master/database) - - Provides a database interface for the Bitcoin block chain - * [mempool](https://github.com/btcsuite/btcd/tree/master/mempool) - - Package mempool provides a policy-enforced pool of unmined bitcoin - transactions. - * [btcutil](https://github.com/btcsuite/btcutil) - Provides Bitcoin-specific - convenience functions and types - * [chainhash](https://github.com/btcsuite/btcd/tree/master/chaincfg/chainhash) - - Provides a generic hash type and associated functions that allows the - specific hash algorithm to be abstracted. - * [connmgr](https://github.com/btcsuite/btcd/tree/master/connmgr) - - Package connmgr implements a generic Bitcoin network connection manager. diff --git a/docs/README.md b/docs/README.md new file mode 120000 index 0000000000..dd0ea36c8e --- /dev/null +++ b/docs/README.md @@ -0,0 +1 @@ +index.md \ No newline at end of file diff --git a/docs/code_contribution_guidelines.md b/docs/code_contribution_guidelines.md index b643e911a3..0fc0f74de3 100644 --- a/docs/code_contribution_guidelines.md +++ b/docs/code_contribution_guidelines.md @@ -1,23 +1,4 @@ -### Table of Contents -1. [Overview](#Overview)
-2. [Minimum Recommended Skillset](#MinSkillset)
-3. [Required Reading](#ReqReading)
-4. [Development Practices](#DevelopmentPractices)
-4.1. [Share Early, Share Often](#ShareEarly)
-4.2. [Testing](#Testing)
-4.3. [Code Documentation and Commenting](#CodeDocumentation)
-4.4. [Model Git Commit Messages](#ModelGitCommitMessages)
-5. [Code Approval Process](#CodeApproval)
-5.1 [Code Review](#CodeReview)
-5.2 [Rework Code (if needed)](#CodeRework)
-5.3 [Acceptance](#CodeAcceptance)
-6. [Contribution Standards](#Standards)
-6.1. [Contribution Checklist](#Checklist)
-6.2. [Licensing of Contributions](#Licensing)
- -
- -### 1. Overview +# Code contribution guidelines Developing cryptocurrencies is an exciting endeavor that touches a wide variety of areas such as wire protocols, peer-to-peer networking, databases, @@ -38,9 +19,7 @@ is outlined on this page. We highly encourage code contributions, however it is imperative that you adhere to the guidelines established on this page. - - -### 2. Minimum Recommended Skillset +## Minimum Recommended Skillset The following list is a set of core competencies that we recommend you possess before you really start attempting to contribute code to the project. These are @@ -64,9 +43,7 @@ if you wish to contribute to the cryptography code, you should have a good understanding of the various aspects involved with cryptography such as the security and performance implications. - - -### 3. Required Reading +## Required Reading - [Effective Go](http://golang.org/doc/effective_go.html) - The entire btcd suite follows the guidelines in this document. For your code to be accepted, @@ -74,17 +51,13 @@ security and performance implications. - [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 foundation to build on will make the code much more comprehensible. - - -### 4. Development Practices +## Development Practices Developers are expected to work in their own trees and submit pull requests when they feel their feature or bug fix is ready for integration into the master branch. - - -### 4.1 Share Early, Share Often +## Share Early, Share Often We firmly believe in the share early, share often approach. The basic premise of the approach is to announce your plans **before** you start work, and once @@ -105,9 +78,7 @@ This approach has several benefits: - The quicker your changes are merged to master, the less time you will need to spend rebasing and otherwise trying to keep up with the main code base - - -### 4.2 Testing +## Testing One of the major design goals of all core btcd packages is to aim for complete test coverage. This is financial software so bugs and regressions can cost @@ -126,34 +97,37 @@ checking coverage statistics straight forward. For more information about the test coverage tools, see the [golang cover blog post](http://blog.golang.org/cover). A quick summary of test practices follows: + - All new code should be accompanied by tests that ensure the code behaves correctly when given expected values, and, perhaps even more importantly, that it handles errors gracefully - When you fix a bug, it should be accompanied by tests which exercise the bug to both prove it has been resolved and to prevent future regressions - - -### 4.3 Code Documentation and Commenting +## Code Documentation and Commenting - At a minimum every function must be commented with its intended purpose and any assumptions that it makes - Function comments must always begin with the name of the function per [Effective Go](http://golang.org/doc/effective_go.html) - Function comments should be complete sentences since they allow a wide - variety of automated presentations such as [godoc.org](https://godoc.org) + variety of automated presentations such as [go.dev](https://go.dev) - The general rule of thumb is to look at it as if you were completely unfamiliar with the code and ask yourself, would this give me enough - information to understand what this function does and how I'd probably want - to use it? + information to understand what this function does and how I'd probably want + to use it? - Exported functions should also include detailed information the caller of the - function will likely need to know and/or understand:

+ function will likely need to know and/or understand: + **WRONG** + ```Go // convert a compact uint32 to big.Int func CompactToBig(compact uint32) *big.Int { ``` + **RIGHT** + ```Go // CompactToBig converts a compact representation of a whole number N to a // big integer. The representation is similar to IEEE754 floating point @@ -180,31 +154,35 @@ func CompactToBig(compact uint32) *big.Int { // sign bit, but it is implemented here to stay consistent with bitcoind. func CompactToBig(compact uint32) *big.Int { ``` + - Comments in the body of the code are highly encouraged, but they should explain the intention of the code as opposed to just calling out the - obvious

+ obvious + **WRONG** + ```Go // return err if amt is less than 5460 if amt < 5460 { - return err + return err } ``` + **RIGHT** + ```Go // Treat transactions with amounts less than the amount which is considered dust // as non-standard. if amt < 5460 { - return err + return err } ``` + **NOTE:** The above should really use a constant as opposed to a magic number, but it was left as a magic number to show how much of a difference a good comment can make. -
- -### 4.4 Model Git Commit Messages +## Model Git Commit Messages This project prefers to keep a clean commit history with well-formed commit messages. This section illustrates a model commit message and provides a bit @@ -214,7 +192,7 @@ being provided here. Here’s a model Git commit message: -``` +```text Short (50 chars or less) summary of changes More detailed explanatory text, if necessary. Wrap it to about 72 @@ -245,8 +223,8 @@ commit messages. Here are some of the reasons why wrapping your commit messages to 72 columns is a good thing. -- git log doesn’t do any special special wrapping of the commit messages. With - the default pager of less -S, this means your paragraphs flow far off the edge +- git log doesn’t do any special wrapping of the commit messages. With the + default pager of less -S, this means your paragraphs flow far off the edge of the screen, making them difficult to read. On an 80 column terminal, if we subtract 4 columns for the indent on the left and 4 more for symmetry on the right, we’re left with 72 columns. @@ -255,22 +233,18 @@ a good thing. wrap our plain text emails such that there’s room for a few levels of nested reply indicators without overflow in an 80 column terminal. - - -### 5. Code Approval Process +## Code Approval Process This section describes the code approval process that is used for code contributions. This is how to get your changes into btcd. - - -### 5.1 Code Review +## Code Review All code which is submitted will need to be reviewed before inclusion into the master branch. This process is performed by the project maintainers and usually other committers who are interested in the area you are working in as well. -##### Code Review Timeframe +## Code Review Timeframe The timeframe for a code review will vary greatly depending on factors such as the number of other pull requests which need to be reviewed, the size and @@ -286,7 +260,7 @@ days, while large or far reaching changes may take weeks. This is a good reason to stick with the [Share Early, Share Often](#ShareOften) development practice outlined above. -##### What is the review looking for? +## What is the review looking for? The review is mainly ensuring the code follows the [Development Practices](#DevelopmentPractices) and [Code Contribution Standards](#Standards). However, there are a few other @@ -298,9 +272,7 @@ checks which are generally performed as follows: - The change is not something which is deemed inappropriate by community consensus - - -### 5.2 Rework Code (if needed) +## Rework Code (if needed) After the code review, the change will be accepted immediately if no issues are found. If there are any concerns or questions, you will be provided with @@ -311,9 +283,7 @@ make the necessary changes. This process will continue until the code is finally accepted. - - -### 5.3 Acceptance +## Acceptance Once your code is accepted, it will be integrated with the master branch. Typically it will be rebased and fast-forward merged to master as we prefer to @@ -323,15 +293,11 @@ the master branch and the pull request will be closed. Rejoice as you will now be listed as a [contributor](https://github.com/btcsuite/btcd/graphs/contributors)! - +## Contribution Standards -### 6. Contribution Standards +## Contribution Checklist - - -### 6.1. Contribution Checklist - -- [  ] All changes are Go version 1.3 compliant +- [  ] All changes are Go version 1.17 compliant - [  ] The code being submitted is commented according to the [Code Documentation and Commenting](#CodeDocumentation) section - [  ] For new code: Code is accompanied by tests which exercise both @@ -346,9 +312,7 @@ Rejoice as you will now be listed as a [contributor](https://github.com/btcsuite - [  ] Running [golint](https://github.com/golang/lint) does not report any **new** issues that did not already exist - - -### 6.2. Licensing of Contributions +## Licensing of Contributions All contributions must be licensed with the [ISC license](https://github.com/btcsuite/btcd/blob/master/LICENSE). This is diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000000..3db163052b --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,77 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) +import recommonmark +from recommonmark.transform import AutoStructify + +# -- Project information ----------------------------------------------------- + +project = 'btcd' +copyright = '2020, btcd' +author = 'btcsuite developers' + +# The full version, including alpha/beta/rc tags +release = 'beta' + +source_suffix = ['.md'] + +# The master toctree document. +master_doc = 'index' + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.napoleon', + 'sphinx.ext.mathjax', + 'sphinx_markdown_tables', + 'recommonmark', +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'sphinx_rtd_theme' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# app setup hook +def setup(app): + app.add_config_value('recommonmark_config', { + #'url_resolver': lambda url: github_doc_root + url, + 'auto_toc_tree_section': 'Contents', + 'enable_math': False, + 'enable_inline_math': False, + 'enable_eval_rst': True, + 'enable_auto_doc_ref': True, + }, True) + app.add_transform(AutoStructify) diff --git a/docs/configuration.md b/docs/configuration.md new file mode 100644 index 0000000000..cc1d0dbe44 --- /dev/null +++ b/docs/configuration.md @@ -0,0 +1,190 @@ +# Configuration + +btcd has a number of [configuration](https://pkg.go.dev/github.com/btcsuite/btcd) +options, which can be viewed by running: `$ btcd --help`. + +## Peer server listen interface + +btcd allows you to bind to specific interfaces which enables you to setup +configurations with varying levels of complexity. The listen parameter can be +specified on the command line as shown below with the -- prefix or in the +configuration file without the -- prefix (as can all long command line options). +The configuration file takes one entry per line. + +**NOTE:** The listen flag can be specified multiple times to listen on multiple +interfaces as a couple of the examples below illustrate. + +Command Line Examples: + +|Flags|Comment| +|----------|------------| +|--listen=|all interfaces on default port which is changed by `--testnet` and `--regtest` (**default**)| +|--listen=0.0.0.0|all IPv4 interfaces on default port which is changed by `--testnet` and `--regtest`| +|--listen=::|all IPv6 interfaces on default port which is changed by `--testnet` and `--regtest`| +|--listen=:8333|all interfaces on port 8333| +|--listen=0.0.0.0:8333|all IPv4 interfaces on port 8333| +|--listen=[::]:8333|all IPv6 interfaces on port 8333| +|--listen=127.0.0.1:8333|only IPv4 localhost on port 8333| +|--listen=[::1]:8333|only IPv6 localhost on port 8333| +|--listen=:8336|all interfaces on non-standard port 8336| +|--listen=0.0.0.0:8336|all IPv4 interfaces on non-standard port 8336| +|--listen=[::]:8336|all IPv6 interfaces on non-standard port 8336| +|--listen=127.0.0.1:8337 --listen=[::1]:8333|IPv4 localhost on port 8337 and IPv6 localhost on port 8333| +|--listen=:8333 --listen=:8337|all interfaces on ports 8333 and 8337| + +The following config file would configure btcd to only listen on localhost for both IPv4 and IPv6: + +```text +[Application Options] + +listen=127.0.0.1:8333 +listen=[::1]:8333 +``` + +In addition, if you are starting btcd with TLS and want to make it +available via a hostname, then you will need to generate the TLS +certificates for that host. For example, + +``` +gencerts --host=myhostname.example.com --directory=/home/me/.btcd/ +``` + +## RPC server listen interface + +btcd allows you to bind the RPC server to specific interfaces which enables you +to setup configurations with varying levels of complexity. The `rpclisten` +parameter can be specified on the command line as shown below with the -- prefix +or in the configuration file without the -- prefix (as can all long command line +options). The configuration file takes one entry per line. + +A few things to note regarding the RPC server: + +* The RPC server will **not** be enabled unless the `rpcuser` and `rpcpass` + options are specified. +* When the `rpcuser` and `rpcpass` and/or `rpclimituser` and `rpclimitpass` + options are specified, the RPC server will only listen on localhost IPv4 and + IPv6 interfaces by default. You will need to override the RPC listen + interfaces to include external interfaces if you want to connect from a remote + machine. +* The RPC server has TLS enabled by default, even for localhost. You may use + the `--notls` option to disable it, but only when all listeners are on + localhost interfaces. +* The `--rpclisten` flag can be specified multiple times to listen on multiple + interfaces as a couple of the examples below illustrate. +* The RPC server is disabled by default when using the `--regtest` and + `--simnet` networks. You can override this by specifying listen interfaces. + +Command Line Examples: + +|Flags|Comment| +|----------|------------| +|--rpclisten=|all interfaces on default port which is changed by `--testnet`| +|--rpclisten=0.0.0.0|all IPv4 interfaces on default port which is changed by `--testnet`| +|--rpclisten=::|all IPv6 interfaces on default port which is changed by `--testnet`| +|--rpclisten=:8334|all interfaces on port 8334| +|--rpclisten=0.0.0.0:8334|all IPv4 interfaces on port 8334| +|--rpclisten=[::]:8334|all IPv6 interfaces on port 8334| +|--rpclisten=127.0.0.1:8334|only IPv4 localhost on port 8334| +|--rpclisten=[::1]:8334|only IPv6 localhost on port 8334| +|--rpclisten=:8336|all interfaces on non-standard port 8336| +|--rpclisten=0.0.0.0:8336|all IPv4 interfaces on non-standard port 8336| +|--rpclisten=[::]:8336|all IPv6 interfaces on non-standard port 8336| +|--rpclisten=127.0.0.1:8337 --listen=[::1]:8334|IPv4 localhost on port 8337 and IPv6 localhost on port 8334| +|--rpclisten=:8334 --listen=:8337|all interfaces on ports 8334 and 8337| + +The 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: + +```text +[Application Options] + +rpclisten= +``` + +## Default ports + +While btcd is highly configurable when it comes to the network configuration, +the following is intended to be a quick reference for the default ports used so +port forwarding can be configured as required. + +btcd provides a `--upnp` flag which can be used to automatically map the bitcoin +peer-to-peer listening port if your router supports UPnP. If your router does +not support UPnP, or you don't wish to use it, please note that only the bitcoin +peer-to-peer port should be forwarded unless you specifically want to allow RPC +access to your btcd from external sources such as in more advanced network +configurations. + +|Name|Port| +|----|----| +|Default Bitcoin peer-to-peer port|TCP 8333| +|Default RPC port|TCP 8334| + +## Using bootstrap.dat + +### What is bootstrap.dat? + +It is a flat, binary file containing bitcoin blockchain data starting from the +genesis block and continuing through a relatively recent block height depending +on the last time it was updated. + +See [this](https://bitcointalk.org/index.php?topic=145386.0) thread on +bitcointalk for more details. + +**NOTE:** Using bootstrap.dat is entirely optional. Btcd will download the +block chain from other peers through the Bitcoin protocol with no extra +configuration needed. + +### What are the pros and cons of using bootstrap.dat? + +Pros: + +* Typically accelerates the initial process of bringing up a new node as it + downloads from public P2P nodes and generally is able to achieve faster + download speeds +* It is particularly beneficial when bringing up multiple nodes as you only need + to download the data once + +Cons: + +* Requires you to setup and configure a torrent client if you don't already have + one available +* Requires roughly twice as much disk space since you'll need the flat file as + well as the imported database + +### Where do I get bootstrap.dat? + +The bootstrap.dat file is made available via a torrent. See +[this](https://bitcointalk.org/index.php?topic=145386.0) thread on bitcointalk +for the torrent download details. + +### How do I know I can trust the bootstrap.dat I downloaded? + +You don't need to trust the file as the `addblock` utility verifies every block +using the same rules that are used when downloading the block chain normally +through the Bitcoin protocol. Additionally, the chain rules contain hard-coded +checkpoints for the known-good block chain at periodic intervals. This ensures +that not only is it a valid chain, but it is the same chain that everyone else +is using. + +### How do I use bootstrap.dat with btcd? + +btcd comes with a separate utility named `addblock` which can be used to import +`bootstrap.dat`. This approach is used since the import is a one-time operation +and we prefer to keep the daemon itself as lightweight as possible. + +1. Stop btcd if it is already running. This is required since addblock needs to + access the database used by btcd and it will be locked if btcd is using it. +2. Note the path to the downloaded bootstrap.dat file. +3. Run the addblock utility with the `-i` argument pointing to the location of + bootstrap.dat: + +**Windows:** + +```bat +"%PROGRAMFILES%\Btcd Suite\Btcd\addblock" -i C:\Path\To\bootstrap.dat +``` + +**Linux/Unix/BSD/POSIX:** + +```bash +$GOPATH/bin/addblock -i /path/to/bootstrap.dat +``` diff --git a/docs/configure_peer_server_listen_interfaces.md b/docs/configure_peer_server_listen_interfaces.md deleted file mode 100644 index 26f5ec72a1..0000000000 --- a/docs/configure_peer_server_listen_interfaces.md +++ /dev/null @@ -1,35 +0,0 @@ -btcd allows you to bind to specific interfaces which enables you to setup -configurations with varying levels of complexity. The listen parameter can be -specified on the command line as shown below with the -- prefix or in the -configuration file without the -- prefix (as can all long command line options). -The configuration file takes one entry per line. - -**NOTE:** The listen flag can be specified multiple times to listen on multiple -interfaces as a couple of the examples below illustrate. - -Command Line Examples: - -|Flags|Comment| -|----------|------------| -|--listen=|all interfaces on default port which is changed by `--testnet` and `--regtest` (**default**)| -|--listen=0.0.0.0|all IPv4 interfaces on default port which is changed by `--testnet` and `--regtest`| -|--listen=::|all IPv6 interfaces on default port which is changed by `--testnet` and `--regtest`| -|--listen=:8333|all interfaces on port 8333| -|--listen=0.0.0.0:8333|all IPv4 interfaces on port 8333| -|--listen=[::]:8333|all IPv6 interfaces on port 8333| -|--listen=127.0.0.1:8333|only IPv4 localhost on port 8333| -|--listen=[::1]:8333|only IPv6 localhost on port 8333| -|--listen=:8336|all interfaces on non-standard port 8336| -|--listen=0.0.0.0:8336|all IPv4 interfaces on non-standard port 8336| -|--listen=[::]:8336|all IPv6 interfaces on non-standard port 8336| -|--listen=127.0.0.1:8337 --listen=[::1]:8333|IPv4 localhost on port 8337 and IPv6 localhost on port 8333| -|--listen=:8333 --listen=:8337|all interfaces on ports 8333 and 8337| - -The following config file would configure btcd to only listen on localhost for both IPv4 and IPv6: - -```text -[Application Options] - -listen=127.0.0.1:8333 -listen=[::1]:8333 -``` diff --git a/docs/configure_rpc_server_listen_interfaces.md b/docs/configure_rpc_server_listen_interfaces.md deleted file mode 100644 index 3115d6a16f..0000000000 --- a/docs/configure_rpc_server_listen_interfaces.md +++ /dev/null @@ -1,47 +0,0 @@ -btcd allows you to bind the RPC server to specific interfaces which enables you -to setup configurations with varying levels of complexity. The `rpclisten` -parameter can be specified on the command line as shown below with the -- prefix -or in the configuration file without the -- prefix (as can all long command line -options). The configuration file takes one entry per line. - -A few things to note regarding the RPC server: -* The RPC server will **not** be enabled unless the `rpcuser` and `rpcpass` - options are specified. -* When the `rpcuser` and `rpcpass` and/or `rpclimituser` and `rpclimitpass` - options are specified, the RPC server will only listen on localhost IPv4 and - IPv6 interfaces by default. You will need to override the RPC listen - interfaces to include external interfaces if you want to connect from a remote - machine. -* The RPC server has TLS enabled by default, even for localhost. You may use - the `--notls` option to disable it, but only when all listeners are on - localhost interfaces. -* The `--rpclisten` flag can be specified multiple times to listen on multiple - interfaces as a couple of the examples below illustrate. -* The RPC server is disabled by default when using the `--regtest` and - `--simnet` networks. You can override this by specifying listen interfaces. - -Command Line Examples: - -|Flags|Comment| -|----------|------------| -|--rpclisten=|all interfaces on default port which is changed by `--testnet`| -|--rpclisten=0.0.0.0|all IPv4 interfaces on default port which is changed by `--testnet`| -|--rpclisten=::|all IPv6 interfaces on default port which is changed by `--testnet`| -|--rpclisten=:8334|all interfaces on port 8334| -|--rpclisten=0.0.0.0:8334|all IPv4 interfaces on port 8334| -|--rpclisten=[::]:8334|all IPv6 interfaces on port 8334| -|--rpclisten=127.0.0.1:8334|only IPv4 localhost on port 8334| -|--rpclisten=[::1]:8334|only IPv6 localhost on port 8334| -|--rpclisten=:8336|all interfaces on non-standard port 8336| -|--rpclisten=0.0.0.0:8336|all IPv4 interfaces on non-standard port 8336| -|--rpclisten=[::]:8336|all IPv6 interfaces on non-standard port 8336| -|--rpclisten=127.0.0.1:8337 --listen=[::1]:8334|IPv4 localhost on port 8337 and IPv6 localhost on port 8334| -|--rpclisten=:8334 --listen=:8337|all interfaces on ports 8334 and 8337| - -The 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: - -```text -[Application Options] - -rpclisten= -``` diff --git a/docs/configuring_tor.md b/docs/configuring_tor.md index 442930d6e3..3225b9b541 100644 --- a/docs/configuring_tor.md +++ b/docs/configuring_tor.md @@ -1,25 +1,4 @@ -### Table of Contents -1. [Overview](#Overview)
-2. [Client-Only](#Client)
-2.1 [Description](#ClientDescription)
-2.2 [Command Line Example](#ClientCLIExample)
-2.3 [Config File Example](#ClientConfigFileExample)
-3. [Client-Server via Tor Hidden Service](#HiddenService)
-3.1 [Description](#HiddenServiceDescription)
-3.2 [Command Line Example](#HiddenServiceCLIExample)
-3.3 [Config File Example](#HiddenServiceConfigFileExample)
-4. [Bridge Mode (Not Anonymous)](#Bridge)
-4.1 [Description](#BridgeDescription)
-4.2 [Command Line Example](#BridgeCLIExample)
-4.3 [Config File Example](#BridgeConfigFileExample)
-5. [Tor Stream Isolation](#TorStreamIsolation)
-5.1 [Description](#TorStreamIsolationDescription)
-5.2 [Command Line Example](#TorStreamIsolationCLIExample)
-5.3 [Config File Example](#TorStreamIsolationFileExample)
- -
- -### 1. Overview +# Configuring TOR btcd provides full support for anonymous networking via the [Tor Project](https://www.torproject.org/), including [client-only](#Client) @@ -34,13 +13,7 @@ network to run as both a client and a server so others may connect to you to as you are connecting to them. We recommend you take the time to setup a Tor hidden service for this reason. - - -### 2. Client-Only - - - -**2.1 Description**
+## Client-only Configuring btcd as a Tor client is straightforward. The first step is obviously to install Tor and ensure it is working. Once that is done, all that @@ -58,17 +31,13 @@ NOTE: Specifying the `--proxy` flag disables listening by default since you will not be reachable for inbound connections unless you also configure a Tor [hidden service](#HiddenService). -
- -**2.2 Command Line Example**
+### Command line example ```bash -$ ./btcd --proxy=127.0.0.1:9050 +./btcd --proxy=127.0.0.1:9050 ``` -
- -**2.3 Config File Example**
+### Config file example ```text [Application Options] @@ -76,17 +45,11 @@ $ ./btcd --proxy=127.0.0.1:9050 proxy=127.0.0.1:9050 ``` -
- -### 3. Client-Server via Tor Hidden Service - - - -**3.1 Description**
+## Client-server via Tor hidden service The first step is to configure Tor to provide a hidden service. Documentation for this can be found on the Tor project website -[here](https://www.torproject.org/docs/tor-hidden-service.html.en). However, +[here](https://community.torproject.org/onion-services/setup/). However, there is no need to install a web server locally as the linked instructions discuss since btcd will act as the server. @@ -103,23 +66,20 @@ HiddenServicePort 8333 127.0.0.1:8333 Once Tor is configured to provide the hidden service and you have obtained your generated .onion address, configuring btcd as a Tor hidden service requires three flags: + * `--proxy` to identify the Tor (SOCKS 5) proxy to use for outgoing traffic. This is typically 127.0.0.1:9050. * `--listen` to enable listening for inbound connections since `--proxy` disables listening by default * `--externalip` to set the .onion address that is advertised to other peers -
- -**3.2 Command Line Example**
+### Command line example ```bash -$ ./btcd --proxy=127.0.0.1:9050 --listen=127.0.0.1 --externalip=fooanon.onion +./btcd --proxy=127.0.0.1:9050 --listen=127.0.0.1 --externalip=fooanon.onion ``` -
- -**3.3 Config File Example**
+### Config file example ```text [Application Options] @@ -129,13 +89,7 @@ listen=127.0.0.1 externalip=fooanon.onion ``` -
- -### 4. Bridge Mode (Not Anonymous) - - - -**4.1 Description**
+## Bridge mode (not anonymous) btcd provides support for operating as a bridge between regular nodes and hidden service nodes. In particular this means only traffic which is directed to or @@ -154,17 +108,13 @@ mode, you only need to specify your hidden service's .onion address via the `--externalip` flag since traffic to and from .onion addresses are already routed via Tor due to the `--onion` flag. -
- -**4.2 Command Line Example**
+### Command line example ```bash -$ ./btcd --onion=127.0.0.1:9050 --externalip=fooanon.onion +./btcd --onion=127.0.0.1:9050 --externalip=fooanon.onion ``` -
- -**4.3 Config File Example**
+### Config file example ```text [Application Options] @@ -173,13 +123,7 @@ onion=127.0.0.1:9050 externalip=fooanon.onion ``` -
- -### 5. Tor Stream Isolation - - - -**5.1 Description**
+## Tor stream isolation Tor stream isolation forces Tor to build a new circuit for each connection making it harder to correlate connections. @@ -187,17 +131,13 @@ making it harder to correlate connections. btcd provides support for Tor stream isolation by using the `--torisolation` flag. This option requires --proxy or --onionproxy to be set. -
- -**5.2 Command Line Example**
+### Command line example ```bash -$ ./btcd --proxy=127.0.0.1:9050 --torisolation +./btcd --proxy=127.0.0.1:9050 --torisolation ``` -
- -**5.3 Config File Example**
+### Config file example ```text [Application Options] diff --git a/docs/contact.md b/docs/contact.md new file mode 100644 index 0000000000..1ed9fc0b3a --- /dev/null +++ b/docs/contact.md @@ -0,0 +1,15 @@ +# Contact + +## IRC + +* [irc.libera.chat](irc://irc.libera.chat), channel `#btcd` + +## Mailing Lists + +* [btcd](mailto:btcd+subscribe@opensource.conformal.com): discussion of btcd and its packages. +* [btcd-commits](mailto:btcd-commits+subscribe@opensource.conformal.com): readonly mail-out of source code changes. + +## Issue Tracker + +The [integrated github issue tracker](https://github.com/btcsuite/btcd/issues) +is used for this project. diff --git a/docs/controlling.md b/docs/controlling.md new file mode 100644 index 0000000000..93ab403b2e --- /dev/null +++ b/docs/controlling.md @@ -0,0 +1,34 @@ +# Controlling and querying btcd via btcctl + +btcctl is a command line utility that can be used to both control and query btcd +via [RPC](http://www.wikipedia.org/wiki/Remote_procedure_call). btcd does +**not** enable its RPC server by default; You must configure at minimum both an +RPC username and password or both an RPC limited username and password: + +* btcd.conf configuration file + +```bash +[Application Options] +rpcuser=myuser +rpcpass=SomeDecentp4ssw0rd +rpclimituser=mylimituser +rpclimitpass=Limitedp4ssw0rd +``` + +* btcctl.conf configuration file + +```bash +[Application Options] +rpcuser=myuser +rpcpass=SomeDecentp4ssw0rd +``` + +OR + +```bash +[Application Options] +rpclimituser=mylimituser +rpclimitpass=Limitedp4ssw0rd +``` + +For a list of available options, run: `$ btcctl --help` diff --git a/docs/default_ports.md b/docs/default_ports.md deleted file mode 100644 index 14e4eea2a7..0000000000 --- a/docs/default_ports.md +++ /dev/null @@ -1,15 +0,0 @@ -While btcd is highly configurable when it comes to the network configuration, -the following is intended to be a quick reference for the default ports used so -port forwarding can be configured as required. - -btcd provides a `--upnp` flag which can be used to automatically map the bitcoin -peer-to-peer listening port if your router supports UPnP. If your router does -not support UPnP, or you don't wish to use it, please note that only the bitcoin -peer-to-peer port should be forwarded unless you specifically want to allow RPC -access to your btcd from external sources such as in more advanced network -configurations. - -|Name|Port| -|----|----| -|Default Bitcoin peer-to-peer port|TCP 8333| -|Default RPC port|TCP 8334| diff --git a/docs/developer_resources.md b/docs/developer_resources.md new file mode 100644 index 0000000000..328e1b225a --- /dev/null +++ b/docs/developer_resources.md @@ -0,0 +1,37 @@ +# Developer Resources + +* [Code Contribution Guidelines](https://github.com/btcsuite/btcd/tree/master/docs/code_contribution_guidelines.md) + +* [JSON-RPC Reference](https://github.com/btcsuite/btcd/tree/master/docs/json_rpc_api.md) + * [RPC Examples](https://github.com/btcsuite/btcd/tree/master/docs/json_rpc_api.md#ExampleCode) + +* The btcsuite Bitcoin-related Go Packages: + * [btcrpcclient](https://github.com/btcsuite/btcd/tree/master/rpcclient) - Implements a + robust and easy to use Websocket-enabled Bitcoin JSON-RPC client + * [btcjson](https://github.com/btcsuite/btcd/tree/master/btcjson) - Provides an extensive API + for the underlying JSON-RPC command and return values + * [wire](https://github.com/btcsuite/btcd/tree/master/wire) - Implements the + Bitcoin wire protocol + * [peer](https://github.com/btcsuite/btcd/tree/master/peer) - + Provides a common base for creating and managing Bitcoin network peers. + * [blockchain](https://github.com/btcsuite/btcd/tree/master/blockchain) - + Implements Bitcoin block handling and chain selection rules + * [blockchain/fullblocktests](https://github.com/btcsuite/btcd/tree/master/blockchain/fullblocktests) - + Provides a set of block tests for testing the consensus validation rules + * [txscript](https://github.com/btcsuite/btcd/tree/master/txscript) - + Implements the Bitcoin transaction scripting language + * [btcec](https://github.com/btcsuite/btcd/tree/master/btcec) - Implements + support for the elliptic curve cryptographic functions needed for the + Bitcoin scripts + * [database](https://github.com/btcsuite/btcd/tree/master/database) - + Provides a database interface for the Bitcoin block chain + * [mempool](https://github.com/btcsuite/btcd/tree/master/mempool) - + Package mempool provides a policy-enforced pool of unmined bitcoin + transactions. + * [btcutil](https://github.com/btcsuite/btcd/tree/master/btcutil) - Provides Bitcoin-specific + convenience functions and types + * [chainhash](https://github.com/btcsuite/btcd/tree/master/chaincfg/chainhash) - + Provides a generic hash type and associated functions that allows the + specific hash algorithm to be abstracted. + * [connmgr](https://github.com/btcsuite/btcd/tree/master/connmgr) - + Package connmgr implements a generic Bitcoin network connection manager. diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000000..9d980626d4 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,57 @@ +# btcd + +[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions) +[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) +[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd) + +btcd is an alternative full node bitcoin implementation written in Go (golang). + +This project is currently under active development and is in a Beta state. It +is extremely stable and has been in production use since October 2013. + +It properly downloads, validates, and serves the block chain using the exact +rules (including consensus bugs) for block acceptance as Bitcoin Core. We have +taken great care to avoid btcd causing a fork to the block chain. It includes a +full block validation testing framework which contains all of the 'official' +block acceptance tests (and some additional ones) that is run on every pull +request to help ensure it properly follows consensus. Also, it passes all of +the JSON test data in the Bitcoin Core code. + +It also properly relays newly mined blocks, maintains a transaction pool, and +relays individual transactions that have not yet made it into a block. It +ensures all individual transactions admitted to the pool follow the rules +required by the block chain and also includes more strict checks which filter +transactions based on miner requirements ("standard" transactions). + +One key difference between btcd and Bitcoin Core is that btcd does *NOT* include +wallet functionality and this was a very intentional design decision. See the +blog entry [here](https://web.archive.org/web/20171125143919/https://blog.conformal.com/btcd-not-your-moms-bitcoin-daemon) +for more details. This means you can't actually make or receive payments +directly with btcd. That functionality is provided by the +[btcwallet](https://github.com/btcsuite/btcwallet) and +[Paymetheus](https://github.com/btcsuite/Paymetheus) (Windows-only) projects +which are both under active development. + +## Documentation + +Documentation is a work-in-progress. It is available at [btcd.readthedocs.io](https://btcd.readthedocs.io). + +## Contents + +* [Installation](installation.md) +* [Update](update.md) +* [Configuration](configuration.md) +* [Configuring TOR](configuring_tor.md) +* [Docker](using_docker.md) +* [Controlling](controlling.md) +* [Mining](mining.md) +* [Wallet](wallet.md) +* [Developer resources](developer_resources.md) +* [JSON RPC API](json_rpc_api.md) +* [Code contribution guidelines](code_contribution_guidelines.md) +* [Contact](contact.md) + +## License + +btcd is licensed under the [copyfree](http://copyfree.org) ISC License. + diff --git a/docs/installation.md b/docs/installation.md new file mode 100644 index 0000000000..f6670bd50a --- /dev/null +++ b/docs/installation.md @@ -0,0 +1,76 @@ +# Installation + +The first step is to install btcd. See one of the following sections for +details on how to install on the supported operating systems. + +## Requirements + +[Go](http://golang.org) 1.17 or newer. + +## GPG Verification Key + +All official release tags are signed by Conformal so users can ensure the code +has not been tampered with and is coming from the btcsuite developers. To +verify the signature perform the following: + +* Download the Conformal public key: + https://raw.githubusercontent.com/btcsuite/btcd/master/release/GIT-GPG-KEY-conformal.txt + +* Import the public key into your GPG keyring: + + ```bash + gpg --import GIT-GPG-KEY-conformal.txt + ``` + +* Verify the release tag with the following command where `TAG_NAME` is a + placeholder for the specific tag: + + ```bash + git tag -v TAG_NAME + ``` + +## Windows Installation + +* Install the MSI available at: [btcd windows installer](https://github.com/btcsuite/btcd/releases) +* Launch btcd from the Start Menu + +## Linux/BSD/MacOSX/POSIX Installation + +* Install Go according to the [installation instructions](http://golang.org/doc/install) +* Ensure Go was installed properly and is a supported version: + +```bash +go version +go env GOROOT GOPATH +``` + +NOTE: The `GOROOT` and `GOPATH` above must not be the same path. It is +recommended that `GOPATH` is set to a directory in your home directory such as +`~/goprojects` to avoid write permission issues. It is also recommended to add +`$GOPATH/bin` to your `PATH` at this point. + +* Run the following commands to obtain btcd, all dependencies, and install it: + +```bash +git clone https://github.com/btcsuite/btcd $GOPATH/src/github.com/btcsuite/btcd +cd $GOPATH/src/github.com/btcsuite/btcd +go install -v . ./cmd/... +``` + +* btcd (and utilities) will now be installed in ```$GOPATH/bin```. If you did + not already add the bin directory to your system path during Go installation, + we recommend you do so now. + +## Gentoo Linux Installation + +* [Install Layman](https://gitlab.com/bitcoin/gentoo) and enable the Bitcoin overlay. +* Copy or symlink `/var/lib/layman/bitcoin/Documentation/package.keywords/btcd-live` to `/etc/portage/package.keywords/` +* Install btcd: `$ emerge net-p2p/btcd` + +## Startup + +Typically btcd will run and start downloading the block chain with no extra +configuration necessary, however, there is an optional method to use a +`bootstrap.dat` file that may speed up the initial block chain download process. + +* [Using bootstrap.dat](https://github.com/btcsuite/btcd/blob/master/docs/configuration.md#using-bootstrapdat) diff --git a/docs/json_rpc_api.md b/docs/json_rpc_api.md index 51d4c82c3f..1999a6c245 100644 --- a/docs/json_rpc_api.md +++ b/docs/json_rpc_api.md @@ -1,4 +1,5 @@ -### Table of Contents +# JSON RPC API + 1. [Overview](#Overview)
2. [HTTP POST Versus Websockets](#HttpPostVsWebsockets)
3. [Authentication](#Authentication)
@@ -167,26 +168,27 @@ the method name for further details such as parameter and return information. |8|[getblockcount](#getblockcount)|Y|Returns the number of blocks in the longest block chain.| |9|[getblockhash](#getblockhash)|Y|Returns hash of the block in best block chain at the given height.| |10|[getblockheader](#getblockheader)|Y|Returns the block header of the block.| -|11|[getconnectioncount](#getconnectioncount)|N|Returns the number of active connections to other peers.| -|12|[getdifficulty](#getdifficulty)|Y|Returns the proof-of-work difficulty as a multiple of the minimum difficulty.| -|13|[getgenerate](#getgenerate)|N|Return if the server is set to generate coins (mine) or not.| -|14|[gethashespersec](#gethashespersec)|N|Returns a recent hashes per second performance measurement while generating coins (mining).| -|15|[getinfo](#getinfo)|Y|Returns a JSON object containing various state info.| -|16|[getmempoolinfo](#getmempoolinfo)|N|Returns a JSON object containing mempool-related information.| -|17|[getmininginfo](#getmininginfo)|N|Returns a JSON object containing mining-related information.| -|18|[getnettotals](#getnettotals)|Y|Returns a JSON object containing network traffic statistics.| -|19|[getnetworkhashps](#getnetworkhashps)|Y|Returns the estimated network hashes per second for the block heights provided by the parameters.| -|20|[getpeerinfo](#getpeerinfo)|N|Returns information about each connected network peer as an array of json objects.| -|21|[getrawmempool](#getrawmempool)|Y|Returns an array of hashes for all of the transactions currently in the memory pool.| -|22|[getrawtransaction](#getrawtransaction)|Y|Returns information about a transaction given its hash.| -|23|[help](#help)|Y|Returns a list of all commands or help for a specified command.| -|24|[ping](#ping)|N|Queues a ping to be sent to each connected peer.| -|25|[sendrawtransaction](#sendrawtransaction)|Y|Submits the serialized, hex-encoded transaction to the local peer and relays it to the network.
btcd does not yet implement the `allowhighfees` parameter, so it has no effect| -|26|[setgenerate](#setgenerate) |N|Set the server to generate coins (mine) or not.
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.| -|27|[stop](#stop)|N|Shutdown btcd.| -|28|[submitblock](#submitblock)|Y|Attempts to submit a new serialized, hex-encoded block to the network.| -|29|[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.| -|30|[verifychain](#verifychain)|N|Verifies the block chain database.| +|11|[getchaintips](#getchaintips)|Y|Returns information about all known tips in the block tree, including the main chain as well as orphaned branches.| +|12|[getconnectioncount](#getconnectioncount)|N|Returns the number of active connections to other peers.| +|13|[getdifficulty](#getdifficulty)|Y|Returns the proof-of-work difficulty as a multiple of the minimum difficulty.| +|14|[getgenerate](#getgenerate)|N|Return if the server is set to generate coins (mine) or not.| +|15|[gethashespersec](#gethashespersec)|N|Returns a recent hashes per second performance measurement while generating coins (mining).| +|16|[getinfo](#getinfo)|Y|Returns a JSON object containing various state info.| +|17|[getmempoolinfo](#getmempoolinfo)|N|Returns a JSON object containing mempool-related information.| +|18|[getmininginfo](#getmininginfo)|N|Returns a JSON object containing mining-related information.| +|19|[getnettotals](#getnettotals)|Y|Returns a JSON object containing network traffic statistics.| +|20|[getnetworkhashps](#getnetworkhashps)|Y|Returns the estimated network hashes per second for the block heights provided by the parameters.| +|21|[getpeerinfo](#getpeerinfo)|N|Returns information about each connected network peer as an array of json objects.| +|22|[getrawmempool](#getrawmempool)|Y|Returns an array of hashes for all of the transactions currently in the memory pool.| +|23|[getrawtransaction](#getrawtransaction)|Y|Returns information about a transaction given its hash.| +|24|[help](#help)|Y|Returns a list of all commands or help for a specified command.| +|25|[ping](#ping)|N|Queues a ping to be sent to each connected peer.| +|26|[sendrawtransaction](#sendrawtransaction)|Y|Submits the serialized, hex-encoded transaction to the local peer and relays it to the network.
btcd does not yet implement the `allowhighfees` parameter, so it has no effect| +|27|[setgenerate](#setgenerate) |N|Set the server to generate coins (mine) or not.
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.| +|28|[stop](#stop)|N|Shutdown btcd.| +|29|[submitblock](#submitblock)|Y|Attempts to submit a new serialized, hex-encoded block to the network.| +|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.| +|31|[verifychain](#verifychain)|N|Verifies the block chain database.|
@@ -271,13 +273,13 @@ the method name for further details such as parameter and return information. | | | |---|---| |Method|getblock| -|Parameters|1. block hash (string, required) - the hash of the block
2. verbose (boolean, optional, default=true) - specifies the block is returned as a JSON object instead of hex-encoded string
3. verbosetx (boolean, optional, default=false) - specifies that each transaction is returned as a JSON object and only applies if the `verbose` flag is true.**This parameter is a btcd extension**| +|Parameters|1. block hash (string, required) - the hash of the block
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). |Description|Returns information about a block given its hash.| -|Returns (verbose=false)|`"data" (string) hex-encoded bytes of the serialized block`| -|Returns (verbose=true, verbosetx=false)|`{ (json object)`
  `"hash": "blockhash", (string) the hash of the block (same as provided)`
  `"confirmations": n, (numeric) the number of confirmations`
  `"strippedsize", n (numeric) the size of the block without witness data`
  `"size": n, (numeric) the size of the block`
  `"weight": n, (numeric) value of the weight metric`
  `"height": n, (numeric) the height of the block in the block chain`
  `"version": n, (numeric) the block version`
  `"merkleroot": "hash", (string) root hash of the merkle tree`
  `"tx": [ (json array of string) the transaction hashes`
    `"transactionhash", (string) hash of the parent transaction`
    `...`
  `]`
  `"time": n, (numeric) the block time in seconds since 1 Jan 1970 GMT`
  `"nonce": n, (numeric) the block nonce`
  `"bits", n, (numeric) the bits which represent the block difficulty`
  `difficulty: n.nn, (numeric) the proof-of-work difficulty as a multiple of the minimum difficulty`
  `"previousblockhash": "hash", (string) the hash of the previous block`
  `"nextblockhash": "hash", (string) the hash of the next block (only if there is one)`
`}`| -|Returns (verbose=true, verbosetx=true)|`{ (json object)`
  `"hash": "blockhash", (string) the hash of the block (same as provided)`
  `"confirmations": n, (numeric) the number of confirmations`
  `"strippedsize", n (numeric) the size of the block without witness data`
  `"size": n, (numeric) the size of the block`
  `"weight": n, (numeric) value of the weight metric`
  `"height": n, (numeric) the height of the block in the block chain`
  `"version": n, (numeric) the block version`
  `"merkleroot": "hash", (string) root hash of the merkle tree`
  `"rawtx": [ (array of json objects) the transactions as json objects`
    `(see getrawtransaction json object details)`
  `]`
  `"time": n, (numeric) the block time in seconds since 1 Jan 1970 GMT`
  `"nonce": n, (numeric) the block nonce`
  `"bits", n, (numeric) the bits which represent the block difficulty`
  `difficulty: n.nn, (numeric) the proof-of-work difficulty as a multiple of the minimum difficulty`
  `"previousblockhash": "hash", (string) the hash of the previous block`
  `"nextblockhash": "hash", (string) the hash of the next block`
`}`| -|Example Return (verbose=false)|`"010000000000000000000000000000000000000000000000000000000000000000000000`
`3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a29ab5f49`
`ffff001d1dac2b7c01010000000100000000000000000000000000000000000000000000`
`00000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f`
`4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f`
`6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104`
`678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f`
`4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000"`
**Newlines added for display purposes. The actual return does not contain newlines.**| -|Example Return (verbose=true, verbosetx=false)|`{`
  `"hash": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",`
  `"confirmations": 277113,`
  `"size": 285,`
  `"height": 0,`
  `"version": 1,`
  `"merkleroot": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",`
  `"tx": [`
    `"4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"`
  `],`
  `"time": 1231006505,`
  `"nonce": 2083236893,`
  `"bits": "1d00ffff",`
  `"difficulty": 1,`
  `"previousblockhash": "0000000000000000000000000000000000000000000000000000000000000000",`
  `"nextblockhash": "00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048"`
`}`| +|Returns (verbosity=0)|`"data" (string) hex-encoded bytes of the serialized block`| +|Returns (verbosity=1)|`{ (json object)`
  `"hash": "blockhash", (string) the hash of the block (same as provided)`
  `"confirmations": n, (numeric) the number of confirmations`
  `"strippedsize", n (numeric) the size of the block without witness data`
  `"size": n, (numeric) the size of the block`
  `"weight": n, (numeric) value of the weight metric`
  `"height": n, (numeric) the height of the block in the block chain`
  `"version": n, (numeric) the block version`
  `"merkleroot": "hash", (string) root hash of the merkle tree`
  `"tx": [ (json array of string) the transaction hashes`
    `"transactionhash", (string) hash of the parent transaction`
    `...`
  `]`
  `"time": n, (numeric) the block time in seconds since 1 Jan 1970 GMT`
  `"nonce": n, (numeric) the block nonce`
  `"bits", n, (numeric) the bits which represent the block difficulty`
  `difficulty: n.nn, (numeric) the proof-of-work difficulty as a multiple of the minimum difficulty`
  `"previousblockhash": "hash", (string) the hash of the previous block`
  `"nextblockhash": "hash", (string) the hash of the next block (only if there is one)`
`}`| +|Returns (verbosity=2)|`{ (json object)`
  `"hash": "blockhash", (string) the hash of the block (same as provided)`
  `"confirmations": n, (numeric) the number of confirmations`
  `"strippedsize", n (numeric) the size of the block without witness data`
  `"size": n, (numeric) the size of the block`
  `"weight": n, (numeric) value of the weight metric`
  `"height": n, (numeric) the height of the block in the block chain`
  `"version": n, (numeric) the block version`
  `"merkleroot": "hash", (string) root hash of the merkle tree`
  `"rawtx": [ (array of json objects) the transactions as json objects`
    `(see getrawtransaction json object details)`
  `]`
  `"time": n, (numeric) the block time in seconds since 1 Jan 1970 GMT`
  `"nonce": n, (numeric) the block nonce`
  `"bits", n, (numeric) the bits which represent the block difficulty`
  `difficulty: n.nn, (numeric) the proof-of-work difficulty as a multiple of the minimum difficulty`
  `"previousblockhash": "hash", (string) the hash of the previous block`
  `"nextblockhash": "hash", (string) the hash of the next block`
`}`| +|Example Return (verbosity=0)|`"010000000000000000000000000000000000000000000000000000000000000000000000`
`3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a29ab5f49`
`ffff001d1dac2b7c01010000000100000000000000000000000000000000000000000000`
`00000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f`
`4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f`
`6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104`
`678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f`
`4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000"`
**Newlines added for display purposes. The actual return does not contain newlines.**| +|Example Return (verbosity=1)|`{`
  `"hash": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",`
  `"confirmations": 277113,`
  `"size": 285,`
  `"height": 0,`
  `"version": 1,`
  `"merkleroot": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",`
  `"tx": [`
    `"4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"`
  `],`
  `"time": 1231006505,`
  `"nonce": 2083236893,`
  `"bits": "1d00ffff",`
  `"difficulty": 1,`
  `"previousblockhash": "0000000000000000000000000000000000000000000000000000000000000000",`
  `"nextblockhash": "00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048"`
`}`| [Return to Overview](#MethodOverview)
*** @@ -318,6 +320,18 @@ the method name for further details such as parameter and return information. |Example Return (verbose=true)|`{`
  `"hash": "00000000009e2958c15ff9290d571bf9459e93b19765c6801ddeccadbb160a1e",`
  `"confirmations": 392076,`
  `"height": 100000,`
  `"version": 2,`
  `"merkleroot": "d574f343976d8e70d91cb278d21044dd8a396019e6db70755a0a50e4783dba38",`
  `"time": 1376123972,`
  `"nonce": 1005240617,`
  `"bits": "1c00f127",`
  `"difficulty": 271.75767393,`
  `"previousblockhash": "000000004956cc2edd1a8caa05eacfa3c69f4c490bfc9ace820257834115ab35",`
  `"nextblockhash": "0000000000629d100db387f37d0f37c51118f250fb0946310a8c37316cbc4028"`
`}`| [Return to Overview](#MethodOverview)
+*** +
+ +| | | +|---|---| +|Method|getchaintips| +|Parameters|None| +|Description|Returns information about all known tips in the block tree, including the main chain as well as orphaned branches| +|Returns|`(A json object array)`
`height`: `(numeric)` The height of the chain tip.
`hash`: `(string)` The block hash of the chain tip.
`branchlen`: `(numeric)` Returns zero for main chain. Otherwise is the length of branch connecting the tip to the main chain.
`status`: `(string)` Status of the chain. Returns "active" for the main chain.`| +|Example Return|`["{"height": 1, "hash": "78b945a390c561cf8b9ccf0598be15d7d85c67022bf71083c0b0bd8042fc30d7", "branchlen": 1, "status": "valid-fork"}, {"height": 1, "hash": "584c830a4783c6331e59cb984686cfec14bccc596fe8bbd1660b90cda359b42a", "branchlen": 0, "status": "active"}"]`| +[Return to Overview](#MethodOverview)
+ ***
@@ -458,7 +472,7 @@ Example Return|`{`
  `"bytes": 310768,`
  `"size": |---|---| |Method|help| |Parameters|1. command (string, optional) - the command to get help for| -|Description|Returns a list of all commands or help for a specified command.
When no `command` parameter is specified, a list of avaialable commands is returned
When `command` is a valid method, the help text for that method is returned.| +|Description|Returns a list of all commands or help for a specified command.
When no `command` parameter is specified, a list of available commands is returned
When `command` is a valid method, the help text for that method is returned.| |Returns|string| |Example Return|getblockcount
Returns a numeric for the number of blocks in the longest block chain.| [Return to Overview](#MethodOverview)
@@ -1074,7 +1088,7 @@ various languages. **9.1 Go** This section provides examples of using the RPC interface using Go and the -[btcrpcclient](https://github.com/btcsuite/btcrpcclient) package. +[rpcclient](https://github.com/btcsuite/btcd/tree/master/rpcclient) package. * [Using getblockcount to Retrieve the Current Block Height](#ExampleGetBlockCount) * [Using getblock to Retrieve the Genesis Block](#ExampleGetBlock) @@ -1086,7 +1100,7 @@ This section provides examples of using the RPC interface using Go and the **9.1.1 Using getblockcount to Retrieve the Current Block Height**
The following is an example Go application which uses the -[btcrpcclient](https://github.com/btcsuite/btcrpcclient) package to connect with +[rpcclient](https://github.com/btcsuite/btcd/tree/master/rpcclient) package to connect with a btcd instance via Websockets, issues [getblockcount](#getblockcount) to retrieve the current block height, and displays it. @@ -1094,11 +1108,12 @@ retrieve the current block height, and displays it. package main import ( - "github.com/btcsuite/btcrpcclient" - "github.com/btcsuite/btcutil" "io/ioutil" "log" "path/filepath" + + "github.com/btcsuite/btcd/rpcclient" + "github.com/btcsuite/btcd/btcutil" ) func main() { @@ -1106,7 +1121,7 @@ func main() { // generated by btcd when it starts the RPC server and doesn't already // have one. btcdHomeDir := btcutil.AppDataDir("btcd", false) - certs, err := ioutil.ReadFile(filepath.Join(btcdHomeDir, "rpc.cert")) + certs, err := os.ReadFile(filepath.Join(btcdHomeDir, "rpc.cert")) if err != nil { log.Fatal(err) } @@ -1114,14 +1129,14 @@ func main() { // Create a new RPC client using websockets. Since this example is // not long-lived, the connection will be closed as soon as the program // exits. - connCfg := &btcrpcclient.ConnConfig{ + connCfg := &rpcclient.ConnConfig{ Host: "localhost:8334", Endpoint: "ws", User: "yourrpcuser", Pass: "yourrpcpass", Certificates: certs, } - client, err := btcrpcclient.New(connCfg, nil) + client, err := rpcclient.New(connCfg, nil) if err != nil { log.Fatal(err) } @@ -1139,7 +1154,7 @@ func main() { Which results in: ```bash -Block count: 276978 +2018/08/27 11:17:27 Block count: 536027 ```
@@ -1147,7 +1162,7 @@ Block count: 276978 **9.1.2 Using getblock to Retrieve the Genesis Block**
The following is an example Go application which uses the -[btcrpcclient](https://github.com/btcsuite/btcrpcclient) package to connect with +[rpcclient](https://github.com/btcsuite/btcd/tree/master/rpcclient) package to connect with a btcd instance via Websockets, issues [getblock](#getblock) to retrieve information about the Genesis block, and display a few details about it. @@ -1155,14 +1170,14 @@ information about the Genesis block, and display a few details about it. package main import ( - "github.com/btcsuite/btcrpcclient" - "github.com/btcsuite/btcutil" - "github.com/btcsuite/btcd/chaincfg/chainhash" - "github.com/btcsuite/btcd/wire" "io/ioutil" "log" "path/filepath" "time" + + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/rpcclient" + "github.com/btcsuite/btcd/btcutil" ) func main() { @@ -1170,7 +1185,7 @@ func main() { // generated by btcd when it starts the RPC server and doesn't already // have one. btcdHomeDir := btcutil.AppDataDir("btcd", false) - certs, err := ioutil.ReadFile(filepath.Join(btcdHomeDir, "rpc.cert")) + certs, err := os.ReadFile(filepath.Join(btcdHomeDir, "rpc.cert")) if err != nil { log.Fatal(err) } @@ -1178,14 +1193,14 @@ func main() { // Create a new RPC client using websockets. Since this example is // not long-lived, the connection will be closed as soon as the program // exits. - connCfg := &btcrpcclient.ConnConfig{ + connCfg := &rpcclient.ConnConfig{ Host: "localhost:18334", Endpoint: "ws", User: "yourrpcuser", Pass: "yourrpcpass", Certificates: certs, } - client, err := btcrpcclient.New(connCfg, nil) + client, err := rpcclient.New(connCfg, nil) if err != nil { log.Fatal(err) } @@ -1199,7 +1214,7 @@ func main() { if err != nil { log.Fatal(err) } - block, err := client.GetBlockVerbose(blockHash, false) + block, err := client.GetBlockVerbose(blockHash) if err != nil { log.Fatal(err) } @@ -1225,7 +1240,7 @@ Previous Block: 0000000000000000000000000000000000000000000000000000000000000000 Next Block: 00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048 Merkle root: 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b Timestamp: 2009-01-03 18:15:05 +0000 UTC -Confirmations: 277290 +Confirmations: 534323 Difficulty: 1.000000 Size (in bytes): 285 Num transactions: 1 @@ -1237,7 +1252,7 @@ Num transactions: 1 Notifications (Websocket-specific)**
The following is an example Go application which uses the -[btcrpcclient](https://github.com/btcsuite/btcrpcclient) package to connect with +[rpcclient](https://github.com/btcsuite/btcd/tree/master/rpcclient) package to connect with a btcd instance via Websockets and registers for [blockconnected](#blockconnected) and [blockdisconnected](#blockdisconnected) notifications with [notifyblocks](#notifyblocks). It also sets up handlers for @@ -1247,25 +1262,25 @@ the notifications. package main import ( - "github.com/btcsuite/btcrpcclient" - "github.com/btcsuite/btcutil" - "github.com/btcsuite/btcd/chaincfg/chainhash" - "github.com/btcsuite/btcd/wire" "io/ioutil" "log" "path/filepath" "time" + + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/rpcclient" + "github.com/btcsuite/btcd/btcutil" ) func main() { // Setup handlers for blockconnected and blockdisconnected // notifications. - ntfnHandlers := btcrpcclient.NotificationHandlers{ - OnBlockConnected: func(hash *chainhash.Hash, height int32) { - log.Printf("Block connected: %v (%d)", hash, height) + ntfnHandlers := rpcclient.NotificationHandlers{ + OnBlockConnected: func(hash *chainhash.Hash, height int32, t time.Time) { + log.Printf("Block connected: %v (%d) %s", hash, height, t) }, - OnBlockDisconnected: func(hash *chainhash.Hash, height int32) { - log.Printf("Block disconnected: %v", hash, height) + OnBlockDisconnected: func(hash *chainhash.Hash, height int32, t time.Time) { + log.Printf("Block disconnected: %v (%d) %s", hash, height, t) }, } @@ -1273,20 +1288,20 @@ func main() { // generated by btcd when it starts the RPC server and doesn't already // have one. btcdHomeDir := btcutil.AppDataDir("btcd", false) - certs, err := ioutil.ReadFile(filepath.Join(btcdHomeDir, "rpc.cert")) + certs, err := os.ReadFile(filepath.Join(btcdHomeDir, "rpc.cert")) if err != nil { log.Fatal(err) } // Create a new RPC client using websockets. - connCfg := &btcrpcclient.ConnConfig{ + connCfg := &rpcclient.ConnConfig{ Host: "localhost:8334", Endpoint: "ws", User: "yourrpcuser", Pass: "yourrpcpass", Certificates: certs, } - client, err := btcrpcclient.New(connCfg, &ntfnHandlers) + client, err := rpcclient.New(connCfg, &ntfnHandlers) if err != nil { log.Fatal(err) } @@ -1316,10 +1331,14 @@ func main() { Example output: ``` -2014/05/12 20:33:17 Client shutdown in 10 seconds... -2014/05/12 20:33:19 Block connected: 000000000000000007dff1f95f7b3f5eac2892a4123069517caf34e2c417650d (300461) -2014/05/12 20:33:27 Client shutting down... -2014/05/12 20:31:27 Client shutdown complete. +2018/08/27 10:35:43 Client shutdown in 10 seconds... +2018/08/27 10:35:44 Block connected: 00000000000000000003321723557df58914658dc6fd963d547292a0a4797454 (534747) 2018-08-02 06:37:52 +0800 CST +2018/08/27 10:35:47 Block connected: 0000000000000000002e12773b798fc61dffe00ed5c3e89d3c306f8058c51e13 (534748) 2018-08-02 06:39:54 +0800 CST +2018/08/27 10:35:49 Block connected: 0000000000000000001bb311cd849839ce88499b91a201922f55a1cfafabe267 (534749) 2018-08-02 06:44:22 +0800 CST +2018/08/27 10:35:50 Block connected: 00000000000000000019d7296c9b5c175369ad337ec44b76bd4728021a09b864 (534750) 2018-08-02 06:55:44 +0800 CST +2018/08/27 10:35:53 Block connected: 00000000000000000022db98cf47e944ed58ca450c819e8fef8f8c71ca5d9901 (534751) 2018-08-02 06:57:39 +0800 CST +2018/08/27 10:35:53 Client shutting down... +2018/08/27 10:35:53 Client shutdown complete. ```
diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000000..922152e96a --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/mining.md b/docs/mining.md new file mode 100644 index 0000000000..e6218bed84 --- /dev/null +++ b/docs/mining.md @@ -0,0 +1,30 @@ +# Mining + +btcd supports the `getblocktemplate` RPC. +The limited user cannot access this RPC. + +## Add the payment addresses with the `miningaddr` option + +```bash +[Application Options] +rpcuser=myuser +rpcpass=SomeDecentp4ssw0rd +miningaddr=12c6DSiU4Rq3P4ZxziKxzrL5LmMBrzjrJX +miningaddr=1M83ju3EChKYyysmM2FXtLNftbacagd8FR +``` + +## Add btcd's RPC TLS certificate to system Certificate Authority list + +`cgminer` uses [curl](http://curl.haxx.se/) to fetch data from the RPC server. +Since curl validates the certificate by default, we must install the `btcd` RPC +certificate into the default system Certificate Authority list. + +## Ubuntu + +1. Copy rpc.cert to /usr/share/ca-certificates: `cp /home/user/.btcd/rpc.cert /usr/share/ca-certificates/btcd.crt` +2. Add btcd.crt to /etc/ca-certificates.conf: `echo btcd.crt >> /etc/ca-certificates.conf` +3. Update the CA certificate list: `update-ca-certificates` + +## Set your mining software url to use https + +`cgminer -o https://127.0.0.1:8334 -u rpcuser -p rpcpassword` diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000000..e16dd4b38f --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1 @@ +sphinx_markdown_tables diff --git a/docs/table_of_content.md b/docs/table_of_content.md new file mode 100644 index 0000000000..85f08a97b3 --- /dev/null +++ b/docs/table_of_content.md @@ -0,0 +1,13 @@ +# Contents + +* [Installation](installation.md) +* [Update](update.md) +* [Configuration](configuration.md) +* [Configuring TOR](configuring_tor.md) +* [Controlling](controlling.md) +* [Mining](mining.md) +* [Wallet](wallet.md) +* [Developer resources](developer_resources.md) +* [JSON RPC API](json_rpc_api.md) +* [Code contribution guidelines](code_contribution_guidelines.md) +* [Contact](contact.md) diff --git a/docs/update.md b/docs/update.md new file mode 100644 index 0000000000..3e411a628b --- /dev/null +++ b/docs/update.md @@ -0,0 +1,8 @@ +# Update + +* Run the following commands to update btcd, all dependencies, and install it: + +```bash +cd $GOPATH/src/github.com/btcsuite/btcd +git pull && go install -v . ./cmd/... +``` diff --git a/docs/using_bootstrap_dat.md b/docs/using_bootstrap_dat.md deleted file mode 100644 index de7e08c0ce..0000000000 --- a/docs/using_bootstrap_dat.md +++ /dev/null @@ -1,79 +0,0 @@ -### Table of Contents -1. [What is bootstrap.dat?](#What)
-2. [What are the pros and cons of using bootstrap.dat?](#ProsCons) -3. [Where do I get bootstrap.dat?](#Obtaining) -4. [How do I know I can trust the bootstrap.dat I downloaded?](#Trust) -5. [How do I use bootstrap.dat with btcd?](#Importing) - -
- -### 1. What is bootstrap.dat? - -It is a flat, binary file containing bitcoin blockchain data starting from the -genesis block and continuing through a relatively recent block height depending -on the last time it was updated. - -See [this](https://bitcointalk.org/index.php?topic=145386.0) thread on -bitcointalk for more details. - -**NOTE:** Using bootstrap.dat is entirely optional. Btcd will download the -block chain from other peers through the Bitcoin protocol with no extra -configuration needed. - - - -### 2. What are the pros and cons of using bootstrap.dat? - -Pros: -- Typically accelerates the initial process of bringing up a new node as it - downloads from public P2P nodes and generally is able to achieve faster - download speeds -- It is particularly beneficial when bringing up multiple nodes as you only need - to download the data once - -Cons: -- Requires you to setup and configure a torrent client if you don't already have - one available -- Requires roughly twice as much disk space since you'll need the flat file as - well as the imported database - - - -### 3. Where do I get bootstrap.dat? - -The bootstrap.dat file is made available via a torrent. See -[this](https://bitcointalk.org/index.php?topic=145386.0) thread on bitcointalk -for the torrent download details. - - - -### 4. How do I know I can trust the bootstrap.dat I downloaded? - -You don't need to trust the file as the `addblock` utility verifies every block -using the same rules that are used when downloading the block chain normally -through the Bitcoin protocol. Additionally, the chain rules contain hard-coded -checkpoints for the known-good block chain at periodic intervals. This ensures -that not only is it a valid chain, but it is the same chain that everyone else -is using. - - - -### 5. How do I use bootstrap.dat with btcd? - -btcd comes with a separate utility named `addblock` which can be used to import -`bootstrap.dat`. This approach is used since the import is a one-time operation -and we prefer to keep the daemon itself as lightweight as possible. - -1. Stop btcd if it is already running. This is required since addblock needs to - access the database used by btcd and it will be locked if btcd is using it. -2. Note the path to the downloaded bootstrap.dat file. -3. Run the addblock utility with the `-i` argument pointing to the location of - boostrap.dat:

-**Windows:** -```bat -C:\> "%PROGRAMFILES%\Btcd Suite\Btcd\addblock" -i C:\Path\To\bootstrap.dat -``` -**Linux/Unix/BSD/POSIX:** -```bash -$ $GOPATH/bin/addblock -i /path/to/bootstrap.dat -``` diff --git a/docs/using_docker.md b/docs/using_docker.md new file mode 100644 index 0000000000..6cd41b9d7c --- /dev/null +++ b/docs/using_docker.md @@ -0,0 +1,160 @@ +# Using Docker + +- [Using Docker](#using-docker) + - [Introduction](#introduction) + - [Docker volumes](#docker-volumes) + - [Known error messages when starting the btcd container](#known-error-messages-when-starting-the-btcd-container) + - [Examples](#examples) + - [Preamble](#preamble) + - [Full node without RPC port](#full-node-without-rpc-port) + - [Full node with RPC port](#full-node-with-rpc-port) + - [Full node with RPC port running on TESTNET](#full-node-with-rpc-port-running-on-testnet) + +## Introduction + +With 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). + +This 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/). + +## Docker volumes + +**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/). + +The *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: + +```bash +docker volume ls +docker volume rm btcd-data +``` + +For 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. + +## Known error messages when starting the btcd container + +We 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: + +```bash +Error creating a default config file: open /sample-btcd.conf: no such file or directory +... +[WRN] BTCD: open /root/.btcd/btcd.conf: no such file or directory +``` + +## Examples + +### Preamble + +All following examples uses some defaults: + +- container_name: btcd + Name of the docker container that is be shown by e.g. ```docker ps -a``` + +- hostname: btcd **(very important to set a fixed name before first start)** + 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. + +- restart: unless-stopped + 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. + +To 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. + +```bash +mkdir ~/btcd-docker +cd ~/btcd-docker +touch docker-compose.yaml +nano docker-compose.yaml (use your favourite editor to edit the compose file) +docker-compose up (creates and starts a new btcd container) +``` + +With the following commands you can control *docker-compose*: + +```docker-compose up -d``` (creates and starts the container in background) + +```docker-compose down``` (stops and delete the container. **The docker volume btcd-data will not be deleted**) + +```docker-compose stop``` (stops the container) + +```docker-compose start``` (starts the container) + +```docker ps -a``` (list all running and stopped container) + +```docker volume ls``` (lists all docker volumes) + +```docker logs btcd``` (shows the log ) + +```docker-compose help``` (brings up some helpful information) + +### Full node without RPC port + +Let'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: + +```yaml +version: "2" + +services: + btcd: + container_name: btcd + hostname: btcd + build: https://github.com/btcsuite/btcd.git#master + restart: unless-stopped + volumes: + - btcd-data:/root/.btcd + ports: + - 8333:8333 + +volumes: + btcd-data: +``` + +### Full node with RPC port + +To 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. + +```yaml +version: "2" + +services: + btcd: + container_name: btcd + hostname: btcd + build: https://github.com/btcsuite/btcd.git#master + restart: unless-stopped + volumes: + - btcd-data:/root/.btcd + ports: + - 8333:8333 + - 8334:8334 + command: [ + "--rpcuser=[CHOOSE_A_USERNAME]", + "--rpcpass=[CREATE_A_VERY_HARD_PASSWORD]" + ] + +volumes: + btcd-data: +``` + +### Full node with RPC port running on TESTNET + +To run a node on testnet, you need to provide the *--testnet* argument. The ports for testnet are 18333 (p2p) and 18334 (RPC): + +```yaml +version: "2" + +services: + btcd: + container_name: btcd + hostname: btcd + build: https://github.com/btcsuite/btcd.git#master + restart: unless-stopped + volumes: + - btcd-data:/root/.btcd + ports: + - 18333:18333 + - 18334:18334 + command: [ + "--testnet", + "--rpcuser=[CHOOSE_A_USERNAME]", + "--rpcpass=[CREATE_A_VERY_HARD_PASSWORD]" + ] + +volumes: + btcd-data: +``` diff --git a/docs/wallet.md b/docs/wallet.md new file mode 100644 index 0000000000..cc123aa7d5 --- /dev/null +++ b/docs/wallet.md @@ -0,0 +1,5 @@ +# Wallet + +btcd was intentionally developed without an integrated wallet for security +reasons. Please see [btcwallet](https://github.com/btcsuite/btcwallet) for more +information. diff --git a/go.mod b/go.mod index 606399481f..1f445d9065 100644 --- a/go.mod +++ b/go.mod @@ -1,21 +1,66 @@ module github.com/btcsuite/btcd require ( - github.com/aead/siphash v1.0.1 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.4 + github.com/btcsuite/btcd/btcutil v1.1.5 + github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f - github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd - github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd - github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723 // indirect github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 github.com/btcsuite/winsvc v1.0.0 - github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495 - github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89 + github.com/davecgh/go-spew v1.1.1 + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 + github.com/decred/dcrd/lru v1.0.0 + github.com/gorilla/websocket v1.5.0 + github.com/jessevdk/go-flags v1.4.0 github.com/jrick/logrotate v1.0.0 + github.com/stretchr/testify v1.8.4 + github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 + golang.org/x/crypto v0.22.0 + golang.org/x/sys v0.19.0 +) + +require ( + github.com/aead/siphash v1.0.1 // indirect + github.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect + github.com/golang/snappy v0.0.4 // indirect github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 // indirect - github.com/onsi/ginkgo v1.7.0 // indirect - github.com/onsi/gomega v1.4.3 // indirect - golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44 + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/stretchr/objx v0.5.0 // indirect + golang.org/x/net v0.24.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +// The retract statements below fixes an accidental push of the tags of a btcd +// fork. +retract ( + v0.18.1 + v0.18.0 + v0.17.1 + v0.17.0 + v0.16.5 + v0.16.4 + v0.16.3 + v0.16.2 + v0.16.1 + v0.16.0 + + v0.15.2 + v0.15.1 + v0.15.0 + + v0.14.7 + v0.14.6 + v0.14.6 + v0.14.5 + v0.14.4 + v0.14.3 + v0.14.2 + v0.14.1 + + v0.14.0 + v0.13.0-beta2 + v0.13.0-beta ) -go 1.12 +go 1.17 diff --git a/go.sum b/go.sum index dc773d4775..bb666c89de 100644 --- a/go.sum +++ b/go.sum @@ -1,53 +1,175 @@ github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= +github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= +github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A= +github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= +github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= +github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= +github.com/btcsuite/btcd/btcutil v1.1.5 h1:+wER79R5670vs/ZusMTF1yTcRYE5GUsFbdjdisflzM8= +github.com/btcsuite/btcd/btcutil v1.1.5/go.mod h1:PSZZ4UitpLBWzxGd5VGOrLnmOjtPP/a6HaFo12zMs00= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ= +github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d h1:yJzD/yFppdVCf6ApMkVy8cUxV0XrxdP9rVf6D87/Mng= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd h1:R/opQEbFEy9JGkIguV40SvRY1uliPX8ifOvi6ICsFCw= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd h1:qdGvebPBDuYDPGi1WCPjy1tGyMpmDK8IEapSsszn7HE= github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723 h1:ZA/jbKoGcVAnER6pCHPEkGdZOV7U1oLUedErBHCUMs0= +github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3SkEwmHoWBmX1DNXhXZqlTpq6s4tyJGc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0 h1:J9B4L7e3oqhXOcm+2IuNApwzQec85lE+QaikUcCs+dk= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495 h1:6IyqGr3fnd0tM3YxipK27TUskaOVUjU2nG45yzwcQKY= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/decred/dcrd/lru v1.0.0 h1:Kbsb1SFDsIlaupWPwsPp+dkxiBY1frcS07PCPgotKz8= +github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89 h1:12K8AlpT0/6QUXSfV0yi4Q0jkbq8NDtIKFtF61AoqV0= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0 h1:lQ1bL/n9mBNeIXoTUoYRlK4dHuNJVofX9oWqBtPnSzI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 h1:FOOIBWrEkLgmlgGfMuZT83xIwfPDxEI2OHu6xUmJMFE= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44 h1:9lP3x0pW80sDI6t1UMSLA4to18W7R7imwAI/sWS9S8Q= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= +golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/goclean.sh b/goclean.sh deleted file mode 100755 index 6d0e0ca104..0000000000 --- a/goclean.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash -# The script does automatic checking on a Go package and its sub-packages, including: -# 1. gofmt (http://golang.org/cmd/gofmt/) -# 2. golint (https://github.com/golang/lint) -# 3. go vet (http://golang.org/cmd/vet) -# 4. gosimple (https://github.com/dominikh/go-simple) -# 5. unconvert (https://github.com/mdempsky/unconvert) -# -# gometalinter (github.com/alecthomas/gometalinter) is used to run each static -# checker. - -set -ex - -# Make sure gometalinter is installed and $GOPATH/bin is in your path. -# $ go get -v github.com/alecthomas/gometalinter" -# $ gometalinter --install" -if [ ! -x "$(type -p gometalinter.v2)" ]; then - exit 1 -fi - -linter_targets=$(go list ./...) - -# Automatic checks -test -z "$(gometalinter.v2 -j 4 --disable-all \ ---enable=gofmt \ ---enable=golint \ ---enable=vet \ ---enable=gosimple \ ---enable=unconvert \ ---deadline=10m $linter_targets 2>&1 | grep -v 'ALL_CAPS\|OP_' 2>&1 | tee /dev/stderr)" -GO111MODULE=on go test -tags="rpctest" $linter_targets diff --git a/integration/README.md b/integration/README.md index 52bbf51167..5f6f14eace 100644 --- a/integration/README.md +++ b/integration/README.md @@ -1,7 +1,7 @@ integration =========== -[![Build Status](http://img.shields.io/travis/btcsuite/btcd.svg)](https://travis-ci.org/btcsuite/btcd) +[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions) [![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) This contains integration tests which make use of the diff --git a/integration/bip0009_test.go b/integration/bip0009_test.go index df3721b1e6..5b64480410 100644 --- a/integration/bip0009_test.go +++ b/integration/bip0009_test.go @@ -3,6 +3,7 @@ // license that can be found in the LICENSE file. // This file is ignored during the regular tests due to the following build tag. +//go:build rpctest // +build rpctest package integration @@ -33,7 +34,7 @@ const ( // ensures its version either has the provided bit set or unset per the set // flag. func assertVersionBit(r *rpctest.Harness, t *testing.T, hash *chainhash.Hash, bit uint8, set bool) { - block, err := r.Node.GetBlock(hash) + block, err := r.Client.GetBlock(hash) if err != nil { t.Fatalf("failed to retrieve block %v: %v", hash, err) } @@ -53,7 +54,7 @@ func assertVersionBit(r *rpctest.Harness, t *testing.T, hash *chainhash.Hash, bi // assertChainHeight retrieves the current chain height from the given test // harness and ensures it matches the provided expected height. func assertChainHeight(r *rpctest.Harness, t *testing.T, expectedHeight uint32) { - height, err := r.Node.GetBlockCount() + height, err := r.Client.GetBlockCount() if err != nil { t.Fatalf("failed to retrieve block height: %v", err) } @@ -96,7 +97,7 @@ func assertSoftForkStatus(r *rpctest.Harness, t *testing.T, forkKey string, stat "threshold state %v to string", line, state) } - info, err := r.Node.GetBlockChainInfo() + info, err := r.Client.GetBlockChainInfo() if err != nil { t.Fatalf("failed to retrieve chain info: %v", err) } @@ -129,7 +130,7 @@ func assertSoftForkStatus(r *rpctest.Harness, t *testing.T, forkKey string, stat // specific soft fork deployment to test. func testBIP0009(t *testing.T, forkKey string, deploymentID uint32) { // Initialize the primary mining node with only the genesis block. - r, err := rpctest.New(&chaincfg.RegressionNetParams, nil, nil) + r, err := rpctest.New(&chaincfg.RegressionNetParams, nil, nil, "") if err != nil { t.Fatalf("unable to create primary harness: %v", err) } @@ -196,6 +197,9 @@ func testBIP0009(t *testing.T, forkKey string, deploymentID uint32) { } deployment := &r.ActiveNet.Deployments[deploymentID] activationThreshold := r.ActiveNet.RuleChangeActivationThreshold + if deployment.CustomActivationThreshold != 0 { + activationThreshold = deployment.CustomActivationThreshold + } signalForkVersion := int32(1<= 0 { t.Fatal("transaction was accepted into the mempool " + "but should be rejected!") @@ -366,7 +368,7 @@ func spendCSVOutput(redeemScript []byte, csvUTXO *wire.OutPoint, func assertTxInBlock(r *rpctest.Harness, t *testing.T, blockHash *chainhash.Hash, txid *chainhash.Hash) { - block, err := r.Node.GetBlock(blockHash) + block, err := r.Client.GetBlock(blockHash) if err != nil { t.Fatalf("unable to get block: %v", err) } @@ -390,13 +392,14 @@ func assertTxInBlock(r *rpctest.Harness, t *testing.T, blockHash *chainhash.Hash // 112 and BIP 68 rule-set after the activation of the CSV-package soft-fork. // // Overview: -// - Pre soft-fork: -// - A transaction spending a CSV output validly should be rejected from the -// mempool, but accepted in a valid generated block including the -// transaction. -// - Post soft-fork: -// - See the cases exercised within the table driven tests towards the end -// of this test. +// - Pre soft-fork: +// 1. A transaction spending a CSV output validly should be rejected from the +// mempool, but accepted in a valid generated block including the +// transaction. +// +// - Post soft-fork: +// 1. See the cases exercised within the table driven tests towards the end +// of this test. func TestBIP0068AndBIP0112Activation(t *testing.T) { t.Parallel() @@ -405,7 +408,7 @@ func TestBIP0068AndBIP0112Activation(t *testing.T) { // relative lock times. btcdCfg := []string{"--rejectnonstd"} - r, err := rpctest.New(&chaincfg.SimNetParams, nil, btcdCfg) + r, err := rpctest.New(&chaincfg.SimNetParams, nil, btcdCfg, "") if err != nil { t.Fatal("unable to create primary harness: ", err) } @@ -449,10 +452,10 @@ func TestBIP0068AndBIP0112Activation(t *testing.T) { // As the transaction is p2sh it should be accepted into the // mempool and found within the next generated block. - if _, err := r.Node.SendRawTransaction(tx, true); err != nil { + if _, err := r.Client.SendRawTransaction(tx, true); err != nil { t.Fatalf("unable to broadcast tx: %v", err) } - blocks, err := r.Node.Generate(1) + blocks, err := r.Client.Generate(1) if err != nil { t.Fatalf("unable to generate blocks: %v", err) } @@ -469,7 +472,7 @@ func TestBIP0068AndBIP0112Activation(t *testing.T) { // This transaction should be rejected from the mempool since // CSV validation is already mempool policy pre-fork. - _, err = r.Node.SendRawTransaction(spendingTx, true) + _, err = r.Client.SendRawTransaction(spendingTx, true) if err == nil { t.Fatalf("transaction should have been rejected, but was " + "instead accepted") @@ -496,7 +499,7 @@ func TestBIP0068AndBIP0112Activation(t *testing.T) { // height 299. The getblockchaininfo call checks the state for the // block AFTER the current height. numBlocks := (r.ActiveNet.MinerConfirmationWindow * 2) - 8 - if _, err := r.Node.Generate(numBlocks); err != nil { + if _, err := r.Client.Generate(numBlocks); err != nil { t.Fatalf("unable to generate blocks: %v", err) } @@ -530,7 +533,7 @@ func TestBIP0068AndBIP0112Activation(t *testing.T) { t.Fatalf("unable to create CSV output: %v", err) } - if _, err := r.Node.SendRawTransaction(tx, true); err != nil { + if _, err := r.Client.SendRawTransaction(tx, true); err != nil { t.Fatalf("unable to broadcast transaction: %v", err) } @@ -542,17 +545,17 @@ func TestBIP0068AndBIP0112Activation(t *testing.T) { } // Mine a single block including all the transactions generated above. - if _, err := r.Node.Generate(1); err != nil { + if _, err := r.Client.Generate(1); err != nil { t.Fatalf("unable to generate block: %v", err) } // Now mine 10 additional blocks giving the inputs generated above a // age of 11. Space out each block 10 minutes after the previous block. - prevBlockHash, err := r.Node.GetBestBlockHash() + prevBlockHash, err := r.Client.GetBestBlockHash() if err != nil { t.Fatalf("unable to get prior block hash: %v", err) } - prevBlock, err := r.Node.GetBlock(prevBlockHash) + prevBlock, err := r.Client.GetBlock(prevBlockHash) if err != nil { t.Fatalf("unable to get block: %v", err) } @@ -652,7 +655,7 @@ func TestBIP0068AndBIP0112Activation(t *testing.T) { } for i, test := range tests { - txid, err := r.Node.SendRawTransaction(test.tx, true) + txid, err := r.Client.SendRawTransaction(test.tx, true) switch { // Test case passes, nothing further to report. case test.accept && err == nil: @@ -686,7 +689,7 @@ func TestBIP0068AndBIP0112Activation(t *testing.T) { // Generate a block, the transaction should be included within // the newly mined block. - blockHashes, err := r.Node.Generate(1) + blockHashes, err := r.Client.Generate(1) if err != nil { t.Fatalf("unable to mine block: %v", err) } diff --git a/integration/getchaintips_test.go b/integration/getchaintips_test.go new file mode 100644 index 0000000000..1570ba740c --- /dev/null +++ b/integration/getchaintips_test.go @@ -0,0 +1,350 @@ +package integration + +import ( + "encoding/hex" + "fmt" + "testing" + + "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/integration/rpctest" + "github.com/stretchr/testify/require" +) + +func getBlockFromString(t *testing.T, hexStr string) *btcutil.Block { + t.Helper() + + serializedBlock, err := hex.DecodeString(hexStr) + if err != nil { + t.Fatalf("couldn't decode hex string of %s", hexStr) + } + + block, err := btcutil.NewBlockFromBytes(serializedBlock) + if err != nil { + t.Fatalf("couldn't make a new block from bytes. "+ + "Decoded hex string: %s", hexStr) + } + + return block +} + +// compareMultipleChainTips checks that all the expected chain tips are included in got chain tips and +// verifies that the got chain tip matches the expected chain tip. +func compareMultipleChainTips(t *testing.T, gotChainTips, expectedChainTips []*btcjson.GetChainTipsResult) error { + if len(gotChainTips) != len(expectedChainTips) { + return fmt.Errorf("Expected %d chaintips but got %d", len(expectedChainTips), len(gotChainTips)) + } + + gotChainTipsMap := make(map[string]btcjson.GetChainTipsResult) + for _, gotChainTip := range gotChainTips { + gotChainTipsMap[gotChainTip.Hash] = *gotChainTip + } + + for _, expectedChainTip := range expectedChainTips { + gotChainTip, found := gotChainTipsMap[expectedChainTip.Hash] + if !found { + return fmt.Errorf("Couldn't find expected chaintip with hash %s", expectedChainTip.Hash) + } + + require.Equal(t, gotChainTip, *expectedChainTip) + } + + return nil +} + +func TestGetChainTips(t *testing.T) { + // block1Hex is a block that builds on top of the regtest genesis block. + // Has blockhash of "36c056247e8c0589f6307995e4e13acf2b2b79cad9ecd5a4eeab2131ed0ecde5". + block1Hex := "0000002006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf18891" + + "0f71881025ae0d41ce8748b79ac40e5f3197af3bb83a594def7943aff0fce504c638ea6d63f" + + "fff7f2000000000010200000000010100000000000000000000000000000000000000000000" + + "00000000000000000000ffffffff025100ffffffff0200f2052a010000001600149b0f9d020" + + "8b3b425246e16830562a63bf1c701180000000000000000266a24aa21a9ede2f61c3f71d1de" + + "fd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000" + + "000000000000000000000000000000000000000000000000000" + + // block2Hex is a block that builds on top of block1Hex. + // Has blockhash of "664b51334782a4ad16e8471b530dcd0027c75b8c25187b41dfc85ecd353295c6". + block2Hex := "00000020e5cd0eed3121abeea4d5ecd9ca792b2bcf3ae1e4957930f689058c7e2456c0" + + "362a78a11b875d31af2ea493aa5b6b623e0d481f11e69f7147ab974be9da087f3e24696f63f" + + "fff7f2001000000010200000000010100000000000000000000000000000000000000000000" + + "00000000000000000000ffffffff025200ffffffff0200f2052a0100000016001470fea1feb" + + "4969c1f237753ae29c0217c6637835c0000000000000000266a24aa21a9ede2f61c3f71d1de" + + "fd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000" + + "000000000000000000000000000000000000000000000000000" + + // block3Hex is a block that builds on top of block2Hex. + // Has blockhash of "17a5c5cb90ecde5a46dd195d434eea46b653e35e4517070eade429db3ac83944". + block3Hex := "00000020c6953235cd5ec8df417b18258c5bc72700cd0d531b47e816ada4824733514b" + + "66c3ad4d567a36c20df07ea0b7fce1e4b4ee5be3eaf0b946b0ae73f3a74d47f0cf99696f63f" + + "fff7f2000000000010200000000010100000000000000000000000000000000000000000000" + + "00000000000000000000ffffffff025300ffffffff0200f2052a010000001600140e835869b" + + "154f647d11376634b5e8c785e7d21060000000000000000266a24aa21a9ede2f61c3f71d1de" + + "fd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000" + + "000000000000000000000000000000000000000000000000000" + + // block4Hex is a block that builds on top of block3Hex. + // Has blockhash of "7b357f3073c4397d6d069a32a09141c32560f3c62233ca138eb5e03c5991f45c". + block4Hex := "000000204439c83adb29e4ad0e0717455ee353b646ea4e435d19dd465adeec90cbc5a5" + + "17ab639a5dd622e90f5f9feffc1c7c28f47a2caf85c21d7dd52cd223a7164619e37a6a6f63f" + + "fff7f2004000000010200000000010100000000000000000000000000000000000000000000" + + "00000000000000000000ffffffff025400ffffffff0200f2052a01000000160014a157c74b4" + + "42a3e11b45cf5273f8c0c032c5a40ed0000000000000000266a24aa21a9ede2f61c3f71d1de" + + "fd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000" + + "000000000000000000000000000000000000000000000000000" + + // block2aHex is a block that builds on top of block1Hex. + // Has blockhash of "5181a4e34cc23ed95c69749dedf4cc7ebd659243bc1683372f8940c8cd8f9b68". + block2aHex := "00000020e5cd0eed3121abeea4d5ecd9ca792b2bcf3ae1e4957930f689058c7e2456c" + + "036f7d4ebe524260c9b6c2b5e3d105cad0b7ddfaeaa29971363574fc1921a3f2f7ad66b6f63" + + "ffff7f200100000001020000000001010000000000000000000000000000000000000000000" + + "000000000000000000000ffffffff025200ffffffff0200f2052a0100000016001466fca22d" + + "0e4679d119ea1e127c984746a1f7e66c0000000000000000266a24aa21a9ede2f61c3f71d1d" + + "efd3fa999dfa36953755c690689799962b48bebd836974e8cf9012000000000000000000000" + + "0000000000000000000000000000000000000000000000000000" + + // block3aHex is a block that builds on top of block2aHex. + // Has blockhash of "0b0216936d1a5c01362256d06a9c9a2b13768fa2f2748549a71008af36dd167f". + block3aHex := "00000020689b8fcdc840892f378316bc439265bd7eccf4ed9d74695cd93ec24ce3a48" + + "15161a430ce5cae955b1254b753bc95854d942947855d3ae59002de9773b7fe65fdf16b6f63" + + "ffff7f200100000001020000000001010000000000000000000000000000000000000000000" + + "000000000000000000000ffffffff025300ffffffff0200f2052a0100000016001471da0afb" + + "883c228b18af6bd0cabc471aebe8d1750000000000000000266a24aa21a9ede2f61c3f71d1d" + + "efd3fa999dfa36953755c690689799962b48bebd836974e8cf9012000000000000000000000" + + "0000000000000000000000000000000000000000000000000000" + + // block4aHex is a block that builds on top of block3aHex. + // Has blockhash of "65a00a026eaa83f6e7a7f4a920faa090f3f9d3565a56df2362db2ab2fa14ccec". + block4aHex := "000000207f16dd36af0810a7498574f2a28f76132b9a9c6ad0562236015c1a6d93160" + + "20b951fa5ee5072d88d6aef9601999307dbd8d96dad067b80bfe04afe81c7a8c21beb706f63" + + "ffff7f200000000001020000000001010000000000000000000000000000000000000000000" + + "000000000000000000000ffffffff025400ffffffff0200f2052a01000000160014fd1f118c" + + "95a712b8adef11c3cc0643bcb6b709f10000000000000000266a24aa21a9ede2f61c3f71d1d" + + "efd3fa999dfa36953755c690689799962b48bebd836974e8cf9012000000000000000000000" + + "0000000000000000000000000000000000000000000000000000" + + // block5aHex is a block that builds on top of block4aHex. + // Has blockhash of "5c8814bc034a4c37fa5ccdc05e09b45a771bd7505d68092f21869a912737ee10". + block5aHex := "00000020eccc14fab22adb6223df565a56d3f9f390a0fa20a9f4a7e7f683aa6e020aa" + + "0656331bd4fcd3db611de7fbf72ef3dff0b85b244b5a983d5c0270e728214f67f9aaa766f63" + + "ffff7f200600000001020000000001010000000000000000000000000000000000000000000" + + "000000000000000000000ffffffff025500ffffffff0200f2052a0100000016001438335896" + + "ad1d087e3541436a5b293c0d23ad27e60000000000000000266a24aa21a9ede2f61c3f71d1d" + + "efd3fa999dfa36953755c690689799962b48bebd836974e8cf9012000000000000000000000" + + "0000000000000000000000000000000000000000000000000000" + + // block4bHex is a block that builds on top of block3aHex. + // Has blockhash of "130458e795cc46f2759195e92737426fb0ada2a07f98434551ffb7500b23c161". + block4bHex := "000000207f16dd36af0810a7498574f2a28f76132b9a9c6ad0562236015c1a6d93160" + + "20b14f9ce93d0144c383fea72f408b06b268a1523a029b825a1edfa15b367f6db2cfd7d6f63" + + "ffff7f200200000001020000000001010000000000000000000000000000000000000000000" + + "000000000000000000000ffffffff025400ffffffff0200f2052a0100000016001405b5ba2d" + + "1e549c4c84a623de3575948d3ef8a27f0000000000000000266a24aa21a9ede2f61c3f71d1d" + + "efd3fa999dfa36953755c690689799962b48bebd836974e8cf9012000000000000000000000" + + "0000000000000000000000000000000000000000000000000000" + + // Set up regtest chain. + r, err := rpctest.New(&chaincfg.RegressionNetParams, nil, nil, "") + if err != nil { + t.Fatal("TestGetChainTips fail. Unable to create primary harness: ", err) + } + if err := r.SetUp(true, 0); err != nil { + t.Fatalf("TestGetChainTips fail. Unable to setup test chain: %v", err) + } + defer r.TearDown() + + // Immediately call getchaintips after setting up regtest. + gotChainTips, err := r.Client.GetChainTips() + if err != nil { + t.Fatal(err) + } + // We expect a single genesis block. + expectedChainTips := []*btcjson.GetChainTipsResult{ + { + Height: 0, + Hash: chaincfg.RegressionNetParams.GenesisHash.String(), + BranchLen: 0, + Status: "active", + }, + } + err = compareMultipleChainTips(t, gotChainTips, expectedChainTips) + if err != nil { + t.Fatalf("TestGetChainTips fail. Error: %v", err) + } + + // Submit 4 blocks. + // + // Our chain view looks like so: + // (genesis block) -> 1 -> 2 -> 3 -> 4 + blockStrings := []string{block1Hex, block2Hex, block3Hex, block4Hex} + for _, blockString := range blockStrings { + block := getBlockFromString(t, blockString) + err = r.Client.SubmitBlock(block, nil) + if err != nil { + t.Fatal(err) + } + } + + gotChainTips, err = r.Client.GetChainTips() + if err != nil { + t.Fatal(err) + } + expectedChainTips = []*btcjson.GetChainTipsResult{ + { + Height: 4, + Hash: getBlockFromString(t, blockStrings[len(blockStrings)-1]).Hash().String(), + BranchLen: 0, + Status: "active", + }, + } + err = compareMultipleChainTips(t, gotChainTips, expectedChainTips) + if err != nil { + t.Fatalf("TestGetChainTips fail. Error: %v", err) + } + + // Submit 2 blocks that don't build on top of the current active tip. + // + // Our chain view looks like so: + // (genesis block) -> 1 -> 2 -> 3 -> 4 (active) + // \ -> 2a -> 3a (valid-fork) + blockStrings = []string{block2aHex, block3aHex} + for _, blockString := range blockStrings { + block := getBlockFromString(t, blockString) + err = r.Client.SubmitBlock(block, nil) + if err != nil { + t.Fatal(err) + } + } + + gotChainTips, err = r.Client.GetChainTips() + if err != nil { + t.Fatal(err) + } + expectedChainTips = []*btcjson.GetChainTipsResult{ + { + Height: 4, + Hash: getBlockFromString(t, block4Hex).Hash().String(), + BranchLen: 0, + Status: "active", + }, + { + Height: 3, + Hash: getBlockFromString(t, block3aHex).Hash().String(), + BranchLen: 2, + Status: "valid-fork", + }, + } + err = compareMultipleChainTips(t, gotChainTips, expectedChainTips) + if err != nil { + t.Fatalf("TestGetChainTips fail. Error: %v", err) + } + + // Submit a single block that don't build on top of the current active tip. + // + // Our chain view looks like so: + // (genesis block) -> 1 -> 2 -> 3 -> 4 (active) + // \ -> 2a -> 3a -> 4a (valid-fork) + block := getBlockFromString(t, block4aHex) + err = r.Client.SubmitBlock(block, nil) + if err != nil { + t.Fatal(err) + } + + gotChainTips, err = r.Client.GetChainTips() + if err != nil { + t.Fatal(err) + } + expectedChainTips = []*btcjson.GetChainTipsResult{ + { + Height: 4, + Hash: getBlockFromString(t, block4Hex).Hash().String(), + BranchLen: 0, + Status: "active", + }, + { + Height: 4, + Hash: getBlockFromString(t, block4aHex).Hash().String(), + BranchLen: 3, + Status: "valid-fork", + }, + } + err = compareMultipleChainTips(t, gotChainTips, expectedChainTips) + if err != nil { + t.Fatalf("TestGetChainTips fail. Error: %v", err) + } + + // Submit a single block that changes the active branch to 5a. + // + // Our chain view looks like so: + // (genesis block) -> 1 -> 2 -> 3 -> 4 (valid-fork) + // \ -> 2a -> 3a -> 4a -> 5a (active) + block = getBlockFromString(t, block5aHex) + err = r.Client.SubmitBlock(block, nil) + if err != nil { + t.Fatal(err) + } + gotChainTips, err = r.Client.GetChainTips() + if err != nil { + t.Fatal(err) + } + expectedChainTips = []*btcjson.GetChainTipsResult{ + { + Height: 4, + Hash: getBlockFromString(t, block4Hex).Hash().String(), + BranchLen: 3, + Status: "valid-fork", + }, + { + Height: 5, + Hash: getBlockFromString(t, block5aHex).Hash().String(), + BranchLen: 0, + Status: "active", + }, + } + err = compareMultipleChainTips(t, gotChainTips, expectedChainTips) + if err != nil { + t.Fatalf("TestGetChainTips fail. Error: %v", err) + } + + // Submit a single block that builds on top of 3a. + // + // Our chain view looks like so: + // (genesis block) -> 1 -> 2 -> 3 -> 4 (valid-fork) + // \ -> 2a -> 3a -> 4a -> 5a (active) + // \ -> 4b (valid-fork) + block = getBlockFromString(t, block4bHex) + err = r.Client.SubmitBlock(block, nil) + if err != nil { + t.Fatal(err) + } + gotChainTips, err = r.Client.GetChainTips() + if err != nil { + t.Fatal(err) + } + expectedChainTips = []*btcjson.GetChainTipsResult{ + { + Height: 4, + Hash: getBlockFromString(t, block4Hex).Hash().String(), + BranchLen: 3, + Status: "valid-fork", + }, + { + Height: 5, + Hash: getBlockFromString(t, block5aHex).Hash().String(), + BranchLen: 0, + Status: "active", + }, + { + Height: 4, + Hash: getBlockFromString(t, block4bHex).Hash().String(), + BranchLen: 1, + Status: "valid-fork", + }, + } + + err = compareMultipleChainTips(t, gotChainTips, expectedChainTips) + if err != nil { + t.Fatalf("TestGetChainTips fail. Error: %v", err) + } +} diff --git a/integration/invalidate_reconsider_block_test.go b/integration/invalidate_reconsider_block_test.go new file mode 100644 index 0000000000..4fe6ff0012 --- /dev/null +++ b/integration/invalidate_reconsider_block_test.go @@ -0,0 +1,244 @@ +package integration + +import ( + "testing" + + "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/integration/rpctest" +) + +func TestInvalidateAndReconsiderBlock(t *testing.T) { + // Set up regtest chain. + r, err := rpctest.New(&chaincfg.RegressionNetParams, nil, nil, "") + if err != nil { + t.Fatalf("TestInvalidateAndReconsiderBlock fail."+ + "Unable to create primary harness: %v", err) + } + if err := r.SetUp(true, 0); err != nil { + t.Fatalf("TestInvalidateAndReconsiderBlock fail. "+ + "Unable to setup test chain: %v", err) + } + defer r.TearDown() + + // Generate 4 blocks. + // + // Our chain view looks like so: + // (genesis block) -> 1 -> 2 -> 3 -> 4 + _, err = r.Client.Generate(4) + if err != nil { + t.Fatal(err) + } + + // Cache the active tip hash. + block4ActiveTipHash, err := r.Client.GetBestBlockHash() + if err != nil { + t.Fatal(err) + } + + // Cache block 1 hash as this will be our chaintip after we invalidate block 2. + block1Hash, err := r.Client.GetBlockHash(1) + if err != nil { + t.Fatal(err) + } + + // Invalidate block 2. + // + // Our chain view looks like so: + // (genesis block) -> 1 (active) + // \ -> 2 -> 3 -> 4 (invalid) + block2Hash, err := r.Client.GetBlockHash(2) + if err != nil { + t.Fatal(err) + } + err = r.Client.InvalidateBlock(block2Hash) + if err != nil { + t.Fatal(err) + } + + // Assert that block 1 is the active chaintip. + bestHash, err := r.Client.GetBestBlockHash() + if *bestHash != *block1Hash { + t.Fatalf("TestInvalidateAndReconsiderBlock fail. Expected the "+ + "best block hash to be block 1 with hash %s but got %s", + block1Hash.String(), bestHash.String()) + } + + // Generate 2 blocks. + // + // Our chain view looks like so: + // (genesis block) -> 1 -> 2a -> 3a (active) + // \ -> 2 -> 3 -> 4 (invalid) + _, err = r.Client.Generate(2) + if err != nil { + t.Fatal(err) + } + + // Cache the active tip hash for the current active tip. + block3aActiveTipHash, err := r.Client.GetBestBlockHash() + if err != nil { + t.Fatal(err) + } + + tips, err := r.Client.GetChainTips() + if err != nil { + t.Fatal(err) + } + + // Assert that there are two branches. + if len(tips) != 2 { + t.Fatalf("TestInvalidateAndReconsiderBlock fail. "+ + "Expected 2 chaintips but got %d", len(tips)) + } + + for _, tip := range tips { + if tip.Hash == block4ActiveTipHash.String() && + tip.Status != "invalid" { + t.Fatalf("TestInvalidateAndReconsiderBlock fail. Expected "+ + "invalidated branch tip of %s to be invalid but got %s", + tip.Hash, tip.Status) + } + } + + // Reconsider the invalidated block 2. + // + // Our chain view looks like so: + // (genesis block) -> 1 -> 2a -> 3a (valid-fork) + // \ -> 2 -> 3 -> 4 (active) + err = r.Client.ReconsiderBlock(block2Hash) + if err != nil { + t.Fatal(err) + } + + tips, err = r.Client.GetChainTips() + if err != nil { + t.Fatal(err) + } + // Assert that there are two branches. + if len(tips) != 2 { + t.Fatalf("TestInvalidateAndReconsiderBlock fail. "+ + "Expected 2 chaintips but got %d", len(tips)) + } + + var checkedTips int + for _, tip := range tips { + if tip.Hash == block4ActiveTipHash.String() { + if tip.Status != "active" { + t.Fatalf("TestInvalidateAndReconsiderBlock fail. Expected "+ + "the reconsidered branch tip of %s to be active but got %s", + tip.Hash, tip.Status) + } + + checkedTips++ + } + + if tip.Hash == block3aActiveTipHash.String() { + if tip.Status != "valid-fork" { + t.Fatalf("TestInvalidateAndReconsiderBlock fail. Expected "+ + "invalidated branch tip of %s to be valid-fork but got %s", + tip.Hash, tip.Status) + } + checkedTips++ + } + } + + if checkedTips != 2 { + t.Fatalf("TestInvalidateAndReconsiderBlock fail. "+ + "Expected to check %d chaintips, checked %d", 2, checkedTips) + } + + // Invalidate block 3a. + // + // Our chain view looks like so: + // (genesis block) -> 1 -> 2a -> 3a (invalid) + // \ -> 2 -> 3 -> 4 (active) + err = r.Client.InvalidateBlock(block3aActiveTipHash) + if err != nil { + t.Fatal(err) + } + + tips, err = r.Client.GetChainTips() + if err != nil { + t.Fatal(err) + } + + // Assert that there are two branches. + if len(tips) != 2 { + t.Fatalf("TestInvalidateAndReconsiderBlock fail. "+ + "Expected 2 chaintips but got %d", len(tips)) + } + + checkedTips = 0 + for _, tip := range tips { + if tip.Hash == block4ActiveTipHash.String() { + if tip.Status != "active" { + t.Fatalf("TestInvalidateAndReconsiderBlock fail. Expected "+ + "an active branch tip of %s but got %s", + tip.Hash, tip.Status) + } + + checkedTips++ + } + + if tip.Hash == block3aActiveTipHash.String() { + if tip.Status != "invalid" { + t.Fatalf("TestInvalidateAndReconsiderBlock fail. Expected "+ + "the invalidated tip of %s to be invalid but got %s", + tip.Hash, tip.Status) + } + checkedTips++ + } + } + + if checkedTips != 2 { + t.Fatalf("TestInvalidateAndReconsiderBlock fail. "+ + "Expected to check %d chaintips, checked %d", 2, checkedTips) + } + + // Reconsider block 3a. + // + // Our chain view looks like so: + // (genesis block) -> 1 -> 2a -> 3a (valid-fork) + // \ -> 2 -> 3 -> 4 (active) + err = r.Client.ReconsiderBlock(block3aActiveTipHash) + if err != nil { + t.Fatal(err) + } + + tips, err = r.Client.GetChainTips() + if err != nil { + t.Fatal(err) + } + + // Assert that there are two branches. + if len(tips) != 2 { + t.Fatalf("TestInvalidateAndReconsiderBlock fail. "+ + "Expected 2 chaintips but got %d", len(tips)) + } + + checkedTips = 0 + for _, tip := range tips { + if tip.Hash == block4ActiveTipHash.String() { + if tip.Status != "active" { + t.Fatalf("TestInvalidateAndReconsiderBlock fail. Expected "+ + "an active branch tip of %s but got %s", + tip.Hash, tip.Status) + } + + checkedTips++ + } + + if tip.Hash == block3aActiveTipHash.String() { + if tip.Status != "valid-fork" { + t.Fatalf("TestInvalidateAndReconsiderBlock fail. Expected "+ + "the reconsidered tip of %s to be a valid-fork but got %s", + tip.Hash, tip.Status) + } + checkedTips++ + } + } + + if checkedTips != 2 { + t.Fatalf("TestInvalidateAndReconsiderBlock fail. "+ + "Expected to check %d chaintips, checked %d", 2, checkedTips) + } +} diff --git a/integration/log.go b/integration/log.go new file mode 100644 index 0000000000..26d6217454 --- /dev/null +++ b/integration/log.go @@ -0,0 +1,26 @@ +//go:build rpctest +// +build rpctest + +package integration + +import ( + "os" + + "github.com/btcsuite/btcd/rpcclient" + "github.com/btcsuite/btclog" +) + +type logWriter struct{} + +func (logWriter) Write(p []byte) (n int, err error) { + os.Stdout.Write(p) + return len(p), nil +} + +func init() { + backendLog := btclog.NewBackend(logWriter{}) + testLog := backendLog.Logger("ITEST") + testLog.SetLevel(btclog.LevelDebug) + + rpcclient.UseLogger(testLog) +} diff --git a/integration/prune_test.go b/integration/prune_test.go new file mode 100644 index 0000000000..ac363cb8ca --- /dev/null +++ b/integration/prune_test.go @@ -0,0 +1,40 @@ +// Copyright (c) 2023 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +// This file is ignored during the regular tests due to the following build tag. +//go:build rpctest +// +build rpctest + +package integration + +import ( + "testing" + + "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/integration/rpctest" + "github.com/stretchr/testify/require" +) + +func TestPrune(t *testing.T) { + t.Parallel() + + // Boilerplate code to make a pruned node. + btcdCfg := []string{"--prune=1536"} + r, err := rpctest.New(&chaincfg.SimNetParams, nil, btcdCfg, "") + require.NoError(t, err) + + if err := r.SetUp(false, 0); err != nil { + require.NoError(t, err) + } + t.Cleanup(func() { r.TearDown() }) + + // Check that the rpc call for block chain info comes back correctly. + chainInfo, err := r.Client.GetBlockChainInfo() + require.NoError(t, err) + + if !chainInfo.Pruned { + t.Fatalf("expected the node to be pruned but the pruned "+ + "boolean was %v", chainInfo.Pruned) + } +} diff --git a/integration/rawtx_test.go b/integration/rawtx_test.go new file mode 100644 index 0000000000..f27f5176cf --- /dev/null +++ b/integration/rawtx_test.go @@ -0,0 +1,203 @@ +//go:build rpctest +// +build rpctest + +package integration + +import ( + "encoding/hex" + "testing" + + "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/integration/rpctest" + "github.com/btcsuite/btcd/rpcclient" + "github.com/btcsuite/btcd/txscript" + "github.com/btcsuite/btcd/wire" + "github.com/stretchr/testify/require" +) + +// TestTestMempoolAccept checks that `TestTestMempoolAccept` behaves as +// expected. It checks that, +// - an error is returned when invalid params are used. +// - orphan tx is rejected. +// - fee rate above the max is rejected. +// - a mixed of both allowed and rejected can be returned in the same response. +func TestTestMempoolAccept(t *testing.T) { + t.Parallel() + + // Boilerplate codetestDir to make a pruned node. + btcdCfg := []string{"--rejectnonstd", "--debuglevel=debug"} + r, err := rpctest.New(&chaincfg.SimNetParams, nil, btcdCfg, "") + require.NoError(t, err) + + // Setup the node. + require.NoError(t, r.SetUp(true, 100)) + t.Cleanup(func() { + require.NoError(t, r.TearDown()) + }) + + // Create testing txns. + invalidTx := decodeHex(t, missingParentsHex) + validTx := createTestTx(t, r) + + // Create testing constants. + const feeRate = 10 + + testCases := []struct { + name string + txns []*wire.MsgTx + maxFeeRate float64 + expectedErr error + expectedResult []*btcjson.TestMempoolAcceptResult + }{ + { + // When too many txns are provided, the method should + // return an error. + name: "too many txns", + txns: make([]*wire.MsgTx, 26), + maxFeeRate: 0, + expectedErr: rpcclient.ErrInvalidParam, + expectedResult: nil, + }, + { + // When no txns are provided, the method should return + // an error. + name: "empty txns", + txns: nil, + maxFeeRate: 0, + expectedErr: rpcclient.ErrInvalidParam, + expectedResult: nil, + }, + { + // When a corrupted txn is provided, the method should + // return an error. + name: "corrupted tx", + txns: []*wire.MsgTx{{}}, + maxFeeRate: 0, + expectedErr: rpcclient.ErrInvalidParam, + expectedResult: nil, + }, + { + // When an orphan tx is provided, the method should + // return a test mempool accept result which says this + // tx is not allowed. + name: "orphan tx", + txns: []*wire.MsgTx{invalidTx}, + maxFeeRate: 0, + expectedResult: []*btcjson.TestMempoolAcceptResult{{ + Txid: invalidTx.TxHash().String(), + Wtxid: invalidTx.TxHash().String(), + Allowed: false, + RejectReason: "missing-inputs", + }}, + }, + { + // When a valid tx is provided but it exceeds the max + // fee rate, the method should return a test mempool + // accept result which says it's not allowed. + name: "valid tx but exceeds max fee rate", + txns: []*wire.MsgTx{validTx}, + maxFeeRate: 1e-5, + expectedResult: []*btcjson.TestMempoolAcceptResult{{ + Txid: validTx.TxHash().String(), + Wtxid: validTx.TxHash().String(), + Allowed: false, + RejectReason: "max-fee-exceeded", + }}, + }, + { + // When a valid tx is provided and it doesn't exceeds + // the max fee rate, the method should return a test + // mempool accept result which says it's allowed. + name: "valid tx and sane fee rate", + txns: []*wire.MsgTx{validTx}, + expectedResult: []*btcjson.TestMempoolAcceptResult{{ + Txid: validTx.TxHash().String(), + Wtxid: validTx.TxHash().String(), + Allowed: true, + // TODO(yy): need to calculate the fees, atm + // there's no easy way. + // Fees: &btcjson.TestMempoolAcceptFees{}, + }}, + }, + { + // When multiple txns are provided, the method should + // return the correct results for each of the txns. + name: "multiple txns", + txns: []*wire.MsgTx{invalidTx, validTx}, + expectedResult: []*btcjson.TestMempoolAcceptResult{{ + Txid: invalidTx.TxHash().String(), + Wtxid: invalidTx.TxHash().String(), + Allowed: false, + RejectReason: "missing-inputs", + }, { + Txid: validTx.TxHash().String(), + Wtxid: validTx.TxHash().String(), + Allowed: true, + }}, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + require := require.New(t) + + results, err := r.Client.TestMempoolAccept( + tc.txns, tc.maxFeeRate, + ) + + require.ErrorIs(err, tc.expectedErr) + require.Len(results, len(tc.expectedResult)) + + // Check each item is returned as expected. + for i, r := range results { + expected := tc.expectedResult[i] + + // TODO(yy): check all the fields? + require.Equal(expected.Txid, r.Txid) + require.Equal(expected.Wtxid, r.Wtxid) + require.Equal(expected.Allowed, r.Allowed) + require.Equal(expected.RejectReason, + r.RejectReason) + } + }) + } +} + +var ( + //nolint:lll + missingParentsHex = "0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff2000000001c75619cdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4900000000cff75994dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b07010000003c029216047236f3000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8784d7ee4b" +) + +// createTestTx creates a `wire.MsgTx` and asserts its creation. +func createTestTx(t *testing.T, h *rpctest.Harness) *wire.MsgTx { + addr, err := h.NewAddress() + require.NoError(t, err) + + script, err := txscript.PayToAddrScript(addr) + require.NoError(t, err) + + output := &wire.TxOut{ + PkScript: script, + Value: 1e6, + } + + tx, err := h.CreateTransaction([]*wire.TxOut{output}, 10, true) + require.NoError(t, err) + + return tx +} + +// decodeHex takes a tx hexstring and asserts it can be decoded into a +// `wire.MsgTx`. +func decodeHex(t *testing.T, txHex string) *wire.MsgTx { + serializedTx, err := hex.DecodeString(txHex) + require.NoError(t, err) + + tx, err := btcutil.NewTxFromBytes(serializedTx) + require.NoError(t, err) + + return tx.MsgTx() +} diff --git a/integration/rpcserver_test.go b/integration/rpcserver_test.go index df526442be..7e90a36b5c 100644 --- a/integration/rpcserver_test.go +++ b/integration/rpcserver_test.go @@ -3,6 +3,7 @@ // license that can be found in the LICENSE file. // This file is ignored during the regular tests due to the following build tag. +//go:build rpctest // +build rpctest package integration @@ -13,24 +14,28 @@ import ( "os" "runtime/debug" "testing" + "time" + "github.com/btcsuite/btcd/blockchain" "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/integration/rpctest" + "github.com/btcsuite/btcd/rpcclient" ) func testGetBestBlock(r *rpctest.Harness, t *testing.T) { - _, prevbestHeight, err := r.Node.GetBestBlock() + _, prevbestHeight, err := r.Client.GetBestBlock() if err != nil { t.Fatalf("Call to `getbestblock` failed: %v", err) } // Create a new block connecting to the current tip. - generatedBlockHashes, err := r.Node.Generate(1) + generatedBlockHashes, err := r.Client.Generate(1) if err != nil { t.Fatalf("Unable to generate block: %v", err) } - bestHash, bestHeight, err := r.Node.GetBestBlock() + bestHash, bestHeight, err := r.Client.GetBestBlock() if err != nil { t.Fatalf("Call to `getbestblock` failed: %v", err) } @@ -50,17 +55,17 @@ func testGetBestBlock(r *rpctest.Harness, t *testing.T) { func testGetBlockCount(r *rpctest.Harness, t *testing.T) { // Save the current count. - currentCount, err := r.Node.GetBlockCount() + currentCount, err := r.Client.GetBlockCount() if err != nil { t.Fatalf("Unable to get block count: %v", err) } - if _, err := r.Node.Generate(1); err != nil { + if _, err := r.Client.Generate(1); err != nil { t.Fatalf("Unable to generate block: %v", err) } // Count should have increased by one. - newCount, err := r.Node.GetBlockCount() + newCount, err := r.Client.GetBlockCount() if err != nil { t.Fatalf("Unable to get block count: %v", err) } @@ -72,17 +77,17 @@ func testGetBlockCount(r *rpctest.Harness, t *testing.T) { func testGetBlockHash(r *rpctest.Harness, t *testing.T) { // Create a new block connecting to the current tip. - generatedBlockHashes, err := r.Node.Generate(1) + generatedBlockHashes, err := r.Client.Generate(1) if err != nil { t.Fatalf("Unable to generate block: %v", err) } - info, err := r.Node.GetInfo() + info, err := r.Client.GetInfo() if err != nil { t.Fatalf("call to getinfo cailed: %v", err) } - blockHash, err := r.Node.GetBlockHash(int64(info.Blocks)) + blockHash, err := r.Client.GetBlockHash(int64(info.Blocks)) if err != nil { t.Fatalf("Call to `getblockhash` failed: %v", err) } @@ -94,10 +99,204 @@ func testGetBlockHash(r *rpctest.Harness, t *testing.T) { } } +func testBulkClient(r *rpctest.Harness, t *testing.T) { + // Create a new block connecting to the current tip. + generatedBlockHashes, err := r.Client.Generate(20) + if err != nil { + t.Fatalf("Unable to generate block: %v", err) + } + + var futureBlockResults []rpcclient.FutureGetBlockResult + for _, hash := range generatedBlockHashes { + futureBlockResults = append(futureBlockResults, r.BatchClient.GetBlockAsync(hash)) + } + + err = r.BatchClient.Send() + if err != nil { + t.Fatal(err) + } + + isKnownBlockHash := func(blockHash chainhash.Hash) bool { + for _, hash := range generatedBlockHashes { + if blockHash.IsEqual(hash) { + return true + } + } + return false + } + + for _, block := range futureBlockResults { + msgBlock, err := block.Receive() + if err != nil { + t.Fatal(err) + } + blockHash := msgBlock.Header.BlockHash() + if !isKnownBlockHash(blockHash) { + t.Fatalf("expected hash %s to be in generated hash list", blockHash) + } + } + +} + +func calculateHashesPerSecBetweenBlockHeights(r *rpctest.Harness, t *testing.T, startHeight, endHeight int64) float64 { + var totalWork int64 = 0 + var minTimestamp, maxTimestamp time.Time + + for curHeight := startHeight; curHeight <= endHeight; curHeight++ { + hash, err := r.Client.GetBlockHash(curHeight) + + if err != nil { + t.Fatal(err) + } + + blockHeader, err := r.Client.GetBlockHeader(hash) + + if err != nil { + t.Fatal(err) + } + + if curHeight == startHeight { + minTimestamp = blockHeader.Timestamp + continue + } + + totalWork += blockchain.CalcWork(blockHeader.Bits).Int64() + + if curHeight == endHeight { + maxTimestamp = blockHeader.Timestamp + } + } + + timeDiff := maxTimestamp.Sub(minTimestamp).Seconds() + + if timeDiff == 0 { + return 0 + } + + return float64(totalWork) / timeDiff +} + +func testGetNetworkHashPS(r *rpctest.Harness, t *testing.T) { + networkHashPS, err := r.Client.GetNetworkHashPS() + + if err != nil { + t.Fatal(err) + } + + expectedNetworkHashPS := calculateHashesPerSecBetweenBlockHeights(r, t, 28, 148) + + if networkHashPS != expectedNetworkHashPS { + t.Fatalf("Network hashes per second should be %f but received: %f", expectedNetworkHashPS, networkHashPS) + } +} + +func testGetNetworkHashPS2(r *rpctest.Harness, t *testing.T) { + networkHashPS2BlockTests := []struct { + blocks int + expectedStartHeight int64 + expectedEndHeight int64 + }{ + // Test receiving command for negative blocks + {blocks: -200, expectedStartHeight: 0, expectedEndHeight: 148}, + // Test receiving command for 0 blocks + {blocks: 0, expectedStartHeight: 0, expectedEndHeight: 148}, + // Test receiving command for less than total blocks -> expectedStartHeight = 148 - 100 = 48 + {blocks: 100, expectedStartHeight: 48, expectedEndHeight: 148}, + // Test receiving command for exact total blocks -> expectedStartHeight = 148 - 148 = 0 + {blocks: 148, expectedStartHeight: 0, expectedEndHeight: 148}, + // Test receiving command for greater than total blocks + {blocks: 200, expectedStartHeight: 0, expectedEndHeight: 148}, + } + + for _, networkHashPS2BlockTest := range networkHashPS2BlockTests { + blocks := networkHashPS2BlockTest.blocks + expectedStartHeight := networkHashPS2BlockTest.expectedStartHeight + expectedEndHeight := networkHashPS2BlockTest.expectedEndHeight + + networkHashPS, err := r.Client.GetNetworkHashPS2(blocks) + + if err != nil { + t.Fatal(err) + } + + expectedNetworkHashPS := calculateHashesPerSecBetweenBlockHeights(r, t, expectedStartHeight, expectedEndHeight) + + if networkHashPS != expectedNetworkHashPS { + t.Fatalf("Network hashes per second should be %f but received: %f", expectedNetworkHashPS, networkHashPS) + } + } +} + +func testGetNetworkHashPS3(r *rpctest.Harness, t *testing.T) { + networkHashPS3BlockTests := []struct { + height int + blocks int + expectedStartHeight int64 + expectedEndHeight int64 + }{ + // Test receiving command for negative height -> expectedEndHeight force to 148 + // - And negative blocks -> expectedStartHeight = 148 - ((148 % 2016) + 1) = -1 -> forced to 0 + {height: -200, blocks: -120, expectedStartHeight: 0, expectedEndHeight: 148}, + // - And zero blocks -> expectedStartHeight = 148 - ((148 % 2016) + 1) = -1 -> forced to 0 + {height: -200, blocks: 0, expectedStartHeight: 0, expectedEndHeight: 148}, + // - And positive blocks less than total blocks -> expectedStartHeight = 148 - 100 = 48 + {height: -200, blocks: 100, expectedStartHeight: 48, expectedEndHeight: 148}, + // - And positive blocks equal to total blocks + {height: -200, blocks: 148, expectedStartHeight: 0, expectedEndHeight: 148}, + // - And positive blocks greater than total blocks + {height: -200, blocks: 250, expectedStartHeight: 0, expectedEndHeight: 148}, + + // Test receiving command for zero height + // - Should return 0 similar to expected start height and expected end height both being 0 + // (blocks is irrelevant to output) + {height: 0, blocks: 120, expectedStartHeight: 0, expectedEndHeight: 0}, + + // Tests for valid block height -> expectedEndHeight set as height + // - And negative blocks -> expectedStartHeight = 148 - ((148 % 2016) + 1) = -1 -> forced to 0 + {height: 100, blocks: -120, expectedStartHeight: 0, expectedEndHeight: 100}, + // - And zero blocks -> expectedStartHeight = 148 - ((148 % 2016) + 1) = -1 -> forced to 0 + {height: 100, blocks: 0, expectedStartHeight: 0, expectedEndHeight: 100}, + // - And positive blocks less than command blocks -> expectedStartHeight = 100 - 70 = 30 + {height: 100, blocks: 70, expectedStartHeight: 30, expectedEndHeight: 100}, + // - And positive blocks equal to command blocks -> expectedStartHeight = 100 - 100 = 0 + {height: 100, blocks: 100, expectedStartHeight: 0, expectedEndHeight: 100}, + // - And positive blocks greater than command blocks -> expectedStartHeight = 100 - 200 = -100 -> forced to 0 + {height: 100, blocks: 200, expectedStartHeight: 0, expectedEndHeight: 100}, + + // Test receiving command for height greater than block height + // - Should return 0 similar to expected start height and expected end height both being 0 + // (blocks is irrelevant to output) + {height: 200, blocks: 120, expectedStartHeight: 0, expectedEndHeight: 0}, + } + + for _, networkHashPS3BlockTest := range networkHashPS3BlockTests { + blocks := networkHashPS3BlockTest.blocks + height := networkHashPS3BlockTest.height + expectedStartHeight := networkHashPS3BlockTest.expectedStartHeight + expectedEndHeight := networkHashPS3BlockTest.expectedEndHeight + + networkHashPS, err := r.Client.GetNetworkHashPS3(blocks, height) + + if err != nil { + t.Fatal(err) + } + + expectedNetworkHashPS := calculateHashesPerSecBetweenBlockHeights(r, t, expectedStartHeight, expectedEndHeight) + + if networkHashPS != expectedNetworkHashPS { + t.Fatalf("Network hashes per second should be %f but received: %f", expectedNetworkHashPS, networkHashPS) + } + } +} + var rpcTestCases = []rpctest.HarnessTestCase{ testGetBestBlock, testGetBlockCount, testGetBlockHash, + testBulkClient, + testGetNetworkHashPS, + testGetNetworkHashPS2, + testGetNetworkHashPS3, } var primaryHarness *rpctest.Harness @@ -109,7 +308,9 @@ func TestMain(m *testing.M) { // ensure that non-standard transactions aren't accepted into the // mempool or relayed. btcdCfg := []string{"--rejectnonstd"} - primaryHarness, err = rpctest.New(&chaincfg.SimNetParams, nil, btcdCfg) + primaryHarness, err = rpctest.New( + &chaincfg.SimNetParams, nil, btcdCfg, "", + ) if err != nil { fmt.Println("unable to create primary harness: ", err) os.Exit(1) diff --git a/integration/rpctest/README.md b/integration/rpctest/README.md index fceeed20a0..79f45bc857 100644 --- a/integration/rpctest/README.md +++ b/integration/rpctest/README.md @@ -1,9 +1,9 @@ rpctest ======= -[![Build Status](http://img.shields.io/travis/btcsuite/btcd.svg)](https://travis-ci.org/btcsuite/btcd) +[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions) [![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) -[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/btcsuite/btcd/integration/rpctest) +[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/integration/rpctest) Package rpctest provides a btcd-specific RPC testing harness crafting and executing integration tests by driving a `btcd` instance via the `RPC` diff --git a/integration/rpctest/blockgen.go b/integration/rpctest/blockgen.go index de5821b0c1..07371fb8a1 100644 --- a/integration/rpctest/blockgen.go +++ b/integration/rpctest/blockgen.go @@ -12,11 +12,12 @@ import ( "time" "github.com/btcsuite/btcd/blockchain" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/mining" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) // solveBlock attempts to find a nonce which makes the passed block header hash @@ -181,12 +182,27 @@ func CreateBlock(prevBlock *btcutil.Block, inclusionTxs []*btcutil.Tx, if inclusionTxs != nil { blockTxns = append(blockTxns, inclusionTxs...) } - merkles := blockchain.BuildMerkleTreeStore(blockTxns, false) + + // We must add the witness commitment to the coinbase if any + // transactions are segwit. + witnessIncluded := false + for i := 1; i < len(blockTxns); i++ { + if blockTxns[i].MsgTx().HasWitness() { + witnessIncluded = true + break + } + } + + if witnessIncluded { + _ = mining.AddWitnessCommitment(coinbaseTx, blockTxns) + } + + merkleRoot := blockchain.CalcMerkleRoot(blockTxns, false) var block wire.MsgBlock block.Header = wire.BlockHeader{ Version: blockVersion, PrevBlock: *prevHash, - MerkleRoot: *merkles[len(merkles)-1], + MerkleRoot: merkleRoot, Timestamp: ts, Bits: net.PowLimitBits, } diff --git a/integration/rpctest/memwallet.go b/integration/rpctest/memwallet.go index f16130750a..d084e99feb 100644 --- a/integration/rpctest/memwallet.go +++ b/integration/rpctest/memwallet.go @@ -11,14 +11,14 @@ import ( "sync" "github.com/btcsuite/btcd/blockchain" - "github.com/btcsuite/btcd/btcec" + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/btcutil/hdkeychain" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/rpcclient" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" - "github.com/btcsuite/btcutil/hdkeychain" ) var ( @@ -125,7 +125,7 @@ func newMemWallet(net *chaincfg.Params, harnessID uint32) (*memWallet, error) { // The first child key from the hd root is reserved as the coinbase // generation address. - coinbaseChild, err := hdRoot.Child(0) + coinbaseChild, err := hdRoot.Derive(0) if err != nil { return nil, err } @@ -133,6 +133,7 @@ func newMemWallet(net *chaincfg.Params, harnessID uint32) (*memWallet, error) { if err != nil { return nil, err } + coinbaseAddr, err := keyToAddr(coinbaseKey, net) if err != nil { return nil, err @@ -337,7 +338,7 @@ func (m *memWallet) unwindBlock(update *chainUpdate) { func (m *memWallet) newAddress() (btcutil.Address, error) { index := m.hdIndex - childKey, err := m.hdRoot.Child(index) + childKey, err := m.hdRoot.Derive(index) if err != nil { return nil, err } @@ -509,16 +510,18 @@ func (m *memWallet) CreateTransaction(outputs []*wire.TxOut, outPoint := txIn.PreviousOutPoint utxo := m.utxos[outPoint] - extendedKey, err := m.hdRoot.Child(utxo.keyIndex) + extendedKey, err := m.hdRoot.Derive(utxo.keyIndex) if err != nil { return nil, err } - privKey, err := extendedKey.ECPrivKey() + privKeyOld, err := extendedKey.ECPrivKey() if err != nil { return nil, err } + privKey, _ := btcec.PrivKeyFromBytes(privKeyOld.Serialize()) + sigScript, err := txscript.SignatureScript(tx, i, utxo.pkScript, txscript.SigHashAll, privKey, true) if err != nil { diff --git a/integration/rpctest/node.go b/integration/rpctest/node.go index 6aec2b1168..8dddc75001 100644 --- a/integration/rpctest/node.go +++ b/integration/rpctest/node.go @@ -6,7 +6,6 @@ package rpctest import ( "fmt" - "io/ioutil" "log" "os" "os/exec" @@ -14,8 +13,8 @@ import ( "runtime" "time" + "github.com/btcsuite/btcd/btcutil" rpc "github.com/btcsuite/btcd/rpcclient" - "github.com/btcsuite/btcutil" ) // nodeConfig contains all the args, and data required to launch a btcd process @@ -31,7 +30,7 @@ type nodeConfig struct { profile string debugLevel string extra []string - prefix string + nodeDir string exe string endpoint string @@ -41,10 +40,18 @@ type nodeConfig struct { } // newConfig returns a newConfig with all default values. -func newConfig(prefix, certFile, keyFile string, extra []string) (*nodeConfig, error) { - btcdPath, err := btcdExecutablePath() - if err != nil { - btcdPath = "btcd" +func newConfig(nodeDir, certFile, keyFile string, extra []string, + customExePath string) (*nodeConfig, error) { + + var btcdPath string + if customExePath != "" { + btcdPath = customExePath + } else { + var err error + btcdPath, err = btcdExecutablePath() + if err != nil { + btcdPath = "btcd" + } } a := &nodeConfig{ @@ -53,7 +60,7 @@ func newConfig(prefix, certFile, keyFile string, extra []string) (*nodeConfig, e rpcUser: "user", rpcPass: "pass", extra: extra, - prefix: prefix, + nodeDir: nodeDir, exe: btcdPath, endpoint: "ws", certFile: certFile, @@ -69,17 +76,9 @@ func newConfig(prefix, certFile, keyFile string, extra []string) (*nodeConfig, e // temporary data, and log directories which must be cleaned up with a call to // cleanup(). func (n *nodeConfig) setDefaults() error { - datadir, err := ioutil.TempDir("", n.prefix+"-data") - if err != nil { - return err - } - n.dataDir = datadir - logdir, err := ioutil.TempDir("", n.prefix+"-logs") - if err != nil { - return err - } - n.logDir = logdir - cert, err := ioutil.ReadFile(n.certFile) + n.dataDir = filepath.Join(n.nodeDir, "data") + n.logDir = filepath.Join(n.nodeDir, "logs") + cert, err := os.ReadFile(n.certFile) if err != nil { return err } @@ -155,22 +154,7 @@ func (n *nodeConfig) rpcConnConfig() rpc.ConnConfig { // String returns the string representation of this nodeConfig. func (n *nodeConfig) String() string { - return n.prefix -} - -// cleanup removes the tmp data and log directories. -func (n *nodeConfig) cleanup() error { - dirs := []string{ - n.logDir, - n.dataDir, - } - var err error - for _, dir := range dirs { - if err = os.RemoveAll(dir); err != nil { - log.Printf("Cannot remove dir %s: %v", dir, err) - } - } - return err + return n.nodeDir } // node houses the necessary state required to configure, launch, and manage a @@ -205,8 +189,7 @@ func (n *node) start() error { return err } - pid, err := os.Create(filepath.Join(n.dataDir, - fmt.Sprintf("%s.pid", n.config))) + pid, err := os.Create(filepath.Join(n.dataDir, "btcd.pid")) if err != nil { return err } @@ -250,7 +233,10 @@ func (n *node) cleanup() error { } } - return n.config.cleanup() + // Since the node's main data directory is passed in to the node config, + // it isn't our responsibility to clean it up. So we're done after + // removing the pid file. + return nil } // shutdown terminates the running btcd process, and cleans up all @@ -275,11 +261,11 @@ func genCertPair(certFile, keyFile string) error { } // Write cert and key files. - if err = ioutil.WriteFile(certFile, cert, 0666); err != nil { + if err = os.WriteFile(certFile, cert, 0666); err != nil { return err } - if err = ioutil.WriteFile(keyFile, key, 0600); err != nil { - os.Remove(certFile) + if err = os.WriteFile(keyFile, key, 0600); err != nil { + _ = os.Remove(certFile) return err } diff --git a/integration/rpctest/rpc_harness.go b/integration/rpctest/rpc_harness.go index 1c2612e47b..0e8c53dbe9 100644 --- a/integration/rpctest/rpc_harness.go +++ b/integration/rpctest/rpc_harness.go @@ -6,20 +6,20 @@ package rpctest import ( "fmt" - "io/ioutil" "net" "os" "path/filepath" "strconv" "sync" + "sync/atomic" "testing" "time" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/rpcclient" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) const ( @@ -34,22 +34,20 @@ const ( // BlockVersion is the default block version used when generating // blocks. BlockVersion = 4 + + // DefaultMaxConnectionRetries is the default number of times we re-try + // to connect to the node after starting it. + DefaultMaxConnectionRetries = 20 + + // DefaultConnectionRetryTimeout is the default duration we wait between + // two connection attempts. + DefaultConnectionRetryTimeout = 50 * time.Millisecond ) var ( // current number of active test nodes. numTestInstances = 0 - // processID is the process ID of the current running process. It is - // used to calculate ports based upon it when launching an rpc - // harnesses. The intent is to allow multiple process to run in - // parallel without port collisions. - // - // It should be noted however that there is still some small probability - // that there will be port collisions either due to other processes - // running or simply due to the stars aligning on the process IDs. - processID = os.Getpid() - // testInstances is a private package-level slice used to keep track of // all active test harnesses. This global can be used to perform // various "joins", shutdown several active harnesses after a test, @@ -58,6 +56,26 @@ var ( // Used to protest concurrent access to above declared variables. harnessStateMtx sync.RWMutex + + // ListenAddressGenerator is a function that is used to generate two + // listen addresses (host:port), one for the P2P listener and one for + // the RPC listener. This is exported to allow overwriting of the + // default behavior which isn't very concurrency safe (just selecting + // a random port can produce collisions and therefore flakes). + ListenAddressGenerator = generateListeningAddresses + + // defaultNodePort is the start of the range for listening ports of + // harness nodes. Ports are monotonically increasing starting from this + // number and are determined by the results of nextAvailablePort(). + defaultNodePort uint32 = 8333 + + // ListenerFormat is the format string that is used to generate local + // listener addresses. + ListenerFormat = "127.0.0.1:%d" + + // lastPort is the last port determined to be free for use by a new + // node. It should be used atomically. + lastPort uint32 = defaultNodePort ) // HarnessTestCase represents a test-case which utilizes an instance of the @@ -78,15 +96,23 @@ type Harness struct { // to. ActiveNet *chaincfg.Params - Node *rpcclient.Client - node *node - handlers *rpcclient.NotificationHandlers + // MaxConnRetries is the maximum number of times we re-try to connect to + // the node after starting it. + MaxConnRetries int + + // ConnectionRetryTimeout is the duration we wait between two connection + // attempts. + ConnectionRetryTimeout time.Duration + + Client *rpcclient.Client + BatchClient *rpcclient.Client + node *node + handlers *rpcclient.NotificationHandlers wallet *memWallet - testNodeDir string - maxConnRetries int - nodeNum int + testNodeDir string + nodeNum int sync.Mutex } @@ -94,11 +120,12 @@ type Harness struct { // New creates and initializes new instance of the rpc test harness. // Optionally, websocket handlers and a specified configuration may be passed. // In the case that a nil config is passed, a default configuration will be -// used. +// used. If a custom btcd executable is specified, it will be used to start the +// harness node. Otherwise a new binary is built on demand. // // NOTE: This function is safe for concurrent access. func New(activeNet *chaincfg.Params, handlers *rpcclient.NotificationHandlers, - extraArgs []string) (*Harness, error) { + extraArgs []string, customExePath string) (*Harness, error) { harnessStateMtx.Lock() defer harnessStateMtx.Unlock() @@ -124,8 +151,7 @@ func New(activeNet *chaincfg.Params, handlers *rpcclient.NotificationHandlers, return nil, err } - harnessID := strconv.Itoa(numTestInstances) - nodeTestData, err := ioutil.TempDir(testDir, "harness-"+harnessID) + nodeTestData, err := os.MkdirTemp(testDir, "rpc-node") if err != nil { return nil, err } @@ -144,13 +170,15 @@ func New(activeNet *chaincfg.Params, handlers *rpcclient.NotificationHandlers, miningAddr := fmt.Sprintf("--miningaddr=%s", wallet.coinbaseAddr) extraArgs = append(extraArgs, miningAddr) - config, err := newConfig("rpctest", certFile, keyFile, extraArgs) + config, err := newConfig( + nodeTestData, certFile, keyFile, extraArgs, customExePath, + ) if err != nil { return nil, err } // Generate p2p+rpc listening addresses. - config.listen, config.rpcListen = generateListeningAddresses() + config.listen, config.rpcListen = ListenAddressGenerator() // Create the testing node bounded to the simnet. node, err := newNode(config, nodeTestData) @@ -190,13 +218,14 @@ func New(activeNet *chaincfg.Params, handlers *rpcclient.NotificationHandlers, } h := &Harness{ - handlers: handlers, - node: node, - maxConnRetries: 20, - testNodeDir: nodeTestData, - ActiveNet: activeNet, - nodeNum: nodeNum, - wallet: wallet, + handlers: handlers, + node: node, + MaxConnRetries: DefaultMaxConnectionRetries, + ConnectionRetryTimeout: DefaultConnectionRetryTimeout, + testNodeDir: nodeTestData, + ActiveNet: activeNet, + nodeNum: nodeNum, + wallet: wallet, } // Track this newly created test instance within the package level @@ -217,10 +246,10 @@ func (h *Harness) SetUp(createTestChain bool, numMatureOutputs uint32) error { // Start the btcd node itself. This spawns a new process which will be // managed if err := h.node.start(); err != nil { - return err + return fmt.Errorf("error starting node: %w", err) } if err := h.connectRPCClient(); err != nil { - return err + return fmt.Errorf("error connecting RPC client: %w", err) } h.wallet.Start() @@ -228,22 +257,22 @@ func (h *Harness) SetUp(createTestChain bool, numMatureOutputs uint32) error { // Filter transactions that pay to the coinbase associated with the // wallet. filterAddrs := []btcutil.Address{h.wallet.coinbaseAddr} - if err := h.Node.LoadTxFilter(true, filterAddrs, nil); err != nil { + if err := h.Client.LoadTxFilter(true, filterAddrs, nil); err != nil { return err } // Ensure btcd properly dispatches our registered call-back for each new // block. Otherwise, the memWallet won't function properly. - if err := h.Node.NotifyBlocks(); err != nil { + if err := h.Client.NotifyBlocks(); err != nil { return err } // Create a test chain with the desired number of mature coinbase // outputs. if createTestChain && numMatureOutputs != 0 { - numToGenerate := (uint32(h.ActiveNet.CoinbaseMaturity) + - numMatureOutputs) - _, err := h.Node.Generate(numToGenerate) + coinbaseMaturity := uint32(h.ActiveNet.CoinbaseMaturity) + numToGenerate := coinbaseMaturity + numMatureOutputs + _, err := h.Client.Generate(numToGenerate) if err != nil { return err } @@ -251,7 +280,7 @@ func (h *Harness) SetUp(createTestChain bool, numMatureOutputs uint32) error { // Block until the wallet has fully synced up to the tip of the main // chain. - _, height, err := h.Node.GetBestBlock() + _, height, err := h.Client.GetBestBlock() if err != nil { return err } @@ -272,8 +301,14 @@ func (h *Harness) SetUp(createTestChain bool, numMatureOutputs uint32) error { // // This function MUST be called with the harness state mutex held (for writes). func (h *Harness) tearDown() error { - if h.Node != nil { - h.Node.Shutdown() + if h.Client != nil { + h.Client.Shutdown() + h.Client.WaitForShutdown() + } + + if h.BatchClient != nil { + h.BatchClient.Shutdown() + h.BatchClient.WaitForShutdown() } if err := h.node.shutdown(); err != nil { @@ -308,24 +343,43 @@ func (h *Harness) TearDown() error { // we're not able to establish a connection, this function returns with an // error. func (h *Harness) connectRPCClient() error { - var client *rpcclient.Client + var client, batchClient *rpcclient.Client var err error rpcConf := h.node.config.rpcConnConfig() - for i := 0; i < h.maxConnRetries; i++ { - if client, err = rpcclient.New(&rpcConf, h.handlers); err != nil { - time.Sleep(time.Duration(i) * 50 * time.Millisecond) - continue + batchConf := h.node.config.rpcConnConfig() + batchConf.HTTPPostMode = true + for i := 0; i < h.MaxConnRetries; i++ { + fail := false + timeout := time.Duration(i) * h.ConnectionRetryTimeout + if client == nil { + client, err = rpcclient.New(&rpcConf, h.handlers) + if err != nil { + time.Sleep(timeout) + fail = true + } + } + if batchClient == nil { + batchClient, err = rpcclient.NewBatch(&batchConf) + if err != nil { + time.Sleep(timeout) + fail = true + } + } + if !fail { + break } - break } - if client == nil { - return fmt.Errorf("connection timeout") + if client == nil || batchClient == nil { + return fmt.Errorf("connection timeout, tried %d times with "+ + "timeout %v, last err: %w", h.MaxConnRetries, + h.ConnectionRetryTimeout, err) } - h.Node = client + h.Client = client h.wallet.SetRPCClient(client) + h.BatchClient = batchClient return nil } @@ -447,11 +501,11 @@ func (h *Harness) GenerateAndSubmitBlockWithCustomCoinbaseOutputs( blockVersion = BlockVersion } - prevBlockHash, prevBlockHeight, err := h.Node.GetBestBlock() + prevBlockHash, prevBlockHeight, err := h.Client.GetBestBlock() if err != nil { return nil, err } - mBlock, err := h.Node.GetBlock(prevBlockHash) + mBlock, err := h.Client.GetBlock(prevBlockHash) if err != nil { return nil, err } @@ -466,30 +520,152 @@ func (h *Harness) GenerateAndSubmitBlockWithCustomCoinbaseOutputs( } // Submit the block to the simnet node. - if err := h.Node.SubmitBlock(newBlock, nil); err != nil { + if err := h.Client.SubmitBlock(newBlock, nil); err != nil { return nil, err } return newBlock, nil } -// generateListeningAddresses returns two strings representing listening -// addresses designated for the current rpc test. If there haven't been any -// test instances created, the default ports are used. Otherwise, in order to -// support multiple test nodes running at once, the p2p and rpc port are -// incremented after each initialization. +// generateListeningAddresses is a function that returns two listener +// addresses with unique ports and should be used to overwrite rpctest's +// default generator which is prone to use colliding ports. func generateListeningAddresses() (string, string) { - localhost := "127.0.0.1" + return fmt.Sprintf(ListenerFormat, NextAvailablePort()), + fmt.Sprintf(ListenerFormat, NextAvailablePort()) +} + +// NextAvailablePort returns the first port that is available for listening by +// a new node. It panics if no port is found and the maximum available TCP port +// is reached. +func NextAvailablePort() int { + port := atomic.AddUint32(&lastPort, 1) + for port < 65535 { + // If there are no errors while attempting to listen on this + // port, close the socket and return it as available. While it + // could be the case that some other process picks up this port + // between the time the socket is closed and it's reopened in + // the harness node, in practice in CI servers this seems much + // less likely than simply some other process already being + // bound at the start of the tests. + addr := fmt.Sprintf(ListenerFormat, port) + l, err := net.Listen("tcp4", addr) + if err == nil { + err := l.Close() + if err == nil { + return int(port) + } + } + port = atomic.AddUint32(&lastPort, 1) + } + + // No ports available? Must be a mistake. + panic("no ports available for listening") +} - portString := func(minPort, maxPort int) string { - port := minPort + numTestInstances + ((20 * processID) % - (maxPort - minPort)) - return strconv.Itoa(port) +// NextAvailablePortForProcess returns the first port that is available for +// listening by a new node, using a lock file to make sure concurrent access for +// parallel tasks within the same process don't re-use the same port. It panics +// if no port is found and the maximum available TCP port is reached. +func NextAvailablePortForProcess(pid int) int { + lockFile := filepath.Join( + os.TempDir(), fmt.Sprintf("rpctest-port-pid-%d.lock", pid), + ) + timeout := time.After(time.Second) + + var ( + lockFileHandle *os.File + err error + ) + for { + // Attempt to acquire the lock file. If it already exists, wait + // for a bit and retry. + lockFileHandle, err = os.OpenFile( + lockFile, os.O_CREATE|os.O_EXCL, 0600, + ) + if err == nil { + // Lock acquired. + break + } + + // Wait for a bit and retry. + select { + case <-timeout: + panic("timeout waiting for lock file") + case <-time.After(10 * time.Millisecond): + } } - p2p := net.JoinHostPort(localhost, portString(minPeerPort, maxPeerPort)) - rpc := net.JoinHostPort(localhost, portString(minRPCPort, maxRPCPort)) - return p2p, rpc + // Release the lock file when we're done. + defer func() { + // Always close file first, Windows won't allow us to remove it + // otherwise. + _ = lockFileHandle.Close() + err := os.Remove(lockFile) + if err != nil { + panic(fmt.Errorf("couldn't remove lock file: %w", err)) + } + }() + + portFile := filepath.Join( + os.TempDir(), fmt.Sprintf("rpctest-port-pid-%d", pid), + ) + port, err := os.ReadFile(portFile) + if err != nil { + if !os.IsNotExist(err) { + panic(fmt.Errorf("error reading port file: %w", err)) + } + port = []byte(strconv.Itoa(int(defaultNodePort))) + } + + lastPort, err := strconv.Atoi(string(port)) + if err != nil { + panic(fmt.Errorf("error parsing port: %w", err)) + } + + // We take the next one. + lastPort++ + for lastPort < 65535 { + // If there are no errors while attempting to listen on this + // port, close the socket and return it as available. While it + // could be the case that some other process picks up this port + // between the time the socket is closed and it's reopened in + // the harness node, in practice in CI servers this seems much + // less likely than simply some other process already being + // bound at the start of the tests. + addr := fmt.Sprintf(ListenerFormat, lastPort) + l, err := net.Listen("tcp4", addr) + if err == nil { + err := l.Close() + if err == nil { + err := os.WriteFile( + portFile, + []byte(strconv.Itoa(lastPort)), 0600, + ) + if err != nil { + panic(fmt.Errorf("error updating "+ + "port file: %w", err)) + } + + return lastPort + } + } + lastPort++ + } + + // No ports available? Must be a mistake. + panic("no ports available for listening") +} + +// GenerateProcessUniqueListenerAddresses is a function that returns two +// listener addresses with unique ports per the given process id and should be +// used to overwrite rpctest's default generator which is prone to use colliding +// ports. +func GenerateProcessUniqueListenerAddresses(pid int) (string, string) { + port1 := NextAvailablePortForProcess(pid) + port2 := NextAvailablePortForProcess(pid) + return fmt.Sprintf(ListenerFormat, port1), + fmt.Sprintf(ListenerFormat, port2) } // baseDir is the directory path of the temp directory for all rpctest files. diff --git a/integration/rpctest/rpc_harness_test.go b/integration/rpctest/rpc_harness_test.go index 717f8f45af..978f8d8290 100644 --- a/integration/rpctest/rpc_harness_test.go +++ b/integration/rpctest/rpc_harness_test.go @@ -3,6 +3,7 @@ // license that can be found in the LICENSE file. // This file is ignored during the regular tests due to the following build tag. +//go:build rpctest // +build rpctest package rpctest @@ -13,11 +14,11 @@ import ( "testing" "time" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) func testSendOutputs(r *Harness, t *testing.T) { @@ -43,7 +44,7 @@ func testSendOutputs(r *Harness, t *testing.T) { } assertTxMined := func(txid *chainhash.Hash, blockHash *chainhash.Hash) { - block, err := r.Node.GetBlock(blockHash) + block, err := r.Client.GetBlock(blockHash) if err != nil { t.Fatalf("unable to get block: %v", err) } @@ -67,7 +68,7 @@ func testSendOutputs(r *Harness, t *testing.T) { // Generate a single block, the transaction the wallet created should // be found in this block. - blockHashes, err := r.Node.Generate(1) + blockHashes, err := r.Client.Generate(1) if err != nil { t.Fatalf("unable to generate single block: %v", err) } @@ -76,7 +77,7 @@ func testSendOutputs(r *Harness, t *testing.T) { // Next, generate a spend much greater than the block reward. This // transaction should also have been mined properly. txid = genSpend(btcutil.Amount(500 * btcutil.SatoshiPerBitcoin)) - blockHashes, err = r.Node.Generate(1) + blockHashes, err = r.Client.Generate(1) if err != nil { t.Fatalf("unable to generate single block: %v", err) } @@ -84,7 +85,7 @@ func testSendOutputs(r *Harness, t *testing.T) { } func assertConnectedTo(t *testing.T, nodeA *Harness, nodeB *Harness) { - nodeAPeers, err := nodeA.Node.GetPeerInfo() + nodeAPeers, err := nodeA.Client.GetPeerInfo() if err != nil { t.Fatalf("unable to get nodeA's peer info") } @@ -105,7 +106,7 @@ func assertConnectedTo(t *testing.T, nodeA *Harness, nodeB *Harness) { func testConnectNode(r *Harness, t *testing.T) { // Create a fresh test harness. - harness, err := New(&chaincfg.SimNetParams, nil, nil) + harness, err := New(&chaincfg.SimNetParams, nil, nil, "") if err != nil { t.Fatal(err) } @@ -153,7 +154,7 @@ func testActiveHarnesses(r *Harness, t *testing.T) { numInitialHarnesses := len(ActiveHarnesses()) // Create a single test harness. - harness1, err := New(&chaincfg.SimNetParams, nil, nil) + harness1, err := New(&chaincfg.SimNetParams, nil, nil, "") if err != nil { t.Fatal(err) } @@ -170,7 +171,7 @@ func testActiveHarnesses(r *Harness, t *testing.T) { func testJoinMempools(r *Harness, t *testing.T) { // Assert main test harness has no transactions in its mempool. - pooledHashes, err := r.Node.GetRawMempool() + pooledHashes, err := r.Client.GetRawMempool() if err != nil { t.Fatalf("unable to get mempool for main test harness: %v", err) } @@ -181,7 +182,7 @@ func testJoinMempools(r *Harness, t *testing.T) { // Create a local test harness with only the genesis block. The nodes // will be synced below so the same transaction can be sent to both // nodes without it being an orphan. - harness, err := New(&chaincfg.SimNetParams, nil, nil) + harness, err := New(&chaincfg.SimNetParams, nil, nil, "") if err != nil { t.Fatal(err) } @@ -210,7 +211,7 @@ func testJoinMempools(r *Harness, t *testing.T) { if err != nil { t.Fatalf("coinbase spend failed: %v", err) } - if _, err := r.Node.SendRawTransaction(testTx, true); err != nil { + if _, err := r.Client.SendRawTransaction(testTx, true); err != nil { t.Fatalf("send transaction failed: %v", err) } @@ -219,7 +220,7 @@ func testJoinMempools(r *Harness, t *testing.T) { harnessSynced := make(chan struct{}) go func() { for { - poolHashes, err := r.Node.GetRawMempool() + poolHashes, err := r.Client.GetRawMempool() if err != nil { t.Fatalf("failed to retrieve harness mempool: %v", err) } @@ -262,7 +263,7 @@ func testJoinMempools(r *Harness, t *testing.T) { // Send the transaction to the local harness which will result in synced // mempools. - if _, err := harness.Node.SendRawTransaction(testTx, true); err != nil { + if _, err := harness.Client.SendRawTransaction(testTx, true); err != nil { t.Fatalf("send transaction failed: %v", err) } @@ -281,7 +282,7 @@ func testJoinMempools(r *Harness, t *testing.T) { func testJoinBlocks(r *Harness, t *testing.T) { // Create a second harness with only the genesis block so it is behind // the main harness. - harness, err := New(&chaincfg.SimNetParams, nil, nil) + harness, err := New(&chaincfg.SimNetParams, nil, nil, "") if err != nil { t.Fatal(err) } @@ -469,7 +470,7 @@ func testGenerateAndSubmitBlockWithCustomCoinbaseOutputs(r *Harness, func testMemWalletReorg(r *Harness, t *testing.T) { // Create a fresh harness, we'll be using the main harness to force a // re-org on this local harness. - harness, err := New(&chaincfg.SimNetParams, nil, nil) + harness, err := New(&chaincfg.SimNetParams, nil, nil, "") if err != nil { t.Fatal(err) } @@ -566,7 +567,7 @@ const ( func TestMain(m *testing.M) { var err error - mainHarness, err = New(&chaincfg.SimNetParams, nil, nil) + mainHarness, err = New(&chaincfg.SimNetParams, nil, nil, "") if err != nil { fmt.Println("unable to create main harness: ", err) os.Exit(1) @@ -612,7 +613,7 @@ func TestHarness(t *testing.T) { // Current tip should be at a height of numMatureOutputs plus the // required number of blocks for coinbase maturity. - nodeInfo, err := mainHarness.Node.GetInfo() + nodeInfo, err := mainHarness.Client.GetInfo() if err != nil { t.Fatalf("unable to execute getinfo on node: %v", err) } diff --git a/integration/rpctest/utils.go b/integration/rpctest/utils.go index fc7d938dcf..d4d76f2ee6 100644 --- a/integration/rpctest/utils.go +++ b/integration/rpctest/utils.go @@ -49,7 +49,7 @@ func syncMempools(nodes []*Harness) error { retry: for !poolsMatch { - firstPool, err := nodes[0].Node.GetRawMempool() + firstPool, err := nodes[0].Client.GetRawMempool() if err != nil { return err } @@ -58,7 +58,7 @@ retry: // first node, then we're done. Otherwise, drop back to the top // of the loop and retry after a short wait period. for _, node := range nodes[1:] { - nodePool, err := node.Node.GetRawMempool() + nodePool, err := node.Client.GetRawMempool() if err != nil { return err } @@ -84,7 +84,7 @@ retry: var prevHash *chainhash.Hash var prevHeight int32 for _, node := range nodes { - blockHash, blockHeight, err := node.Node.GetBestBlock() + blockHash, blockHeight, err := node.Client.GetBestBlock() if err != nil { return err } @@ -108,24 +108,24 @@ retry: // therefore in the case of disconnects, "from" will attempt to reestablish a // connection to the "to" harness. func ConnectNode(from *Harness, to *Harness) error { - peerInfo, err := from.Node.GetPeerInfo() + peerInfo, err := from.Client.GetPeerInfo() if err != nil { return err } numPeers := len(peerInfo) targetAddr := to.node.config.listen - if err := from.Node.AddNode(targetAddr, rpcclient.ANAdd); err != nil { + if err := from.Client.AddNode(targetAddr, rpcclient.ANAdd); err != nil { return err } // Block until a new connection has been established. - peerInfo, err = from.Node.GetPeerInfo() + peerInfo, err = from.Client.GetPeerInfo() if err != nil { return err } for len(peerInfo) <= numPeers { - peerInfo, err = from.Node.GetPeerInfo() + peerInfo, err = from.Client.GetPeerInfo() if err != nil { return err } diff --git a/limits/limits_unix.go b/limits/limits_unix.go index 7ebf866789..7972b05e20 100644 --- a/limits/limits_unix.go +++ b/limits/limits_unix.go @@ -2,6 +2,7 @@ // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. +//go:build !windows && !plan9 // +build !windows,!plan9 package limits diff --git a/log.go b/log.go index 71accc7c9c..5707d7c23a 100644 --- a/log.go +++ b/log.go @@ -36,7 +36,7 @@ func (logWriter) Write(p []byte) (n int, err error) { return len(p), nil } -// Loggers per subsystem. A single backend logger is created and all subsytem +// Loggers per subsystem. A single backend logger is created and all subsystem // loggers created from it will write to the backend. When adding new // subsystems, add the subsystem logger variable here and to the // subsystemLoggers map. diff --git a/mempool/README.md b/mempool/README.md index d9b8d73b5c..85c03993c2 100644 --- a/mempool/README.md +++ b/mempool/README.md @@ -1,13 +1,13 @@ mempool ======= -[![Build Status](http://img.shields.io/travis/btcsuite/btcd.svg)](https://travis-ci.org/btcsuite/btcd) +[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions) [![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) -[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/btcsuite/btcd/mempool) +[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/mempool) Package mempool provides a policy-enforced pool of unmined bitcoin transactions. -A key responsbility of the bitcoin network is mining user-generated transactions +A key responsibility of the bitcoin network is mining user-generated transactions into blocks. In order to facilitate this, the mining process relies on having a readily-available source of transactions to include in a block that is being solved. diff --git a/mempool/doc.go b/mempool/doc.go index 3adad018ba..8c6c0bc1ea 100644 --- a/mempool/doc.go +++ b/mempool/doc.go @@ -5,7 +5,7 @@ /* Package mempool provides a policy-enforced pool of unmined bitcoin transactions. -A key responsbility of the bitcoin network is mining user-generated transactions +A key responsibility of the bitcoin network is mining user-generated transactions into blocks. In order to facilitate this, the mining process relies on having a readily-available source of transactions to include in a block that is being solved. @@ -31,40 +31,40 @@ proceed. Typically, this will involve things such as relaying the transactions to other peers on the network and notifying the mining process that new transactions are available. -Feature Overview +# Feature Overview The following is a quick overview of the major features. It is not intended to be an exhaustive list. - - Maintain a pool of fully validated transactions - - Reject non-fully-spent duplicate transactions - - Reject coinbase transactions - - Reject double spends (both from the chain and other transactions in pool) - - Reject invalid transactions according to the network consensus rules - - Full script execution and validation with signature cache support - - Individual transaction query support - - Orphan transaction support (transactions that spend from unknown outputs) - - Configurable limits (see transaction acceptance policy) - - Automatic addition of orphan transactions that are no longer orphans as new - transactions are added to the pool - - Individual orphan transaction query support - - Configurable transaction acceptance policy - - Option to accept or reject standard transactions - - Option to accept or reject transactions based on priority calculations - - Rate limiting of low-fee and free transactions - - Non-zero fee threshold - - Max signature operations per transaction - - Max orphan transaction size - - Max number of orphan transactions allowed - - Additional metadata tracking for each transaction - - Timestamp when the transaction was added to the pool - - Most recent block height when the transaction was added to the pool - - The fee the transaction pays - - The starting priority for the transaction - - Manual control of transaction removal - - Recursive removal of all dependent transactions + - Maintain a pool of fully validated transactions + 1. Reject non-fully-spent duplicate transactions + 2. Reject coinbase transactions + 3. Reject double spends (both from the chain and other transactions in pool) + 4. Reject invalid transactions according to the network consensus rules + 5. Full script execution and validation with signature cache support + 6. Individual transaction query support + - Orphan transaction support (transactions that spend from unknown outputs) + 1. Configurable limits (see transaction acceptance policy) + 2. Automatic addition of orphan transactions that are no longer orphans as new + transactions are added to the pool + 3. Individual orphan transaction query support + - Configurable transaction acceptance policy + 1. Option to accept or reject standard transactions + 2. Option to accept or reject transactions based on priority calculations + 3. Rate limiting of low-fee and free transactions + 4. Non-zero fee threshold + 5. Max signature operations per transaction + 6. Max orphan transaction size + 7. Max number of orphan transactions allowed + - Additional metadata tracking for each transaction + 1. Timestamp when the transaction was added to the pool + 2. Most recent block height when the transaction was added to the pool + 3. The fee the transaction pays + 4. The starting priority for the transaction + - Manual control of transaction removal + 1. Recursive removal of all dependent transactions -Errors +# Errors Errors returned by this package are either the raw errors provided by underlying calls or of type mempool.RuleError. Since there are two classes of rules diff --git a/mempool/estimatefee.go b/mempool/estimatefee.go index 53933469b6..2d1794b797 100644 --- a/mempool/estimatefee.go +++ b/mempool/estimatefee.go @@ -16,9 +16,9 @@ import ( "strings" "sync" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/mining" - "github.com/btcsuite/btcutil" ) // TODO incorporate Alex Morcos' modifications to Gavin's initial model @@ -47,7 +47,7 @@ const ( bytePerKb = 1000 - btcPerSatoshi = 1E-8 + btcPerSatoshi = 1e-8 ) var ( @@ -275,7 +275,16 @@ func (ef *FeeEstimator) RegisterBlock(block *btcutil.Block) error { // This shouldn't happen but check just in case to avoid // an out-of-bounds array index later. - if blocksToConfirm >= estimateFeeDepth { + // + // Also check that blocksToConfirm is not negative as this causes + // the node to crash on reorgs. A tx that was observed at height X + // might be included in heights less than X because of chain reorgs. + // Refer to github.com/btcsuite/btcd/issues/1660 for more information. + // + // TODO(kcalvinalvin) a better design that doesn't just skip over the + // transaction would result in a more accurate fee estimator. Properly + // implement this later. + if blocksToConfirm >= estimateFeeDepth || blocksToConfirm < 0 { continue } @@ -563,7 +572,7 @@ func (ef *FeeEstimator) EstimateFee(numBlocks uint32) (BtcPerKilobyte, error) { if numBlocks > estimateFeeDepth { return -1, fmt.Errorf( "can only estimate fees for up to %d blocks from now", - estimateFeeBinSize) + estimateFeeDepth) } // If there are no cached results, generate them. diff --git a/mempool/estimatefee_test.go b/mempool/estimatefee_test.go index 16dcfadc95..c1e0906096 100644 --- a/mempool/estimatefee_test.go +++ b/mempool/estimatefee_test.go @@ -9,10 +9,10 @@ import ( "math/rand" "testing" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/mining" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) // newTestFeeEstimator creates a feeEstimator with some different parameters diff --git a/mempool/interface.go b/mempool/interface.go new file mode 100644 index 0000000000..f6fe1f059a --- /dev/null +++ b/mempool/interface.go @@ -0,0 +1,71 @@ +package mempool + +import ( + "time" + + "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/wire" +) + +// TxMempool defines an interface that's used by other subsystems to interact +// with the mempool. +type TxMempool interface { + // LastUpdated returns the last time a transaction was added to or + // removed from the source pool. + LastUpdated() time.Time + + // TxDescs returns a slice of descriptors for all the transactions in + // the pool. + TxDescs() []*TxDesc + + // RawMempoolVerbose returns all the entries in the mempool as a fully + // populated btcjson result. + RawMempoolVerbose() map[string]*btcjson.GetRawMempoolVerboseResult + + // Count returns the number of transactions in the main pool. It does + // not include the orphan pool. + Count() int + + // FetchTransaction returns the requested transaction from the + // transaction pool. This only fetches from the main transaction pool + // and does not include orphans. + FetchTransaction(txHash *chainhash.Hash) (*btcutil.Tx, error) + + // HaveTransaction returns whether or not the passed transaction + // already exists in the main pool or in the orphan pool. + HaveTransaction(hash *chainhash.Hash) bool + + // ProcessTransaction is the main workhorse for handling insertion of + // new free-standing transactions into the memory pool. It includes + // functionality such as rejecting duplicate transactions, ensuring + // transactions follow all rules, orphan transaction handling, and + // insertion into the memory pool. + // + // It returns a slice of transactions added to the mempool. When the + // error is nil, the list will include the passed transaction itself + // along with any additional orphan transactions that were added as a + // result of the passed one being accepted. + ProcessTransaction(tx *btcutil.Tx, allowOrphan, + rateLimit bool, tag Tag) ([]*TxDesc, error) + + // RemoveTransaction removes the passed transaction from the mempool. + // When the removeRedeemers flag is set, any transactions that redeem + // outputs from the removed transaction will also be removed + // recursively from the mempool, as they would otherwise become + // orphans. + RemoveTransaction(tx *btcutil.Tx, removeRedeemers bool) + + // CheckMempoolAcceptance behaves similarly to bitcoind's + // `testmempoolaccept` RPC method. It will perform a series of checks + // to decide whether this transaction can be accepted to the mempool. + // If not, the specific error is returned and the caller needs to take + // actions based on it. + CheckMempoolAcceptance(tx *btcutil.Tx) (*MempoolAcceptResult, error) + + // CheckSpend checks whether the passed outpoint is already spent by + // a transaction in the mempool. If that's the case the spending + // transaction will be returned, if not nil will be returned. + CheckSpend(op wire.OutPoint) *btcutil.Tx +} diff --git a/mempool/mempool.go b/mempool/mempool.go index 63a86a16f5..84e583f4af 100644 --- a/mempool/mempool.go +++ b/mempool/mempool.go @@ -15,12 +15,13 @@ import ( "github.com/btcsuite/btcd/blockchain" "github.com/btcsuite/btcd/blockchain/indexers" "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/mining" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" + "github.com/davecgh/go-spew/spew" ) const ( @@ -48,6 +49,10 @@ const ( // can be evicted from the mempool when accepting a transaction // replacement. MaxReplacementEvictions = 100 + + // Transactions smaller than 65 non-witness bytes are not relayed to + // mitigate CVE-2017-12842. + MinStandardTxNonWitnessSize = 65 ) // Tag represents an identifier to use for tagging orphan transactions. The @@ -100,7 +105,7 @@ type Config struct { // This can be nil if the address index is not enabled. AddrIndex *indexers.AddrIndex - // FeeEstimatator provides a feeEstimator. If it is not nil, the mempool + // FeeEstimator provides a feeEstimator. If it is not nil, the mempool // records all new transactions it observes into the feeEstimator. FeeEstimator *FeeEstimator } @@ -195,6 +200,9 @@ type TxPool struct { // Ensure the TxPool type implements the mining.TxSource interface. var _ mining.TxSource = (*TxPool)(nil) +// Ensure the TxPool type implements the TxMemPool interface. +var _ TxMempool = (*TxPool)(nil) + // removeOrphan is the internal function which implements the public // RemoveOrphan. See the comment for RemoveOrphan for more details. // @@ -588,9 +596,9 @@ func (mp *TxPool) checkPoolDoubleSpend(tx *btcutil.Tx) (bool, error) { // transactions or if it doesn't signal replacement. if mp.cfg.Policy.RejectReplacement || !mp.signalsReplacement(conflict, nil) { - str := fmt.Sprintf("output %v already spent by "+ - "transaction %v in the memory pool", - txIn.PreviousOutPoint, conflict.Hash()) + str := fmt.Sprintf("output already spent in mempool: "+ + "output=%v, tx=%v", txIn.PreviousOutPoint, + conflict.Hash()) return false, txRuleError(wire.RejectDuplicate, str) } @@ -838,7 +846,7 @@ func (mp *TxPool) validateReplacement(tx *btcutil.Tx, // exceed the maximum allowed. conflicts := mp.txConflicts(tx) if len(conflicts) > MaxReplacementEvictions { - str := fmt.Sprintf("replacement transaction %v evicts more "+ + str := fmt.Sprintf("%v: replacement transaction evicts more "+ "transactions than permitted: max is %v, evicts %v", tx.Hash(), MaxReplacementEvictions, len(conflicts)) return nil, txRuleError(wire.RejectNonstandard, str) @@ -851,7 +859,7 @@ func (mp *TxPool) validateReplacement(tx *btcutil.Tx, if _, ok := conflicts[ancestorHash]; !ok { continue } - str := fmt.Sprintf("replacement transaction %v spends parent "+ + str := fmt.Sprintf("%v: replacement transaction spends parent "+ "transaction %v", tx.Hash(), ancestorHash) return nil, txRuleError(wire.RejectInvalid, str) } @@ -872,7 +880,7 @@ func (mp *TxPool) validateReplacement(tx *btcutil.Tx, ) for hash, conflict := range conflicts { if txFeeRate <= mp.pool[hash].FeePerKB { - str := fmt.Sprintf("replacement transaction %v has an "+ + str := fmt.Sprintf("%v: replacement transaction has an "+ "insufficient fee rate: needs more than %v, "+ "has %v", tx.Hash(), mp.pool[hash].FeePerKB, txFeeRate) @@ -893,7 +901,7 @@ func (mp *TxPool) validateReplacement(tx *btcutil.Tx, // which is determined by our minimum relay fee. minFee := calcMinRequiredTxRelayFee(txSize, mp.cfg.Policy.MinRelayTxFee) if txFee < conflictsFee+minFee { - str := fmt.Sprintf("replacement transaction %v has an "+ + str := fmt.Sprintf("%v: replacement transaction has an "+ "insufficient absolute fee: needs %v, has %v", tx.Hash(), conflictsFee+minFee, txFee) return nil, txRuleError(wire.RejectInsufficientFee, str) @@ -924,307 +932,39 @@ func (mp *TxPool) validateReplacement(tx *btcutil.Tx, // more details. // // This function MUST be called with the mempool lock held (for writes). -func (mp *TxPool) maybeAcceptTransaction(tx *btcutil.Tx, isNew, rateLimit, rejectDupOrphans bool) ([]*chainhash.Hash, *TxDesc, error) { - txHash := tx.Hash() - - // If a transaction has iwtness data, and segwit isn't active yet, If - // segwit isn't active yet, then we won't accept it into the mempool as - // it can't be mined yet. - if tx.MsgTx().HasWitness() { - segwitActive, err := mp.cfg.IsDeploymentActive(chaincfg.DeploymentSegwit) - if err != nil { - return nil, nil, err - } - - if !segwitActive { - str := fmt.Sprintf("transaction %v has witness data, "+ - "but segwit isn't active yet", txHash) - return nil, nil, txRuleError(wire.RejectNonstandard, str) - } - } - - // Don't accept the transaction if it already exists in the pool. This - // applies to orphan transactions as well when the reject duplicate - // orphans flag is set. This check is intended to be a quick check to - // weed out duplicates. - if mp.isTransactionInPool(txHash) || (rejectDupOrphans && - mp.isOrphanInPool(txHash)) { - - str := fmt.Sprintf("already have transaction %v", txHash) - return nil, nil, txRuleError(wire.RejectDuplicate, str) - } - - // Perform preliminary sanity checks on the transaction. This makes - // use of blockchain which contains the invariant rules for what - // transactions are allowed into blocks. - err := blockchain.CheckTransactionSanity(tx) - if err != nil { - if cerr, ok := err.(blockchain.RuleError); ok { - return nil, nil, chainRuleError(cerr) - } - return nil, nil, err - } - - // A standalone transaction must not be a coinbase transaction. - if blockchain.IsCoinBase(tx) { - str := fmt.Sprintf("transaction %v is an individual coinbase", - txHash) - return nil, nil, txRuleError(wire.RejectInvalid, str) - } - - // Get the current height of the main chain. A standalone transaction - // will be mined into the next block at best, so its height is at least - // one more than the current height. - bestHeight := mp.cfg.BestHeight() - nextBlockHeight := bestHeight + 1 - - medianTimePast := mp.cfg.MedianTimePast() - - // Don't allow non-standard transactions if the network parameters - // forbid their acceptance. - if !mp.cfg.Policy.AcceptNonStd { - err = checkTransactionStandard(tx, nextBlockHeight, - medianTimePast, mp.cfg.Policy.MinRelayTxFee, - mp.cfg.Policy.MaxTxVersion) - if err != nil { - // Attempt to extract a reject code from the error so - // it can be retained. When not possible, fall back to - // a non standard error. - rejectCode, found := extractRejectCode(err) - if !found { - rejectCode = wire.RejectNonstandard - } - str := fmt.Sprintf("transaction %v is not standard: %v", - txHash, err) - return nil, nil, txRuleError(rejectCode, str) - } - } - - // The transaction may not use any of the same outputs as other - // transactions already in the pool as that would ultimately result in a - // double spend, unless those transactions signal for RBF. This check is - // intended to be quick and therefore only detects double spends within - // the transaction pool itself. The transaction could still be double - // spending coins from the main chain at this point. There is a more - // in-depth check that happens later after fetching the referenced - // transaction inputs from the main chain which examines the actual - // spend data and prevents double spends. - isReplacement, err := mp.checkPoolDoubleSpend(tx) - if err != nil { - return nil, nil, err - } - - // Fetch all of the unspent transaction outputs referenced by the inputs - // to this transaction. This function also attempts to fetch the - // transaction itself to be used for detecting a duplicate transaction - // without needing to do a separate lookup. - utxoView, err := mp.fetchInputUtxos(tx) - if err != nil { - if cerr, ok := err.(blockchain.RuleError); ok { - return nil, nil, chainRuleError(cerr) - } - return nil, nil, err - } - - // Don't allow the transaction if it exists in the main chain and is not - // not already fully spent. - prevOut := wire.OutPoint{Hash: *txHash} - for txOutIdx := range tx.MsgTx().TxOut { - prevOut.Index = uint32(txOutIdx) - entry := utxoView.LookupEntry(prevOut) - if entry != nil && !entry.IsSpent() { - return nil, nil, txRuleError(wire.RejectDuplicate, - "transaction already exists") - } - utxoView.RemoveEntry(prevOut) - } - - // Transaction is an orphan if any of the referenced transaction outputs - // don't exist or are already spent. Adding orphans to the orphan pool - // is not handled by this function, and the caller should use - // maybeAddOrphan if this behavior is desired. - var missingParents []*chainhash.Hash - for outpoint, entry := range utxoView.Entries() { - if entry == nil || entry.IsSpent() { - // Must make a copy of the hash here since the iterator - // is replaced and taking its address directly would - // result in all of the entries pointing to the same - // memory location and thus all be the final hash. - hashCopy := outpoint.Hash - missingParents = append(missingParents, &hashCopy) - } - } - if len(missingParents) > 0 { - return missingParents, nil, nil - } - - // Don't allow the transaction into the mempool unless its sequence - // lock is active, meaning that it'll be allowed into the next block - // with respect to its defined relative lock times. - sequenceLock, err := mp.cfg.CalcSequenceLock(tx, utxoView) - if err != nil { - if cerr, ok := err.(blockchain.RuleError); ok { - return nil, nil, chainRuleError(cerr) - } - return nil, nil, err - } - if !blockchain.SequenceLockActive(sequenceLock, nextBlockHeight, - medianTimePast) { - return nil, nil, txRuleError(wire.RejectNonstandard, - "transaction's sequence locks on inputs not met") - } +func (mp *TxPool) maybeAcceptTransaction(tx *btcutil.Tx, isNew, rateLimit, + rejectDupOrphans bool) ([]*chainhash.Hash, *TxDesc, error) { - // Perform several checks on the transaction inputs using the invariant - // rules in blockchain for what transactions are allowed into blocks. - // Also returns the fees associated with the transaction which will be - // used later. - txFee, err := blockchain.CheckTransactionInputs(tx, nextBlockHeight, - utxoView, mp.cfg.ChainParams) - if err != nil { - if cerr, ok := err.(blockchain.RuleError); ok { - return nil, nil, chainRuleError(cerr) - } - return nil, nil, err - } - - // Don't allow transactions with non-standard inputs if the network - // parameters forbid their acceptance. - if !mp.cfg.Policy.AcceptNonStd { - err := checkInputsStandard(tx, utxoView) - if err != nil { - // Attempt to extract a reject code from the error so - // it can be retained. When not possible, fall back to - // a non standard error. - rejectCode, found := extractRejectCode(err) - if !found { - rejectCode = wire.RejectNonstandard - } - str := fmt.Sprintf("transaction %v has a non-standard "+ - "input: %v", txHash, err) - return nil, nil, txRuleError(rejectCode, str) - } - } - - // NOTE: if you modify this code to accept non-standard transactions, - // you should add code here to check that the transaction does a - // reasonable number of ECDSA signature verifications. + txHash := tx.Hash() - // Don't allow transactions with an excessive number of signature - // operations which would result in making it impossible to mine. Since - // the coinbase address itself can contain signature operations, the - // maximum allowed signature operations per transaction is less than - // the maximum allowed signature operations per block. - // TODO(roasbeef): last bool should be conditional on segwit activation - sigOpCost, err := blockchain.GetSigOpCost(tx, false, utxoView, true, true) + // Check for mempool acceptance. + r, err := mp.checkMempoolAcceptance( + tx, isNew, rateLimit, rejectDupOrphans, + ) if err != nil { - if cerr, ok := err.(blockchain.RuleError); ok { - return nil, nil, chainRuleError(cerr) - } return nil, nil, err } - if sigOpCost > mp.cfg.Policy.MaxSigOpCostPerTx { - str := fmt.Sprintf("transaction %v sigop cost is too high: %d > %d", - txHash, sigOpCost, mp.cfg.Policy.MaxSigOpCostPerTx) - return nil, nil, txRuleError(wire.RejectNonstandard, str) - } - - // Don't allow transactions with fees too low to get into a mined block. - // - // Most miners allow a free transaction area in blocks they mine to go - // alongside the area used for high-priority transactions as well as - // transactions with fees. A transaction size of up to 1000 bytes is - // considered safe to go into this section. Further, the minimum fee - // calculated below on its own would encourage several small - // transactions to avoid fees rather than one single larger transaction - // which is more desirable. Therefore, as long as the size of the - // transaction does not exceeed 1000 less than the reserved space for - // high-priority transactions, don't require a fee for it. - serializedSize := GetTxVirtualSize(tx) - minFee := calcMinRequiredTxRelayFee(serializedSize, - mp.cfg.Policy.MinRelayTxFee) - if serializedSize >= (DefaultBlockPrioritySize-1000) && txFee < minFee { - str := fmt.Sprintf("transaction %v has %d fees which is under "+ - "the required amount of %d", txHash, txFee, - minFee) - return nil, nil, txRuleError(wire.RejectInsufficientFee, str) - } - - // Require that free transactions have sufficient priority to be mined - // in the next block. Transactions which are being added back to the - // memory pool from blocks that have been disconnected during a reorg - // are exempted. - if isNew && !mp.cfg.Policy.DisableRelayPriority && txFee < minFee { - currentPriority := mining.CalcPriority(tx.MsgTx(), utxoView, - nextBlockHeight) - if currentPriority <= mining.MinHighPriority { - str := fmt.Sprintf("transaction %v has insufficient "+ - "priority (%g <= %g)", txHash, - currentPriority, mining.MinHighPriority) - return nil, nil, txRuleError(wire.RejectInsufficientFee, str) - } - } - - // Free-to-relay transactions are rate limited here to prevent - // penny-flooding with tiny transactions as a form of attack. - if rateLimit && txFee < minFee { - nowUnix := time.Now().Unix() - // Decay passed data with an exponentially decaying ~10 minute - // window - matches bitcoind handling. - mp.pennyTotal *= math.Pow(1.0-1.0/600.0, - float64(nowUnix-mp.lastPennyUnix)) - mp.lastPennyUnix = nowUnix - - // Are we still over the limit? - if mp.pennyTotal >= mp.cfg.Policy.FreeTxRelayLimit*10*1000 { - str := fmt.Sprintf("transaction %v has been rejected "+ - "by the rate limiter due to low fees", txHash) - return nil, nil, txRuleError(wire.RejectInsufficientFee, str) - } - oldTotal := mp.pennyTotal - - mp.pennyTotal += float64(serializedSize) - log.Tracef("rate limit: curTotal %v, nextTotal: %v, "+ - "limit %v", oldTotal, mp.pennyTotal, - mp.cfg.Policy.FreeTxRelayLimit*10*1000) - } - - // If the transaction has any conflicts and we've made it this far, then - // we're processing a potential replacement. - var conflicts map[chainhash.Hash]*btcutil.Tx - if isReplacement { - conflicts, err = mp.validateReplacement(tx, txFee) - if err != nil { - return nil, nil, err - } - } - // Verify crypto signatures for each input and reject the transaction if - // any don't verify. - err = blockchain.ValidateTransactionScripts(tx, utxoView, - txscript.StandardVerifyFlags, mp.cfg.SigCache, - mp.cfg.HashCache) - if err != nil { - if cerr, ok := err.(blockchain.RuleError); ok { - return nil, nil, chainRuleError(cerr) - } - return nil, nil, err + // Exit early if this transaction is missing parents. + if len(r.MissingParents) > 0 { + return r.MissingParents, nil, nil } // Now that we've deemed the transaction as valid, we can add it to the // mempool. If it ended up replacing any transactions, we'll remove them // first. - for _, conflict := range conflicts { + for _, conflict := range r.Conflicts { log.Debugf("Replacing transaction %v (fee_rate=%v sat/kb) "+ "with %v (fee_rate=%v sat/kb)\n", conflict.Hash(), mp.pool[*conflict.Hash()].FeePerKB, tx.Hash(), - txFee*1000/serializedSize) + int64(r.TxFee)*1000/r.TxSize) // The conflict set should already include the descendants for // each one, so we don't need to remove the redeemers within // this call as they'll be removed eventually. mp.removeTransaction(conflict, false) } - txD := mp.addTransaction(utxoView, tx, bestHeight, txFee) + txD := mp.addTransaction(r.utxoView, tx, r.bestHeight, int64(r.TxFee)) log.Debugf("Accepted transaction %v (pool size: %v)", txHash, len(mp.pool)) @@ -1360,7 +1100,7 @@ func (mp *TxPool) ProcessOrphans(acceptedTx *btcutil.Tx) []*TxDesc { // // It returns a slice of transactions added to the mempool. When the // error is nil, the list will include the passed transaction itself along -// with any additional orphan transaactions that were added as a result of +// with any additional orphan transactions that were added as a result of // the passed one being accepted. // // This function is safe for concurrent access. @@ -1429,7 +1169,7 @@ func (mp *TxPool) Count() int { return count } -// TxHashes returns a slice of hashes for all of the transactions in the memory +// TxHashes returns a slice of hashes for all the transactions in the memory // pool. // // This function is safe for concurrent access. @@ -1482,7 +1222,7 @@ func (mp *TxPool) MiningDescs() []*mining.TxDesc { return descs } -// RawMempoolVerbose returns all of the entries in the mempool as a fully +// RawMempoolVerbose returns all the entries in the mempool as a fully // populated btcjson result. // // This function is safe for concurrent access. @@ -1539,6 +1279,484 @@ func (mp *TxPool) LastUpdated() time.Time { return time.Unix(atomic.LoadInt64(&mp.lastUpdated), 0) } +// MempoolAcceptResult holds the result from mempool acceptance check. +type MempoolAcceptResult struct { + // TxFee is the fees paid in satoshi. + TxFee btcutil.Amount + + // TxSize is the virtual size(vb) of the tx. + TxSize int64 + + // conflicts is a set of transactions whose inputs are spent by this + // transaction(RBF). + Conflicts map[chainhash.Hash]*btcutil.Tx + + // MissingParents is a set of outpoints that are used by this + // transaction which cannot be found. Transaction is an orphan if any + // of the referenced transaction outputs don't exist or are already + // spent. + // + // NOTE: this field is mutually exclusive with other fields. If this + // field is not nil, then other fields must be empty. + MissingParents []*chainhash.Hash + + // utxoView is a set of the unspent transaction outputs referenced by + // the inputs to this transaction. + utxoView *blockchain.UtxoViewpoint + + // bestHeight is the best known height by the mempool. + bestHeight int32 +} + +// CheckMempoolAcceptance behaves similarly to bitcoind's `testmempoolaccept` +// RPC method. It will perform a series of checks to decide whether this +// transaction can be accepted to the mempool. If not, the specific error is +// returned and the caller needs to take actions based on it. +func (mp *TxPool) CheckMempoolAcceptance(tx *btcutil.Tx) ( + *MempoolAcceptResult, error) { + + mp.mtx.RLock() + defer mp.mtx.RUnlock() + + // Call checkMempoolAcceptance with isNew=true and rateLimit=true, + // which has the effect that we always check the fee paid from this tx + // is greater than min relay fee. We also reject this tx if it's + // already an orphan. + result, err := mp.checkMempoolAcceptance(tx, true, true, true) + if err != nil { + log.Errorf("CheckMempoolAcceptance: %v", err) + return nil, err + } + + log.Tracef("Tx %v passed mempool acceptance check: %v", tx.Hash(), + spew.Sdump(result)) + + return result, nil +} + +// checkMempoolAcceptance performs a series of validations on the given +// transaction. It returns an error when the transaction fails to meet the +// mempool policy, otherwise a `mempoolAcceptResult` is returned. +func (mp *TxPool) checkMempoolAcceptance(tx *btcutil.Tx, + isNew, rateLimit, rejectDupOrphans bool) (*MempoolAcceptResult, error) { + + txHash := tx.Hash() + + // Check for segwit activeness. + if err := mp.validateSegWitDeployment(tx); err != nil { + return nil, err + } + + // Don't accept the transaction if it already exists in the pool. This + // applies to orphan transactions as well when the reject duplicate + // orphans flag is set. This check is intended to be a quick check to + // weed out duplicates. + if mp.isTransactionInPool(txHash) || (rejectDupOrphans && + mp.isOrphanInPool(txHash)) { + + str := fmt.Sprintf("already have transaction in mempool %v", + txHash) + return nil, txRuleError(wire.RejectDuplicate, str) + } + + // Disallow transactions under the minimum standardness size. + if tx.MsgTx().SerializeSizeStripped() < MinStandardTxNonWitnessSize { + str := fmt.Sprintf("tx %v is too small", txHash) + return nil, txRuleError(wire.RejectNonstandard, str) + } + + // Perform preliminary sanity checks on the transaction. This makes use + // of blockchain which contains the invariant rules for what + // transactions are allowed into blocks. + err := blockchain.CheckTransactionSanity(tx) + if err != nil { + if cerr, ok := err.(blockchain.RuleError); ok { + return nil, chainRuleError(cerr) + } + + return nil, err + } + + // A standalone transaction must not be a coinbase transaction. + if blockchain.IsCoinBase(tx) { + str := fmt.Sprintf("transaction is an individual coinbase %v", + txHash) + + return nil, txRuleError(wire.RejectInvalid, str) + } + + // Get the current height of the main chain. A standalone transaction + // will be mined into the next block at best, so its height is at least + // one more than the current height. + bestHeight := mp.cfg.BestHeight() + nextBlockHeight := bestHeight + 1 + + medianTimePast := mp.cfg.MedianTimePast() + + // The transaction may not use any of the same outputs as other + // transactions already in the pool as that would ultimately result in + // a double spend, unless those transactions signal for RBF. This check + // is intended to be quick and therefore only detects double spends + // within the transaction pool itself. The transaction could still be + // double spending coins from the main chain at this point. There is a + // more in-depth check that happens later after fetching the referenced + // transaction inputs from the main chain which examines the actual + // spend data and prevents double spends. + isReplacement, err := mp.checkPoolDoubleSpend(tx) + if err != nil { + return nil, err + } + + // Fetch all of the unspent transaction outputs referenced by the + // inputs to this transaction. This function also attempts to fetch the + // transaction itself to be used for detecting a duplicate transaction + // without needing to do a separate lookup. + utxoView, err := mp.fetchInputUtxos(tx) + if err != nil { + if cerr, ok := err.(blockchain.RuleError); ok { + return nil, chainRuleError(cerr) + } + + return nil, err + } + + // Don't allow the transaction if it exists in the main chain and is + // already fully spent. + prevOut := wire.OutPoint{Hash: *txHash} + for txOutIdx := range tx.MsgTx().TxOut { + prevOut.Index = uint32(txOutIdx) + + entry := utxoView.LookupEntry(prevOut) + if entry != nil && !entry.IsSpent() { + return nil, txRuleError(wire.RejectDuplicate, + "transaction already exists in blockchain") + } + + utxoView.RemoveEntry(prevOut) + } + + // Transaction is an orphan if any of the referenced transaction + // outputs don't exist or are already spent. Adding orphans to the + // orphan pool is not handled by this function, and the caller should + // use maybeAddOrphan if this behavior is desired. + var missingParents []*chainhash.Hash + for outpoint, entry := range utxoView.Entries() { + if entry == nil || entry.IsSpent() { + // Must make a copy of the hash here since the iterator + // is replaced and taking its address directly would + // result in all the entries pointing to the same + // memory location and thus all be the final hash. + hashCopy := outpoint.Hash + missingParents = append(missingParents, &hashCopy) + } + } + + // Exit early if this transaction is missing parents. + if len(missingParents) > 0 { + log.Debugf("Tx %v is an orphan with missing parents: %v", + txHash, missingParents) + + return &MempoolAcceptResult{ + MissingParents: missingParents, + }, nil + } + + // Perform several checks on the transaction inputs using the invariant + // rules in blockchain for what transactions are allowed into blocks. + // Also returns the fees associated with the transaction which will be + // used later. + // + // NOTE: this check must be performed before `validateStandardness` to + // make sure a nil entry is not returned from `utxoView.LookupEntry`. + txFee, err := blockchain.CheckTransactionInputs( + tx, nextBlockHeight, utxoView, mp.cfg.ChainParams, + ) + if err != nil { + if cerr, ok := err.(blockchain.RuleError); ok { + return nil, chainRuleError(cerr) + } + return nil, err + } + + // Don't allow non-standard transactions or non-standard inputs if the + // network parameters forbid their acceptance. + err = mp.validateStandardness( + tx, nextBlockHeight, medianTimePast, utxoView, + ) + if err != nil { + return nil, err + } + + // Don't allow the transaction into the mempool unless its sequence + // lock is active, meaning that it'll be allowed into the next block + // with respect to its defined relative lock times. + sequenceLock, err := mp.cfg.CalcSequenceLock(tx, utxoView) + if err != nil { + if cerr, ok := err.(blockchain.RuleError); ok { + return nil, chainRuleError(cerr) + } + + return nil, err + } + + if !blockchain.SequenceLockActive( + sequenceLock, nextBlockHeight, medianTimePast, + ) { + + return nil, txRuleError(wire.RejectNonstandard, + "transaction's sequence locks on inputs not met") + } + + // Don't allow transactions with an excessive number of signature + // operations which would result in making it impossible to mine. + if err := mp.validateSigCost(tx, utxoView); err != nil { + return nil, err + } + + txSize := GetTxVirtualSize(tx) + + // Don't allow transactions with fees too low to get into a mined + // block. + err = mp.validateRelayFeeMet( + tx, txFee, txSize, utxoView, nextBlockHeight, isNew, rateLimit, + ) + if err != nil { + return nil, err + } + + // If the transaction has any conflicts, and we've made it this far, + // then we're processing a potential replacement. + var conflicts map[chainhash.Hash]*btcutil.Tx + if isReplacement { + conflicts, err = mp.validateReplacement(tx, txFee) + if err != nil { + return nil, err + } + } + + // Verify crypto signatures for each input and reject the transaction + // if any don't verify. + err = blockchain.ValidateTransactionScripts(tx, utxoView, + txscript.StandardVerifyFlags, mp.cfg.SigCache, + mp.cfg.HashCache) + if err != nil { + if cerr, ok := err.(blockchain.RuleError); ok { + return nil, chainRuleError(cerr) + } + return nil, err + } + + result := &MempoolAcceptResult{ + TxFee: btcutil.Amount(txFee), + TxSize: txSize, + Conflicts: conflicts, + utxoView: utxoView, + bestHeight: bestHeight, + } + + return result, nil +} + +// validateSegWitDeployment checks that when a transaction has witness data, +// segwit must be active. +func (mp *TxPool) validateSegWitDeployment(tx *btcutil.Tx) error { + // Exit early if this transaction doesn't have witness data. + if !tx.MsgTx().HasWitness() { + return nil + } + + // If a transaction has witness data, and segwit isn't active yet, then + // we won't accept it into the mempool as it can't be mined yet. + segwitActive, err := mp.cfg.IsDeploymentActive( + chaincfg.DeploymentSegwit, + ) + if err != nil { + return err + } + + // Exit early if segwit is active. + if segwitActive { + return nil + } + + simnetHint := "" + if mp.cfg.ChainParams.Net == wire.SimNet { + bestHeight := mp.cfg.BestHeight() + simnetHint = fmt.Sprintf(" (The threshold for segwit "+ + "activation is 300 blocks on simnet, current best "+ + "height is %d)", bestHeight) + } + str := fmt.Sprintf("transaction %v has witness data, "+ + "but segwit isn't active yet%s", tx.Hash(), simnetHint) + + return txRuleError(wire.RejectNonstandard, str) +} + +// validateStandardness checks the transaction passes both transaction standard +// and input standard. +func (mp *TxPool) validateStandardness(tx *btcutil.Tx, nextBlockHeight int32, + medianTimePast time.Time, utxoView *blockchain.UtxoViewpoint) error { + + // Exit early if we accept non-standard transactions. + // + // NOTE: if you modify this code to accept non-standard transactions, + // you should add code here to check that the transaction does a + // reasonable number of ECDSA signature verifications. + if mp.cfg.Policy.AcceptNonStd { + return nil + } + + // Check the transaction standard. + err := CheckTransactionStandard( + tx, nextBlockHeight, medianTimePast, + mp.cfg.Policy.MinRelayTxFee, mp.cfg.Policy.MaxTxVersion, + ) + if err != nil { + // Attempt to extract a reject code from the error so it can be + // retained. When not possible, fall back to a non standard + // error. + rejectCode, found := extractRejectCode(err) + if !found { + rejectCode = wire.RejectNonstandard + } + str := fmt.Sprintf("transaction %v is not standard: %v", + tx.Hash(), err) + + return txRuleError(rejectCode, str) + } + + // Check the inputs standard. + err = checkInputsStandard(tx, utxoView) + if err != nil { + // Attempt to extract a reject code from the error so it can be + // retained. When not possible, fall back to a non-standard + // error. + rejectCode, found := extractRejectCode(err) + if !found { + rejectCode = wire.RejectNonstandard + } + str := fmt.Sprintf("transaction %v has a non-standard "+ + "input: %v", tx.Hash(), err) + + return txRuleError(rejectCode, str) + } + + return nil +} + +// validateSigCost checks the cost to run the signature operations to make sure +// the number of signatures are sane. +func (mp *TxPool) validateSigCost(tx *btcutil.Tx, + utxoView *blockchain.UtxoViewpoint) error { + + // Since the coinbase address itself can contain signature operations, + // the maximum allowed signature operations per transaction is less + // than the maximum allowed signature operations per block. + // + // TODO(roasbeef): last bool should be conditional on segwit activation + sigOpCost, err := blockchain.GetSigOpCost( + tx, false, utxoView, true, true, + ) + if err != nil { + if cerr, ok := err.(blockchain.RuleError); ok { + return chainRuleError(cerr) + } + + return err + } + + // Exit early if the sig cost is under limit. + if sigOpCost <= mp.cfg.Policy.MaxSigOpCostPerTx { + return nil + } + + str := fmt.Sprintf("transaction %v sigop cost is too high: %d > %d", + tx.Hash(), sigOpCost, mp.cfg.Policy.MaxSigOpCostPerTx) + + return txRuleError(wire.RejectNonstandard, str) +} + +// validateRelayFeeMet checks that the min relay fee is covered by this +// transaction. +func (mp *TxPool) validateRelayFeeMet(tx *btcutil.Tx, txFee, txSize int64, + utxoView *blockchain.UtxoViewpoint, nextBlockHeight int32, + isNew, rateLimit bool) error { + + txHash := tx.Hash() + + // Most miners allow a free transaction area in blocks they mine to go + // alongside the area used for high-priority transactions as well as + // transactions with fees. A transaction size of up to 1000 bytes is + // considered safe to go into this section. Further, the minimum fee + // calculated below on its own would encourage several small + // transactions to avoid fees rather than one single larger transaction + // which is more desirable. Therefore, as long as the size of the + // transaction does not exceed 1000 less than the reserved space for + // high-priority transactions, don't require a fee for it. + minFee := calcMinRequiredTxRelayFee(txSize, mp.cfg.Policy.MinRelayTxFee) + + if txSize >= (DefaultBlockPrioritySize-1000) && txFee < minFee { + str := fmt.Sprintf("transaction %v has %d fees which is under "+ + "the required amount of %d", txHash, txFee, minFee) + + return txRuleError(wire.RejectInsufficientFee, str) + } + + // Exit early if the min relay fee is met. + if txFee >= minFee { + return nil + } + + // Exit early if this is neither a new tx or rate limited. + if !isNew && !rateLimit { + return nil + } + + // Require that free transactions have sufficient priority to be mined + // in the next block. Transactions which are being added back to the + // memory pool from blocks that have been disconnected during a reorg + // are exempted. + if isNew && !mp.cfg.Policy.DisableRelayPriority { + currentPriority := mining.CalcPriority( + tx.MsgTx(), utxoView, nextBlockHeight, + ) + if currentPriority <= mining.MinHighPriority { + str := fmt.Sprintf("transaction %v has insufficient "+ + "priority (%g <= %g)", txHash, + currentPriority, mining.MinHighPriority) + + return txRuleError(wire.RejectInsufficientFee, str) + } + } + + // We can only end up here when the rateLimit is true. Free-to-relay + // transactions are rate limited here to prevent penny-flooding with + // tiny transactions as a form of attack. + nowUnix := time.Now().Unix() + + // Decay passed data with an exponentially decaying ~10 minute window - + // matches bitcoind handling. + mp.pennyTotal *= math.Pow( + 1.0-1.0/600.0, float64(nowUnix-mp.lastPennyUnix), + ) + mp.lastPennyUnix = nowUnix + + // Are we still over the limit? + if mp.pennyTotal >= mp.cfg.Policy.FreeTxRelayLimit*10*1000 { + str := fmt.Sprintf("transaction %v has been rejected "+ + "by the rate limiter due to low fees", txHash) + + return txRuleError(wire.RejectInsufficientFee, str) + } + + oldTotal := mp.pennyTotal + mp.pennyTotal += float64(txSize) + log.Tracef("rate limit: curTotal %v, nextTotal: %v, limit %v", + oldTotal, mp.pennyTotal, mp.cfg.Policy.FreeTxRelayLimit*10*1000) + + return nil +} + // New returns a new memory pool for validating and storing standalone // transactions until they are mined into a block. func New(cfg *Config) *TxPool { diff --git a/mempool/mempool_test.go b/mempool/mempool_test.go index 84aee10ab2..e31b6043bd 100644 --- a/mempool/mempool_test.go +++ b/mempool/mempool_test.go @@ -13,12 +13,12 @@ import ( "time" "github.com/btcsuite/btcd/blockchain" - "github.com/btcsuite/btcd/btcec" + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) // fakeChain is used by the pool harness to provide generated test utxos and @@ -291,7 +291,7 @@ func newPoolHarness(chainParams *chaincfg.Params) (*poolHarness, []spendableOutp if err != nil { return nil, nil, err } - signKey, signPub := btcec.PrivKeyFromBytes(btcec.S256(), keyBytes) + signKey, signPub := btcec.PrivKeyFromBytes(keyBytes) // Generate associated pay-to-script-hash address and resulting payment // script. @@ -560,7 +560,7 @@ func TestOrphanReject(t *testing.T) { // Ensure no transactions were reported as accepted. if len(acceptedTxns) != 0 { - t.Fatal("ProcessTransaction: reported %d accepted "+ + t.Fatalf("ProcessTransaction: reported %d accepted "+ "transactions from failed orphan attempt", len(acceptedTxns)) } @@ -1418,8 +1418,8 @@ func TestAncestorsDescendants(t *testing.T) { // We'll be querying for the ancestors of E. We should expect to see all // of the transactions that it depends on. expectedAncestors := map[chainhash.Hash]struct{}{ - *a.Hash(): struct{}{}, *b.Hash(): struct{}{}, - *c.Hash(): struct{}{}, *d.Hash(): struct{}{}, + *a.Hash(): {}, *b.Hash(): {}, + *c.Hash(): {}, *d.Hash(): {}, } ancestors := ctx.harness.txPool.txAncestors(e, nil) if len(ancestors) != len(expectedAncestors) { @@ -1436,8 +1436,8 @@ func TestAncestorsDescendants(t *testing.T) { // Then, we'll query for the descendants of A. We should expect to see // all of the transactions that depend on it. expectedDescendants := map[chainhash.Hash]struct{}{ - *b.Hash(): struct{}{}, *c.Hash(): struct{}{}, - *d.Hash(): struct{}{}, *e.Hash(): struct{}{}, + *b.Hash(): {}, *c.Hash(): {}, + *d.Hash(): {}, *e.Hash(): {}, } descendants := ctx.harness.txPool.txDescendants(a, nil) if len(descendants) != len(expectedDescendants) { @@ -1491,7 +1491,7 @@ func TestRBF(t *testing.T) { return tx, nil }, - err: "already spent by transaction", + err: "already spent in mempool", }, { // A transaction cannot replace another if we don't @@ -1522,7 +1522,7 @@ func TestRBF(t *testing.T) { return tx, nil }, - err: "already spent by transaction", + err: "already spent in mempool", }, { // A transaction cannot replace another if doing so @@ -1749,6 +1749,47 @@ func TestRBF(t *testing.T) { }, err: "", }, + { + // A transaction that doesn't signal replacement, can + // be replaced if the parent signals replacement. + name: "inherited replacement", + setup: func(ctx *testContext) (*btcutil.Tx, []*btcutil.Tx) { + coinbase := ctx.addCoinbaseTx(1) + + // Create an initial parent transaction that + // marks replacement, we won't be replacing + // this directly however. + coinbaseOut := txOutToSpendableOut(coinbase, 0) + outs := []spendableOutput{coinbaseOut} + parent := ctx.addSignedTx( + outs, 1, defaultFee, true, false, + ) + + // Now create a transaction that spends that + // parent transaction, which is marked as NOT + // being RBF-able. + parentOut := txOutToSpendableOut(parent, 0) + parentOuts := []spendableOutput{parentOut} + childNoReplace := ctx.addSignedTx( + parentOuts, 1, defaultFee, false, false, + ) + + // Now we'll create another transaction that + // replaces the *child* only. This should work + // as the parent has been marked for RBF, even + // though the child hasn't. + respendOuts := []spendableOutput{parentOut} + childReplace, err := ctx.harness.CreateSignedTx( + respendOuts, 1, defaultFee*3, false, + ) + if err != nil { + ctx.t.Fatalf("unable to create child tx: %v", err) + } + + return childReplace, []*btcutil.Tx{childNoReplace} + }, + err: "", + }, } for _, testCase := range testCases { diff --git a/mempool/mocks.go b/mempool/mocks.go new file mode 100644 index 0000000000..e81309c51a --- /dev/null +++ b/mempool/mocks.go @@ -0,0 +1,125 @@ +package mempool + +import ( + "time" + + "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/wire" + "github.com/stretchr/testify/mock" +) + +// MockTxMempool is a mock implementation of the TxMempool interface. +type MockTxMempool struct { + mock.Mock +} + +// Ensure the MockTxMempool implements the TxMemPool interface. +var _ TxMempool = (*MockTxMempool)(nil) + +// LastUpdated returns the last time a transaction was added to or removed from +// the source pool. +func (m *MockTxMempool) LastUpdated() time.Time { + args := m.Called() + return args.Get(0).(time.Time) +} + +// TxDescs returns a slice of descriptors for all the transactions in the pool. +func (m *MockTxMempool) TxDescs() []*TxDesc { + args := m.Called() + return args.Get(0).([]*TxDesc) +} + +// RawMempoolVerbose returns all the entries in the mempool as a fully +// populated btcjson result. +func (m *MockTxMempool) RawMempoolVerbose() map[string]*btcjson. + GetRawMempoolVerboseResult { + + args := m.Called() + return args.Get(0).(map[string]*btcjson.GetRawMempoolVerboseResult) +} + +// Count returns the number of transactions in the main pool. It does not +// include the orphan pool. +func (m *MockTxMempool) Count() int { + args := m.Called() + return args.Get(0).(int) +} + +// FetchTransaction returns the requested transaction from the transaction +// pool. This only fetches from the main transaction pool and does not include +// orphans. +func (m *MockTxMempool) FetchTransaction( + txHash *chainhash.Hash) (*btcutil.Tx, error) { + + args := m.Called(txHash) + + if args.Get(0) == nil { + return nil, args.Error(1) + } + + return args.Get(0).(*btcutil.Tx), args.Error(1) +} + +// HaveTransaction returns whether or not the passed transaction already exists +// in the main pool or in the orphan pool. +func (m *MockTxMempool) HaveTransaction(hash *chainhash.Hash) bool { + args := m.Called(hash) + return args.Get(0).(bool) +} + +// ProcessTransaction is the main workhorse for handling insertion of new +// free-standing transactions into the memory pool. It includes functionality +// such as rejecting duplicate transactions, ensuring transactions follow all +// rules, orphan transaction handling, and insertion into the memory pool. +func (m *MockTxMempool) ProcessTransaction(tx *btcutil.Tx, allowOrphan, + rateLimit bool, tag Tag) ([]*TxDesc, error) { + + args := m.Called(tx, allowOrphan, rateLimit, tag) + + if args.Get(0) == nil { + return nil, args.Error(1) + } + + return args.Get(0).([]*TxDesc), args.Error(1) +} + +// RemoveTransaction removes the passed transaction from the mempool. When the +// removeRedeemers flag is set, any transactions that redeem outputs from the +// removed transaction will also be removed recursively from the mempool, as +// they would otherwise become orphans. +func (m *MockTxMempool) RemoveTransaction(tx *btcutil.Tx, + removeRedeemers bool) { + + m.Called(tx, removeRedeemers) +} + +// CheckMempoolAcceptance behaves similarly to bitcoind's `testmempoolaccept` +// RPC method. It will perform a series of checks to decide whether this +// transaction can be accepted to the mempool. If not, the specific error is +// returned and the caller needs to take actions based on it. +func (m *MockTxMempool) CheckMempoolAcceptance( + tx *btcutil.Tx) (*MempoolAcceptResult, error) { + + args := m.Called(tx) + + if args.Get(0) == nil { + return nil, args.Error(1) + } + + return args.Get(0).(*MempoolAcceptResult), args.Error(1) +} + +// CheckSpend checks whether the passed outpoint is already spent by a +// transaction in the mempool. If that's the case the spending transaction will +// be returned, if not nil will be returned. +func (m *MockTxMempool) CheckSpend(op wire.OutPoint) *btcutil.Tx { + args := m.Called(op) + + if args.Get(0) == nil { + return nil + } + + return args.Get(0).(*btcutil.Tx) +} diff --git a/mempool/policy.go b/mempool/policy.go index f4e3b51ee7..862767d0c8 100644 --- a/mempool/policy.go +++ b/mempool/policy.go @@ -9,9 +9,9 @@ import ( "time" "github.com/btcsuite/btcd/blockchain" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) const ( @@ -61,7 +61,7 @@ const ( func calcMinRequiredTxRelayFee(serializedSize int64, minRelayTxFee btcutil.Amount) int64 { // Calculate the minimum fee for a transaction to be allowed into the // mempool and relayed by scaling the base fee (which is the minimum - // free transaction relay fee). minTxRelayFee is in Satoshi/kB so + // free transaction relay fee). minRelayTxFee is in Satoshi/kB so // multiply by serializedSize (which is in bytes) and divide by 1000 to // get minimum Satoshis. minFee := (serializedSize * int64(minRelayTxFee)) / 1000 @@ -172,17 +172,10 @@ func checkPkScriptStandard(pkScript []byte, scriptClass txscript.ScriptClass) er return nil } -// isDust returns whether or not the passed transaction output amount is -// considered dust or not based on the passed minimum transaction relay fee. -// Dust is defined in terms of the minimum transaction relay fee. In -// particular, if the cost to the network to spend coins is more than 1/3 of the -// minimum transaction relay fee, it is considered dust. -func isDust(txOut *wire.TxOut, minRelayTxFee btcutil.Amount) bool { - // Unspendable outputs are considered dust. - if txscript.IsUnspendable(txOut.PkScript) { - return true - } - +// GetDustThreshold calculates the dust limit for a *wire.TxOut by taking the +// size of a typical spending transaction and multiplying it by 3 to account +// for the minimum dust relay fee of 3000sat/kvb. +func GetDustThreshold(txOut *wire.TxOut) int64 { // The total serialized size consists of the output and the associated // input script to redeem it. Since there is no input script // to redeem it yet, use the minimum size of a typical input script. @@ -253,6 +246,20 @@ func isDust(txOut *wire.TxOut, minRelayTxFee btcutil.Amount) bool { totalSize += 107 } + return 3 * int64(totalSize) +} + +// IsDust returns whether or not the passed transaction output amount is +// considered dust or not based on the passed minimum transaction relay fee. +// Dust is defined in terms of the minimum transaction relay fee. In +// particular, if the cost to the network to spend coins is more than 1/3 of the +// minimum transaction relay fee, it is considered dust. +func IsDust(txOut *wire.TxOut, minRelayTxFee btcutil.Amount) bool { + // Unspendable outputs are considered dust. + if txscript.IsUnspendable(txOut.PkScript) { + return true + } + // The output is considered dust if the cost to the network to spend the // coins is more than 1/3 of the minimum free transaction relay fee. // minFreeTxRelayFee is in Satoshi/KB, so multiply by 1000 to @@ -265,17 +272,17 @@ func isDust(txOut *wire.TxOut, minRelayTxFee btcutil.Amount) bool { // // The following is equivalent to (value/totalSize) * (1/3) * 1000 // without needing to do floating point math. - return txOut.Value*1000/(3*int64(totalSize)) < int64(minRelayTxFee) + return txOut.Value*1000/GetDustThreshold(txOut) < int64(minRelayTxFee) } -// checkTransactionStandard performs a series of checks on a transaction to +// CheckTransactionStandard performs a series of checks on a transaction to // ensure it is a "standard" transaction. A standard transaction is one that // conforms to several additional limiting cases over what is considered a // "sane" transaction such as having a version in the supported range, being // finalized, conforming to more stringent size constraints, having scripts // of recognized forms, and not containing "dust" outputs (those that are // so small it costs more to process them than they are worth). -func checkTransactionStandard(tx *btcutil.Tx, height int32, +func CheckTransactionStandard(tx *btcutil.Tx, height int32, medianTimePast time.Time, minRelayTxFee btcutil.Amount, maxTxVersion int32) error { @@ -301,8 +308,8 @@ func checkTransactionStandard(tx *btcutil.Tx, height int32, // attacks. txWeight := blockchain.GetTransactionWeight(tx) if txWeight > maxStandardTxWeight { - str := fmt.Sprintf("weight of transaction %v is larger than max "+ - "allowed weight of %v", txWeight, maxStandardTxWeight) + str := fmt.Sprintf("weight of transaction is larger than max "+ + "allowed: %v > %v", txWeight, maxStandardTxWeight) return txRuleError(wire.RejectNonstandard, str) } @@ -313,8 +320,8 @@ func checkTransactionStandard(tx *btcutil.Tx, height int32, sigScriptLen := len(txIn.SignatureScript) if sigScriptLen > maxStandardSigScriptSize { str := fmt.Sprintf("transaction input %d: signature "+ - "script size of %d bytes is large than max "+ - "allowed size of %d bytes", i, sigScriptLen, + "script size is larger than max allowed: "+ + "%d > %d bytes", i, sigScriptLen, maxStandardSigScriptSize) return txRuleError(wire.RejectNonstandard, str) } @@ -351,9 +358,9 @@ func checkTransactionStandard(tx *btcutil.Tx, height int32, // "dust". if scriptClass == txscript.NullDataTy { numNullDataOutputs++ - } else if isDust(txOut, minRelayTxFee) { - str := fmt.Sprintf("transaction output %d: payment "+ - "of %d is dust", i, txOut.Value) + } else if IsDust(txOut, minRelayTxFee) { + str := fmt.Sprintf("transaction output %d: payment is "+ + "dust: %v", i, txOut.Value) return txRuleError(wire.RejectDust, str) } } diff --git a/mempool/policy_test.go b/mempool/policy_test.go index 9dd618ad6e..29c0956a0e 100644 --- a/mempool/policy_test.go +++ b/mempool/policy_test.go @@ -9,12 +9,12 @@ import ( "testing" "time" - "github.com/btcsuite/btcd/btcec" + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) // TestCalcMinRequiredTxRelayFee tests the calcMinRequiredTxRelayFee API. @@ -98,7 +98,7 @@ func TestCalcMinRequiredTxRelayFee(t *testing.T) { func TestCheckPkScriptStandard(t *testing.T) { var pubKeys [][]byte for i := 0; i < 4; i++ { - pk, err := btcec.NewPrivateKey(btcec.S256()) + pk, err := btcec.NewPrivateKey() if err != nil { t.Fatalf("TestCheckPkScriptStandard NewPrivateKey failed: %v", err) @@ -190,7 +190,6 @@ func TestCheckPkScriptStandard(t *testing.T) { if err != nil { t.Fatalf("TestCheckPkScriptStandard test '%s' "+ "failed: %v", test.name, err) - continue } scriptClass := txscript.GetScriptClass(script) got := checkPkScriptStandard(script, scriptClass) @@ -204,7 +203,7 @@ func TestCheckPkScriptStandard(t *testing.T) { } } -// TestDust tests the isDust API. +// TestDust tests the IsDust API. func TestDust(t *testing.T) { pkScript := []byte{0x76, 0xa9, 0x21, 0x03, 0x2f, 0x7e, 0x43, 0x0a, 0xa4, 0xc9, 0xd1, 0x59, 0x43, 0x7e, 0x84, 0xb9, @@ -268,16 +267,15 @@ func TestDust(t *testing.T) { }, } for _, test := range tests { - res := isDust(&test.txOut, test.relayFee) + res := IsDust(&test.txOut, test.relayFee) if res != test.isDust { t.Fatalf("Dust test '%s' failed: want %v got %v", test.name, test.isDust, res) - continue } } } -// TestCheckTransactionStandard tests the checkTransactionStandard API. +// TestCheckTransactionStandard tests the CheckTransactionStandard API. func TestCheckTransactionStandard(t *testing.T) { // Create some dummy, but otherwise standard, data for transactions. prevOutHash, err := chainhash.NewHashFromStr("01") @@ -469,7 +467,7 @@ func TestCheckTransactionStandard(t *testing.T) { pastMedianTime := time.Now() for _, test := range tests { // Ensure standardness is as expected. - err := checkTransactionStandard(btcutil.NewTx(&test.tx), + err := CheckTransactionStandard(btcutil.NewTx(&test.tx), test.height, pastMedianTime, DefaultMinRelayTxFee, 1) if err == nil && test.isStandard { // Test passes since function returned standard for a @@ -477,12 +475,12 @@ func TestCheckTransactionStandard(t *testing.T) { continue } if err == nil && !test.isStandard { - t.Errorf("checkTransactionStandard (%s): standard when "+ + t.Errorf("CheckTransactionStandard (%s): standard when "+ "it should not be", test.name) continue } if err != nil && test.isStandard { - t.Errorf("checkTransactionStandard (%s): nonstandard "+ + t.Errorf("CheckTransactionStandard (%s): nonstandard "+ "when it should not be: %v", test.name, err) continue } @@ -490,20 +488,20 @@ func TestCheckTransactionStandard(t *testing.T) { // Ensure error type is a TxRuleError inside of a RuleError. rerr, ok := err.(RuleError) if !ok { - t.Errorf("checkTransactionStandard (%s): unexpected "+ + t.Errorf("CheckTransactionStandard (%s): unexpected "+ "error type - got %T", test.name, err) continue } txrerr, ok := rerr.Err.(TxRuleError) if !ok { - t.Errorf("checkTransactionStandard (%s): unexpected "+ + t.Errorf("CheckTransactionStandard (%s): unexpected "+ "error type - got %T", test.name, rerr.Err) continue } // Ensure the reject code is the expected one. if txrerr.RejectCode != test.code { - t.Errorf("checkTransactionStandard (%s): unexpected "+ + t.Errorf("CheckTransactionStandard (%s): unexpected "+ "error code - got %v, want %v", test.name, txrerr.RejectCode, test.code) continue diff --git a/mining/README.md b/mining/README.md index 5295215f8e..3abd195355 100644 --- a/mining/README.md +++ b/mining/README.md @@ -1,9 +1,9 @@ mining ====== -[![Build Status](http://img.shields.io/travis/btcsuite/btcd.svg)](https://travis-ci.org/btcsuite/btcd) +[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions) [![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) -[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/btcsuite/btcd/mining) +[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/mining) ## Overview diff --git a/mining/cpuminer/README.md b/mining/cpuminer/README.md index 205b8f0360..47247be98f 100644 --- a/mining/cpuminer/README.md +++ b/mining/cpuminer/README.md @@ -1,9 +1,9 @@ cpuminer ======== -[![Build Status](http://img.shields.io/travis/btcsuite/btcd.svg)](https://travis-ci.org/btcsuite/btcd) +[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions) [![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) -[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/btcsuite/btcd/mining/cpuminer) +[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/mining/cpuminer) ======= ## Overview diff --git a/mining/cpuminer/cpuminer.go b/mining/cpuminer/cpuminer.go index 3d5b3b1936..2c07f2ee1f 100644 --- a/mining/cpuminer/cpuminer.go +++ b/mining/cpuminer/cpuminer.go @@ -13,11 +13,11 @@ import ( "time" "github.com/btcsuite/btcd/blockchain" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/mining" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) const ( diff --git a/mining/mining.go b/mining/mining.go index 44ec7dc761..5f2706521a 100644 --- a/mining/mining.go +++ b/mining/mining.go @@ -11,11 +11,11 @@ import ( "time" "github.com/btcsuite/btcd/blockchain" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) const ( @@ -42,7 +42,7 @@ type TxDesc struct { // Added is the time when the entry was added to the source pool. Added time.Time - // Height is the block height when the entry was added to the the source + // Height is the block height when the entry was added to the source // pool. Height int32 @@ -420,26 +420,26 @@ func NewBlkTmplGenerator(policy *Policy, params *chaincfg.Params, // // Given the above, a block generated by this function is of the following form: // -// ----------------------------------- -- -- -// | Coinbase Transaction | | | -// |-----------------------------------| | | -// | | | | ----- policy.BlockPrioritySize -// | High-priority Transactions | | | -// | | | | -// |-----------------------------------| | -- -// | | | -// | | | -// | | |--- policy.BlockMaxSize -// | Transactions prioritized by fee | | -// | until <= policy.TxMinFreeFee | | -// | | | -// | | | -// | | | -// |-----------------------------------| | -// | Low-fee/Non high-priority (free) | | -// | transactions (while block size | | -// | <= policy.BlockMinSize) | | -// ----------------------------------- -- +// ----------------------------------- -- -- +// | Coinbase Transaction | | | +// |-----------------------------------| | | +// | | | | ----- policy.BlockPrioritySize +// | High-priority Transactions | | | +// | | | | +// |-----------------------------------| | -- +// | | | +// | | | +// | | |--- policy.BlockMaxSize +// | Transactions prioritized by fee | | +// | until <= policy.TxMinFreeFee | | +// | | | +// | | | +// | | | +// |-----------------------------------| | +// | Low-fee/Non high-priority (free) | | +// | transactions (while block size | | +// | <= policy.BlockMinSize) | | +// ----------------------------------- -- func (g *BlkTmplGenerator) NewBlockTemplate(payToAddress btcutil.Address) (*BlockTemplate, error) { // Extend the most recently known best block. best := g.chain.BestSnapshot() @@ -520,7 +520,7 @@ mempoolLoop: continue } - // Fetch all of the utxos referenced by the this transaction. + // Fetch all of the utxos referenced by this transaction. // NOTE: This intentionally does not fetch inputs from the // mempool since a transaction which depends on other // transactions in the mempool must come after those @@ -563,9 +563,6 @@ mempoolLoop: } prioItem.dependsOn[*originHash] = struct{}{} - // Skip the check below. We already know the - // referenced transaction is available. - continue } } @@ -803,40 +800,7 @@ mempoolLoop: // OP_RETURN output within the coinbase transaction. var witnessCommitment []byte if witnessIncluded { - // The witness of the coinbase transaction MUST be exactly 32-bytes - // of all zeroes. - var witnessNonce [blockchain.CoinbaseWitnessDataLen]byte - coinbaseTx.MsgTx().TxIn[0].Witness = wire.TxWitness{witnessNonce[:]} - - // Next, obtain the merkle root of a tree which consists of the - // wtxid of all transactions in the block. The coinbase - // transaction will have a special wtxid of all zeroes. - witnessMerkleTree := blockchain.BuildMerkleTreeStore(blockTxns, - true) - witnessMerkleRoot := witnessMerkleTree[len(witnessMerkleTree)-1] - - // The preimage to the witness commitment is: - // witnessRoot || coinbaseWitness - var witnessPreimage [64]byte - copy(witnessPreimage[:32], witnessMerkleRoot[:]) - copy(witnessPreimage[32:], witnessNonce[:]) - - // The witness commitment itself is the double-sha256 of the - // witness preimage generated above. With the commitment - // generated, the witness script for the output is: OP_RETURN - // OP_DATA_36 {0xaa21a9ed || witnessCommitment}. The leading - // prefix is referred to as the "witness magic bytes". - witnessCommitment = chainhash.DoubleHashB(witnessPreimage[:]) - witnessScript := append(blockchain.WitnessMagicBytes, witnessCommitment...) - - // Finally, create the OP_RETURN carrying witness commitment - // output as an additional output within the coinbase. - commitmentOutput := &wire.TxOut{ - Value: 0, - PkScript: witnessScript, - } - coinbaseTx.MsgTx().TxOut = append(coinbaseTx.MsgTx().TxOut, - commitmentOutput) + witnessCommitment = AddWitnessCommitment(coinbaseTx, blockTxns) } // Calculate the required difficulty for the block. The timestamp @@ -856,12 +820,11 @@ mempoolLoop: } // Create a new block ready to be solved. - merkles := blockchain.BuildMerkleTreeStore(blockTxns, false) var msgBlock wire.MsgBlock msgBlock.Header = wire.BlockHeader{ Version: nextBlockVersion, PrevBlock: best.Hash, - MerkleRoot: *merkles[len(merkles)-1], + MerkleRoot: blockchain.CalcMerkleRoot(blockTxns, false), Timestamp: ts, Bits: reqDifficulty, } @@ -895,6 +858,47 @@ mempoolLoop: }, nil } +// AddWitnessCommitment adds the witness commitment as an OP_RETURN output +// within the coinbase tx. The raw commitment is returned. +func AddWitnessCommitment(coinbaseTx *btcutil.Tx, + blockTxns []*btcutil.Tx) []byte { + + // The witness of the coinbase transaction MUST be exactly 32-bytes + // of all zeroes. + var witnessNonce [blockchain.CoinbaseWitnessDataLen]byte + coinbaseTx.MsgTx().TxIn[0].Witness = wire.TxWitness{witnessNonce[:]} + + // Next, obtain the merkle root of a tree which consists of the + // wtxid of all transactions in the block. The coinbase + // transaction will have a special wtxid of all zeroes. + witnessMerkleRoot := blockchain.CalcMerkleRoot(blockTxns, true) + + // The preimage to the witness commitment is: + // witnessRoot || coinbaseWitness + var witnessPreimage [64]byte + copy(witnessPreimage[:32], witnessMerkleRoot[:]) + copy(witnessPreimage[32:], witnessNonce[:]) + + // The witness commitment itself is the double-sha256 of the + // witness preimage generated above. With the commitment + // generated, the witness script for the output is: OP_RETURN + // OP_DATA_36 {0xaa21a9ed || witnessCommitment}. The leading + // prefix is referred to as the "witness magic bytes". + witnessCommitment := chainhash.DoubleHashB(witnessPreimage[:]) + witnessScript := append(blockchain.WitnessMagicBytes, witnessCommitment...) + + // Finally, create the OP_RETURN carrying witness commitment + // output as an additional output within the coinbase. + commitmentOutput := &wire.TxOut{ + Value: 0, + PkScript: witnessScript, + } + coinbaseTx.MsgTx().TxOut = append(coinbaseTx.MsgTx().TxOut, + commitmentOutput) + + return witnessCommitment +} + // UpdateBlockTime updates the timestamp in the header of the passed block to // the current time while taking into account the median time of the last // several blocks to ensure the new time is after that time per the chain @@ -943,8 +947,8 @@ func (g *BlkTmplGenerator) UpdateExtraNonce(msgBlock *wire.MsgBlock, blockHeight // Recalculate the merkle root with the updated extra nonce. block := btcutil.NewBlock(msgBlock) - merkles := blockchain.BuildMerkleTreeStore(block.Transactions(), false) - msgBlock.Header.MerkleRoot = *merkles[len(merkles)-1] + merkleRoot := blockchain.CalcMerkleRoot(block.Transactions(), false) + msgBlock.Header.MerkleRoot = merkleRoot return nil } diff --git a/mining/mining_test.go b/mining/mining_test.go index 362253e5fe..ba1d97771c 100644 --- a/mining/mining_test.go +++ b/mining/mining_test.go @@ -9,7 +9,7 @@ import ( "math/rand" "testing" - "github.com/btcsuite/btcutil" + "github.com/btcsuite/btcd/btcutil" ) // TestTxFeePrioHeap ensures the priority queue for transaction fees and diff --git a/mining/policy.go b/mining/policy.go index c3f059c521..b92df27796 100644 --- a/mining/policy.go +++ b/mining/policy.go @@ -6,8 +6,8 @@ package mining import ( "github.com/btcsuite/btcd/blockchain" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) const ( @@ -29,7 +29,7 @@ type Policy struct { // generating a block template. BlockMaxWeight uint32 - // BlockMinWeight is the minimum block size to be used when generating + // BlockMinSize is the minimum block size to be used when generating // a block template. BlockMinSize uint32 @@ -112,7 +112,7 @@ func CalcPriority(tx *wire.MsgTx, utxoView *blockchain.UtxoViewpoint, nextBlockH // A compressed pubkey pay-to-script-hash redemption with a maximum len // signature is of the form: // [OP_DATA_73 <73-byte sig> + OP_DATA_35 + {OP_DATA_33 - // <33 byte compresed pubkey> + OP_CHECKSIG}] + // <33 byte compressed pubkey> + OP_CHECKSIG}] // // Thus 1 + 73 + 1 + 1 + 33 + 1 = 110 overhead := 0 diff --git a/mining/policy_test.go b/mining/policy_test.go index f66a9c8dbd..cc2fdfbfb2 100644 --- a/mining/policy_test.go +++ b/mining/policy_test.go @@ -9,9 +9,9 @@ import ( "testing" "github.com/btcsuite/btcd/blockchain" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) // newHashFromStr converts the passed big-endian hex string into a diff --git a/netsync/README.md b/netsync/README.md index d5e141151d..a4966815fd 100644 --- a/netsync/README.md +++ b/netsync/README.md @@ -1,9 +1,9 @@ netsync ======= -[![Build Status](http://img.shields.io/travis/btcsuite/btcd.svg)](https://travis-ci.org/btcsuite/btcd) +[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions) [![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) -[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/btcsuite/btcd/netsync) +[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/netsync) ## Overview diff --git a/netsync/blocklogger.go b/netsync/blocklogger.go index 18480e782a..31a6a4c509 100644 --- a/netsync/blocklogger.go +++ b/netsync/blocklogger.go @@ -5,11 +5,13 @@ package netsync import ( + "fmt" "sync" "time" + "github.com/btcsuite/btcd/blockchain" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btclog" - "github.com/btcsuite/btcutil" ) // blockProgressLogger provides periodic logging for other services in order @@ -27,8 +29,9 @@ type blockProgressLogger struct { // newBlockProgressLogger returns a new block progress logger. // The progress message is templated as follows: -// {progressAction} {numProcessed} {blocks|block} in the last {timePeriod} -// ({numTxs}, height {lastBlockHeight}, {lastBlockTimeStamp}) +// +// {progressAction} {numProcessed} {blocks|block} in the last {timePeriod} +// ({numTxs}, height {lastBlockHeight}, {lastBlockTimeStamp}) func newBlockProgressLogger(progressMessage string, logger btclog.Logger) *blockProgressLogger { return &blockProgressLogger{ lastBlockLogTime: time.Now(), @@ -40,7 +43,7 @@ func newBlockProgressLogger(progressMessage string, logger btclog.Logger) *block // LogBlockHeight logs a new block height as an information message to show // progress to the user. In order to prevent spam, it limits logging to one // message every 10 seconds with duration and totals included. -func (b *blockProgressLogger) LogBlockHeight(block *btcutil.Block) { +func (b *blockProgressLogger) LogBlockHeight(block *btcutil.Block, chain *blockchain.BlockChain) { b.Lock() defer b.Unlock() @@ -66,9 +69,10 @@ func (b *blockProgressLogger) LogBlockHeight(block *btcutil.Block) { if b.receivedLogTx == 1 { txStr = "transaction" } - b.subsystemLogger.Infof("%s %d %s in the last %s (%d %s, height %d, %s)", + cacheSizeStr := fmt.Sprintf("~%d MiB", chain.CachedStateSize()/1024/1024) + b.subsystemLogger.Infof("%s %d %s in the last %s (%d %s, height %d, %s, %s cache)", b.progressAction, b.receivedLogBlocks, blockStr, tDuration, b.receivedLogTx, - txStr, block.Height(), block.MsgBlock().Header.Timestamp) + txStr, block.Height(), block.MsgBlock().Header.Timestamp, cacheSizeStr) b.receivedLogBlocks = 0 b.receivedLogTx = 0 diff --git a/netsync/interface.go b/netsync/interface.go index 3e6ca1c12d..6a873bd888 100644 --- a/netsync/interface.go +++ b/netsync/interface.go @@ -6,12 +6,12 @@ package netsync import ( "github.com/btcsuite/btcd/blockchain" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/mempool" "github.com/btcsuite/btcd/peer" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) // PeerNotifier exposes methods to notify peers of status changes to diff --git a/netsync/manager.go b/netsync/manager.go index 32715b8e1e..3215a86ace 100644 --- a/netsync/manager.go +++ b/netsync/manager.go @@ -13,13 +13,13 @@ import ( "time" "github.com/btcsuite/btcd/blockchain" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/database" "github.com/btcsuite/btcd/mempool" peerpkg "github.com/btcsuite/btcd/peer" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) const ( @@ -79,6 +79,13 @@ type headersMsg struct { peer *peerpkg.Peer } +// notFoundMsg packages a bitcoin notfound message and the peer it came from +// together so the block handler has access to that information. +type notFoundMsg struct { + notFound *wire.MsgNotFound + peer *peerpkg.Peer +} + // donePeerMsg signifies a newly disconnected peer to the block handler. type donePeerMsg struct { peer *peerpkg.Peer @@ -147,6 +154,25 @@ type peerSyncState struct { requestedBlocks map[chainhash.Hash]struct{} } +// limitAdd is a helper function for maps that require a maximum limit by +// evicting a random value if adding the new value would cause it to +// overflow the maximum allowed. +func limitAdd(m map[chainhash.Hash]struct{}, hash chainhash.Hash, limit int) { + if len(m)+1 > limit { + // Remove a random entry from the map. For most compilers, Go's + // range statement iterates starting at a random item although + // that is not 100% guaranteed by the spec. The iteration order + // is not important here because an adversary would have to be + // able to pull off preimage attacks on the hashing function in + // order to target eviction of specific entries anyways. + for txHash := range m { + delete(m, txHash) + break + } + } + m[hash] = struct{}{} +} + // SyncManager is used to communicate block related messages with peers. The // SyncManager is started as by executing Start() in a goroutine. Once started, // it selects peers to sync from and starts the initial block download. Once the @@ -371,20 +397,55 @@ func (sm *SyncManager) isSyncCandidate(peer *peerpkg.Peer) bool { if host != "127.0.0.1" && host != "localhost" { return false } - } else { - // The peer is not a candidate for sync if it's not a full - // node. Additionally, if the segwit soft-fork package has - // activated, then the peer must also be upgraded. - segwitActive, err := sm.chain.IsDeploymentActive(chaincfg.DeploymentSegwit) - if err != nil { - log.Errorf("Unable to query for segwit "+ - "soft-fork state: %v", err) - } - nodeServices := peer.Services() - if nodeServices&wire.SFNodeNetwork != wire.SFNodeNetwork || - (segwitActive && !peer.IsWitnessEnabled()) { + + // Candidate if all checks passed. + return true + } + + // If the segwit soft-fork package has activated, then the peer must + // also be upgraded. + segwitActive, err := sm.chain.IsDeploymentActive( + chaincfg.DeploymentSegwit, + ) + if err != nil { + log.Errorf("Unable to query for segwit soft-fork state: %v", + err) + } + + if segwitActive && !peer.IsWitnessEnabled() { + return false + } + + var ( + nodeServices = peer.Services() + fullNode = nodeServices.HasFlag(wire.SFNodeNetwork) + prunedNode = nodeServices.HasFlag(wire.SFNodeNetworkLimited) + ) + + switch { + case fullNode: + // Node is a sync candidate if it has all the blocks. + + case prunedNode: + // Even if the peer is pruned, if they have the node network + // limited flag, they are able to serve 2 days worth of blocks + // from the current tip. Therefore, check if our chaintip is + // within that range. + bestHeight := sm.chain.BestSnapshot().Height + peerLastBlock := peer.LastBlock() + + // bestHeight+1 as we need the peer to serve us the next block, + // not the one we already have. + if bestHeight+1 <= + peerLastBlock-wire.NodeNetworkLimitedBlockThreshold { + return false } + + default: + // If the peer isn't an archival node, and it's not signaling + // NODE_NETWORK_LIMITED, we can't sync off of this node. + return false } // Candidate if all checks passed. @@ -402,7 +463,7 @@ func (sm *SyncManager) handleNewPeerMsg(peer *peerpkg.Peer) { log.Infof("New valid peer %s (%s)", peer, peer.UserAgent()) - // Initialize the peer state + // Initialize the peer state. isSyncCandidate := sm.isSyncCandidate(peer) sm.peerStates[peer] = &peerSyncState{ syncCandidate: isSyncCandidate, @@ -579,8 +640,7 @@ func (sm *SyncManager) handleTxMsg(tmsg *txMsg) { if err != nil { // Do not request this transaction again until a new block // has been processed. - sm.rejectedTxns[*txHash] = struct{}{} - sm.limitMap(sm.rejectedTxns, maxRejectedTxns) + limitAdd(sm.rejectedTxns, *txHash, maxRejectedTxns) // When the error is a rule error, it means the transaction was // simply rejected as opposed to something actually going wrong, @@ -756,7 +816,7 @@ func (sm *SyncManager) handleBlockMsg(bmsg *blockMsg) { // When the block is not an orphan, log information about it and // update the chain state. - sm.progressLogger.LogBlockHeight(bmsg.block) + sm.progressLogger.LogBlockHeight(bmsg.block, sm.chain) // Update this peer's latest block height, for future // potential sync node candidacy. @@ -780,8 +840,13 @@ func (sm *SyncManager) handleBlockMsg(bmsg *blockMsg) { } } - // Nothing more to do if we aren't in headers-first mode. + // If we are not in headers first mode, it's a good time to periodically + // flush the blockchain cache because we don't expect new blocks immediately. + // After that, there is nothing more to do. if !sm.headersFirstMode { + if err := sm.chain.FlushUtxoCache(blockchain.FlushPeriodic); err != nil { + log.Errorf("Error while flushing the blockchain cache: %v", err) + } return } @@ -994,6 +1059,37 @@ func (sm *SyncManager) handleHeadersMsg(hmsg *headersMsg) { } } +// handleNotFoundMsg handles notfound messages from all peers. +func (sm *SyncManager) handleNotFoundMsg(nfmsg *notFoundMsg) { + peer := nfmsg.peer + state, exists := sm.peerStates[peer] + if !exists { + log.Warnf("Received notfound message from unknown peer %s", peer) + return + } + for _, inv := range nfmsg.notFound.InvList { + // verify the hash was actually announced by the peer + // before deleting from the global requested maps. + switch inv.Type { + case wire.InvTypeWitnessBlock: + fallthrough + case wire.InvTypeBlock: + if _, exists := state.requestedBlocks[inv.Hash]; exists { + delete(state.requestedBlocks, inv.Hash) + delete(sm.requestedBlocks, inv.Hash) + } + + case wire.InvTypeWitnessTx: + fallthrough + case wire.InvTypeTx: + if _, exists := state.requestedTxns[inv.Hash]; exists { + delete(state.requestedTxns, inv.Hash) + delete(sm.requestedTxns, inv.Hash) + } + } + } +} + // haveInventory returns whether or not the inventory represented by the passed // inventory vector is known. This includes checking all of the various places // inventory can be when it is in different states such as blocks that are part @@ -1040,7 +1136,7 @@ func (sm *SyncManager) haveInventory(invVect *wire.InvVect) (bool, error) { return false, nil } - // The requested inventory is is an unsupported type, so just claim + // The requested inventory is an unsupported type, so just claim // it is known to avoid requesting it. return true, nil } @@ -1202,9 +1298,8 @@ func (sm *SyncManager) handleInvMsg(imsg *invMsg) { // Request the block if there is not already a pending // request. if _, exists := sm.requestedBlocks[iv.Hash]; !exists { - sm.requestedBlocks[iv.Hash] = struct{}{} - sm.limitMap(sm.requestedBlocks, maxRequestedBlocks) - state.requestedBlocks[iv.Hash] = struct{}{} + limitAdd(sm.requestedBlocks, iv.Hash, maxRequestedBlocks) + limitAdd(state.requestedBlocks, iv.Hash, maxRequestedBlocks) if peer.IsWitnessEnabled() { iv.Type = wire.InvTypeWitnessBlock @@ -1220,9 +1315,8 @@ func (sm *SyncManager) handleInvMsg(imsg *invMsg) { // Request the transaction if there is not already a // pending request. if _, exists := sm.requestedTxns[iv.Hash]; !exists { - sm.requestedTxns[iv.Hash] = struct{}{} - sm.limitMap(sm.requestedTxns, maxRequestedTxns) - state.requestedTxns[iv.Hash] = struct{}{} + limitAdd(sm.requestedTxns, iv.Hash, maxRequestedTxns) + limitAdd(state.requestedTxns, iv.Hash, maxRequestedTxns) // If the peer is capable, request the txn // including all witness data. @@ -1245,24 +1339,6 @@ func (sm *SyncManager) handleInvMsg(imsg *invMsg) { } } -// limitMap is a helper function for maps that require a maximum limit by -// evicting a random transaction if adding a new value would cause it to -// overflow the maximum allowed. -func (sm *SyncManager) limitMap(m map[chainhash.Hash]struct{}, limit int) { - if len(m)+1 > limit { - // Remove a random entry from the map. For most compilers, Go's - // range statement iterates starting at a random item although - // that is not 100% guaranteed by the spec. The iteration order - // is not important here because an adversary would have to be - // able to pull off preimage attacks on the hashing function in - // order to target eviction of specific entries anyways. - for txHash := range m { - delete(m, txHash) - return - } - } -} - // blockHandler is the main handler for the sync manager. It must be run as a // goroutine. It processes block and inv messages in a separate goroutine // from the peer handlers so the block (MsgBlock) messages are handled by a @@ -1295,6 +1371,9 @@ out: case *headersMsg: sm.handleHeadersMsg(msg) + case *notFoundMsg: + sm.handleNotFoundMsg(msg) + case *donePeerMsg: sm.handleDonePeerMsg(msg.peer) @@ -1340,6 +1419,11 @@ out: } } + log.Debug("Block handler shutting down: flushing blockchain caches...") + if err := sm.chain.FlushUtxoCache(blockchain.FlushRequired); err != nil { + log.Errorf("Error while flushing blockchain caches: %v", err) + } + sm.wg.Done() log.Trace("Block handler done") } @@ -1370,6 +1454,13 @@ func (sm *SyncManager) handleBlockchainNotification(notification *blockchain.Not // A block has been connected to the main block chain. case blockchain.NTBlockConnected: + // Don't attempt to update the mempool if we're not current. + // The mempool is empty and the fee estimator is useless unless + // we're caught up. + if !sm.current() { + return + } + block, ok := notification.Data.(*btcutil.Block) if !ok { log.Warnf("Chain connected notification is not a block.") @@ -1492,6 +1583,18 @@ func (sm *SyncManager) QueueHeaders(headers *wire.MsgHeaders, peer *peerpkg.Peer sm.msgChan <- &headersMsg{headers: headers, peer: peer} } +// QueueNotFound adds the passed notfound message and peer to the block handling +// queue. +func (sm *SyncManager) QueueNotFound(notFound *wire.MsgNotFound, peer *peerpkg.Peer) { + // No channel handling here because peers do not need to block on + // reject messages. + if atomic.LoadInt32(&sm.shutdown) != 0 { + return + } + + sm.msgChan <- ¬FoundMsg{notFound: notFound, peer: peer} +} + // DonePeer informs the blockmanager that a peer has disconnected. func (sm *SyncManager) DonePeer(peer *peerpkg.Peer) { // Ignore if we are shutting down. diff --git a/ossec/ossec.go b/ossec/ossec.go new file mode 100644 index 0000000000..fc760ed9ea --- /dev/null +++ b/ossec/ossec.go @@ -0,0 +1,15 @@ +//go:build !openbsd + +package ossec + +func Unveil(path string, perms string) error { + return nil +} + +func Pledge(promises, execpromises string) error { + return nil +} + +func PledgePromises(promises string) error { + return nil +} diff --git a/ossec/ossec_openbsd.go b/ossec/ossec_openbsd.go new file mode 100644 index 0000000000..47aa2ae3ef --- /dev/null +++ b/ossec/ossec_openbsd.go @@ -0,0 +1,17 @@ +package ossec + +import ( + "golang.org/x/sys/unix" +) + +func Unveil(path string, perms string) error { + return unix.Unveil(path, perms) +} + +func Pledge(promises, execpromises string) error { + return unix.Pledge(promises, execpromises) +} + +func PledgePromises(promises string) error { + return unix.PledgePromises(promises) +} diff --git a/params.go b/params.go index 14eeff0717..b4d1453dfb 100644 --- a/params.go +++ b/params.go @@ -55,6 +55,13 @@ var simNetParams = params{ rpcPort: "18556", } +// sigNetParams contains parameters specific to the Signet network +// (wire.SigNet). +var sigNetParams = params{ + Params: &chaincfg.SigNetParams, + rpcPort: "38332", +} + // netName returns the name used when referring to a bitcoin network. At the // time of writing, btcd currently places blocks for testnet version 3 in the // data and log directory "testnet", which does not match the Name field of the diff --git a/peer/README.md b/peer/README.md index 1a0ba36e8d..217f5dc3dc 100644 --- a/peer/README.md +++ b/peer/README.md @@ -1,9 +1,9 @@ peer ==== -[![Build Status](http://img.shields.io/travis/btcsuite/btcd.svg)](https://travis-ci.org/btcsuite/btcd) +[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions) [![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) -[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/btcsuite/btcd/peer) +[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/peer) Package peer provides a common base for creating and managing bitcoin network peers. @@ -63,7 +63,7 @@ $ go get -u github.com/btcsuite/btcd/peer ## Examples -* [New Outbound Peer Example](https://godoc.org/github.com/btcsuite/btcd/peer#example-package--NewOutboundPeer) +* [New Outbound Peer Example](https://pkg.go.dev/github.com/btcsuite/btcd/peer#example-package--NewOutboundPeer) Demonstrates the basic process for initializing and creating an outbound peer. Peers negotiate by exchanging version and verack messages. For demonstration, a simple handler for the version message is attached to the peer. diff --git a/peer/doc.go b/peer/doc.go index cd822fe1cf..d2c66ff3cd 100644 --- a/peer/doc.go +++ b/peer/doc.go @@ -6,7 +6,7 @@ Package peer provides a common base for creating and managing Bitcoin network peers. -Overview +# Overview This package builds upon the wire package, which provides the fundamental primitives necessary to speak the bitcoin wire protocol, in order to simplify @@ -16,41 +16,41 @@ Payment Verification (SPV) nodes, proxies, etc. A quick overview of the major features peer provides are as follows: - - Provides a basic concurrent safe bitcoin peer for handling bitcoin - communications via the peer-to-peer protocol - - Full duplex reading and writing of bitcoin protocol messages - - Automatic handling of the initial handshake process including protocol - version negotiation - - Asynchronous message queuing of outbound messages with optional channel for - notification when the message is actually sent - - Flexible peer configuration - - Caller is responsible for creating outgoing connections and listening for - incoming connections so they have flexibility to establish connections as - they see fit (proxies, etc) - - User agent name and version - - Bitcoin network - - Service support signalling (full nodes, bloom filters, etc) - - Maximum supported protocol version - - Ability to register callbacks for handling bitcoin protocol messages - - Inventory message batching and send trickling with known inventory detection - and avoidance - - Automatic periodic keep-alive pinging and pong responses - - Random nonce generation and self connection detection - - Proper handling of bloom filter related commands when the caller does not - specify the related flag to signal support - - Disconnects the peer when the protocol version is high enough - - Does not invoke the related callbacks for older protocol versions - - Snapshottable peer statistics such as the total number of bytes read and - written, the remote address, user agent, and negotiated protocol version - - Helper functions pushing addresses, getblocks, getheaders, and reject - messages - - These could all be sent manually via the standard message output function, - but the helpers provide additional nice functionality such as duplicate - filtering and address randomization - - Ability to wait for shutdown/disconnect - - Comprehensive test coverage - -Peer Configuration + - Provides a basic concurrent safe bitcoin peer for handling bitcoin + communications via the peer-to-peer protocol + - Full duplex reading and writing of bitcoin protocol messages + - Automatic handling of the initial handshake process including protocol + version negotiation + - Asynchronous message queuing of outbound messages with optional channel for + notification when the message is actually sent + - Flexible peer configuration + 1. Caller is responsible for creating outgoing connections and listening for + incoming connections so they have flexibility to establish connections as + they see fit (proxies, etc) + 2. User agent name and version + 3. Bitcoin network + 4. Service support signalling (full nodes, bloom filters, etc) + 5. Maximum supported protocol version + 6. Ability to register callbacks for handling bitcoin protocol messages + - Inventory message batching and send trickling with known inventory detection + and avoidance + - Automatic periodic keep-alive pinging and pong responses + - Random nonce generation and self connection detection + - Proper handling of bloom filter related commands when the caller does not + specify the related flag to signal support + 1. Disconnects the peer when the protocol version is high enough + 2. Does not invoke the related callbacks for older protocol versions + - Snapshottable peer statistics such as the total number of bytes read and + written, the remote address, user agent, and negotiated protocol version + - Helper functions pushing addresses, getblocks, getheaders, and reject + messages + 1. These could all be sent manually via the standard message output function, + but the helpers provide additional nice functionality such as duplicate + filtering and address randomization + - Ability to wait for shutdown/disconnect + - Comprehensive test coverage + +# Peer Configuration All peer configuration is handled with the Config struct. This allows the caller to specify things such as the user agent name and version, the bitcoin @@ -58,7 +58,7 @@ network to use, which services it supports, and callbacks to invoke when bitcoin messages are received. See the documentation for each field of the Config struct for more details. -Inbound and Outbound Peers +# Inbound and Outbound Peers A peer can either be inbound or outbound. The caller is responsible for establishing the connection to remote peers and listening for incoming peers. @@ -73,7 +73,7 @@ Disconnect to disconnect from the peer and clean up all resources. WaitForDisconnect can be used to block until peer disconnection and resource cleanup has completed. -Callbacks +# Callbacks In order to do anything useful with a peer, it is necessary to react to bitcoin messages. This is accomplished by creating an instance of the MessageListeners @@ -92,7 +92,7 @@ It is often useful to use closures which encapsulate state when specifying the callback handlers. This provides a clean method for accessing that state when callbacks are invoked. -Queuing Messages and Inventory +# Queuing Messages and Inventory The QueueMessage function provides the fundamental means to send messages to the remote peer. As the name implies, this employs a non-blocking queue. A done @@ -106,7 +106,7 @@ QueueInventory function. It employs batching and trickling along with intelligent known remote peer inventory detection and avoidance through the use of a most-recently used algorithm. -Message Sending Helper Functions +# Message Sending Helper Functions In addition to the bare QueueMessage function previously described, the PushAddrMsg, PushGetBlocksMsg, PushGetHeadersMsg, and PushRejectMsg functions @@ -128,13 +128,13 @@ appropriate reject message based on the provided parameters as well as optionally provides a flag to cause it to block until the message is actually sent. -Peer Statistics +# Peer Statistics A snapshot of the current peer statistics can be obtained with the StatsSnapshot function. This includes statistics such as the total number of bytes read and written, the remote address, user agent, and negotiated protocol version. -Logging +# Logging This package provides extensive logging capabilities through the UseLogger function which allows a btclog.Logger to be specified. For example, logging at @@ -142,9 +142,9 @@ the debug level provides summaries of every message sent and received, and logging at the trace level provides full dumps of parsed messages as well as the raw message bytes using a format similar to hexdump -C. -Bitcoin Improvement Proposals +# Bitcoin Improvement Proposals This package supports all BIPS supported by the wire package. -(https://godoc.org/github.com/btcsuite/btcd/wire#hdr-Bitcoin_Improvement_Proposals) +(https://pkg.go.dev/github.com/btcsuite/btcd/wire#hdr-Bitcoin_Improvement_Proposals) */ package peer diff --git a/peer/example_test.go b/peer/example_test.go index cb67683bae..850557b877 100644 --- a/peer/example_test.go +++ b/peer/example_test.go @@ -16,7 +16,7 @@ import ( ) // mockRemotePeer creates a basic inbound peer listening on the simnet port for -// use with Example_peerConnection. It does not return until the listner is +// use with Example_peerConnection. It does not return until the listener is // active. func mockRemotePeer() error { // Configure peer to act as a simnet node that offers no services. @@ -25,6 +25,7 @@ func mockRemotePeer() error { UserAgentVersion: "1.0.0", // User agent version to advertise. ChainParams: &chaincfg.SimNetParams, TrickleInterval: time.Second * 10, + AllowSelfConns: true, } // Accept connections on the simnet port. @@ -81,6 +82,7 @@ func Example_newOutboundPeer() { verack <- struct{}{} }, }, + AllowSelfConns: true, } p, err := peer.NewOutboundPeer(peerCfg, "127.0.0.1:18555") if err != nil { diff --git a/peer/export_test.go b/peer/export_test.go deleted file mode 100644 index 06ec78a1a5..0000000000 --- a/peer/export_test.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2015 The btcsuite developers -// Use of this source code is governed by an ISC -// license that can be found in the LICENSE file. - -/* -This test file is part of the peer package rather than than the peer_test -package so it can bridge access to the internals to properly test cases which -are either not possible or can't reliably be tested via the public interface. -The functions are only exported while the tests are being run. -*/ - -package peer - -// TstAllowSelfConns allows the test package to allow self connections by -// disabling the detection logic. -func TstAllowSelfConns() { - allowSelfConns = true -} diff --git a/peer/mruinvmap.go b/peer/mruinvmap.go deleted file mode 100644 index 0bf1b2b34a..0000000000 --- a/peer/mruinvmap.go +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright (c) 2013-2015 The btcsuite developers -// Use of this source code is governed by an ISC -// license that can be found in the LICENSE file. - -package peer - -import ( - "bytes" - "container/list" - "fmt" - "sync" - - "github.com/btcsuite/btcd/wire" -) - -// mruInventoryMap provides a concurrency safe map that is limited to a maximum -// number of items with eviction for the oldest entry when the limit is -// exceeded. -type mruInventoryMap struct { - invMtx sync.Mutex - invMap map[wire.InvVect]*list.Element // nearly O(1) lookups - invList *list.List // O(1) insert, update, delete - limit uint -} - -// String returns the map as a human-readable string. -// -// This function is safe for concurrent access. -func (m *mruInventoryMap) String() string { - m.invMtx.Lock() - defer m.invMtx.Unlock() - - lastEntryNum := len(m.invMap) - 1 - curEntry := 0 - buf := bytes.NewBufferString("[") - for iv := range m.invMap { - buf.WriteString(fmt.Sprintf("%v", iv)) - if curEntry < lastEntryNum { - buf.WriteString(", ") - } - curEntry++ - } - buf.WriteString("]") - - return fmt.Sprintf("<%d>%s", m.limit, buf.String()) -} - -// Exists returns whether or not the passed inventory item is in the map. -// -// This function is safe for concurrent access. -func (m *mruInventoryMap) Exists(iv *wire.InvVect) bool { - m.invMtx.Lock() - _, exists := m.invMap[*iv] - m.invMtx.Unlock() - - return exists -} - -// Add adds the passed inventory to the map and handles eviction of the oldest -// item if adding the new item would exceed the max limit. Adding an existing -// item makes it the most recently used item. -// -// This function is safe for concurrent access. -func (m *mruInventoryMap) Add(iv *wire.InvVect) { - m.invMtx.Lock() - defer m.invMtx.Unlock() - - // When the limit is zero, nothing can be added to the map, so just - // return. - if m.limit == 0 { - return - } - - // When the entry already exists move it to the front of the list - // thereby marking it most recently used. - if node, exists := m.invMap[*iv]; exists { - m.invList.MoveToFront(node) - return - } - - // Evict the least recently used entry (back of the list) if the the new - // entry would exceed the size limit for the map. Also reuse the list - // node so a new one doesn't have to be allocated. - if uint(len(m.invMap))+1 > m.limit { - node := m.invList.Back() - lru := node.Value.(*wire.InvVect) - - // Evict least recently used item. - delete(m.invMap, *lru) - - // Reuse the list node of the item that was just evicted for the - // new item. - node.Value = iv - m.invList.MoveToFront(node) - m.invMap[*iv] = node - return - } - - // The limit hasn't been reached yet, so just add the new item. - node := m.invList.PushFront(iv) - m.invMap[*iv] = node -} - -// Delete deletes the passed inventory item from the map (if it exists). -// -// This function is safe for concurrent access. -func (m *mruInventoryMap) Delete(iv *wire.InvVect) { - m.invMtx.Lock() - if node, exists := m.invMap[*iv]; exists { - m.invList.Remove(node) - delete(m.invMap, *iv) - } - m.invMtx.Unlock() -} - -// newMruInventoryMap returns a new inventory map that is limited to the number -// of entries specified by limit. When the number of entries exceeds the limit, -// the oldest (least recently used) entry will be removed to make room for the -// new entry. -func newMruInventoryMap(limit uint) *mruInventoryMap { - m := mruInventoryMap{ - invMap: make(map[wire.InvVect]*list.Element), - invList: list.New(), - limit: limit, - } - return &m -} diff --git a/peer/mruinvmap_test.go b/peer/mruinvmap_test.go deleted file mode 100644 index e55746010b..0000000000 --- a/peer/mruinvmap_test.go +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright (c) 2013-2016 The btcsuite developers -// Use of this source code is governed by an ISC -// license that can be found in the LICENSE file. - -package peer - -import ( - "crypto/rand" - "fmt" - "testing" - - "github.com/btcsuite/btcd/chaincfg/chainhash" - "github.com/btcsuite/btcd/wire" -) - -// TestMruInventoryMap ensures the MruInventoryMap behaves as expected including -// limiting, eviction of least-recently used entries, specific entry removal, -// and existence tests. -func TestMruInventoryMap(t *testing.T) { - // Create a bunch of fake inventory vectors to use in testing the mru - // inventory code. - numInvVects := 10 - invVects := make([]*wire.InvVect, 0, numInvVects) - for i := 0; i < numInvVects; i++ { - hash := &chainhash.Hash{byte(i)} - iv := wire.NewInvVect(wire.InvTypeBlock, hash) - invVects = append(invVects, iv) - } - - tests := []struct { - name string - limit int - }{ - {name: "limit 0", limit: 0}, - {name: "limit 1", limit: 1}, - {name: "limit 5", limit: 5}, - {name: "limit 7", limit: 7}, - {name: "limit one less than available", limit: numInvVects - 1}, - {name: "limit all available", limit: numInvVects}, - } - -testLoop: - for i, test := range tests { - // Create a new mru inventory map limited by the specified test - // limit and add all of the test inventory vectors. This will - // cause evicition since there are more test inventory vectors - // than the limits. - mruInvMap := newMruInventoryMap(uint(test.limit)) - for j := 0; j < numInvVects; j++ { - mruInvMap.Add(invVects[j]) - } - - // Ensure the limited number of most recent entries in the - // inventory vector list exist. - for j := numInvVects - test.limit; j < numInvVects; j++ { - if !mruInvMap.Exists(invVects[j]) { - t.Errorf("Exists #%d (%s) entry %s does not "+ - "exist", i, test.name, *invVects[j]) - continue testLoop - } - } - - // Ensure the entries before the limited number of most recent - // entries in the inventory vector list do not exist. - for j := 0; j < numInvVects-test.limit; j++ { - if mruInvMap.Exists(invVects[j]) { - t.Errorf("Exists #%d (%s) entry %s exists", i, - test.name, *invVects[j]) - continue testLoop - } - } - - // Readd the entry that should currently be the least-recently - // used entry so it becomes the most-recently used entry, then - // force an eviction by adding an entry that doesn't exist and - // ensure the evicted entry is the new least-recently used - // entry. - // - // This check needs at least 2 entries. - if test.limit > 1 { - origLruIndex := numInvVects - test.limit - mruInvMap.Add(invVects[origLruIndex]) - - iv := wire.NewInvVect(wire.InvTypeBlock, - &chainhash.Hash{0x00, 0x01}) - mruInvMap.Add(iv) - - // Ensure the original lru entry still exists since it - // was updated and should've have become the mru entry. - if !mruInvMap.Exists(invVects[origLruIndex]) { - t.Errorf("MRU #%d (%s) entry %s does not exist", - i, test.name, *invVects[origLruIndex]) - continue testLoop - } - - // Ensure the entry that should've become the new lru - // entry was evicted. - newLruIndex := origLruIndex + 1 - if mruInvMap.Exists(invVects[newLruIndex]) { - t.Errorf("MRU #%d (%s) entry %s exists", i, - test.name, *invVects[newLruIndex]) - continue testLoop - } - } - - // Delete all of the entries in the inventory vector list, - // including those that don't exist in the map, and ensure they - // no longer exist. - for j := 0; j < numInvVects; j++ { - mruInvMap.Delete(invVects[j]) - if mruInvMap.Exists(invVects[j]) { - t.Errorf("Delete #%d (%s) entry %s exists", i, - test.name, *invVects[j]) - continue testLoop - } - } - } -} - -// TestMruInventoryMapStringer tests the stringized output for the -// MruInventoryMap type. -func TestMruInventoryMapStringer(t *testing.T) { - // Create a couple of fake inventory vectors to use in testing the mru - // inventory stringer code. - hash1 := &chainhash.Hash{0x01} - hash2 := &chainhash.Hash{0x02} - iv1 := wire.NewInvVect(wire.InvTypeBlock, hash1) - iv2 := wire.NewInvVect(wire.InvTypeBlock, hash2) - - // Create new mru inventory map and add the inventory vectors. - mruInvMap := newMruInventoryMap(uint(2)) - mruInvMap.Add(iv1) - mruInvMap.Add(iv2) - - // Ensure the stringer gives the expected result. Since map iteration - // is not ordered, either entry could be first, so account for both - // cases. - wantStr1 := fmt.Sprintf("<%d>[%s, %s]", 2, *iv1, *iv2) - wantStr2 := fmt.Sprintf("<%d>[%s, %s]", 2, *iv2, *iv1) - gotStr := mruInvMap.String() - if gotStr != wantStr1 && gotStr != wantStr2 { - t.Fatalf("unexpected string representation - got %q, want %q "+ - "or %q", gotStr, wantStr1, wantStr2) - } -} - -// BenchmarkMruInventoryList performs basic benchmarks on the most recently -// used inventory handling. -func BenchmarkMruInventoryList(b *testing.B) { - // Create a bunch of fake inventory vectors to use in benchmarking - // the mru inventory code. - b.StopTimer() - numInvVects := 100000 - invVects := make([]*wire.InvVect, 0, numInvVects) - for i := 0; i < numInvVects; i++ { - hashBytes := make([]byte, chainhash.HashSize) - rand.Read(hashBytes) - hash, _ := chainhash.NewHash(hashBytes) - iv := wire.NewInvVect(wire.InvTypeBlock, hash) - invVects = append(invVects, iv) - } - b.StartTimer() - - // Benchmark the add plus evicition code. - limit := 20000 - mruInvMap := newMruInventoryMap(uint(limit)) - for i := 0; i < b.N; i++ { - mruInvMap.Add(invVects[i%numInvVects]) - } -} diff --git a/peer/mrunoncemap.go b/peer/mrunoncemap.go deleted file mode 100644 index 5f7c798429..0000000000 --- a/peer/mrunoncemap.go +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright (c) 2015 The btcsuite developers -// Use of this source code is governed by an ISC -// license that can be found in the LICENSE file. - -package peer - -import ( - "bytes" - "container/list" - "fmt" - "sync" -) - -// mruNonceMap provides a concurrency safe map that is limited to a maximum -// number of items with eviction for the oldest entry when the limit is -// exceeded. -type mruNonceMap struct { - mtx sync.Mutex - nonceMap map[uint64]*list.Element // nearly O(1) lookups - nonceList *list.List // O(1) insert, update, delete - limit uint -} - -// String returns the map as a human-readable string. -// -// This function is safe for concurrent access. -func (m *mruNonceMap) String() string { - m.mtx.Lock() - defer m.mtx.Unlock() - - lastEntryNum := len(m.nonceMap) - 1 - curEntry := 0 - buf := bytes.NewBufferString("[") - for nonce := range m.nonceMap { - buf.WriteString(fmt.Sprintf("%d", nonce)) - if curEntry < lastEntryNum { - buf.WriteString(", ") - } - curEntry++ - } - buf.WriteString("]") - - return fmt.Sprintf("<%d>%s", m.limit, buf.String()) -} - -// Exists returns whether or not the passed nonce is in the map. -// -// This function is safe for concurrent access. -func (m *mruNonceMap) Exists(nonce uint64) bool { - m.mtx.Lock() - _, exists := m.nonceMap[nonce] - m.mtx.Unlock() - - return exists -} - -// Add adds the passed nonce to the map and handles eviction of the oldest item -// if adding the new item would exceed the max limit. Adding an existing item -// makes it the most recently used item. -// -// This function is safe for concurrent access. -func (m *mruNonceMap) Add(nonce uint64) { - m.mtx.Lock() - defer m.mtx.Unlock() - - // When the limit is zero, nothing can be added to the map, so just - // return. - if m.limit == 0 { - return - } - - // When the entry already exists move it to the front of the list - // thereby marking it most recently used. - if node, exists := m.nonceMap[nonce]; exists { - m.nonceList.MoveToFront(node) - return - } - - // Evict the least recently used entry (back of the list) if the the new - // entry would exceed the size limit for the map. Also reuse the list - // node so a new one doesn't have to be allocated. - if uint(len(m.nonceMap))+1 > m.limit { - node := m.nonceList.Back() - lru := node.Value.(uint64) - - // Evict least recently used item. - delete(m.nonceMap, lru) - - // Reuse the list node of the item that was just evicted for the - // new item. - node.Value = nonce - m.nonceList.MoveToFront(node) - m.nonceMap[nonce] = node - return - } - - // The limit hasn't been reached yet, so just add the new item. - node := m.nonceList.PushFront(nonce) - m.nonceMap[nonce] = node -} - -// Delete deletes the passed nonce from the map (if it exists). -// -// This function is safe for concurrent access. -func (m *mruNonceMap) Delete(nonce uint64) { - m.mtx.Lock() - if node, exists := m.nonceMap[nonce]; exists { - m.nonceList.Remove(node) - delete(m.nonceMap, nonce) - } - m.mtx.Unlock() -} - -// newMruNonceMap returns a new nonce map that is limited to the number of -// entries specified by limit. When the number of entries exceeds the limit, -// the oldest (least recently used) entry will be removed to make room for the -// new entry. -func newMruNonceMap(limit uint) *mruNonceMap { - m := mruNonceMap{ - nonceMap: make(map[uint64]*list.Element), - nonceList: list.New(), - limit: limit, - } - return &m -} diff --git a/peer/mrunoncemap_test.go b/peer/mrunoncemap_test.go deleted file mode 100644 index bd7fb1082e..0000000000 --- a/peer/mrunoncemap_test.go +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright (c) 2015 The btcsuite developers -// Use of this source code is governed by an ISC -// license that can be found in the LICENSE file. - -package peer - -import ( - "fmt" - "testing" -) - -// TestMruNonceMap ensures the mruNonceMap behaves as expected including -// limiting, eviction of least-recently used entries, specific entry removal, -// and existence tests. -func TestMruNonceMap(t *testing.T) { - // Create a bunch of fake nonces to use in testing the mru nonce code. - numNonces := 10 - nonces := make([]uint64, 0, numNonces) - for i := 0; i < numNonces; i++ { - nonces = append(nonces, uint64(i)) - } - - tests := []struct { - name string - limit int - }{ - {name: "limit 0", limit: 0}, - {name: "limit 1", limit: 1}, - {name: "limit 5", limit: 5}, - {name: "limit 7", limit: 7}, - {name: "limit one less than available", limit: numNonces - 1}, - {name: "limit all available", limit: numNonces}, - } - -testLoop: - for i, test := range tests { - // Create a new mru nonce map limited by the specified test - // limit and add all of the test nonces. This will cause - // evicition since there are more test nonces than the limits. - mruNonceMap := newMruNonceMap(uint(test.limit)) - for j := 0; j < numNonces; j++ { - mruNonceMap.Add(nonces[j]) - } - - // Ensure the limited number of most recent entries in the list - // exist. - for j := numNonces - test.limit; j < numNonces; j++ { - if !mruNonceMap.Exists(nonces[j]) { - t.Errorf("Exists #%d (%s) entry %d does not "+ - "exist", i, test.name, nonces[j]) - continue testLoop - } - } - - // Ensure the entries before the limited number of most recent - // entries in the list do not exist. - for j := 0; j < numNonces-test.limit; j++ { - if mruNonceMap.Exists(nonces[j]) { - t.Errorf("Exists #%d (%s) entry %d exists", i, - test.name, nonces[j]) - continue testLoop - } - } - - // Readd the entry that should currently be the least-recently - // used entry so it becomes the most-recently used entry, then - // force an eviction by adding an entry that doesn't exist and - // ensure the evicted entry is the new least-recently used - // entry. - // - // This check needs at least 2 entries. - if test.limit > 1 { - origLruIndex := numNonces - test.limit - mruNonceMap.Add(nonces[origLruIndex]) - - mruNonceMap.Add(uint64(numNonces) + 1) - - // Ensure the original lru entry still exists since it - // was updated and should've have become the mru entry. - if !mruNonceMap.Exists(nonces[origLruIndex]) { - t.Errorf("MRU #%d (%s) entry %d does not exist", - i, test.name, nonces[origLruIndex]) - continue testLoop - } - - // Ensure the entry that should've become the new lru - // entry was evicted. - newLruIndex := origLruIndex + 1 - if mruNonceMap.Exists(nonces[newLruIndex]) { - t.Errorf("MRU #%d (%s) entry %d exists", i, - test.name, nonces[newLruIndex]) - continue testLoop - } - } - - // Delete all of the entries in the list, including those that - // don't exist in the map, and ensure they no longer exist. - for j := 0; j < numNonces; j++ { - mruNonceMap.Delete(nonces[j]) - if mruNonceMap.Exists(nonces[j]) { - t.Errorf("Delete #%d (%s) entry %d exists", i, - test.name, nonces[j]) - continue testLoop - } - } - } -} - -// TestMruNonceMapStringer tests the stringized output for the mruNonceMap type. -func TestMruNonceMapStringer(t *testing.T) { - // Create a couple of fake nonces to use in testing the mru nonce - // stringer code. - nonce1 := uint64(10) - nonce2 := uint64(20) - - // Create new mru nonce map and add the nonces. - mruNonceMap := newMruNonceMap(uint(2)) - mruNonceMap.Add(nonce1) - mruNonceMap.Add(nonce2) - - // Ensure the stringer gives the expected result. Since map iteration - // is not ordered, either entry could be first, so account for both - // cases. - wantStr1 := fmt.Sprintf("<%d>[%d, %d]", 2, nonce1, nonce2) - wantStr2 := fmt.Sprintf("<%d>[%d, %d]", 2, nonce2, nonce1) - gotStr := mruNonceMap.String() - if gotStr != wantStr1 && gotStr != wantStr2 { - t.Fatalf("unexpected string representation - got %q, want %q "+ - "or %q", gotStr, wantStr1, wantStr2) - } -} - -// BenchmarkMruNonceList performs basic benchmarks on the most recently used -// nonce handling. -func BenchmarkMruNonceList(b *testing.B) { - // Create a bunch of fake nonces to use in benchmarking the mru nonce - // code. - b.StopTimer() - numNonces := 100000 - nonces := make([]uint64, 0, numNonces) - for i := 0; i < numNonces; i++ { - nonces = append(nonces, uint64(i)) - } - b.StartTimer() - - // Benchmark the add plus evicition code. - limit := 20000 - mruNonceMap := newMruNonceMap(uint(limit)) - for i := 0; i < b.N; i++ { - mruNonceMap.Add(nonces[i%numNonces]) - } -} diff --git a/peer/peer.go b/peer/peer.go index 11306ace49..195fc0b4fe 100644 --- a/peer/peer.go +++ b/peer/peer.go @@ -24,11 +24,12 @@ import ( "github.com/btcsuite/btcd/wire" "github.com/btcsuite/go-socks/socks" "github.com/davecgh/go-spew/spew" + "github.com/decred/dcrd/lru" ) const ( // MaxProtocolVersion is the max protocol version the peer supports. - MaxProtocolVersion = wire.FeeFilterVersion + MaxProtocolVersion = wire.AddrV2Version // DefaultTrickleInterval is the min time between attempts to send an // inv message to a peer. @@ -82,12 +83,7 @@ var ( // sentNonces houses the unique nonces that are generated when pushing // version messages that are used to detect self connections. - sentNonces = newMruNonceMap(50) - - // allowSelfConns is only used to allow the tests to bypass the self - // connection detecting and disconnect logic since they intentionally - // do so for testing purposes. - allowSelfConns bool + sentNonces = lru.NewCache(50) ) // MessageListeners defines callback function pointers to invoke with message @@ -106,6 +102,9 @@ type MessageListeners struct { // OnAddr is invoked when a peer receives an addr bitcoin message. OnAddr func(p *Peer, msg *wire.MsgAddr) + // OnAddrV2 is invoked when a peer receives an addrv2 bitcoin message. + OnAddrV2 func(p *Peer, msg *wire.MsgAddrV2) + // OnPing is invoked when a peer receives a ping bitcoin message. OnPing func(p *Peer, msg *wire.MsgPing) @@ -201,6 +200,9 @@ type MessageListeners struct { // message. OnSendHeaders func(p *Peer, msg *wire.MsgSendHeaders) + // OnSendAddrV2 is invoked when a peer receives a sendaddrv2 message. + OnSendAddrV2 func(p *Peer, msg *wire.MsgSendAddrV2) + // OnRead is invoked when a peer receives a bitcoin message. It // consists of the number of bytes read, the message, and whether or not // an error in the read occurred. Typically, callers will opt to use @@ -275,6 +277,18 @@ type Config struct { // TrickleInterval is the duration of the ticker which trickles down the // inventory to a peer. TrickleInterval time.Duration + + // AllowSelfConns is only used to allow the tests to bypass the self + // connection detecting and disconnect logic since they intentionally + // do so for testing purposes. + AllowSelfConns bool + + // DisableStallHandler if true, then the stall handler that attempts to + // disconnect from peers that appear to be taking too long to respond + // to requests won't be activated. This can be useful in certain simnet + // scenarios where the stall behavior isn't important to the system + // under test. + DisableStallHandler bool } // minUint32 is a helper function to return the minimum of two uint32s. @@ -391,7 +405,7 @@ type AddrFunc func(remoteAddr *wire.NetAddress) *wire.NetAddress // HostToNetAddrFunc is a func which takes a host, port, services and returns // the netaddress. type HostToNetAddrFunc func(host string, port uint16, - services wire.ServiceFlag) (*wire.NetAddress, error) + services wire.ServiceFlag) (*wire.NetAddressV2, error) // NOTE: The overall data flow of a peer is split into 3 goroutines. Inbound // messages are read via the inHandler goroutine and generally dispatched to @@ -437,7 +451,7 @@ type Peer struct { inbound bool flagsMtx sync.Mutex // protects the peer flags below - na *wire.NetAddress + na *wire.NetAddressV2 id int32 userAgent string services wire.ServiceFlag @@ -447,10 +461,11 @@ type Peer struct { sendHeadersPreferred bool // peer sent a sendheaders message verAckReceived bool witnessEnabled bool + sendAddrV2 bool wireEncoding wire.MessageEncoding - knownInventory *mruInventoryMap + knownInventory lru.Cache prevGetBlocksMtx sync.Mutex prevGetBlocksBegin *chainhash.Hash prevGetBlocksStop *chainhash.Hash @@ -494,6 +509,10 @@ func (p *Peer) String() string { // This function is safe for concurrent access. func (p *Peer) UpdateLastBlockHeight(newHeight int32) { p.statsMtx.Lock() + if newHeight <= p.lastBlock { + p.statsMtx.Unlock() + return + } log.Tracef("Updating last block height of peer %v from %v to %v", p.addr, p.lastBlock, newHeight) p.lastBlock = newHeight @@ -573,7 +592,7 @@ func (p *Peer) ID() int32 { // NA returns the peer network address. // // This function is safe for concurrent access. -func (p *Peer) NA() *wire.NetAddress { +func (p *Peer) NA() *wire.NetAddressV2 { p.flagsMtx.Lock() na := p.na p.flagsMtx.Unlock() @@ -725,7 +744,7 @@ func (p *Peer) LastRecv() time.Time { // LocalAddr returns the local address of the connection. // -// This function is safe fo concurrent access. +// This function is safe for concurrent access. func (p *Peer) LocalAddr() net.Addr { var localAddr net.Addr if atomic.LoadInt32(&p.connected) != 0 { @@ -808,6 +827,16 @@ func (p *Peer) IsWitnessEnabled() bool { return witnessEnabled } +// WantsAddrV2 returns if the peer supports addrv2 messages instead of the +// legacy addr messages. +func (p *Peer) WantsAddrV2() bool { + p.flagsMtx.Lock() + wantsAddrV2 := p.sendAddrV2 + p.flagsMtx.Unlock() + + return wantsAddrV2 +} + // PushAddrMsg sends an addr message to the connected peer using the provided // addresses. This function is useful over manually sending the message via // QueueMessage since it automatically limits the addresses to the maximum @@ -844,6 +873,38 @@ func (p *Peer) PushAddrMsg(addresses []*wire.NetAddress) ([]*wire.NetAddress, er return msg.AddrList, nil } +// PushAddrV2Msg is used to push an addrv2 message to the remote peer. +// +// This function is safe for concurrent access. +func (p *Peer) PushAddrV2Msg(addrs []*wire.NetAddressV2) ( + []*wire.NetAddressV2, error) { + + count := len(addrs) + + // Nothing to send. + if count == 0 { + return nil, nil + } + + m := wire.NewMsgAddrV2() + m.AddrList = make([]*wire.NetAddressV2, count) + copy(m.AddrList, addrs) + + // Randomize the addresses sent if there are more than the maximum. + if count > wire.MaxV2AddrPerMsg { + rand.Shuffle(count, func(i, j int) { + m.AddrList[i] = m.AddrList[j] + m.AddrList[j] = m.AddrList[i] + }) + + // Truncate it to the maximum size. + m.AddrList = m.AddrList[:wire.MaxV2AddrPerMsg] + } + + p.QueueMessage(m, nil) + return m.AddrList, nil +} + // PushGetBlocksMsg sends a getblocks message for the provided block locator // and stop hash. It will ignore back-to-back duplicate requests. // @@ -1197,6 +1258,10 @@ out: for { select { case msg := <-p.stallControl: + if p.cfg.DisableStallHandler { + continue + } + switch msg.command { case sccSendMessage: // Add a deadline for the expected response @@ -1259,6 +1324,10 @@ out: } case <-stallTicker.C: + if p.cfg.DisableStallHandler { + continue + } + // Calculate the offset to apply to the deadline based // on how long the handlers have taken to execute since // the last tick. @@ -1343,6 +1412,19 @@ out: continue } + // Since the protocol version is 70016 but we don't + // implement compact blocks, we have to ignore unknown + // messages after the version-verack handshake. This + // matches bitcoind's behavior and is necessary since + // compact blocks negotiation occurs after the + // handshake. + if err == wire.ErrUnknownMessage { + log.Debugf("Received unknown message from %s:"+ + " %v", p, err) + idleTimer.Reset(idleTimeout) + continue + } + // Only log the error and send reject message if the // local peer is not forcibly disconnecting and the // remote peer has not disconnected. @@ -1384,6 +1466,11 @@ out: ) break out + case *wire.MsgSendAddrV2: + // Disconnect if peer sends this after the handshake is + // completed. + break out + case *wire.MsgGetAddr: if p.cfg.Listeners.OnGetAddr != nil { p.cfg.Listeners.OnGetAddr(p, msg) @@ -1394,6 +1481,11 @@ out: p.cfg.Listeners.OnAddr(p, msg) } + case *wire.MsgAddrV2: + if p.cfg.Listeners.OnAddrV2 != nil { + p.cfg.Listeners.OnAddrV2(p, msg) + } + case *wire.MsgPing: p.handlePingMsg(msg) if p.cfg.Listeners.OnPing != nil { @@ -1626,7 +1718,7 @@ out: // Don't send inventory that became known after // the initial check. - if p.knownInventory.Exists(iv) { + if p.knownInventory.Contains(iv) { continue } @@ -1832,7 +1924,7 @@ func (p *Peer) QueueMessageWithEncoding(msg wire.Message, doneChan chan<- struct func (p *Peer) QueueInventory(invVect *wire.InvVect) { // Don't add the inventory to the send queue if the peer is already // known to have it. - if p.knownInventory.Exists(invVect) { + if p.knownInventory.Contains(invVect) { return } @@ -1891,7 +1983,7 @@ func (p *Peer) readRemoteVersionMsg() error { } // Detect self connections. - if !allowSelfConns && sentNonces.Exists(msg.Nonce) { + if !p.cfg.AllowSelfConns && sentNonces.Contains(msg.Nonce) { return errors.New("disconnecting peer connected to self") } @@ -1966,29 +2058,8 @@ func (p *Peer) readRemoteVersionMsg() error { return nil } -// readRemoteVerAckMsg waits for the next message to arrive from the remote -// peer. If this message is not a verack message, then an error is returned. -// This method is to be used as part of the version negotiation upon a new -// connection. -func (p *Peer) readRemoteVerAckMsg() error { - // Read the next message from the wire. - remoteMsg, _, err := p.readMessage(wire.LatestEncoding) - if err != nil { - return err - } - - // It should be a verack message, otherwise send a reject message to the - // peer explaining why. - msg, ok := remoteMsg.(*wire.MsgVerAck) - if !ok { - reason := "a verack message must follow version" - rejectMsg := wire.NewMsgReject( - msg.Command(), wire.RejectMalformed, reason, - ) - _ = p.writeMessage(rejectMsg, wire.LatestEncoding) - return errors.New(reason) - } - +// processRemoteVerAckMsg takes the verack from the remote peer and handles it. +func (p *Peer) processRemoteVerAckMsg(msg *wire.MsgVerAck) { p.flagsMtx.Lock() p.verAckReceived = true p.flagsMtx.Unlock() @@ -1996,8 +2067,6 @@ func (p *Peer) readRemoteVerAckMsg() error { if p.cfg.Listeners.OnVerAck != nil { p.cfg.Listeners.OnVerAck(p, msg) } - - return nil } // localVersionMsg creates a version message that can be used to send to the @@ -2012,7 +2081,15 @@ func (p *Peer) localVersionMsg() (*wire.MsgVersion, error) { } } - theirNA := p.na + theirNA := p.na.ToLegacy() + + // If p.na is a torv3 hidden service address, we'll need to send over + // an empty NetAddress for their address. + if p.na.IsTorV3() { + theirNA = wire.NewNetAddressIPPort( + net.IP([]byte{0, 0, 0, 0}), p.na.Port, p.na.Services, + ) + } // If we are behind a proxy and the connection comes from the proxy then // we return an unroutable address as their address. This is to prevent @@ -2020,7 +2097,7 @@ func (p *Peer) localVersionMsg() (*wire.MsgVersion, error) { if p.cfg.Proxy != "" { proxyaddress, _, err := net.SplitHostPort(p.cfg.Proxy) // invalid proxy means poorly configured, be on the safe side. - if err != nil || p.na.IP.String() == proxyaddress { + if err != nil || p.na.Addr.String() == proxyaddress { theirNA = wire.NewNetAddressIPPort(net.IP([]byte{0, 0, 0, 0}), 0, theirNA.Services) } @@ -2072,14 +2149,71 @@ func (p *Peer) writeLocalVersionMsg() error { return p.writeMessage(localVerMsg, wire.LatestEncoding) } +// writeSendAddrV2Msg writes our sendaddrv2 message to the remote peer if the +// peer supports protocol version 70016 and above. +func (p *Peer) writeSendAddrV2Msg(pver uint32) error { + if pver < wire.AddrV2Version { + return nil + } + + sendAddrMsg := wire.NewMsgSendAddrV2() + return p.writeMessage(sendAddrMsg, wire.LatestEncoding) +} + +// waitToFinishNegotiation waits until desired negotiation messages are +// received, recording the remote peer's preference for sendaddrv2 as an +// example. The list of negotiated features can be expanded in the future. If a +// verack is received, negotiation stops and the connection is live. +func (p *Peer) waitToFinishNegotiation(pver uint32) error { + // There are several possible messages that can be received here. We + // could immediately receive verack and be done with the handshake. We + // could receive sendaddrv2 and still have to wait for verack. Or we + // can receive unknown messages before and after sendaddrv2 and still + // have to wait for verack. + for { + remoteMsg, _, err := p.readMessage(wire.LatestEncoding) + if err == wire.ErrUnknownMessage { + continue + } else if err != nil { + return err + } + + switch m := remoteMsg.(type) { + case *wire.MsgSendAddrV2: + if pver >= wire.AddrV2Version { + p.flagsMtx.Lock() + p.sendAddrV2 = true + p.flagsMtx.Unlock() + + if p.cfg.Listeners.OnSendAddrV2 != nil { + p.cfg.Listeners.OnSendAddrV2(p, m) + } + } + case *wire.MsgVerAck: + // Receiving a verack means we are done with the + // handshake. + p.processRemoteVerAckMsg(m) + return nil + default: + // This is triggered if the peer sends, for example, a + // GETDATA message during this negotiation. + return wire.ErrInvalidHandshake + } + } +} + // negotiateInboundProtocol performs the negotiation protocol for an inbound // peer. The events should occur in the following order, otherwise an error is // returned: // -// 1. Remote peer sends their version. -// 2. We send our version. -// 3. We send our verack. -// 4. Remote peer sends their verack. +// 1. Remote peer sends their version. +// 2. We send our version. +// 3. We send sendaddrv2 if their version is >= 70016. +// 4. We send our verack. +// 5. Wait until sendaddrv2 or verack is received. Unknown messages are +// skipped as it could be wtxidrelay or a different message in the future +// that btcd does not implement but bitcoind does. +// 6. If remote peer sent sendaddrv2 above, wait until receipt of verack. func (p *Peer) negotiateInboundProtocol() error { if err := p.readRemoteVersionMsg(); err != nil { return err @@ -2089,22 +2223,35 @@ func (p *Peer) negotiateInboundProtocol() error { return err } + var protoVersion uint32 + p.flagsMtx.Lock() + protoVersion = p.protocolVersion + p.flagsMtx.Unlock() + + if err := p.writeSendAddrV2Msg(protoVersion); err != nil { + return err + } + err := p.writeMessage(wire.NewMsgVerAck(), wire.LatestEncoding) if err != nil { return err } - return p.readRemoteVerAckMsg() + // Finish the negotiation by waiting for negotiable messages or verack. + return p.waitToFinishNegotiation(protoVersion) } -// negotiateOutoundProtocol performs the negotiation protocol for an outbound +// negotiateOutboundProtocol performs the negotiation protocol for an outbound // peer. The events should occur in the following order, otherwise an error is // returned: // -// 1. We send our version. -// 2. Remote peer sends their version. -// 3. Remote peer sends their verack. -// 4. We send our verack. +// 1. We send our version. +// 2. Remote peer sends their version. +// 3. We send sendaddrv2 if their version is >= 70016. +// 4. We send our verack. +// 5. We wait to receive sendaddrv2 or verack, skipping unknown messages as +// in the inbound case. +// 6. If sendaddrv2 was received, wait for receipt of verack. func (p *Peer) negotiateOutboundProtocol() error { if err := p.writeLocalVersionMsg(); err != nil { return err @@ -2114,11 +2261,22 @@ func (p *Peer) negotiateOutboundProtocol() error { return err } - if err := p.readRemoteVerAckMsg(); err != nil { + var protoVersion uint32 + p.flagsMtx.Lock() + protoVersion = p.protocolVersion + p.flagsMtx.Unlock() + + if err := p.writeSendAddrV2Msg(protoVersion); err != nil { + return err + } + + err := p.writeMessage(wire.NewMsgVerAck(), wire.LatestEncoding) + if err != nil { return err } - return p.writeMessage(wire.NewMsgVerAck(), wire.LatestEncoding) + // Finish the negotiation by waiting for negotiable messages or verack. + return p.waitToFinishNegotiation(protoVersion) } // start begins processing input and output messages. @@ -2181,7 +2339,12 @@ func (p *Peer) AssociateConnection(conn net.Conn) { p.Disconnect() return } - p.na = na + + // Convert the NetAddress created above into NetAddressV2. + currentNa := wire.NetAddressV2FromBytes( + na.Timestamp, na.Services, na.IP, na.Port, + ) + p.na = currentNa } go func() { @@ -2224,7 +2387,7 @@ func newPeerBase(origCfg *Config, inbound bool) *Peer { p := Peer{ inbound: inbound, wireEncoding: wire.BaseEncoding, - knownInventory: newMruInventoryMap(maxKnownInventory), + knownInventory: lru.NewCache(maxKnownInventory), stallControl: make(chan stallControlMsg, 1), // nonblocking sync outputQueue: make(chan outMsg, outputBufferSize), sendQueue: make(chan outMsg, 1), // nonblocking sync @@ -2247,7 +2410,10 @@ func NewInboundPeer(cfg *Config) *Peer { return newPeerBase(cfg, true) } -// NewOutboundPeer returns a new outbound bitcoin peer. +// NewOutboundPeer returns a new outbound bitcoin peer. If the Config argument +// does not set HostToNetAddress, connecting to anything other than an ipv4 or +// ipv6 address will fail and may cause a nil-pointer-dereference. This +// includes hostnames and onion services. func NewOutboundPeer(cfg *Config, addr string) (*Peer, error) { p := newPeerBase(cfg, false) p.addr = addr @@ -2269,7 +2435,12 @@ func NewOutboundPeer(cfg *Config, addr string) (*Peer, error) { } p.na = na } else { - p.na = wire.NewNetAddressIPPort(net.ParseIP(host), uint16(port), 0) + // If host is an onion hidden service or a hostname, it is + // likely that a nil-pointer-dereference will occur. The caller + // should set HostToNetAddress if connecting to these. + p.na = wire.NetAddressV2FromBytes( + time.Now(), 0, net.ParseIP(host), uint16(port), + ) } return p, nil diff --git a/peer/peer_test.go b/peer/peer_test.go index fff0ce3fd8..9df90c233d 100644 --- a/peer/peer_test.go +++ b/peer/peer_test.go @@ -238,6 +238,7 @@ func TestPeerConnection(t *testing.T) { ProtocolVersion: wire.RejectVersion, // Configure with older version Services: 0, TrickleInterval: time.Second * 10, + AllowSelfConns: true, } peer2Cfg := &peer.Config{ Listeners: peer1Cfg.Listeners, @@ -247,6 +248,7 @@ func TestPeerConnection(t *testing.T) { ChainParams: &chaincfg.MainNetParams, Services: wire.SFNodeNetwork | wire.SFNodeWitness, TrickleInterval: time.Second * 10, + AllowSelfConns: true, } wantStats1 := peerStats{ @@ -287,18 +289,16 @@ func TestPeerConnection(t *testing.T) { { "basic handshake", func() (*peer.Peer, *peer.Peer, error) { - inConn, outConn := pipe( - &conn{raddr: "10.0.0.1:8333"}, - &conn{raddr: "10.0.0.2:8333"}, - ) inPeer := peer.NewInboundPeer(peer1Cfg) - inPeer.AssociateConnection(inConn) - outPeer, err := peer.NewOutboundPeer(peer2Cfg, "10.0.0.2:8333") if err != nil { return nil, nil, err } - outPeer.AssociateConnection(outConn) + + err = setupPeerConnection(inPeer, outPeer) + if err != nil { + return nil, nil, err + } for i := 0; i < 4; i++ { select { @@ -313,18 +313,16 @@ func TestPeerConnection(t *testing.T) { { "socks proxy", func() (*peer.Peer, *peer.Peer, error) { - inConn, outConn := pipe( - &conn{raddr: "10.0.0.1:8333", proxy: true}, - &conn{raddr: "10.0.0.2:8333"}, - ) inPeer := peer.NewInboundPeer(peer1Cfg) - inPeer.AssociateConnection(inConn) - outPeer, err := peer.NewOutboundPeer(peer2Cfg, "10.0.0.2:8333") if err != nil { return nil, nil, err } - outPeer.AssociateConnection(outConn) + + err = setupPeerConnection(inPeer, outPeer) + if err != nil { + return nil, nil, err + } for i := 0; i < 4; i++ { select { @@ -357,7 +355,7 @@ func TestPeerConnection(t *testing.T) { // TestPeerListeners tests that the peer listeners are called as expected. func TestPeerListeners(t *testing.T) { verack := make(chan struct{}, 1) - ok := make(chan wire.Message, 20) + ok := make(chan wire.Message, 22) peerCfg := &peer.Config{ Listeners: peer.MessageListeners{ OnGetAddr: func(p *peer.Peer, msg *wire.MsgGetAddr) { @@ -445,6 +443,12 @@ func TestPeerListeners(t *testing.T) { OnSendHeaders: func(p *peer.Peer, msg *wire.MsgSendHeaders) { ok <- msg }, + OnSendAddrV2: func(p *peer.Peer, msg *wire.MsgSendAddrV2) { + ok <- msg + }, + OnAddrV2: func(p *peer.Peer, msg *wire.MsgAddrV2) { + ok <- msg + }, }, UserAgentName: "peer", UserAgentVersion: "1.0", @@ -452,13 +456,9 @@ func TestPeerListeners(t *testing.T) { ChainParams: &chaincfg.MainNetParams, Services: wire.SFNodeBloom, TrickleInterval: time.Second * 10, + AllowSelfConns: true, } - inConn, outConn := pipe( - &conn{raddr: "10.0.0.1:8333"}, - &conn{raddr: "10.0.0.2:8333"}, - ) inPeer := peer.NewInboundPeer(peerCfg) - inPeer.AssociateConnection(inConn) peerCfg.Listeners = peer.MessageListeners{ OnVerAck: func(p *peer.Peer, msg *wire.MsgVerAck) { @@ -470,7 +470,12 @@ func TestPeerListeners(t *testing.T) { t.Errorf("NewOutboundPeer: unexpected err %v\n", err) return } - outPeer.AssociateConnection(outConn) + + err = setupPeerConnection(inPeer, outPeer) + if err != nil { + t.Errorf("setupPeerConnection: failed: %v\n", err) + return + } for i := 0; i < 2; i++ { select { @@ -594,6 +599,14 @@ func TestPeerListeners(t *testing.T) { "OnSendHeaders", wire.NewMsgSendHeaders(), }, + { + "OnSendAddrV2", + wire.NewMsgSendAddrV2(), + }, + { + "OnAddrV2", + wire.NewMsgAddrV2(), + }, } t.Logf("Running %d tests", len(tests)) for _, test := range tests { @@ -623,6 +636,7 @@ func TestOutboundPeer(t *testing.T) { ChainParams: &chaincfg.MainNetParams, Services: 0, TrickleInterval: time.Second * 10, + AllowSelfConns: true, } r, w := io.Pipe() @@ -764,6 +778,7 @@ func TestUnsupportedVersionPeer(t *testing.T) { ChainParams: &chaincfg.MainNetParams, Services: 0, TrickleInterval: time.Second * 10, + AllowSelfConns: true, } localNA := wire.NewNetAddressIPPort( @@ -874,18 +889,19 @@ func TestDuplicateVersionMsg(t *testing.T) { UserAgentVersion: "1.0", ChainParams: &chaincfg.MainNetParams, Services: 0, + AllowSelfConns: true, } - inConn, outConn := pipe( - &conn{laddr: "10.0.0.1:9108", raddr: "10.0.0.2:9108"}, - &conn{laddr: "10.0.0.2:9108", raddr: "10.0.0.1:9108"}, - ) - outPeer, err := peer.NewOutboundPeer(peerCfg, inConn.laddr) + outPeer, err := peer.NewOutboundPeer(peerCfg, "10.0.0.2:8333") if err != nil { t.Fatalf("NewOutboundPeer: unexpected err: %v\n", err) } - outPeer.AssociateConnection(outConn) inPeer := peer.NewInboundPeer(peerCfg) - inPeer.AssociateConnection(inConn) + + err = setupPeerConnection(inPeer, outPeer) + if err != nil { + t.Fatalf("setupPeerConnection failed to connect: %v\n", err) + } + // Wait for the veracks from the initial protocol version negotiation. for i := 0; i < 2; i++ { select { @@ -917,7 +933,279 @@ func TestDuplicateVersionMsg(t *testing.T) { } } -func init() { - // Allow self connection when running the tests. - peer.TstAllowSelfConns() +// TestUpdateLastBlockHeight ensures the last block height is set properly +// during the initial version negotiation and is only allowed to advance to +// higher values via the associated update function. +func TestUpdateLastBlockHeight(t *testing.T) { + // Create a pair of peers that are connected to each other using a fake + // connection and the remote peer starting at height 100. + const remotePeerHeight = 100 + verack := make(chan struct{}) + peerCfg := peer.Config{ + Listeners: peer.MessageListeners{ + OnVerAck: func(p *peer.Peer, msg *wire.MsgVerAck) { + verack <- struct{}{} + }, + }, + UserAgentName: "peer", + UserAgentVersion: "1.0", + ChainParams: &chaincfg.MainNetParams, + Services: 0, + AllowSelfConns: true, + } + remotePeerCfg := peerCfg + remotePeerCfg.NewestBlock = func() (*chainhash.Hash, int32, error) { + return &chainhash.Hash{}, remotePeerHeight, nil + } + localPeer, err := peer.NewOutboundPeer(&peerCfg, "10.0.0.2:8333") + if err != nil { + t.Fatalf("NewOutboundPeer: unexpected err: %v\n", err) + } + inPeer := peer.NewInboundPeer(&remotePeerCfg) + + err = setupPeerConnection(inPeer, localPeer) + if err != nil { + t.Fatalf("setupPeerConnection failed to connect: %v\n", err) + } + + // Wait for the veracks from the initial protocol version negotiation. + for i := 0; i < 2; i++ { + select { + case <-verack: + case <-time.After(time.Second): + t.Fatal("verack timeout") + } + } + + // Ensure the latest block height starts at the value reported by the remote + // peer via its version message. + if height := localPeer.LastBlock(); height != remotePeerHeight { + t.Fatalf("wrong starting height - got %d, want %d", height, + remotePeerHeight) + } + + // Ensure the latest block height is not allowed to go backwards. + localPeer.UpdateLastBlockHeight(remotePeerHeight - 1) + if height := localPeer.LastBlock(); height != remotePeerHeight { + t.Fatalf("height allowed to go backwards - got %d, want %d", height, + remotePeerHeight) + } + + // Ensure the latest block height is allowed to advance. + localPeer.UpdateLastBlockHeight(remotePeerHeight + 1) + if height := localPeer.LastBlock(); height != remotePeerHeight+1 { + t.Fatalf("height not allowed to advance - got %d, want %d", height, + remotePeerHeight+1) + } +} + +// setupPeerConnection initiates a tcp connection between two peers. +func setupPeerConnection(in, out *peer.Peer) error { + // listenFunc is a function closure that listens for a tcp connection. + // The tcp connection will be the one the inbound peer uses. This will + // be run as a goroutine. + listenFunc := func(l *net.TCPListener, errChan chan error, + listenChan chan struct{}) { + + listenChan <- struct{}{} + + conn, err := l.Accept() + if err != nil { + errChan <- err + return + } + + in.AssociateConnection(conn) + errChan <- nil + } + + // dialFunc is a function closure that initiates the tcp connection. + // The tcp connection will be the one the outbound peer uses. + dialFunc := func(addr *net.TCPAddr) error { + conn, err := net.Dial("tcp", addr.String()) + if err != nil { + return err + } + + out.AssociateConnection(conn) + return nil + } + + listenAddr := "localhost:0" + + addr, err := net.ResolveTCPAddr("tcp", listenAddr) + if err != nil { + return err + } + + l, err := net.ListenTCP("tcp", addr) + if err != nil { + return err + } + + errChan := make(chan error, 1) + listenChan := make(chan struct{}, 1) + + go listenFunc(l, errChan, listenChan) + <-listenChan + + if err := dialFunc(l.Addr().(*net.TCPAddr)); err != nil { + return err + } + + select { + case err = <-errChan: + return err + case <-time.After(time.Second * 2): + return errors.New("failed to create connection") + } +} + +// TestSendAddrV2Handshake tests that the version-verack handshake with the +// addition of the sendaddrv2 message works as expected. +func TestSendAddrV2Handshake(t *testing.T) { + verack := make(chan struct{}, 2) + sendaddr := make(chan struct{}, 2) + peer1Cfg := &peer.Config{ + Listeners: peer.MessageListeners{ + OnVerAck: func(p *peer.Peer, msg *wire.MsgVerAck) { + verack <- struct{}{} + }, + OnSendAddrV2: func(p *peer.Peer, + msg *wire.MsgSendAddrV2) { + + sendaddr <- struct{}{} + }, + }, + AllowSelfConns: true, + ChainParams: &chaincfg.MainNetParams, + } + + peer2Cfg := &peer.Config{ + Listeners: peer1Cfg.Listeners, + AllowSelfConns: true, + ChainParams: &chaincfg.MainNetParams, + } + + verackErr := errors.New("verack timeout") + + tests := []struct { + name string + expectsV2 bool + setup func() (*peer.Peer, *peer.Peer, error) + }{ + { + "successful sendaddrv2 handshake", + true, + func() (*peer.Peer, *peer.Peer, error) { + inPeer := peer.NewInboundPeer(peer1Cfg) + outPeer, err := peer.NewOutboundPeer( + peer2Cfg, "10.0.0.2:8333", + ) + if err != nil { + return nil, nil, err + } + + err = setupPeerConnection(inPeer, outPeer) + if err != nil { + return nil, nil, err + } + + for i := 0; i < 4; i++ { + select { + case <-sendaddr: + case <-verack: + case <-time.After(time.Second * 2): + return nil, nil, verackErr + } + } + + return inPeer, outPeer, nil + }, + }, + { + "handshake with legacy inbound peer", + false, + func() (*peer.Peer, *peer.Peer, error) { + legacyVersion := wire.AddrV2Version - 1 + peer1Cfg.ProtocolVersion = legacyVersion + inPeer := peer.NewInboundPeer(peer1Cfg) + outPeer, err := peer.NewOutboundPeer( + peer2Cfg, "10.0.0.2:8333", + ) + if err != nil { + return nil, nil, err + } + + err = setupPeerConnection(inPeer, outPeer) + if err != nil { + return nil, nil, err + } + + for i := 0; i < 2; i++ { + select { + case <-verack: + case <-time.After(time.Second * 2): + return nil, nil, verackErr + } + } + + return inPeer, outPeer, nil + }, + }, + { + "handshake with legacy outbound peer", + false, + func() (*peer.Peer, *peer.Peer, error) { + inPeer := peer.NewInboundPeer(peer1Cfg) + legacyVersion := wire.AddrV2Version - 1 + peer2Cfg.ProtocolVersion = legacyVersion + outPeer, err := peer.NewOutboundPeer( + peer2Cfg, "10.0.0.2:8333", + ) + if err != nil { + return nil, nil, err + } + + err = setupPeerConnection(inPeer, outPeer) + if err != nil { + return nil, nil, err + } + + for i := 0; i < 2; i++ { + select { + case <-verack: + case <-time.After(time.Second * 2): + return nil, nil, verackErr + } + } + + return inPeer, outPeer, nil + }, + }, + } + + t.Logf("Running %d tests", len(tests)) + for i, test := range tests { + inPeer, outPeer, err := test.setup() + if err != nil { + t.Fatalf("TestSendAddrV2Handshake setup #%d: "+ + "unexpected err: %v", i, err) + } + + if inPeer.WantsAddrV2() != test.expectsV2 { + t.Fatalf("TestSendAddrV2Handshake #%d expected "+ + "wantsAddrV2 to be %v instead was %v", i, + test.expectsV2, inPeer.WantsAddrV2()) + } else if outPeer.WantsAddrV2() != test.expectsV2 { + t.Fatalf("TestSendAddrV2Handshake #%d expected "+ + "wantsAddrV2 to be %v instead was %v", i, + test.expectsV2, outPeer.WantsAddrV2()) + } + + inPeer.Disconnect() + outPeer.Disconnect() + inPeer.WaitForDisconnect() + outPeer.WaitForDisconnect() + } } diff --git a/release/README.md b/release/README.md index 10d1c80cc0..7128ef1f16 100644 --- a/release/README.md +++ b/release/README.md @@ -3,29 +3,139 @@ This package contains the build script that the `btcd` project uses in order to build binaries for each new release. As of `go1.13`, with some new build flags, binaries are now reproducible, allowing developers to build the binary on -distinct machines, and end up with a byte-for-byte identical binary. However, -this wasn't _fully_ solved in `go1.13`, as the build system still includes the -directory the binary is built into the binary itself. As a result, our scripts -utilize a work around needed until `go1.13.2`. +distinct machines, and end up with a byte-for-byte identical binary. +Every release should note which Go version was used to build the release, so +that version should be used for verifying the release. ## Building a New Release -### macOS/Linux/Windows (WSL) +### Tagging and pushing a new tag (for maintainers) + +Before running release scripts, a few things need to happen in order to finally +create a release and make sure there are no mistakes in the release process. + +First, make sure that before the tagged commit there are modifications to the +[CHANGES](../CHANGES) file committed. +The CHANGES file should be a changelog that roughly mirrors the release notes. +Generally, the PRs that have been merged since the last release have been +listed in the CHANGES file and categorized. +For example, these changes have had the following format in the past: +``` +Changes in X.YY.Z (Month Day Year): + - Protocol and Network-related changes: + - PR Title One (#PRNUM) + - PR Title Two (#PRNUMTWO) + ... + - RPC changes: + - Crypto changes: + ... + + - Contributors (alphabetical order): + - Contributor A + - Contributor B + - Contributor C + ... +``` + +If the previous tag is, for example, `vA.B.C`, then you can get the list of +contributors (from `vA.B.C` until the current `HEAD`) using the following command: +```bash +git log vA.B.C..HEAD --pretty="%an" | sort | uniq +``` +After committing changes to the CHANGES file, the tagged release commit +should be created. + +The tagged commit should be a commit that bumps version numbers in `version.go` +and `cmd/btcctl/version.go`. +For example (taken from [f3ec130](https://github.com/btcsuite/btcd/commit/f3ec13030e4e828869954472cbc51ac36bee5c1d)): +```diff +diff --git a/cmd/btcctl/version.go b/cmd/btcctl/version.go +index 2195175c71..f65cacef7e 100644 +--- a/cmd/btcctl/version.go ++++ b/cmd/btcctl/version.go +@@ -18,7 +18,7 @@ const semanticAlphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr + const ( + appMajor uint = 0 + appMinor uint = 20 +- appPatch uint = 0 ++ appPatch uint = 1 + + // appPreRelease MUST only contain characters from semanticAlphabet + // per the semantic versioning spec. +diff --git a/version.go b/version.go +index 92fd60fdd4..fba55b5a37 100644 +--- a/version.go ++++ b/version.go +@@ -18,7 +18,7 @@ const semanticAlphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr + const ( + appMajor uint = 0 + appMinor uint = 20 +- appPatch uint = 0 ++ appPatch uint = 1 + + // appPreRelease MUST only contain characters from semanticAlphabet + // per the semantic versioning spec. +``` + +Next, this commit should be signed by the maintainer using `git commit -S`. +The commit should be tagged and signed with `git tag -s`, and should be +pushed using `git push origin TAG`. + +### Building a release on macOS/Linux/Windows (WSL) No prior set up is needed on Linux or macOS is required in order to build the release binaries. However, on Windows, the only way to build the release binaries at the moment is by using the Windows Subsystem Linux. One can build the release binaries following these steps: -1. `git clone https://github.com/btcsuite/btcd.git +1. `git clone https://github.com/btcsuite/btcd.git` 2. `cd btcd` -3. `./build/release/release.sh # is the name of the next - release/tag` +3. `./release/release.sh # is the name of the next release/tag` This will then create a directory of the form `btcd-` containing archives of the release binaries for each supported operating system and architecture, and a manifest file containing the hash of each archive. +### Pushing a release (for maintainers) + +Now that the directory `btcd-` is created, the manifest file needs to be +signed by a maintainer and the release files need to be published to GitHub. + +Sign the `manifest-.txt` file like so: +```sh +gpg --sign --detach-sig manifest-.txt +``` +This will create a file named `manifest-.txt.sig`, which will must +be included in the release files later. + +#### Note before publishing +Before publishing, go through the reproducible build process that is outlined +in this document with the files created from `release/release.sh`. This includes +verifying commit and tag signatures using `git verify-commit` and git `verify-tag` +respectively. + +Now that we've double-checked everything and have all of the necessary files, +it's time to publish release files on GitHub. +Follow [this documentation](https://docs.github.com/en/github/administering-a-repository/managing-releases-in-a-repository) +to create a release using the GitHub UI, and make sure to write release notes +which roughly follow the format of [previous release notes](https://github.com/btcsuite/btcd/releases/tag/v0.20.1-beta). +This is different from the [CHANGES](../CHANGES) file, which should be before the +tagged commit in the git history. +Much of the information in the release notes will be the same as the CHANGES +file. +It's important to include the Go version used to produce the release files in +the release notes, so users know the correct version of Go to use to reproduce +and verify the build. +When following the GitHub documentation, include every file in the `btcd-` +directory. + +At this point, a signed commit and tag on that commit should be pushed to the main +branch. The directory created from running `release/release.sh` should be included +as release files in the GitHub release UI, and the `manifest-.txt` file +signature, called `manifest-.txt.sig`, should also be included. +A release notes document should be created and written in the GitHub release UI. +Once all of this is done, feel free to click `Publish Release`! + ## Verifying a Release With `go1.13`, it's now possible for third parties to verify release binaries. @@ -64,8 +174,8 @@ and `go` (matching the same version used in the release): release with `git checkout `. 7. Proceed to verify the tag with `git verify-tag ` and compile the binaries from source for the intended operating system and architecture with - `BTCDBUILDSYS=OS-ARCH ./build/release/release.sh `. + `BTCDBUILDSYS=OS-ARCH ./release/release.sh `. 8. Extract the archive found in the `btcd-` directory created by the release script and recompute the `SHA256` hash of the release binaries (btcd and btcctl) with `shasum -a 256 `. These should match __exactly__ - as the ones noted above. + as the ones noted above. \ No newline at end of file diff --git a/release/notes.sample b/release/notes.sample deleted file mode 100644 index 86a79a61f5..0000000000 --- a/release/notes.sample +++ /dev/null @@ -1,6 +0,0 @@ -- Each release note is preceded by a dash -- Each release note must not exceed 74 characters per line -- Release notes that require a longer explanation than will fit on a - single line should be wrapped with the text indented as in this line -- No periods at the end of each release note -- Other minor cleanup and bug fixes diff --git a/release/prep_release.sh b/release/prep_release.sh deleted file mode 100644 index c64824a644..0000000000 --- a/release/prep_release.sh +++ /dev/null @@ -1,205 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2013 Conformal Systems LLC -# -# Permission to use, copy, modify, and distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -# -# -# Prepares for a release: -# - Bumps version according to specified level (major, minor, or patch) -# - Updates all version files and package control files with new version -# - Performs some basic validation on specified release notes -# - Updates project changes file with release notes -# - -PROJECT=btcd -PROJECT_UC=$(echo $PROJECT | tr '[:lower:]' '[:upper:]') -SCRIPT=$(basename $0) -VERFILE=../version.go -VERFILES="$VERFILE ../cmd/btcctl/version.go" -PROJ_CHANGES=../CHANGES - -# verify params -if [ $# -lt 2 ]; then - echo "usage: $SCRIPT {major | minor | patch} release-notes-file" - exit 1 -fi - -CUR_DIR=$(pwd) -cd "$(dirname $0)" - -# verify version files exist -for verfile in $VERFILES; do - if [ ! -f "$verfile" ]; then - echo "$SCRIPT: error: $verfile does not exist" 1>&2 - exit 1 - fi -done - -# verify changes file exists -if [ ! -f "$PROJ_CHANGES" ]; then - echo "$SCRIPT: error: $PROJ_CHANGES does not exist" 1>&2 - exit 1 -fi - -RTYPE="$1" -RELEASE_NOTES="$2" -if [ $(echo $RELEASE_NOTES | cut -c1) != "/" ]; then - RELEASE_NOTES="$CUR_DIR/$RELEASE_NOTES" -fi - -# verify valid release type -if [ "$RTYPE" != "major" -a "$RTYPE" != "minor" -a "$RTYPE" != "patch" ]; then - echo "$SCRIPT: error: release type must be major, minor, or patch" - exit 1 -fi - -# verify release notes -if [ ! -e "$RELEASE_NOTES" ]; then - echo "$SCRIPT: error: specified release notes file does not exist" - exit 1 -fi - -if [ ! -s "$RELEASE_NOTES" ]; then - echo "$SCRIPT: error: specified release notes file is empty" - exit 1 -fi - -# verify release notes format -while IFS='' read line; do - if [ -z "$line" ]; then - echo "$SCRIPT: error: release notes must not have blank lines" - exit 1 - fi - if [ ${#line} -gt 74 ]; then - echo -n "$SCRIPT: error: release notes must not contain lines " - echo "with more than 74 characters" - exit 1 - fi - if expr "$line" : ".*\.$" >/dev/null 2>&1 ; then - echo -n "$SCRIPT: error: release notes must not contain lines " - echo "that end in a period" - exit 1 - fi - if ! expr "$line" : "\-" >/dev/null 2>&1; then - if ! expr "$line" : " " >/dev/null 2>&1; then - echo -n "$SCRIPT: error: release notes must not contain lines " - echo "that do not begin with a dash and are not indented" - exit 1 - fi - fi -done <"$RELEASE_NOTES" - -# verify git is available -if ! type git >/dev/null 2>&1; then - echo -n "$SCRIPT: error: Unable to find 'git' in the system path." - exit 1 -fi - -# verify the git repository is on the master branch -BRANCH=$(git branch | grep '\*' | cut -c3-) -if [ "$BRANCH" != "master" ]; then - echo "$SCRIPT: error: git repository must be on the master branch." - exit 1 -fi - -# verify there are no uncommitted modifications prior to release modifications -NUM_MODIFIED=$(git diff 2>/dev/null | wc -l | sed 's/^[ \t]*//') -NUM_STAGED=$(git diff --cached 2>/dev/null | wc -l | sed 's/^[ \t]*//') -if [ "$NUM_MODIFIED" != "0" -o "$NUM_STAGED" != "0" ]; then - echo -n "$SCRIPT: error: the working directory contains uncommitted " - echo "modifications" - exit 1 -fi - -# get version -PAT_PREFIX="(^[[:space:]]+app" -PAT_SUFFIX='[[:space:]]+uint[[:space:]]+=[[:space:]]+)[0-9]+$' -MAJOR=$(egrep "${PAT_PREFIX}Major${PAT_SUFFIX}" $VERFILE | awk '{print $4}') -MINOR=$(egrep "${PAT_PREFIX}Minor${PAT_SUFFIX}" $VERFILE | awk '{print $4}') -PATCH=$(egrep "${PAT_PREFIX}Patch${PAT_SUFFIX}" $VERFILE | awk '{print $4}') -if [ -z "$MAJOR" -o -z "$MINOR" -o -z "$PATCH" ]; then - echo "$SCRIPT: error: unable to get version from $VERFILE" 1>&2 - exit 1 -fi - -# bump version according to level -if [ "$RTYPE" = "major" ]; then - MAJOR=$(expr $MAJOR + 1) - MINOR=0 - PATCH=0 -elif [ "$RTYPE" = "minor" ]; then - MINOR=$(expr $MINOR + 1) - PATCH=0 -elif [ "$RTYPE" = "patch" ]; then - PATCH=$(expr $PATCH + 1) -fi -PROJ_VER="$MAJOR.$MINOR.$PATCH" - -# update project changes with release notes -DATE=$(date "+%a %b %d %Y") -awk -v D="$DATE" -v VER="$PROJ_VER" ' -/=======/ && first_line==0 { - first_line=1 - print $0 - next -} -/=======/ && first_line==1 { - print $0 - print "" - print "Changes in "VER" ("D")" - exit -} -{ print $0 } -' <"$PROJ_CHANGES" >"${PROJ_CHANGES}.tmp" -cat "$RELEASE_NOTES" | sed 's/^/ /' >>"${PROJ_CHANGES}.tmp" -awk ' -/=======/ && first_line==0 { - first_line=1 - next -} -/=======/ && first_line==1 { - second_line=1 - next -} -second_line==1 { print $0 } -' <"$PROJ_CHANGES" >>"${PROJ_CHANGES}.tmp" - -# update version filef with new version -for verfile in $VERFILES; do - sed -E " - s/${PAT_PREFIX}Major${PAT_SUFFIX}/\1${MAJOR}/; - s/${PAT_PREFIX}Minor${PAT_SUFFIX}/\1${MINOR}/; - s/${PAT_PREFIX}Patch${PAT_SUFFIX}/\1${PATCH}/; - " <"$verfile" >"${verfile}.tmp" -done - - -# Apply changes -mv "${PROJ_CHANGES}.tmp" "$PROJ_CHANGES" -for verfile in $VERFILES; do - mv "${verfile}.tmp" "$verfile" -done - -echo "All files have been prepared for release." -echo "Use the following commands to review the changes for accuracy:" -echo " git status" -echo " git diff" -echo "" -echo "If everything is accurate, use the following commands to commit, tag," -echo "and push the changes" -echo " git commit -am \"Prepare for release ${PROJ_VER}.\"" -echo -n " git tag -a \"${PROJECT_UC}_${MAJOR}_${MINOR}_${PATCH}\" -m " -echo "\"Release ${PROJ_VER}\"" -echo " git push" -echo " git push --tags" diff --git a/release/release.sh b/release/release.sh index 7b0885dac6..49dee89638 100755 --- a/release/release.sh +++ b/release/release.sh @@ -1,11 +1,12 @@ #!/bin/bash +# Copyright (c) 2016 Company 0, LLC. +# Copyright (c) 2016-2020 The btcsuite developers +# Use of this source code is governed by an ISC +# license that can be found in the LICENSE file. + # Simple bash script to build basic btcd tools for all the platforms we support # with the golang cross-compiler. -# -# Copyright (c) 2016 Company 0, LLC. -# Use of this source code is governed by the ISC -# license. set -e @@ -38,8 +39,8 @@ cd $MAINDIR # If BTCDBUILDSYS is set the default list is ignored. Useful to release # for a subset of systems/architectures. SYS=${BTCDBUILDSYS:-" - darwin-386 darwin-amd64 + darwin-arm64 dragonfly-amd64 freebsd-386 freebsd-amd64 diff --git a/rpcadapters.go b/rpcadapters.go index 7d2c3a14d0..03905c7b16 100644 --- a/rpcadapters.go +++ b/rpcadapters.go @@ -8,12 +8,12 @@ import ( "sync/atomic" "github.com/btcsuite/btcd/blockchain" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/mempool" "github.com/btcsuite/btcd/netsync" "github.com/btcsuite/btcd/peer" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) // rpcPeer provides a peer for use with the RPC server and implements the @@ -223,6 +223,15 @@ func (cm *rpcConnManager) RelayTransactions(txns []*mempool.TxDesc) { cm.server.relayTransactions(txns) } +// NodeAddresses returns an array consisting node addresses which can +// potentially be used to find new nodes in the network. +// +// This function is safe for concurrent access and is part of the +// rpcserverConnManager interface implementation. +func (cm *rpcConnManager) NodeAddresses() []*wire.NetAddressV2 { + return cm.server.addrManager.AddressCache() +} + // rpcSyncMgr provides a block manager for use with the RPC server and // implements the rpcserverSyncManager interface. type rpcSyncMgr struct { @@ -268,7 +277,7 @@ func (b *rpcSyncMgr) SyncPeerID() int32 { return b.syncMgr.SyncPeerID() } -// LocateBlocks returns the hashes of the blocks after the first known block in +// LocateHeaders returns the hashes of the blocks after the first known block in // the provided locators until the provided stop hash or the current tip is // reached, up to a max of wire.MaxBlockHeadersPerMsg hashes. // diff --git a/rpcclient/README.md b/rpcclient/README.md index 06be0d69e1..08b16f7560 100644 --- a/rpcclient/README.md +++ b/rpcclient/README.md @@ -1,9 +1,9 @@ rpcclient ========= -[![Build Status](http://img.shields.io/travis/btcsuite/btcd.svg)](https://travis-ci.org/btcsuite/btcd) +[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions) [![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) -[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/btcsuite/btcd/rpcclient) +[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/rpcclient) rpcclient implements a Websocket-enabled Bitcoin JSON-RPC client package written in [Go](http://golang.org/). It provides a robust and easy to use client for @@ -18,7 +18,7 @@ implement and the API is not stable yet. ## Documentation -* [API Reference](http://godoc.org/github.com/btcsuite/btcd/rpcclient) +* [API Reference](https://pkg.go.dev/github.com/btcsuite/btcd/rpcclient) * [btcd Websockets Example](https://github.com/btcsuite/btcd/tree/master/rpcclient/examples/btcdwebsockets) Connects to a btcd RPC server using TLS-secured websockets, registers for block connected and block disconnected notifications, and gets the current diff --git a/rpcclient/backend_version.go b/rpcclient/backend_version.go new file mode 100644 index 0000000000..cb2a46fc5e --- /dev/null +++ b/rpcclient/backend_version.go @@ -0,0 +1,208 @@ +package rpcclient + +import "strings" + +// BackendVersion defines an interface to handle the version of the backend +// used by the client. +type BackendVersion interface { + // String returns a human-readable backend version. + String() string + + // SupportUnifiedSoftForks returns true if the backend supports the + // unified softforks format. + SupportUnifiedSoftForks() bool + + // SupportTestMempoolAccept returns true if the backend supports the + // testmempoolaccept RPC. + SupportTestMempoolAccept() bool + + // SupportGetTxSpendingPrevOut returns true if the backend supports the + // gettxspendingprevout RPC. + SupportGetTxSpendingPrevOut() bool +} + +// BitcoindVersion represents the version of the bitcoind the client is +// currently connected to. +type BitcoindVersion uint8 + +const ( + // BitcoindPre19 represents a bitcoind version before 0.19.0. + BitcoindPre19 BitcoindVersion = iota + + // BitcoindPre22 represents a bitcoind version equal to or greater than + // 0.19.0 and smaller than 22.0.0. + BitcoindPre22 + + // BitcoindPre24 represents a bitcoind version equal to or greater than + // 22.0.0 and smaller than 24.0.0. + BitcoindPre24 + + // BitcoindPre25 represents a bitcoind version equal to or greater than + // 24.0.0 and smaller than 25.0.0. + BitcoindPre25 + + // BitcoindPre25 represents a bitcoind version equal to or greater than + // 25.0.0. + BitcoindPost25 +) + +// String returns a human-readable backend version. +func (b BitcoindVersion) String() string { + switch b { + case BitcoindPre19: + return "bitcoind 0.19 and below" + + case BitcoindPre22: + return "bitcoind v0.19.0-v22.0.0" + + case BitcoindPre24: + return "bitcoind v22.0.0-v24.0.0" + + case BitcoindPre25: + return "bitcoind v24.0.0-v25.0.0" + + case BitcoindPost25: + return "bitcoind v25.0.0 and above" + + default: + return "unknown" + } +} + +// SupportUnifiedSoftForks returns true if the backend supports the unified +// softforks format. +func (b BitcoindVersion) SupportUnifiedSoftForks() bool { + // Versions of bitcoind on or after v0.19.0 use the unified format. + return b > BitcoindPre19 +} + +// SupportTestMempoolAccept returns true if bitcoind version is 22.0.0 or +// above. +func (b BitcoindVersion) SupportTestMempoolAccept() bool { + return b > BitcoindPre22 +} + +// SupportGetTxSpendingPrevOut returns true if bitcoind version is 24.0.0 or +// above. +func (b BitcoindVersion) SupportGetTxSpendingPrevOut() bool { + return b > BitcoindPre24 +} + +// Compile-time checks to ensure that BitcoindVersion satisfy the +// BackendVersion interface. +var _ BackendVersion = BitcoindVersion(0) + +const ( + // bitcoind19Str is the string representation of bitcoind v0.19.0. + bitcoind19Str = "0.19.0" + + // bitcoind22Str is the string representation of bitcoind v22.0.0. + bitcoind22Str = "22.0.0" + + // bitcoind24Str is the string representation of bitcoind v24.0.0. + bitcoind24Str = "24.0.0" + + // bitcoind25Str is the string representation of bitcoind v25.0.0. + bitcoind25Str = "25.0.0" + + // bitcoindVersionPrefix specifies the prefix included in every bitcoind + // version exposed through GetNetworkInfo. + bitcoindVersionPrefix = "/Satoshi:" + + // bitcoindVersionSuffix specifies the suffix included in every bitcoind + // version exposed through GetNetworkInfo. + bitcoindVersionSuffix = "/" +) + +// parseBitcoindVersion parses the bitcoind version from its string +// representation. +func parseBitcoindVersion(version string) BitcoindVersion { + // Trim the version of its prefix and suffix to determine the + // appropriate version number. + version = strings.TrimPrefix( + strings.TrimSuffix(version, bitcoindVersionSuffix), + bitcoindVersionPrefix, + ) + switch { + case version < bitcoind19Str: + return BitcoindPre19 + + case version < bitcoind22Str: + return BitcoindPre22 + + case version < bitcoind24Str: + return BitcoindPre24 + + case version < bitcoind25Str: + return BitcoindPre25 + + default: + return BitcoindPost25 + } +} + +// BtcdVersion represents the version of the btcd the client is currently +// connected to. +type BtcdVersion int32 + +const ( + // BtcdPre2401 describes a btcd version before 0.24.1, which doesn't + // include the `testmempoolaccept` and `gettxspendingprevout` RPCs. + BtcdPre2401 BtcdVersion = iota + + // BtcdPost2401 describes a btcd version equal to or greater than + // 0.24.1. + BtcdPost2401 +) + +// String returns a human-readable backend version. +func (b BtcdVersion) String() string { + switch b { + case BtcdPre2401: + return "btcd 24.0.0 and below" + + case BtcdPost2401: + return "btcd 24.1.0 and above" + + default: + return "unknown" + } +} + +// SupportUnifiedSoftForks returns true if the backend supports the unified +// softforks format. +// +// NOTE: always true for btcd as we didn't track it before. +func (b BtcdVersion) SupportUnifiedSoftForks() bool { + return true +} + +// SupportTestMempoolAccept returns true if btcd version is 24.1.0 or above. +func (b BtcdVersion) SupportTestMempoolAccept() bool { + return b > BtcdPre2401 +} + +// SupportGetTxSpendingPrevOut returns true if btcd version is 24.1.0 or above. +func (b BtcdVersion) SupportGetTxSpendingPrevOut() bool { + return b > BtcdPre2401 +} + +// Compile-time checks to ensure that BtcdVersion satisfy the BackendVersion +// interface. +var _ BackendVersion = BtcdVersion(0) + +const ( + // btcd2401Val is the int representation of btcd v0.24.1. + btcd2401Val = 240100 +) + +// parseBtcdVersion parses the btcd version from its string representation. +func parseBtcdVersion(version int32) BtcdVersion { + switch { + case version < btcd2401Val: + return BtcdPre2401 + + default: + return BtcdPost2401 + } +} diff --git a/rpcclient/backend_version_test.go b/rpcclient/backend_version_test.go new file mode 100644 index 0000000000..3a4baec1db --- /dev/null +++ b/rpcclient/backend_version_test.go @@ -0,0 +1,148 @@ +package rpcclient + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +// TestParseBitcoindVersion checks that the correct version from bitcoind's +// `getnetworkinfo` RPC call is parsed. +func TestParseBitcoindVersion(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + rpcVersion string + parsedVersion BitcoindVersion + }{ + { + name: "parse version 0.19 and below", + rpcVersion: "/Satoshi:0.18.0/", + parsedVersion: BitcoindPre19, + }, + { + name: "parse version 0.19", + rpcVersion: "/Satoshi:0.19.0/", + parsedVersion: BitcoindPre22, + }, + { + name: "parse version 0.19 - 22.0", + rpcVersion: "/Satoshi:0.20.1/", + parsedVersion: BitcoindPre22, + }, + { + name: "parse version 22.0", + rpcVersion: "/Satoshi:22.0.0/", + parsedVersion: BitcoindPre24, + }, + { + name: "parse version 22.0 - 24.0", + rpcVersion: "/Satoshi:23.1.0/", + parsedVersion: BitcoindPre24, + }, + { + name: "parse version 24.0", + rpcVersion: "/Satoshi:24.0.0/", + parsedVersion: BitcoindPre25, + }, + { + name: "parse version 25.0", + rpcVersion: "/Satoshi:25.0.0/", + parsedVersion: BitcoindPost25, + }, + { + name: "parse version 25.0 and above", + rpcVersion: "/Satoshi:26.0.0/", + parsedVersion: BitcoindPost25, + }, + } + + for _, tc := range testCases { + tc := tc + + t.Run(tc.name, func(t *testing.T) { + version := parseBitcoindVersion(tc.rpcVersion) + require.Equal(t, tc.parsedVersion, version) + }) + } +} + +// TestParseBtcdVersion checks that the correct version from btcd's `getinfo` +// RPC call is parsed. +func TestParseBtcdVersion(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + rpcVersion int32 + parsedVersion BtcdVersion + }{ + { + name: "parse version 0.24 and below", + rpcVersion: 230000, + parsedVersion: BtcdPre2401, + }, + { + name: "parse version 0.24.1", + rpcVersion: 240100, + parsedVersion: BtcdPost2401, + }, + { + name: "parse version 0.24.1 and above", + rpcVersion: 250000, + parsedVersion: BtcdPost2401, + }, + } + + for _, tc := range testCases { + tc := tc + + t.Run(tc.name, func(t *testing.T) { + version := parseBtcdVersion(tc.rpcVersion) + require.Equal(t, tc.parsedVersion, version) + }) + } +} + +// TestVersionSupports checks all the versions of bitcoind and btcd to ensure +// that the RPCs are supported correctly. +func TestVersionSupports(t *testing.T) { + t.Parallel() + + require := require.New(t) + + // For bitcoind, unified softforks format is supported in 19.0 and + // above. + require.False(BitcoindPre19.SupportUnifiedSoftForks()) + require.True(BitcoindPre22.SupportUnifiedSoftForks()) + require.True(BitcoindPre24.SupportUnifiedSoftForks()) + require.True(BitcoindPre25.SupportUnifiedSoftForks()) + require.True(BitcoindPost25.SupportUnifiedSoftForks()) + + // For bitcoind, `testmempoolaccept` is supported in 22.0 and above. + require.False(BitcoindPre19.SupportTestMempoolAccept()) + require.False(BitcoindPre22.SupportTestMempoolAccept()) + require.True(BitcoindPre24.SupportTestMempoolAccept()) + require.True(BitcoindPre25.SupportTestMempoolAccept()) + require.True(BitcoindPost25.SupportTestMempoolAccept()) + + // For bitcoind, `gettxspendingprevout` is supported in 24.0 and above. + require.False(BitcoindPre19.SupportGetTxSpendingPrevOut()) + require.False(BitcoindPre22.SupportGetTxSpendingPrevOut()) + require.False(BitcoindPre24.SupportGetTxSpendingPrevOut()) + require.True(BitcoindPre25.SupportGetTxSpendingPrevOut()) + require.True(BitcoindPost25.SupportGetTxSpendingPrevOut()) + + // For btcd, unified softforks format is supported in all versions. + require.True(BtcdPre2401.SupportUnifiedSoftForks()) + require.True(BtcdPost2401.SupportUnifiedSoftForks()) + + // For btcd, `testmempoolaccept` is supported in 24.1 and above. + require.False(BtcdPre2401.SupportTestMempoolAccept()) + require.True(BtcdPost2401.SupportTestMempoolAccept()) + + // For btcd, `gettxspendingprevout` is supported in 24.1 and above. + require.False(BtcdPre2401.SupportGetTxSpendingPrevOut()) + require.True(BtcdPost2401.SupportGetTxSpendingPrevOut()) +} diff --git a/rpcclient/chain.go b/rpcclient/chain.go index 996d80458c..c8562b8e65 100644 --- a/rpcclient/chain.go +++ b/rpcclient/chain.go @@ -17,12 +17,12 @@ import ( // FutureGetBestBlockHashResult is a future promise to deliver the result of a // GetBestBlockAsync RPC invocation (or an applicable error). -type FutureGetBestBlockHashResult chan *response +type FutureGetBestBlockHashResult chan *Response -// Receive waits for the response promised by the future and returns the hash of +// Receive waits for the Response promised by the future and returns the hash of // the best block in the longest block chain. func (r FutureGetBestBlockHashResult) Receive() (*chainhash.Hash, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -43,7 +43,7 @@ func (r FutureGetBestBlockHashResult) Receive() (*chainhash.Hash, error) { // See GetBestBlockHash for the blocking version and more details. func (c *Client) GetBestBlockHashAsync() FutureGetBestBlockHashResult { cmd := btcjson.NewGetBestBlockHashCmd() - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetBestBlockHash returns the hash of the best block in the longest block @@ -52,14 +52,61 @@ func (c *Client) GetBestBlockHash() (*chainhash.Hash, error) { return c.GetBestBlockHashAsync().Receive() } +// legacyGetBlockRequest constructs and sends a legacy getblock request which +// contains two separate bools to denote verbosity, in contract to a single int +// parameter. +func (c *Client) legacyGetBlockRequest(hash string, verbose, + verboseTx bool) ([]byte, error) { + + hashJSON, err := json.Marshal(hash) + if err != nil { + return nil, err + } + verboseJSON, err := json.Marshal(btcjson.Bool(verbose)) + if err != nil { + return nil, err + } + verboseTxJSON, err := json.Marshal(btcjson.Bool(verboseTx)) + if err != nil { + return nil, err + } + return c.RawRequest("getblock", []json.RawMessage{ + hashJSON, verboseJSON, verboseTxJSON, + }) +} + +// waitForGetBlockRes waits for the Response of a getblock request. If the +// Response indicates an invalid parameter was provided, a legacy style of the +// request is resent and its Response is returned instead. +func (c *Client) waitForGetBlockRes(respChan chan *Response, hash string, + verbose, verboseTx bool) ([]byte, error) { + + res, err := ReceiveFuture(respChan) + + // If we receive an invalid parameter error, then we may be + // communicating with a btcd node which only understands the legacy + // request, so we'll try that. + if err, ok := err.(*btcjson.RPCError); ok && + err.Code == btcjson.ErrRPCInvalidParams.Code { + return c.legacyGetBlockRequest(hash, verbose, verboseTx) + } + + // Otherwise, we can return the Response as is. + return res, err +} + // FutureGetBlockResult is a future promise to deliver the result of a // GetBlockAsync RPC invocation (or an applicable error). -type FutureGetBlockResult chan *response +type FutureGetBlockResult struct { + client *Client + hash string + Response chan *Response +} -// Receive waits for the response promised by the future and returns the raw +// Receive waits for the Response promised by the future and returns the raw // block requested from the server given its hash. func (r FutureGetBlockResult) Receive() (*wire.MsgBlock, error) { - res, err := receiveFuture(r) + res, err := r.client.waitForGetBlockRes(r.Response, r.hash, false, false) if err != nil { return nil, err } @@ -97,8 +144,12 @@ func (c *Client) GetBlockAsync(blockHash *chainhash.Hash) FutureGetBlockResult { hash = blockHash.String() } - cmd := btcjson.NewGetBlockCmd(hash, btcjson.Bool(false), nil) - return c.sendCmd(cmd) + cmd := btcjson.NewGetBlockCmd(hash, btcjson.Int(0)) + return FutureGetBlockResult{ + client: c, + hash: hash, + Response: c.SendCmd(cmd), + } } // GetBlock returns a raw block from the server given its hash. @@ -111,12 +162,16 @@ func (c *Client) GetBlock(blockHash *chainhash.Hash) (*wire.MsgBlock, error) { // FutureGetBlockVerboseResult is a future promise to deliver the result of a // GetBlockVerboseAsync RPC invocation (or an applicable error). -type FutureGetBlockVerboseResult chan *response +type FutureGetBlockVerboseResult struct { + client *Client + hash string + Response chan *Response +} -// Receive waits for the response promised by the future and returns the data +// Receive waits for the Response promised by the future and returns the data // structure from the server with information about the requested block. func (r FutureGetBlockVerboseResult) Receive() (*btcjson.GetBlockVerboseResult, error) { - res, err := receiveFuture(r) + res, err := r.client.waitForGetBlockRes(r.Response, r.hash, true, false) if err != nil { return nil, err } @@ -140,9 +195,14 @@ func (c *Client) GetBlockVerboseAsync(blockHash *chainhash.Hash) FutureGetBlockV if blockHash != nil { hash = blockHash.String() } - - cmd := btcjson.NewGetBlockCmd(hash, btcjson.Bool(true), nil) - return c.sendCmd(cmd) + // From the bitcoin-cli getblock documentation: + // "If verbosity is 1, returns an Object with information about block ." + cmd := btcjson.NewGetBlockCmd(hash, btcjson.Int(1)) + return FutureGetBlockVerboseResult{ + client: c, + hash: hash, + Response: c.SendCmd(cmd), + } } // GetBlockVerbose returns a data structure from the server with information @@ -154,19 +214,52 @@ func (c *Client) GetBlockVerbose(blockHash *chainhash.Hash) (*btcjson.GetBlockVe return c.GetBlockVerboseAsync(blockHash).Receive() } +// FutureGetBlockVerboseTxResult is a future promise to deliver the result of a +// GetBlockVerboseTxResult RPC invocation (or an applicable error). +type FutureGetBlockVerboseTxResult struct { + client *Client + hash string + Response chan *Response +} + +// Receive waits for the Response promised by the future and returns a verbose +// version of the block including detailed information about its transactions. +func (r FutureGetBlockVerboseTxResult) Receive() (*btcjson.GetBlockVerboseTxResult, error) { + res, err := r.client.waitForGetBlockRes(r.Response, r.hash, true, true) + if err != nil { + return nil, err + } + + var blockResult btcjson.GetBlockVerboseTxResult + err = json.Unmarshal(res, &blockResult) + if err != nil { + return nil, err + } + + return &blockResult, nil +} + // GetBlockVerboseTxAsync returns an instance of a type that can be used to get // the result of the RPC at some future time by invoking the Receive function on // the returned instance. // // See GetBlockVerboseTx or the blocking version and more details. -func (c *Client) GetBlockVerboseTxAsync(blockHash *chainhash.Hash) FutureGetBlockVerboseResult { +func (c *Client) GetBlockVerboseTxAsync(blockHash *chainhash.Hash) FutureGetBlockVerboseTxResult { hash := "" if blockHash != nil { hash = blockHash.String() } - cmd := btcjson.NewGetBlockCmd(hash, btcjson.Bool(true), btcjson.Bool(true)) - return c.sendCmd(cmd) + // From the bitcoin-cli getblock documentation: + // + // If verbosity is 2, returns an Object with information about block + // and information about each transaction. + cmd := btcjson.NewGetBlockCmd(hash, btcjson.Int(2)) + return FutureGetBlockVerboseTxResult{ + client: c, + hash: hash, + Response: c.SendCmd(cmd), + } } // GetBlockVerboseTx returns a data structure from the server with information @@ -174,18 +267,18 @@ func (c *Client) GetBlockVerboseTxAsync(blockHash *chainhash.Hash) FutureGetBloc // // See GetBlockVerbose if only transaction hashes are preferred. // See GetBlock to retrieve a raw block instead. -func (c *Client) GetBlockVerboseTx(blockHash *chainhash.Hash) (*btcjson.GetBlockVerboseResult, error) { +func (c *Client) GetBlockVerboseTx(blockHash *chainhash.Hash) (*btcjson.GetBlockVerboseTxResult, error) { return c.GetBlockVerboseTxAsync(blockHash).Receive() } // FutureGetBlockCountResult is a future promise to deliver the result of a // GetBlockCountAsync RPC invocation (or an applicable error). -type FutureGetBlockCountResult chan *response +type FutureGetBlockCountResult chan *Response -// Receive waits for the response promised by the future and returns the number +// Receive waits for the Response promised by the future and returns the number // of blocks in the longest block chain. func (r FutureGetBlockCountResult) Receive() (int64, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return 0, err } @@ -206,7 +299,7 @@ func (r FutureGetBlockCountResult) Receive() (int64, error) { // See GetBlockCount for the blocking version and more details. func (c *Client) GetBlockCountAsync() FutureGetBlockCountResult { cmd := btcjson.NewGetBlockCountCmd() - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetBlockCount returns the number of blocks in the longest block chain. @@ -214,14 +307,87 @@ func (c *Client) GetBlockCount() (int64, error) { return c.GetBlockCountAsync().Receive() } +// FutureGetChainTxStatsResult is a future promise to deliver the result of a +// GetChainTxStatsAsync RPC invocation (or an applicable error). +type FutureGetChainTxStatsResult chan *Response + +// Receive waits for the Response promised by the future and returns transaction statistics +func (r FutureGetChainTxStatsResult) Receive() (*btcjson.GetChainTxStatsResult, error) { + res, err := ReceiveFuture(r) + if err != nil { + return nil, err + } + + var chainTxStats btcjson.GetChainTxStatsResult + err = json.Unmarshal(res, &chainTxStats) + if err != nil { + return nil, err + } + + return &chainTxStats, nil +} + +// GetChainTxStatsAsync returns an instance of a type that can be used to get +// the result of the RPC at some future time by invoking the Receive function on +// the returned instance. +// +// See GetChainTxStats for the blocking version and more details. +func (c *Client) GetChainTxStatsAsync() FutureGetChainTxStatsResult { + cmd := btcjson.NewGetChainTxStatsCmd(nil, nil) + return c.SendCmd(cmd) +} + +// GetChainTxStatsNBlocksAsync returns an instance of a type that can be used to get +// the result of the RPC at some future time by invoking the Receive function on +// the returned instance. +// +// See GetChainTxStatsNBlocks for the blocking version and more details. +func (c *Client) GetChainTxStatsNBlocksAsync(nBlocks int32) FutureGetChainTxStatsResult { + cmd := btcjson.NewGetChainTxStatsCmd(&nBlocks, nil) + return c.SendCmd(cmd) +} + +// GetChainTxStatsNBlocksBlockHashAsync returns an instance of a type that can be used to get +// the result of the RPC at some future time by invoking the Receive function on +// the returned instance. +// +// See GetChainTxStatsNBlocksBlockHash for the blocking version and more details. +func (c *Client) GetChainTxStatsNBlocksBlockHashAsync(nBlocks int32, blockHash chainhash.Hash) FutureGetChainTxStatsResult { + hash := blockHash.String() + cmd := btcjson.NewGetChainTxStatsCmd(&nBlocks, &hash) + return c.SendCmd(cmd) +} + +// GetChainTxStats returns statistics about the total number and rate of transactions in the chain. +// +// Size of the window is one month and it ends at chain tip. +func (c *Client) GetChainTxStats() (*btcjson.GetChainTxStatsResult, error) { + return c.GetChainTxStatsAsync().Receive() +} + +// GetChainTxStatsNBlocks returns statistics about the total number and rate of transactions in the chain. +// +// The argument specifies size of the window in number of blocks. The window ends at chain tip. +func (c *Client) GetChainTxStatsNBlocks(nBlocks int32) (*btcjson.GetChainTxStatsResult, error) { + return c.GetChainTxStatsNBlocksAsync(nBlocks).Receive() +} + +// GetChainTxStatsNBlocksBlockHash returns statistics about the total number and rate of transactions in the chain. +// +// First argument specifies size of the window in number of blocks. +// Second argument is the hash of the block that ends the window. +func (c *Client) GetChainTxStatsNBlocksBlockHash(nBlocks int32, blockHash chainhash.Hash) (*btcjson.GetChainTxStatsResult, error) { + return c.GetChainTxStatsNBlocksBlockHashAsync(nBlocks, blockHash).Receive() +} + // FutureGetDifficultyResult is a future promise to deliver the result of a // GetDifficultyAsync RPC invocation (or an applicable error). -type FutureGetDifficultyResult chan *response +type FutureGetDifficultyResult chan *Response -// Receive waits for the response promised by the future and returns the +// Receive waits for the Response promised by the future and returns the // proof-of-work difficulty as a multiple of the minimum difficulty. func (r FutureGetDifficultyResult) Receive() (float64, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return 0, err } @@ -242,7 +408,7 @@ func (r FutureGetDifficultyResult) Receive() (float64, error) { // See GetDifficulty for the blocking version and more details. func (c *Client) GetDifficultyAsync() FutureGetDifficultyResult { cmd := btcjson.NewGetDifficultyCmd() - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetDifficulty returns the proof-of-work difficulty as a multiple of the @@ -255,7 +421,7 @@ func (c *Client) GetDifficulty() (float64, error) { // GetBlockChainInfoAsync RPC invocation (or an applicable error). type FutureGetBlockChainInfoResult struct { client *Client - Response chan *response + Response chan *Response } // unmarshalPartialGetBlockChainInfoResult unmarshals the response into an @@ -274,17 +440,16 @@ func unmarshalPartialGetBlockChainInfoResult(res []byte) (*btcjson.GetBlockChain func unmarshalGetBlockChainInfoResultSoftForks(chainInfo *btcjson.GetBlockChainInfoResult, version BackendVersion, res []byte) error { - switch version { // Versions of bitcoind on or after v0.19.0 use the unified format. - case BitcoindPost19: + if version.SupportUnifiedSoftForks() { var softForks btcjson.UnifiedSoftForks if err := json.Unmarshal(res, &softForks); err != nil { return err } chainInfo.UnifiedSoftForks = &softForks + } else { - // All other versions use the original format. - default: + // All other versions use the original format. var softForks btcjson.SoftForks if err := json.Unmarshal(res, &softForks); err != nil { return err @@ -295,10 +460,10 @@ func unmarshalGetBlockChainInfoResultSoftForks(chainInfo *btcjson.GetBlockChainI return nil } -// Receive waits for the response promised by the future and returns chain info +// Receive waits for the Response promised by the future and returns chain info // result provided by the server. func (r FutureGetBlockChainInfoResult) Receive() (*btcjson.GetBlockChainInfoResult, error) { - res, err := receiveFuture(r.Response) + res, err := ReceiveFuture(r.Response) if err != nil { return nil, err } @@ -331,7 +496,7 @@ func (c *Client) GetBlockChainInfoAsync() FutureGetBlockChainInfoResult { cmd := btcjson.NewGetBlockChainInfoCmd() return FutureGetBlockChainInfoResult{ client: c, - Response: c.sendCmd(cmd), + Response: c.SendCmd(cmd), } } @@ -342,14 +507,52 @@ func (c *Client) GetBlockChainInfo() (*btcjson.GetBlockChainInfoResult, error) { return c.GetBlockChainInfoAsync().Receive() } +// FutureGetBlockFilterResult is a future promise to deliver the result of a +// GetBlockFilterAsync RPC invocation (or an applicable error). +type FutureGetBlockFilterResult chan *Response + +// Receive waits for the Response promised by the future and returns block filter +// result provided by the server. +func (r FutureGetBlockFilterResult) Receive() (*btcjson.GetBlockFilterResult, error) { + res, err := ReceiveFuture(r) + if err != nil { + return nil, err + } + + var blockFilter btcjson.GetBlockFilterResult + err = json.Unmarshal(res, &blockFilter) + if err != nil { + return nil, err + } + + return &blockFilter, nil +} + +// GetBlockFilterAsync returns an instance of a type that can be used to get the +// result of the RPC at some future time by invoking the Receive function on the +// returned instance. +// +// See GetBlockFilter for the blocking version and more details. +func (c *Client) GetBlockFilterAsync(blockHash chainhash.Hash, filterType *btcjson.FilterTypeName) FutureGetBlockFilterResult { + hash := blockHash.String() + + cmd := btcjson.NewGetBlockFilterCmd(hash, filterType) + return c.SendCmd(cmd) +} + +// GetBlockFilter retrieves a BIP0157 content filter for a particular block. +func (c *Client) GetBlockFilter(blockHash chainhash.Hash, filterType *btcjson.FilterTypeName) (*btcjson.GetBlockFilterResult, error) { + return c.GetBlockFilterAsync(blockHash, filterType).Receive() +} + // FutureGetBlockHashResult is a future promise to deliver the result of a // GetBlockHashAsync RPC invocation (or an applicable error). -type FutureGetBlockHashResult chan *response +type FutureGetBlockHashResult chan *Response -// Receive waits for the response promised by the future and returns the hash of +// Receive waits for the Response promised by the future and returns the hash of // the block in the best block chain at the given height. func (r FutureGetBlockHashResult) Receive() (*chainhash.Hash, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -370,7 +573,7 @@ func (r FutureGetBlockHashResult) Receive() (*chainhash.Hash, error) { // See GetBlockHash for the blocking version and more details. func (c *Client) GetBlockHashAsync(blockHeight int64) FutureGetBlockHashResult { cmd := btcjson.NewGetBlockHashCmd(blockHeight) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetBlockHash returns the hash of the block in the best block chain at the @@ -381,12 +584,12 @@ func (c *Client) GetBlockHash(blockHeight int64) (*chainhash.Hash, error) { // FutureGetBlockHeaderResult is a future promise to deliver the result of a // GetBlockHeaderAsync RPC invocation (or an applicable error). -type FutureGetBlockHeaderResult chan *response +type FutureGetBlockHeaderResult chan *Response -// Receive waits for the response promised by the future and returns the +// Receive waits for the Response promised by the future and returns the // blockheader requested from the server given its hash. func (r FutureGetBlockHeaderResult) Receive() (*wire.BlockHeader, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -425,7 +628,7 @@ func (c *Client) GetBlockHeaderAsync(blockHash *chainhash.Hash) FutureGetBlockHe } cmd := btcjson.NewGetBlockHeaderCmd(hash, btcjson.Bool(false)) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetBlockHeader returns the blockheader from the server given its hash. @@ -438,12 +641,12 @@ func (c *Client) GetBlockHeader(blockHash *chainhash.Hash) (*wire.BlockHeader, e // FutureGetBlockHeaderVerboseResult is a future promise to deliver the result of a // GetBlockAsync RPC invocation (or an applicable error). -type FutureGetBlockHeaderVerboseResult chan *response +type FutureGetBlockHeaderVerboseResult chan *Response -// Receive waits for the response promised by the future and returns the +// Receive waits for the Response promised by the future and returns the // data structure of the blockheader requested from the server given its hash. func (r FutureGetBlockHeaderVerboseResult) Receive() (*btcjson.GetBlockHeaderVerboseResult, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -470,7 +673,7 @@ func (c *Client) GetBlockHeaderVerboseAsync(blockHash *chainhash.Hash) FutureGet } cmd := btcjson.NewGetBlockHeaderCmd(hash, btcjson.Bool(true)) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetBlockHeaderVerbose returns a data structure with information about the @@ -481,15 +684,53 @@ func (c *Client) GetBlockHeaderVerbose(blockHash *chainhash.Hash) (*btcjson.GetB return c.GetBlockHeaderVerboseAsync(blockHash).Receive() } +// FutureGetChainTipsResult is a future promise to deliver the result of a +// GetChainTips RPC invocation (or an applicable error). +type FutureGetChainTipsResult chan *Response + +// Receive waits for the Response promised by the future and returns the +// data structure of all the chain tips the node is aware of. +func (r FutureGetChainTipsResult) Receive() ([]*btcjson.GetChainTipsResult, error) { + res, err := ReceiveFuture(r) + if err != nil { + return nil, err + } + + // Unmarshal result as a string. + var chainTips []*btcjson.GetChainTipsResult + err = json.Unmarshal(res, &chainTips) + if err != nil { + return nil, err + } + + return chainTips, nil +} + +// GetChainTipsAsync returns an instance of a type that can be used to get the +// result of the RPC at some future time by invoking the Receive function on the +// returned instance. +// +// See GetChainTips for the blocking version and more details. +func (c *Client) GetChainTipsAsync() FutureGetChainTipsResult { + cmd := btcjson.NewGetChainTipsCmd() + return c.SendCmd(cmd) +} + +// GetChainTips returns a slice of data structure with information about all the +// current chain tips that this node is aware of. +func (c *Client) GetChainTips() ([]*btcjson.GetChainTipsResult, error) { + return c.GetChainTipsAsync().Receive() +} + // FutureGetMempoolEntryResult is a future promise to deliver the result of a // GetMempoolEntryAsync RPC invocation (or an applicable error). -type FutureGetMempoolEntryResult chan *response +type FutureGetMempoolEntryResult chan *Response -// Receive waits for the response promised by the future and returns a data +// Receive waits for the Response promised by the future and returns a data // structure with information about the transaction in the memory pool given // its hash. func (r FutureGetMempoolEntryResult) Receive() (*btcjson.GetMempoolEntryResult, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -511,7 +752,7 @@ func (r FutureGetMempoolEntryResult) Receive() (*btcjson.GetMempoolEntryResult, // See GetMempoolEntry for the blocking version and more details. func (c *Client) GetMempoolEntryAsync(txHash string) FutureGetMempoolEntryResult { cmd := btcjson.NewGetMempoolEntryCmd(txHash) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetMempoolEntry returns a data structure with information about the @@ -522,12 +763,12 @@ func (c *Client) GetMempoolEntry(txHash string) (*btcjson.GetMempoolEntryResult, // FutureGetRawMempoolResult is a future promise to deliver the result of a // GetRawMempoolAsync RPC invocation (or an applicable error). -type FutureGetRawMempoolResult chan *response +type FutureGetRawMempoolResult chan *Response -// Receive waits for the response promised by the future and returns the hashes +// Receive waits for the Response promised by the future and returns the hashes // of all transactions in the memory pool. func (r FutureGetRawMempoolResult) Receive() ([]*chainhash.Hash, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -559,7 +800,7 @@ func (r FutureGetRawMempoolResult) Receive() ([]*chainhash.Hash, error) { // See GetRawMempool for the blocking version and more details. func (c *Client) GetRawMempoolAsync() FutureGetRawMempoolResult { cmd := btcjson.NewGetRawMempoolCmd(btcjson.Bool(false)) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetRawMempool returns the hashes of all transactions in the memory pool. @@ -572,13 +813,13 @@ func (c *Client) GetRawMempool() ([]*chainhash.Hash, error) { // FutureGetRawMempoolVerboseResult is a future promise to deliver the result of // a GetRawMempoolVerboseAsync RPC invocation (or an applicable error). -type FutureGetRawMempoolVerboseResult chan *response +type FutureGetRawMempoolVerboseResult chan *Response -// Receive waits for the response promised by the future and returns a map of +// Receive waits for the Response promised by the future and returns a map of // transaction hashes to an associated data structure with information about the // transaction for all transactions in the memory pool. func (r FutureGetRawMempoolVerboseResult) Receive() (map[string]btcjson.GetRawMempoolVerboseResult, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -600,7 +841,7 @@ func (r FutureGetRawMempoolVerboseResult) Receive() (map[string]btcjson.GetRawMe // See GetRawMempoolVerbose for the blocking version and more details. func (c *Client) GetRawMempoolVerboseAsync() FutureGetRawMempoolVerboseResult { cmd := btcjson.NewGetRawMempoolCmd(btcjson.Bool(true)) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetRawMempoolVerbose returns a map of transaction hashes to an associated @@ -614,12 +855,12 @@ func (c *Client) GetRawMempoolVerbose() (map[string]btcjson.GetRawMempoolVerbose // FutureEstimateFeeResult is a future promise to deliver the result of a // EstimateFeeAsync RPC invocation (or an applicable error). -type FutureEstimateFeeResult chan *response +type FutureEstimateFeeResult chan *Response -// Receive waits for the response promised by the future and returns the info +// Receive waits for the Response promised by the future and returns the info // provided by the server. func (r FutureEstimateFeeResult) Receive() (float64, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return -1, err } @@ -641,7 +882,7 @@ func (r FutureEstimateFeeResult) Receive() (float64, error) { // See EstimateFee for the blocking version and more details. func (c *Client) EstimateFeeAsync(numBlocks int64) FutureEstimateFeeResult { cmd := btcjson.NewEstimateFeeCmd(numBlocks) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // EstimateFee provides an estimated fee in bitcoins per kilobyte. @@ -649,16 +890,51 @@ func (c *Client) EstimateFee(numBlocks int64) (float64, error) { return c.EstimateFeeAsync(numBlocks).Receive() } +// FutureEstimateSmartFeeResult is a future promise to deliver the result of a +// EstimateSmartFeeAsync RPC invocation (or an applicable error). +type FutureEstimateSmartFeeResult chan *Response + +// Receive waits for the Response promised by the future and returns the +// estimated fee. +func (r FutureEstimateSmartFeeResult) Receive() (*btcjson.EstimateSmartFeeResult, error) { + res, err := ReceiveFuture(r) + if err != nil { + return nil, err + } + + var verified btcjson.EstimateSmartFeeResult + err = json.Unmarshal(res, &verified) + if err != nil { + return nil, err + } + return &verified, nil +} + +// EstimateSmartFeeAsync returns an instance of a type that can be used to get the +// result of the RPC at some future time by invoking the Receive function on the +// returned instance. +// +// See EstimateSmartFee for the blocking version and more details. +func (c *Client) EstimateSmartFeeAsync(confTarget int64, mode *btcjson.EstimateSmartFeeMode) FutureEstimateSmartFeeResult { + cmd := btcjson.NewEstimateSmartFeeCmd(confTarget, mode) + return c.SendCmd(cmd) +} + +// EstimateSmartFee requests the server to estimate a fee level based on the given parameters. +func (c *Client) EstimateSmartFee(confTarget int64, mode *btcjson.EstimateSmartFeeMode) (*btcjson.EstimateSmartFeeResult, error) { + return c.EstimateSmartFeeAsync(confTarget, mode).Receive() +} + // FutureVerifyChainResult is a future promise to deliver the result of a // VerifyChainAsync, VerifyChainLevelAsyncRPC, or VerifyChainBlocksAsync // invocation (or an applicable error). -type FutureVerifyChainResult chan *response +type FutureVerifyChainResult chan *Response -// Receive waits for the response promised by the future and returns whether +// Receive waits for the Response promised by the future and returns whether // or not the chain verified based on the check level and number of blocks // to verify specified in the original call. func (r FutureVerifyChainResult) Receive() (bool, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return false, err } @@ -679,7 +955,7 @@ func (r FutureVerifyChainResult) Receive() (bool, error) { // See VerifyChain for the blocking version and more details. func (c *Client) VerifyChainAsync() FutureVerifyChainResult { cmd := btcjson.NewVerifyChainCmd(nil, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // VerifyChain requests the server to verify the block chain database using @@ -697,7 +973,7 @@ func (c *Client) VerifyChain() (bool, error) { // See VerifyChainLevel for the blocking version and more details. func (c *Client) VerifyChainLevelAsync(checkLevel int32) FutureVerifyChainResult { cmd := btcjson.NewVerifyChainCmd(&checkLevel, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // VerifyChainLevel requests the server to verify the block chain database using @@ -720,7 +996,7 @@ func (c *Client) VerifyChainLevel(checkLevel int32) (bool, error) { // See VerifyChainBlocks for the blocking version and more details. func (c *Client) VerifyChainBlocksAsync(checkLevel, numBlocks int32) FutureVerifyChainResult { cmd := btcjson.NewVerifyChainCmd(&checkLevel, &numBlocks) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // VerifyChainBlocks requests the server to verify the block chain database @@ -740,12 +1016,12 @@ func (c *Client) VerifyChainBlocks(checkLevel, numBlocks int32) (bool, error) { // FutureGetTxOutResult is a future promise to deliver the result of a // GetTxOutAsync RPC invocation (or an applicable error). -type FutureGetTxOutResult chan *response +type FutureGetTxOutResult chan *Response -// Receive waits for the response promised by the future and returns a +// Receive waits for the Response promised by the future and returns a // transaction given its hash. func (r FutureGetTxOutResult) Receive() (*btcjson.GetTxOutResult, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -778,7 +1054,7 @@ func (c *Client) GetTxOutAsync(txHash *chainhash.Hash, index uint32, mempool boo } cmd := btcjson.NewGetTxOutCmd(hash, index, &mempool) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetTxOut returns the transaction output info if it's unspent and @@ -787,20 +1063,58 @@ func (c *Client) GetTxOut(txHash *chainhash.Hash, index uint32, mempool bool) (* return c.GetTxOutAsync(txHash, index, mempool).Receive() } +// FutureGetTxOutSetInfoResult is a future promise to deliver the result of a +// GetTxOutSetInfoAsync RPC invocation (or an applicable error). +type FutureGetTxOutSetInfoResult chan *Response + +// Receive waits for the Response promised by the future and returns the +// results of GetTxOutSetInfoAsync RPC invocation. +func (r FutureGetTxOutSetInfoResult) Receive() (*btcjson.GetTxOutSetInfoResult, error) { + res, err := ReceiveFuture(r) + if err != nil { + return nil, err + } + + // Unmarshal result as an gettxoutsetinfo result object. + var txOutSetInfo *btcjson.GetTxOutSetInfoResult + err = json.Unmarshal(res, &txOutSetInfo) + if err != nil { + return nil, err + } + + return txOutSetInfo, nil +} + +// GetTxOutSetInfoAsync returns an instance of a type that can be used to get +// the result of the RPC at some future time by invoking the Receive function on +// the returned instance. +// +// See GetTxOutSetInfo for the blocking version and more details. +func (c *Client) GetTxOutSetInfoAsync() FutureGetTxOutSetInfoResult { + cmd := btcjson.NewGetTxOutSetInfoCmd() + return c.SendCmd(cmd) +} + +// GetTxOutSetInfo returns the statistics about the unspent transaction output +// set. +func (c *Client) GetTxOutSetInfo() (*btcjson.GetTxOutSetInfoResult, error) { + return c.GetTxOutSetInfoAsync().Receive() +} + // FutureRescanBlocksResult is a future promise to deliver the result of a // RescanBlocksAsync RPC invocation (or an applicable error). // // NOTE: This is a btcsuite extension ported from // github.com/decred/dcrrpcclient. -type FutureRescanBlocksResult chan *response +type FutureRescanBlocksResult chan *Response -// Receive waits for the response promised by the future and returns the +// Receive waits for the Response promised by the future and returns the // discovered rescanblocks data. // // NOTE: This is a btcsuite extension ported from // github.com/decred/dcrrpcclient. func (r FutureRescanBlocksResult) Receive() ([]btcjson.RescannedBlock, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -829,7 +1143,7 @@ func (c *Client) RescanBlocksAsync(blockHashes []chainhash.Hash) FutureRescanBlo } cmd := btcjson.NewRescanBlocksCmd(strBlockHashes) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // RescanBlocks rescans the blocks identified by blockHashes, in order, using @@ -844,12 +1158,12 @@ func (c *Client) RescanBlocks(blockHashes []chainhash.Hash) ([]btcjson.Rescanned // FutureInvalidateBlockResult is a future promise to deliver the result of a // InvalidateBlockAsync RPC invocation (or an applicable error). -type FutureInvalidateBlockResult chan *response +type FutureInvalidateBlockResult chan *Response -// Receive waits for the response promised by the future and returns the raw +// Receive waits for the Response promised by the future and returns the raw // block requested from the server given its hash. func (r FutureInvalidateBlockResult) Receive() error { - _, err := receiveFuture(r) + _, err := ReceiveFuture(r) return err } @@ -866,7 +1180,7 @@ func (c *Client) InvalidateBlockAsync(blockHash *chainhash.Hash) FutureInvalidat } cmd := btcjson.NewInvalidateBlockCmd(hash) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // InvalidateBlock invalidates a specific block. @@ -876,12 +1190,12 @@ func (c *Client) InvalidateBlock(blockHash *chainhash.Hash) error { // FutureGetCFilterResult is a future promise to deliver the result of a // GetCFilterAsync RPC invocation (or an applicable error). -type FutureGetCFilterResult chan *response +type FutureGetCFilterResult chan *Response -// Receive waits for the response promised by the future and returns the raw +// Receive waits for the Response promised by the future and returns the raw // filter requested from the server given its block hash. func (r FutureGetCFilterResult) Receive() (*wire.MsgCFilter, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -920,7 +1234,7 @@ func (c *Client) GetCFilterAsync(blockHash *chainhash.Hash, } cmd := btcjson.NewGetCFilterCmd(hash, filterType) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetCFilter returns a raw filter from the server given its block hash. @@ -931,12 +1245,12 @@ func (c *Client) GetCFilter(blockHash *chainhash.Hash, // FutureGetCFilterHeaderResult is a future promise to deliver the result of a // GetCFilterHeaderAsync RPC invocation (or an applicable error). -type FutureGetCFilterHeaderResult chan *response +type FutureGetCFilterHeaderResult chan *Response -// Receive waits for the response promised by the future and returns the raw +// Receive waits for the Response promised by the future and returns the raw // filter header requested from the server given its block hash. func (r FutureGetCFilterHeaderResult) Receive() (*wire.MsgCFHeaders, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -973,7 +1287,7 @@ func (c *Client) GetCFilterHeaderAsync(blockHash *chainhash.Hash, } cmd := btcjson.NewGetCFilterHeaderCmd(hash, filterType) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetCFilterHeader returns a raw filter header from the server given its block @@ -982,3 +1296,161 @@ func (c *Client) GetCFilterHeader(blockHash *chainhash.Hash, filterType wire.FilterType) (*wire.MsgCFHeaders, error) { return c.GetCFilterHeaderAsync(blockHash, filterType).Receive() } + +// FutureGetBlockStatsResult is a future promise to deliver the result of a +// GetBlockStatsAsync RPC invocation (or an applicable error). +type FutureGetBlockStatsResult chan *Response + +// Receive waits for the Response promised by the future and returns statistics +// of a block at a certain height. +func (r FutureGetBlockStatsResult) Receive() (*btcjson.GetBlockStatsResult, error) { + res, err := ReceiveFuture(r) + if err != nil { + return nil, err + } + + var blockStats btcjson.GetBlockStatsResult + err = json.Unmarshal(res, &blockStats) + if err != nil { + return nil, err + } + + return &blockStats, nil +} + +// GetBlockStatsAsync returns an instance of a type that can be used to get +// the result of the RPC at some future time by invoking the Receive function on +// the returned instance. +// +// See GetBlockStats or the blocking version and more details. +func (c *Client) GetBlockStatsAsync(hashOrHeight interface{}, stats *[]string) FutureGetBlockStatsResult { + if hash, ok := hashOrHeight.(*chainhash.Hash); ok { + hashOrHeight = hash.String() + } + + cmd := btcjson.NewGetBlockStatsCmd(btcjson.HashOrHeight{Value: hashOrHeight}, stats) + return c.SendCmd(cmd) +} + +// GetBlockStats returns block statistics. First argument specifies height or hash of the target block. +// Second argument allows to select certain stats to return. +func (c *Client) GetBlockStats(hashOrHeight interface{}, stats *[]string) (*btcjson.GetBlockStatsResult, error) { + return c.GetBlockStatsAsync(hashOrHeight, stats).Receive() +} + +// FutureDeriveAddressesResult is a future promise to deliver the result of an +// DeriveAddressesAsync RPC invocation (or an applicable error). +type FutureDeriveAddressesResult chan *Response + +// Receive waits for the Response promised by the future and derives one or more addresses +// corresponding to the given output descriptor. +func (r FutureDeriveAddressesResult) Receive() (*btcjson.DeriveAddressesResult, error) { + res, err := ReceiveFuture(r) + if err != nil { + return nil, err + } + + var deriveAddressesResult btcjson.DeriveAddressesResult + + err = json.Unmarshal(res, &deriveAddressesResult) + if err != nil { + return nil, err + } + + return &deriveAddressesResult, nil +} + +// DeriveAddressesAsync returns an instance of a type that can be used to get the result +// of the RPC at some future time by invoking the Receive function on the +// returned instance. +// +// See DeriveAddresses for the blocking version and more details. +func (c *Client) DeriveAddressesAsync(descriptor string, descriptorRange *btcjson.DescriptorRange) FutureDeriveAddressesResult { + cmd := btcjson.NewDeriveAddressesCmd(descriptor, descriptorRange) + return c.SendCmd(cmd) +} + +// DeriveAddresses derives one or more addresses corresponding to an output +// descriptor. If a ranged descriptor is used, the end or the range +// (in [begin,end] notation) to derive must be specified. +func (c *Client) DeriveAddresses(descriptor string, descriptorRange *btcjson.DescriptorRange) (*btcjson.DeriveAddressesResult, error) { + return c.DeriveAddressesAsync(descriptor, descriptorRange).Receive() +} + +// FutureGetDescriptorInfoResult is a future promise to deliver the result of a +// GetDescriptorInfoAsync RPC invocation (or an applicable error). +type FutureGetDescriptorInfoResult chan *Response + +// Receive waits for the Response promised by the future and returns the analysed +// info of the descriptor. +func (r FutureGetDescriptorInfoResult) Receive() (*btcjson.GetDescriptorInfoResult, error) { + res, err := ReceiveFuture(r) + if err != nil { + return nil, err + } + + var descriptorInfo btcjson.GetDescriptorInfoResult + + err = json.Unmarshal(res, &descriptorInfo) + if err != nil { + return nil, err + } + + return &descriptorInfo, nil +} + +// GetDescriptorInfoAsync returns an instance of a type that can be used to get +// the result of the RPC at some future time by invoking the Receive function on +// the returned instance. +// +// See GetDescriptorInfo for the blocking version and more details. +func (c *Client) GetDescriptorInfoAsync(descriptor string) FutureGetDescriptorInfoResult { + cmd := btcjson.NewGetDescriptorInfoCmd(descriptor) + return c.SendCmd(cmd) +} + +// GetDescriptorInfo returns the analysed info of a descriptor string, by invoking the +// getdescriptorinfo RPC. +// +// Use this function to analyse a descriptor string, or compute the checksum +// for a descriptor without one. +// +// See btcjson.GetDescriptorInfoResult for details about the result. +func (c *Client) GetDescriptorInfo(descriptor string) (*btcjson.GetDescriptorInfoResult, error) { + return c.GetDescriptorInfoAsync(descriptor).Receive() +} + +// FutureReconsiderBlockResult is a future promise to deliver the result of a +// ReconsiderBlockAsync RPC invocation (or an applicable error). +type FutureReconsiderBlockResult chan *Response + +// Receive waits for the Response promised by the future and returns the raw +// block requested from the server given its hash. +func (r FutureReconsiderBlockResult) Receive() error { + _, err := ReceiveFuture(r) + return err +} + +// ReconsiderBlockAsync returns an instance of a type that can be used to get the +// result of the RPC at some future time by invoking the Receive function on the +// returned instance. +// +// See ReconsiderBlock for the blocking version and more details. +func (c *Client) ReconsiderBlockAsync( + blockHash *chainhash.Hash) FutureReconsiderBlockResult { + + hash := "" + if blockHash != nil { + hash = blockHash.String() + } + + cmd := btcjson.NewReconsiderBlockCmd(hash) + return c.SendCmd(cmd) +} + +// ReconsiderBlock reconsiders an verifies a specific block and the branch that +// the block is included in. If the block is valid on reconsideration, the chain +// will reorg to that block if it has more PoW than the current tip. +func (c *Client) ReconsiderBlock(blockHash *chainhash.Hash) error { + return c.ReconsiderBlockAsync(blockHash).Receive() +} diff --git a/rpcclient/chain_test.go b/rpcclient/chain_test.go index e32d547ce3..ad1fb7aa2a 100644 --- a/rpcclient/chain_test.go +++ b/rpcclient/chain_test.go @@ -1,6 +1,18 @@ package rpcclient -import "testing" +import ( + "errors" + "net/http" + "net/http/httptest" + "strings" + "sync" + "testing" + "time" + + "github.com/gorilla/websocket" +) + +var upgrader = websocket.Upgrader{} // TestUnmarshalGetBlockChainInfoResult ensures that the SoftForks and // UnifiedSoftForks fields of GetBlockChainInfoResult are properly unmarshaled @@ -22,7 +34,7 @@ func TestUnmarshalGetBlockChainInfoResultSoftForks(t *testing.T) { }, { name: "bitcoind >= 0.19.0 with separate softforks", - version: BitcoindPost19, + version: BitcoindPre22, res: []byte(`{"softforks": [{"version": 2}]}`), compatible: false, }, @@ -34,7 +46,7 @@ func TestUnmarshalGetBlockChainInfoResultSoftForks(t *testing.T) { }, { name: "bitcoind >= 0.19.0 with unified softforks", - version: BitcoindPost19, + version: BitcoindPre22, res: []byte(`{"softforks": {"segwit": {"type": "bip9"}}}`), compatible: true, }, @@ -42,7 +54,7 @@ func TestUnmarshalGetBlockChainInfoResultSoftForks(t *testing.T) { for _, test := range tests { success := t.Run(test.name, func(t *testing.T) { - // We'll start by unmarshaling the JSON into a struct. + // We'll start by unmarshalling the JSON into a struct. // The SoftForks and UnifiedSoftForks field should not // be set yet, as they are unmarshaled within a // different function. @@ -76,7 +88,7 @@ func TestUnmarshalGetBlockChainInfoResultSoftForks(t *testing.T) { // If the version is compatible with the response, we // should expect to see the proper softforks field set. - if test.version == BitcoindPost19 && + if test.version == BitcoindPre22 && info.SoftForks != nil { t.Fatal("expected SoftForks to be empty") } @@ -90,3 +102,195 @@ func TestUnmarshalGetBlockChainInfoResultSoftForks(t *testing.T) { } } } + +func TestFutureGetBlockCountResultReceiveErrors(t *testing.T) { + responseChan := FutureGetBlockCountResult(make(chan *Response)) + response := Response{ + result: []byte{}, + err: errors.New("blah blah something bad happened"), + } + go func() { + responseChan <- &response + }() + + _, err := responseChan.Receive() + if err == nil || err.Error() != "blah blah something bad happened" { + t.Fatalf("unexpected error: %s", err.Error()) + } +} + +func TestFutureGetBlockCountResultReceiveMarshalsResponseCorrectly(t *testing.T) { + responseChan := FutureGetBlockCountResult(make(chan *Response)) + response := Response{ + result: []byte{0x36, 0x36}, + err: nil, + } + go func() { + responseChan <- &response + }() + + res, err := responseChan.Receive() + if err != nil { + t.Fatalf("unexpected error: %s", err.Error()) + } + + if res != 66 { + t.Fatalf("unexpected response: %d (0x%X)", res, res) + } +} + +func TestClientConnectedToWSServerRunner(t *testing.T) { + type TestTableItem struct { + Name string + TestCase func(t *testing.T) + } + + testTable := []TestTableItem{ + TestTableItem{ + Name: "TestGetChainTxStatsAsyncSuccessTx", + TestCase: func(t *testing.T) { + client, serverReceivedChannel, cleanup := makeClient(t) + defer cleanup() + client.GetChainTxStatsAsync() + + message := <-serverReceivedChannel + if message != "{\"jsonrpc\":\"1.0\",\"method\":\"getchaintxstats\",\"params\":[],\"id\":1}" { + t.Fatalf("received unexpected message: %s", message) + } + }, + }, + TestTableItem{ + Name: "TestGetChainTxStatsAsyncShutdownError", + TestCase: func(t *testing.T) { + client, _, cleanup := makeClient(t) + defer cleanup() + + // a bit of a hack here: since there are multiple places where we read + // from the shutdown channel, and it is not buffered, ensure that a shutdown + // message is sent every time it is read from, this will ensure that + // when client.GetChainTxStatsAsync() gets called, it hits the non-blocking + // read from the shutdown channel + go func() { + type shutdownMessage struct{} + for { + client.shutdown <- shutdownMessage{} + } + }() + + var response *Response = nil + + for response == nil { + respChan := client.GetChainTxStatsAsync() + select { + case response = <-respChan: + default: + } + } + + if response.err == nil || response.err.Error() != "the client has been shutdown" { + t.Fatalf("unexpected error: %s", response.err.Error()) + } + }, + }, + TestTableItem{ + Name: "TestGetBestBlockHashAsync", + TestCase: func(t *testing.T) { + client, serverReceivedChannel, cleanup := makeClient(t) + defer cleanup() + ch := client.GetBestBlockHashAsync() + + message := <-serverReceivedChannel + if message != "{\"jsonrpc\":\"1.0\",\"method\":\"getbestblockhash\",\"params\":[],\"id\":1}" { + t.Fatalf("received unexpected message: %s", message) + } + + expectedResponse := Response{} + + wg := sync.WaitGroup{} + + wg.Add(1) + go func() { + defer wg.Done() + for { + client.requestLock.Lock() + if client.requestList.Len() > 0 { + r := client.requestList.Back() + r.Value.(*jsonRequest).responseChan <- &expectedResponse + client.requestLock.Unlock() + return + } + client.requestLock.Unlock() + } + }() + + response := <-ch + + if &expectedResponse != response { + t.Fatalf("received unexpected response") + } + + // ensure the goroutine created in this test exists, + // the test is ran with a timeout + wg.Wait() + }, + }, + } + + // since these tests rely on concurrency, ensure there is a reasonable timeout + // that they should run within + for _, testCase := range testTable { + done := make(chan bool) + + go func() { + t.Run(testCase.Name, testCase.TestCase) + done <- true + }() + + select { + case <-done: + case <-time.After(5 * time.Second): + t.Fatalf("timeout exceeded for: %s", testCase.Name) + } + } +} + +func makeClient(t *testing.T) (*Client, chan string, func()) { + serverReceivedChannel := make(chan string) + s := httptest.NewServer(http.HandlerFunc(makeUpgradeOnConnect(serverReceivedChannel))) + url := strings.TrimPrefix(s.URL, "http://") + + config := ConnConfig{ + DisableTLS: true, + User: "username", + Pass: "password", + Host: url, + } + + client, err := New(&config, nil) + if err != nil { + t.Fatalf("error when creating new client %s", err.Error()) + } + return client, serverReceivedChannel, func() { + s.Close() + } +} + +func makeUpgradeOnConnect(ch chan string) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + c, err := upgrader.Upgrade(w, r, nil) + if err != nil { + return + } + defer c.Close() + for { + _, message, err := c.ReadMessage() + if err != nil { + break + } + + go func() { + ch <- string(message) + }() + } + } +} diff --git a/rpcclient/cookiefile.go b/rpcclient/cookiefile.go new file mode 100644 index 0000000000..c3f7068b30 --- /dev/null +++ b/rpcclient/cookiefile.go @@ -0,0 +1,38 @@ +// Copyright (c) 2017 The Namecoin developers +// Copyright (c) 2019 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package rpcclient + +import ( + "bufio" + "fmt" + "os" + "strings" +) + +func readCookieFile(path string) (username, password string, err error) { + f, err := os.Open(path) + if err != nil { + return + } + defer f.Close() + + scanner := bufio.NewScanner(f) + scanner.Scan() + err = scanner.Err() + if err != nil { + return + } + s := scanner.Text() + + parts := strings.SplitN(s, ":", 2) + if len(parts) != 2 { + err = fmt.Errorf("malformed cookie file") + return + } + + username, password = parts[0], parts[1] + return +} diff --git a/rpcclient/doc.go b/rpcclient/doc.go index d4bbb64d65..8057dd240c 100644 --- a/rpcclient/doc.go +++ b/rpcclient/doc.go @@ -5,7 +5,7 @@ /* Package rpcclient implements a websocket-enabled Bitcoin JSON-RPC client. -Overview +# Overview This client provides a robust and easy to use client for interfacing with a Bitcoin RPC server that uses a btcd/bitcoin core compatible Bitcoin JSON-RPC @@ -24,7 +24,7 @@ btcd or btcwallet by default. However, configuration options are provided to fall back to HTTP POST and disable TLS to support talking with inferior bitcoin core style RPC servers. -Websockets vs HTTP POST +# Websockets vs HTTP POST In HTTP POST-based JSON-RPC, every request creates a new HTTP connection, issues the call, waits for the response, and closes the connection. This adds @@ -40,7 +40,7 @@ can be invoked without having to go through a connect/disconnect cycle for every call. In addition, the websocket interface provides other nice features such as the ability to register for asynchronous notifications of various events. -Synchronous vs Asynchronous API +# Synchronous vs Asynchronous API The client provides both a synchronous (blocking) and asynchronous API. @@ -57,7 +57,7 @@ the Receive method on the returned instance will either return the result immediately if it has already arrived, or block until it has. This is useful since it provides the caller with greater control over concurrency. -Notifications +# Notifications The first important part of notifications is to realize that they will only work when connected via websockets. This should intuitively make sense @@ -67,7 +67,7 @@ All notifications provided by btcd require registration to opt-in. For example, if you want to be notified when funds are received by a set of addresses, you register the addresses via the NotifyReceived (or NotifyReceivedAsync) function. -Notification Handlers +# Notification Handlers Notifications are exposed by the client through the use of callback handlers which are setup via a NotificationHandlers instance that is specified by the @@ -83,7 +83,7 @@ will cause a deadlock as more server responses won't be read until the callback returns, but the callback would be waiting for a response. Thus, any additional RPCs must be issued an a completely decoupled manner. -Automatic Reconnection +# Automatic Reconnection By default, when running in websockets mode, this client will automatically keep trying to reconnect to the RPC server should the connection be lost. There @@ -106,7 +106,7 @@ Some of the commands are extensions specific to a particular RPC server. For example, the DebugLevel call is an extension only provided by btcd (and btcwallet passthrough). Therefore if you call one of these commands against an RPC server that doesn't provide them, you will get an unimplemented error -from the server. An effort has been made to call out which commmands are +from the server. An effort has been made to call out which commands are extensions in their documentation. Also, it is important to realize that btcd intentionally separates the wallet @@ -116,7 +116,7 @@ chain services will be available. Depending on your application, you might only need chain-related RPCs. In contrast, btcwallet provides pass through treatment for chain-related RPCs, so it supports them in addition to wallet-related RPCs. -Errors +# Errors There are 3 categories of errors that will be returned throughout this package: @@ -144,35 +144,35 @@ The third category of errors, that is errors returned by the server, can be detected by type asserting the error in a *btcjson.RPCError. For example, to detect if a command is unimplemented by the remote RPC server: - amount, err := client.GetBalance("") - if err != nil { - if jerr, ok := err.(*btcjson.RPCError); ok { - switch jerr.Code { - case btcjson.ErrRPCUnimplemented: - // Handle not implemented error + amount, err := client.GetBalance("") + if err != nil { + if jerr, ok := err.(*btcjson.RPCError); ok { + switch jerr.Code { + case btcjson.ErrRPCUnimplemented: + // Handle not implemented error - // Handle other specific errors you care about - } - } + // Handle other specific errors you care about + } + } - // Log or otherwise handle the error knowing it was not one returned - // from the remote RPC server. - } + // Log or otherwise handle the error knowing it was not one returned + // from the remote RPC server. + } -Example Usage +# Example Usage The following full-blown client examples are in the examples directory: - - bitcoincorehttp - Connects to a bitcoin core RPC server using HTTP POST mode with TLS disabled - and gets the current block count - - btcdwebsockets - Connects to a btcd RPC server using TLS-secured websockets, registers for - block connected and block disconnected notifications, and gets the current - block count - - btcwalletwebsockets - Connects to a btcwallet RPC server using TLS-secured websockets, registers - for notifications about changes to account balances, and gets a list of - unspent transaction outputs (utxos) the wallet can sign + - bitcoincorehttp + Connects to a bitcoin core RPC server using HTTP POST mode with TLS disabled + and gets the current block count + - btcdwebsockets + Connects to a btcd RPC server using TLS-secured websockets, registers for + block connected and block disconnected notifications, and gets the current + block count + - btcwalletwebsockets + Connects to a btcwallet RPC server using TLS-secured websockets, registers + for notifications about changes to account balances, and gets a list of + unspent transaction outputs (utxos) the wallet can sign */ package rpcclient diff --git a/rpcclient/errors.go b/rpcclient/errors.go new file mode 100644 index 0000000000..928881f1da --- /dev/null +++ b/rpcclient/errors.go @@ -0,0 +1,518 @@ +package rpcclient + +import ( + "errors" + "fmt" + "strings" +) + +var ( + // ErrBackendVersion is returned when running against a bitcoind or + // btcd that is older than the minimum version supported by the + // rpcclient. + ErrBackendVersion = errors.New("backend version too low") + + // ErrInvalidParam is returned when the caller provides an invalid + // parameter to an RPC method. + ErrInvalidParam = errors.New("invalid param") + + // ErrUndefined is used when an error returned is not recognized. We + // should gradually increase our error types to avoid returning this + // error. + ErrUndefined = errors.New("undefined") +) + +// BitcoindRPCErr represents an error returned by bitcoind's RPC server. +type BitcoindRPCErr uint32 + +// This section defines all possible errors or reject reasons returned from +// bitcoind's `sendrawtransaction` or `testmempoolaccept` RPC. +const ( + // ErrMissingInputsOrSpent is returned when calling + // `sendrawtransaction` with missing inputs. + ErrMissingInputsOrSpent BitcoindRPCErr = iota + + // ErrMaxBurnExceeded is returned when calling `sendrawtransaction` + // with exceeding, falling short of, and equaling maxburnamount. + ErrMaxBurnExceeded + + // ErrMaxFeeExceeded can happen when passing a signed tx to + // `testmempoolaccept`, but the tx pays more fees than specified. + ErrMaxFeeExceeded + + // ErrTxAlreadyKnown is used in the `reject-reason` field of + // `testmempoolaccept` when a transaction is already in the blockchain. + ErrTxAlreadyKnown + + // ErrTxAlreadyConfirmed is returned as an error from + // `sendrawtransaction` when a transaction is already in the + // blockchain. + ErrTxAlreadyConfirmed + + // ErrMempoolConflict happens when RBF is not enabled yet the + // transaction conflicts with an unconfirmed tx. . + // + // NOTE: RBF rule 1. + ErrMempoolConflict + + // ErrReplacementAddsUnconfirmed is returned when a transaction adds + // new unconfirmed inputs. + // + // NOTE: RBF rule 2. + ErrReplacementAddsUnconfirmed + + // ErrInsufficientFee is returned when fee rate used or fees paid + // doesn't meet the requirements. + // + // NOTE: RBF rule 3 or 4. + ErrInsufficientFee + + // ErrTooManyReplacements is returned when a transaction causes too + // many transactions being replaced. This is set by + // `MAX_REPLACEMENT_CANDIDATES` in `bitcoind` and defaults to 100. + // + // NOTE: RBF rule 5. + ErrTooManyReplacements + + // ErrMempoolMinFeeNotMet is returned when the transaction doesn't meet + // the minimum relay fee. + ErrMempoolMinFeeNotMet + + // ErrConflictingTx is returned when a transaction that spends + // conflicting tx outputs that are rejected. + ErrConflictingTx + + // ErrEmptyOutput is returned when a transaction has no outputs. + ErrEmptyOutput + + // ErrEmptyInput is returned when a transaction has no inputs. + ErrEmptyInput + + // ErrTxTooSmall is returned when spending a tiny transaction(in + // non-witness bytes) that is disallowed. + // + // NOTE: ErrTxTooLarge must be put after ErrTxTooSmall because it's a + // subset of ErrTxTooSmall. Otherwise, if bitcoind returns + // `tx-size-small`, it will be matched to ErrTxTooLarge. + ErrTxTooSmall + + // ErrDuplicateInput is returned when a transaction has duplicate + // inputs. + ErrDuplicateInput + + // ErrEmptyPrevOut is returned when a non-coinbase transaction has + // coinbase-like outpoint. + ErrEmptyPrevOut + + // ErrBelowOutValue is returned when a transaction's output value is + // greater than its input value. + ErrBelowOutValue + + // ErrNegativeOutput is returned when a transaction has negative output + // value. + ErrNegativeOutput + + // ErrLargeOutput is returned when a transaction has too large output + // value. + ErrLargeOutput + + // ErrLargeTotalOutput is returned when a transaction has too large sum + // of output values. + ErrLargeTotalOutput + + // ErrScriptVerifyFlag is returned when there is invalid OP_IF + // construction. + ErrScriptVerifyFlag + + // ErrTooManySigOps is returned when a transaction has too many sigops. + ErrTooManySigOps + + // ErrInvalidOpcode is returned when a transaction has invalid OP + // codes. + ErrInvalidOpcode + + // ErrTxAlreadyInMempool is returned when a transaction is in the + // mempool. + ErrTxAlreadyInMempool + + // ErrMissingInputs is returned when a transaction has missing inputs, + // that never existed or only existed once in the past. + ErrMissingInputs + + // ErrOversizeTx is returned when a transaction is too large. + ErrOversizeTx + + // ErrCoinbaseTx is returned when the transaction is coinbase tx. + ErrCoinbaseTx + + // ErrNonStandardVersion is returned when the transactions are not + // standard - a version currently non-standard. + ErrNonStandardVersion + + // ErrNonStandardScript is returned when the transactions are not + // standard - non-standard script. + ErrNonStandardScript + + // ErrBareMultiSig is returned when the transactions are not standard - + // bare multisig script (2-of-3). + ErrBareMultiSig + + // ErrScriptSigNotPushOnly is returned when the transactions are not + // standard - not-pushonly scriptSig. + ErrScriptSigNotPushOnly + + // ErrScriptSigSize is returned when the transactions are not standard + // - too large scriptSig (>1650 bytes). + ErrScriptSigSize + + // ErrTxTooLarge is returned when the transactions are not standard - + // too large tx size. + ErrTxTooLarge + + // ErrDust is returned when the transactions are not standard - output + // too small. + ErrDust + + // ErrMultiOpReturn is returned when the transactions are not standard + // - muiltiple OP_RETURNs. + ErrMultiOpReturn + + // ErrNonFinal is returned when spending a timelocked transaction that + // hasn't expired yet. + ErrNonFinal + + // ErrNonBIP68Final is returned when a transaction that is locked by + // BIP68 sequence logic and not expired yet. + ErrNonBIP68Final + + // ErrSameNonWitnessData is returned when another tx with the same + // non-witness data is already in the mempool. For instance, these two + // txns share the same `txid` but different `wtxid`. + ErrSameNonWitnessData + + // ErrNonMandatoryScriptVerifyFlag is returned when passing a raw tx to + // `testmempoolaccept`, which gives the error followed by (Witness + // program hash mismatch). + ErrNonMandatoryScriptVerifyFlag + + // errSentinel is used to indicate the end of the error list. This + // should always be the last error code. + errSentinel +) + +// Error implements the error interface. It returns the error message defined +// in `bitcoind`. + +// Some of the dashes used in the original error string is removed, e.g. +// "missing-inputs" is now "missing inputs". This is ok since we will normalize +// the errors before matching. +// +// references: +// - https://github.com/bitcoin/bitcoin/blob/master/test/functional/rpc_rawtransaction.py#L342 +// - https://github.com/bitcoin/bitcoin/blob/master/test/functional/data/invalid_txs.py +// - https://github.com/bitcoin/bitcoin/blob/master/test/functional/mempool_accept.py +// - https://github.com/bitcoin/bitcoin/blob/master/test/functional/mempool_accept_wtxid.py +// - https://github.com/bitcoin/bitcoin/blob/master/test/functional/mempool_dust.py +// - https://github.com/bitcoin/bitcoin/blob/master/test/functional/mempool_limit.py +// - https://github.com/bitcoin/bitcoin/blob/master/src/validation.cpp +func (r BitcoindRPCErr) Error() string { + switch r { + case ErrMissingInputsOrSpent: + return "bad-txns-inputs-missingorspent" + + case ErrMaxBurnExceeded: + return "Unspendable output exceeds maximum configured by user (maxburnamount)" + + case ErrMaxFeeExceeded: + return "max-fee-exceeded" + + case ErrTxAlreadyKnown: + return "txn-already-known" + + case ErrTxAlreadyConfirmed: + return "Transaction already in block chain" + + case ErrMempoolConflict: + return "txn mempool conflict" + + case ErrReplacementAddsUnconfirmed: + return "replacement adds unconfirmed" + + case ErrInsufficientFee: + return "insufficient fee" + + case ErrTooManyReplacements: + return "too many potential replacements" + + case ErrMempoolMinFeeNotMet: + return "mempool min fee not met" + + case ErrConflictingTx: + return "bad txns spends conflicting tx" + + case ErrEmptyOutput: + return "bad txns vout empty" + + case ErrEmptyInput: + return "bad txns vin empty" + + case ErrTxTooSmall: + return "tx size small" + + case ErrDuplicateInput: + return "bad txns inputs duplicate" + + case ErrEmptyPrevOut: + return "bad txns prevout null" + + case ErrBelowOutValue: + return "bad txns in belowout" + + case ErrNegativeOutput: + return "bad txns vout negative" + + case ErrLargeOutput: + return "bad txns vout toolarge" + + case ErrLargeTotalOutput: + return "bad txns txouttotal toolarge" + + case ErrScriptVerifyFlag: + return "mandatory script verify flag failed" + + case ErrTooManySigOps: + return "bad txns too many sigops" + + case ErrInvalidOpcode: + return "disabled opcode" + + case ErrTxAlreadyInMempool: + return "txn already in mempool" + + case ErrMissingInputs: + return "missing inputs" + + case ErrOversizeTx: + return "bad txns oversize" + + case ErrCoinbaseTx: + return "coinbase" + + case ErrNonStandardVersion: + return "version" + + case ErrNonStandardScript: + return "scriptpubkey" + + case ErrBareMultiSig: + return "bare multisig" + + case ErrScriptSigNotPushOnly: + return "scriptsig not pushonly" + + case ErrScriptSigSize: + return "scriptsig size" + + case ErrTxTooLarge: + return "tx size" + + case ErrDust: + return "dust" + + case ErrMultiOpReturn: + return "multi op return" + + case ErrNonFinal: + return "non final" + + case ErrNonBIP68Final: + return "non BIP68 final" + + case ErrSameNonWitnessData: + return "txn-same-nonwitness-data-in-mempool" + + case ErrNonMandatoryScriptVerifyFlag: + return "non-mandatory-script-verify-flag" + } + + return "unknown error" +} + +// BtcdErrMap takes the errors returned from btcd's `testmempoolaccept` and +// `sendrawtransaction` RPCs and map them to the errors defined above, which +// are results from calling either `testmempoolaccept` or `sendrawtransaction` +// in `bitcoind`. +// +// Errors not mapped in `btcd`: +// - deployment error from `validateSegWitDeployment`. +// - the error when total inputs is higher than max allowed value from +// `CheckTransactionInputs`. +// - the error when total outputs is higher than total inputs from +// `CheckTransactionInputs`. +// - errors from `CalcSequenceLock`. +// +// NOTE: This is not an exhaustive list of errors, but it covers the +// usage case of LND. +// +//nolint:lll +var BtcdErrMap = map[string]error{ + // BIP125 related errors. + // + // When fee rate used or fees paid doesn't meet the requirements. + "replacement transaction has an insufficient fee rate": ErrInsufficientFee, + "replacement transaction has an insufficient absolute fee": ErrInsufficientFee, + + // When a transaction causes too many transactions being replaced. This + // is set by `MAX_REPLACEMENT_CANDIDATES` in `bitcoind` and defaults to + // 100. + "replacement transaction evicts more transactions than permitted": ErrTooManyReplacements, + + // When a transaction adds new unconfirmed inputs. + "replacement transaction spends new unconfirmed input": ErrReplacementAddsUnconfirmed, + + // A transaction that spends conflicting tx outputs that are rejected. + "replacement transaction spends parent transaction": ErrConflictingTx, + + // A transaction that conflicts with an unconfirmed tx. Happens when + // RBF is not enabled. + "output already spent in mempool": ErrMempoolConflict, + + // A transaction with no outputs. + "transaction has no outputs": ErrEmptyOutput, + + // A transaction with no inputs. + "transaction has no inputs": ErrEmptyInput, + + // A transaction with duplicate inputs. + "transaction contains duplicate inputs": ErrDuplicateInput, + + // A non-coinbase transaction with coinbase-like outpoint. + "transaction input refers to previous output that is null": ErrEmptyPrevOut, + + // A transaction pays too little fee. + "fees which is under the required amount": ErrMempoolMinFeeNotMet, + "has insufficient priority": ErrInsufficientFee, + "has been rejected by the rate limiter due to low fees": ErrInsufficientFee, + + // A transaction with negative output value. + "transaction output has negative value": ErrNegativeOutput, + + // A transaction with too large output value. + "transaction output value is higher than max allowed value": ErrLargeOutput, + + // A transaction with too large sum of output values. + "total value of all transaction outputs exceeds max allowed value": ErrLargeTotalOutput, + + // A transaction with too many sigops. + "sigop cost is too hight": ErrTooManySigOps, + + // A transaction already in the blockchain. + "database contains entry for spent tx output": ErrTxAlreadyKnown, + "transaction already exists in blockchain": ErrTxAlreadyConfirmed, + + // A transaction in the mempool. + // + // NOTE: For btcd v0.24.2 and beyond, the error message is "already + // have transaction in mempool". + "already have transaction": ErrTxAlreadyInMempool, + + // A transaction with missing inputs, that never existed or only + // existed once in the past. + "either does not exist or has already been spent": ErrMissingInputs, + "orphan transaction": ErrMissingInputs, + + // A really large transaction. + "serialized transaction is too big": ErrOversizeTx, + + // A coinbase transaction. + "transaction is an invalid coinbase": ErrCoinbaseTx, + + // Some nonstandard transactions - a version currently non-standard. + "transaction version": ErrNonStandardVersion, + + // Some nonstandard transactions - non-standard script. + "non-standard script form": ErrNonStandardScript, + "has a non-standard input": ErrNonStandardScript, + + // Some nonstandard transactions - bare multisig script + // (2-of-3). + "milti-signature script": ErrBareMultiSig, + + // Some nonstandard transactions - not-pushonly scriptSig. + "signature script is not push only": ErrScriptSigNotPushOnly, + + // Some nonstandard transactions - too large scriptSig (>1650 + // bytes). + "signature script size is larger than max allowed": ErrScriptSigSize, + + // Some nonstandard transactions - too large tx size. + "weight of transaction is larger than max allowed": ErrTxTooLarge, + + // Some nonstandard transactions - output too small. + "payment is dust": ErrDust, + + // Some nonstandard transactions - muiltiple OP_RETURNs. + "more than one transaction output in a nulldata script": ErrMultiOpReturn, + + // A timelocked transaction. + "transaction is not finalized": ErrNonFinal, + "tried to spend coinbase transaction output": ErrNonFinal, + + // A transaction that is locked by BIP68 sequence logic. + "transaction's sequence locks on inputs not met": ErrNonBIP68Final, + + // TODO(yy): find/return the following errors in `btcd`. + // + // A tiny transaction(in non-witness bytes) that is disallowed. + // "unmatched btcd error 1": ErrTxTooSmall, + // "unmatched btcd error 2": ErrScriptVerifyFlag, + // // A transaction with invalid OP codes. + // "unmatched btcd error 3": ErrInvalidOpcode, + // // Minimally-small transaction(in non-witness bytes) that is + // // allowed. + // "unmatched btcd error 4": ErrSameNonWitnessData, +} + +// MapRPCErr takes an error returned from calling RPC methods from various +// chain backend and map it to an defined error here. It uses the `BtcdErrMap` +// defined above, whose keys are btcd error strings and values are errors made +// from bitcoind error strings. +// +// NOTE: we assume neutrino shares the same error strings as btcd. +func MapRPCErr(rpcErr error) error { + // Iterate the map and find the matching error. + for btcdErr, err := range BtcdErrMap { + // Match it against btcd's error first. + if matchErrStr(rpcErr, btcdErr) { + return err + } + } + + // If not found, try to match it against bitcoind's error. + for i := uint32(0); i < uint32(errSentinel); i++ { + err := BitcoindRPCErr(i) + if matchErrStr(rpcErr, err.Error()) { + return err + } + } + + // If not matched, return the original error wrapped. + return fmt.Errorf("%w: %v", ErrUndefined, rpcErr) +} + +// matchErrStr takes an error returned from RPC client and matches it against +// the specified string. If the expected string pattern is found in the error +// passed, return true. Both the error strings are normalized before matching. +func matchErrStr(err error, s string) bool { + // Replace all dashes found in the error string with spaces. + strippedErrStr := strings.ReplaceAll(err.Error(), "-", " ") + + // Replace all dashes found in the error string with spaces. + strippedMatchStr := strings.ReplaceAll(s, "-", " ") + + // Match against the lowercase. + return strings.Contains( + strings.ToLower(strippedErrStr), + strings.ToLower(strippedMatchStr), + ) +} diff --git a/rpcclient/errors_test.go b/rpcclient/errors_test.go new file mode 100644 index 0000000000..e074622b11 --- /dev/null +++ b/rpcclient/errors_test.go @@ -0,0 +1,122 @@ +package rpcclient + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/require" +) + +// TestMatchErrStr checks that `matchErrStr` can correctly replace the dashes +// with spaces and turn title cases into lowercases for a given error and match +// it against the specified string pattern. +func TestMatchErrStr(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + bitcoindErr error + matchStr string + matched bool + }{ + { + name: "error without dashes", + bitcoindErr: errors.New("missing input"), + matchStr: "missing input", + matched: true, + }, + { + name: "match str without dashes", + bitcoindErr: errors.New("missing-input"), + matchStr: "missing input", + matched: true, + }, + { + name: "error with dashes", + bitcoindErr: errors.New("missing-input"), + matchStr: "missing input", + matched: true, + }, + { + name: "match str with dashes", + bitcoindErr: errors.New("missing-input"), + matchStr: "missing-input", + matched: true, + }, + { + name: "error with title case and dash", + bitcoindErr: errors.New("Missing-Input"), + matchStr: "missing input", + matched: true, + }, + { + name: "match str with title case and dash", + bitcoindErr: errors.New("missing-input"), + matchStr: "Missing-Input", + matched: true, + }, + { + name: "unmatched error", + bitcoindErr: errors.New("missing input"), + matchStr: "missingorspent", + matched: false, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + matched := matchErrStr(tc.bitcoindErr, tc.matchStr) + require.Equal(t, tc.matched, matched) + }) + } +} + +// TestMapRPCErr checks that `MapRPCErr` can correctly map a given error to +// the corresponding error in the `BtcdErrMap` or `BitcoindErrors` map. +func TestMapRPCErr(t *testing.T) { + t.Parallel() + + require := require.New(t) + + // Get all known bitcoind errors. + bitcoindErrors := make([]error, 0, errSentinel) + for i := uint32(0); i < uint32(errSentinel); i++ { + err := BitcoindRPCErr(i) + bitcoindErrors = append(bitcoindErrors, err) + } + + // An unknown error should be mapped to ErrUndefined. + errUnknown := errors.New("unknown error") + err := MapRPCErr(errUnknown) + require.ErrorIs(err, ErrUndefined) + + // A known error should be mapped to the corresponding error in the + // `BtcdErrMap` or `bitcoindErrors` map. + for btcdErrStr, mappedErr := range BtcdErrMap { + err := MapRPCErr(errors.New(btcdErrStr)) + require.ErrorIs(err, mappedErr) + + err = MapRPCErr(mappedErr) + require.ErrorIs(err, mappedErr) + } + + for _, bitcoindErr := range bitcoindErrors { + err = MapRPCErr(bitcoindErr) + require.ErrorIs(err, bitcoindErr) + } +} + +// TestBitcoindErrorSentinel checks that all defined BitcoindRPCErr errors are +// added to the method `Error`. +func TestBitcoindErrorSentinel(t *testing.T) { + t.Parallel() + + rt := require.New(t) + + for i := uint32(0); i < uint32(errSentinel); i++ { + err := BitcoindRPCErr(i) + rt.NotEqualf(err.Error(), "unknown error", "error code %d is "+ + "not defined, make sure to update it inside the Error "+ + "method", i) + } +} diff --git a/rpcclient/example_test.go b/rpcclient/example_test.go new file mode 100644 index 0000000000..9ba9adadef --- /dev/null +++ b/rpcclient/example_test.go @@ -0,0 +1,156 @@ +// Copyright (c) 2020 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package rpcclient + +import ( + "fmt" + "github.com/btcsuite/btcd/btcjson" +) + +var connCfg = &ConnConfig{ + Host: "localhost:8332", + User: "user", + Pass: "pass", + HTTPPostMode: true, + DisableTLS: true, +} + +func ExampleClient_GetDescriptorInfo() { + client, err := New(connCfg, nil) + if err != nil { + panic(err) + } + defer client.Shutdown() + + descriptorInfo, err := client.GetDescriptorInfo( + "wpkh([d34db33f/84h/0h/0h]0279be667ef9dcbbac55a06295Ce870b07029Bfcdb2dce28d959f2815b16f81798)") + if err != nil { + panic(err) + } + + fmt.Printf("%+v\n", descriptorInfo) + // &{Descriptor:wpkh([d34db33f/84'/0'/0']0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798)#n9g43y4k Checksum:qwlqgth7 IsRange:false IsSolvable:true HasPrivateKeys:false} +} + +func ExampleClient_ImportMulti() { + client, err := New(connCfg, nil) + if err != nil { + panic(err) + } + defer client.Shutdown() + + requests := []btcjson.ImportMultiRequest{ + { + Descriptor: btcjson.String( + "pkh([f34db33f/44'/0'/0']xpub6Cc939fyHvfB9pPLWd3bSyyQFvgKbwhidca49jGCM5Hz5ypEPGf9JVXB4NBuUfPgoHnMjN6oNgdC9KRqM11RZtL8QLW6rFKziNwHDYhZ6Kx/0/*)#ed7px9nu"), + Range: &btcjson.DescriptorRange{Value: []int{0, 100}}, + Timestamp: btcjson.TimestampOrNow{Value: 0}, // scan from genesis + WatchOnly: btcjson.Bool(true), + KeyPool: btcjson.Bool(false), + Internal: btcjson.Bool(false), + }, + } + opts := &btcjson.ImportMultiOptions{Rescan: true} + + resp, err := client.ImportMulti(requests, opts) + if err != nil { + panic(err) + } + + fmt.Println(resp[0].Success) + // true +} + +func ExampleClient_DeriveAddresses() { + client, err := New(connCfg, nil) + if err != nil { + panic(err) + } + defer client.Shutdown() + + addrs, err := client.DeriveAddresses( + "pkh([f34db33f/44'/0'/0']xpub6Cc939fyHvfB9pPLWd3bSyyQFvgKbwhidca49jGCM5Hz5ypEPGf9JVXB4NBuUfPgoHnMjN6oNgdC9KRqM11RZtL8QLW6rFKziNwHDYhZ6Kx/0/*)#ed7px9nu", + &btcjson.DescriptorRange{Value: []int{0, 2}}) + if err != nil { + panic(err) + } + + fmt.Printf("%+v\n", addrs) + // &[14NjenDKkGGq1McUgoSkeUHJpW3rrKLbPW 1Pn6i3cvdGhqbdgNjXHfbaYfiuviPiymXj 181x1NbgGYKLeMXkDdXEAqepG75EgU8XtG] +} + +func ExampleClient_GetAddressInfo() { + client, err := New(connCfg, nil) + if err != nil { + panic(err) + } + defer client.Shutdown() + + info, err := client.GetAddressInfo("2NF1FbxtUAsvdU4uW1UC2xkBVatp6cYQuJ3") + if err != nil { + panic(err) + } + + fmt.Println(info.Address) // 2NF1FbxtUAsvdU4uW1UC2xkBVatp6cYQuJ3 + fmt.Println(info.ScriptType.String()) // witness_v0_keyhash + fmt.Println(*info.HDKeyPath) // m/49'/1'/0'/0/4 + fmt.Println(info.Embedded.Address) // tb1q3x2h2kh57wzg7jz00jhwn0ycvqtdk2ane37j27 +} + +func ExampleClient_GetWalletInfo() { + client, err := New(connCfg, nil) + if err != nil { + panic(err) + } + defer client.Shutdown() + + info, err := client.GetWalletInfo() + if err != nil { + panic(err) + } + + fmt.Println(info.WalletVersion) // 169900 + fmt.Println(info.TransactionCount) // 22 + fmt.Println(*info.HDSeedID) // eb44e4e9b864ef17e7ba947da746375b000f5d94 + fmt.Println(info.Scanning.Value) // false +} + +func ExampleClient_GetTxOutSetInfo() { + client, err := New(connCfg, nil) + if err != nil { + panic(err) + } + defer client.Shutdown() + + r, err := client.GetTxOutSetInfo() + if err != nil { + panic(err) + } + + fmt.Println(r.TotalAmount.String()) // 20947654.56996054 BTC + fmt.Println(r.BestBlock.String()) // 000000000000005f94116250e2407310463c0a7cf950f1af9ebe935b1c0687ab + fmt.Println(r.TxOuts) // 24280607 + fmt.Println(r.Transactions) // 9285603 + fmt.Println(r.DiskSize) // 1320871611 +} + +func ExampleClient_CreateWallet() { + client, err := New(connCfg, nil) + if err != nil { + panic(err) + } + defer client.Shutdown() + + r, err := client.CreateWallet( + "mywallet", + WithCreateWalletBlank(), + WithCreateWalletPassphrase("secret"), + ) + if err != nil { + panic(err) + } + + fmt.Println(r.Name) // mywallet +} diff --git a/rpcclient/examples/bitcoincorehttpbulk/README.md b/rpcclient/examples/bitcoincorehttpbulk/README.md new file mode 100644 index 0000000000..ca900b6e79 --- /dev/null +++ b/rpcclient/examples/bitcoincorehttpbulk/README.md @@ -0,0 +1,31 @@ +Bitcoin Core Batch HTTP POST Example +============================== + +This 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. + +## Running the Example + +The first step is to use `go get` to download and install the rpcclient package: + +```bash +$ go get github.com/btcsuite/btcd/rpcclient +``` + +Next, modify the `main.go` source to specify the correct RPC username and +password for the RPC server: + +```Go + User: "yourrpcuser", + Pass: "yourrpcpass", +``` + +Finally, navigate to the example's directory and run it with: + +```bash +$ cd $GOPATH/src/github.com/btcsuite/btcd/rpcclient/examples/bitcoincorehttp +$ go run *.go +``` + +## License + +This example is licensed under the [copyfree](http://copyfree.org) ISC License. diff --git a/rpcclient/examples/bitcoincorehttpbulk/main.go b/rpcclient/examples/bitcoincorehttpbulk/main.go new file mode 100644 index 0000000000..3dce058da0 --- /dev/null +++ b/rpcclient/examples/bitcoincorehttpbulk/main.go @@ -0,0 +1,46 @@ +// Copyright (c) 2014-2020 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package main + +import ( + "fmt" + "log" + + "github.com/btcsuite/btcd/rpcclient" +) + +func main() { + // Connect to local bitcoin core RPC server using HTTP POST mode. + connCfg := &rpcclient.ConnConfig{ + Host: "localhost:8332", + User: "yourrpcuser", + Pass: "yourrpcpass", + DisableConnectOnNew: true, + HTTPPostMode: true, // Bitcoin core only supports HTTP POST mode + DisableTLS: true, // Bitcoin core does not provide TLS by default + } + batchClient, err := rpcclient.NewBatch(connCfg) + defer batchClient.Shutdown() + + if err != nil { + log.Fatal(err) + } + + // batch mode requires async requests + blockCount := batchClient.GetBlockCountAsync() + block1 := batchClient.GetBlockHashAsync(1) + batchClient.GetBlockHashAsync(2) + batchClient.GetBlockHashAsync(3) + block4 := batchClient.GetBlockHashAsync(4) + difficulty := batchClient.GetDifficultyAsync() + + // sends all queued batch requests + batchClient.Send() + + fmt.Println(blockCount.Receive()) + fmt.Println(block1.Receive()) + fmt.Println(block4.Receive()) + fmt.Println(difficulty.Receive()) +} diff --git a/rpcclient/examples/bitcoincoreunixsocket/README.md b/rpcclient/examples/bitcoincoreunixsocket/README.md new file mode 100644 index 0000000000..6ef9774647 --- /dev/null +++ b/rpcclient/examples/bitcoincoreunixsocket/README.md @@ -0,0 +1,41 @@ +Bitcoin Core HTTP POST Over Unix Socket Example +============================== + +This example shows how to use the rpcclient package to connect to a Bitcoin +Core RPC server using HTTP POST mode over a Unix Socket with TLS disabled +and gets the current block count. + +## Running the Example + +The first step is to use `go get` to download and install the rpcclient package: + +```bash +$ go get github.com/btcsuite/btcd/rpcclient +``` + +Next, modify the `main.go` source to specify the correct RPC username and +password for the RPC server: + +```Go + User: "yourrpcuser", + Pass: "yourrpcpass", +``` + +As Bitcoin Core supports only TCP/IP, we'll redirect RPC requests from the +Unix Socket to Bitcoin Core. For this example, we'll use the `socat` command: + +```bash +$ socat -d UNIX-LISTEN:"my-unix-socket-path",fork TCP:"host-address" +$ socat -d UNIX-LISTEN:/tmp/test.XXXX,fork TCP:localhost:8332 +``` + +Finally, navigate to the example's directory and run it with: + +```bash +$ cd $GOPATH/src/github.com/btcsuite/btcd/rpcclient/examples/bitcoincorehttp +$ go run *.go +``` + +## License + +This example is licensed under the [copyfree](http://copyfree.org) ISC License. diff --git a/rpcclient/examples/bitcoincoreunixsocket/main.go b/rpcclient/examples/bitcoincoreunixsocket/main.go new file mode 100644 index 0000000000..b061d19ff8 --- /dev/null +++ b/rpcclient/examples/bitcoincoreunixsocket/main.go @@ -0,0 +1,39 @@ +// Copyright (c) 2014-2017 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package main + +import ( + "log" + + "github.com/btcsuite/btcd/rpcclient" +) + +func main() { + // Connect to local bitcoin core RPC server using HTTP POST mode over a + // Unix Socket. + connCfg := &rpcclient.ConnConfig{ + // For unix sockets, use unix:// + "your unix socket path". + Host: "unix:///tmp/test.XXXX", + User: "yourrpcuser", + Pass: "yourrpcpass", + HTTPPostMode: true, // Bitcoin core only supports HTTP POST mode. + DisableTLS: true, // Bitcoin core does not provide TLS by default. + } + + // Notice the notification parameter is nil since notifications are + // not supported in HTTP POST mode. + client, err := rpcclient.New(connCfg, nil) + if err != nil { + log.Fatal(err) + } + defer client.Shutdown() + + // Get the current block count. + blockCount, err := client.GetBlockCount() + if err != nil { + log.Fatal(err) + } + log.Printf("Block count: %d", blockCount) +} diff --git a/rpcclient/examples/btcdwebsockets/main.go b/rpcclient/examples/btcdwebsockets/main.go index 56d12d8274..fe3fc81b7c 100644 --- a/rpcclient/examples/btcdwebsockets/main.go +++ b/rpcclient/examples/btcdwebsockets/main.go @@ -5,14 +5,14 @@ package main import ( - "io/ioutil" "log" + "os" "path/filepath" "time" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/rpcclient" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) func main() { @@ -33,7 +33,7 @@ func main() { // Connect to local btcd RPC server using websockets. btcdHomeDir := btcutil.AppDataDir("btcd", false) - certs, err := ioutil.ReadFile(filepath.Join(btcdHomeDir, "rpc.cert")) + certs, err := os.ReadFile(filepath.Join(btcdHomeDir, "rpc.cert")) if err != nil { log.Fatal(err) } diff --git a/rpcclient/examples/btcwalletwebsockets/main.go b/rpcclient/examples/btcwalletwebsockets/main.go index e803138d64..c41b4414d0 100644 --- a/rpcclient/examples/btcwalletwebsockets/main.go +++ b/rpcclient/examples/btcwalletwebsockets/main.go @@ -5,13 +5,13 @@ package main import ( - "io/ioutil" "log" + "os" "path/filepath" "time" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/rpcclient" - "github.com/btcsuite/btcutil" "github.com/davecgh/go-spew/spew" ) @@ -29,7 +29,7 @@ func main() { // Connect to local btcwallet RPC server using websockets. certHomeDir := btcutil.AppDataDir("btcwallet", false) - certs, err := ioutil.ReadFile(filepath.Join(certHomeDir, "rpc.cert")) + certs, err := os.ReadFile(filepath.Join(certHomeDir, "rpc.cert")) if err != nil { log.Fatal(err) } diff --git a/rpcclient/examples/customcommand/README.md b/rpcclient/examples/customcommand/README.md new file mode 100644 index 0000000000..0e36d649cc --- /dev/null +++ b/rpcclient/examples/customcommand/README.md @@ -0,0 +1,32 @@ +Custom Command Example +====================== + +This example shows how to use custom commands with the rpcclient package, by +implementing the `name_show` command from Namecoin Core. + +## Running the Example + +The first step is to use `go get` to download and install the rpcclient package: + +```bash +$ go get github.com/btcsuite/btcd/rpcclient +``` + +Next, modify the `main.go` source to specify the correct RPC username and +password for the RPC server of your Namecoin Core node: + +```Go + User: "yourrpcuser", + Pass: "yourrpcpass", +``` + +Finally, navigate to the example's directory and run it with: + +```bash +$ cd $GOPATH/src/github.com/btcsuite/btcd/rpcclient/examples/customcommand +$ go run *.go +``` + +## License + +This example is licensed under the [copyfree](http://copyfree.org) ISC License. diff --git a/rpcclient/examples/customcommand/main.go b/rpcclient/examples/customcommand/main.go new file mode 100644 index 0000000000..1e14c06fe4 --- /dev/null +++ b/rpcclient/examples/customcommand/main.go @@ -0,0 +1,110 @@ +// Copyright (c) 2014-2017 The btcsuite developers +// Copyright (c) 2019-2020 The Namecoin developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package main + +import ( + "encoding/json" + "log" + + "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/rpcclient" +) + +// NameShowCmd defines the name_show JSON-RPC command. +type NameShowCmd struct { + Name string +} + +// NameShowResult models the data from the name_show command. +type NameShowResult struct { + Name string `json:"name"` + NameEncoding string `json:"name_encoding"` + NameError string `json:"name_error"` + Value string `json:"value"` + ValueEncoding string `json:"value_encoding"` + ValueError string `json:"value_error"` + TxID string `json:"txid"` + Vout uint32 `json:"vout"` + Address string `json:"address"` + IsMine bool `json:"ismine"` + Height int32 `json:"height"` + ExpiresIn int32 `json:"expires_in"` + Expired bool `json:"expired"` +} + +// FutureNameShowResult is a future promise to deliver the result +// of a NameShowAsync RPC invocation (or an applicable error). +type FutureNameShowResult chan *rpcclient.Response + +// Receive waits for the Response promised by the future and returns detailed +// information about a name. +func (r FutureNameShowResult) Receive() (*NameShowResult, error) { + res, err := rpcclient.ReceiveFuture(r) + if err != nil { + return nil, err + } + + // Unmarshal result as a name_show result object + var nameShow NameShowResult + err = json.Unmarshal(res, &nameShow) + if err != nil { + return nil, err + } + + return &nameShow, nil +} + +// NameShowAsync returns an instance of a type that can be used to get the +// result of the RPC at some future time by invoking the Receive function on +// the returned instance. +// +// See NameShow for the blocking version and more details. +func NameShowAsync(c *rpcclient.Client, name string) FutureNameShowResult { + cmd := &NameShowCmd{ + Name: name, + } + return c.SendCmd(cmd) +} + +// NameShow returns detailed information about a name. +func NameShow(c *rpcclient.Client, name string) (*NameShowResult, error) { + return NameShowAsync(c, name).Receive() +} + +func init() { + // No special flags for commands in this file. + flags := btcjson.UsageFlag(0) + + btcjson.MustRegisterCmd("name_show", (*NameShowCmd)(nil), flags) +} + +func main() { + // Connect to local namecoin core RPC server using HTTP POST mode. + connCfg := &rpcclient.ConnConfig{ + Host: "localhost:8336", + User: "yourrpcuser", + Pass: "yourrpcpass", + HTTPPostMode: true, // Namecoin core only supports HTTP POST mode + DisableTLS: true, // Namecoin core does not provide TLS by default + } + // Notice the notification parameter is nil since notifications are + // not supported in HTTP POST mode. + client, err := rpcclient.New(connCfg, nil) + if err != nil { + log.Fatal(err) + } + defer client.Shutdown() + + // Get the current block count. + result, err := NameShow(client, "d/namecoin") + if err != nil { + log.Fatal(err) + } + + value := result.Value + + log.Printf("Value of d/namecoin: %s", value) +} diff --git a/rpcclient/extensions.go b/rpcclient/extensions.go index d16cd5252e..b7517cf26e 100644 --- a/rpcclient/extensions.go +++ b/rpcclient/extensions.go @@ -13,20 +13,20 @@ import ( "fmt" "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) // FutureDebugLevelResult is a future promise to deliver the result of a // DebugLevelAsync RPC invocation (or an applicable error). -type FutureDebugLevelResult chan *response +type FutureDebugLevelResult chan *Response -// Receive waits for the response promised by the future and returns the result +// Receive waits for the Response promised by the future and returns the result // of setting the debug logging level to the passed level specification or the // list of of the available subsystems for the special keyword 'show'. func (r FutureDebugLevelResult) Receive() (string, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return "", err } @@ -49,14 +49,15 @@ func (r FutureDebugLevelResult) Receive() (string, error) { // NOTE: This is a btcd extension. func (c *Client) DebugLevelAsync(levelSpec string) FutureDebugLevelResult { cmd := btcjson.NewDebugLevelCmd(levelSpec) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // DebugLevel dynamically sets the debug logging level to the passed level // specification. // // The levelspec can be either a debug level or of the form: -// =,=,... +// +// =,=,... // // Additionally, the special keyword 'show' can be used to get a list of the // available subsystems. @@ -68,11 +69,11 @@ func (c *Client) DebugLevel(levelSpec string) (string, error) { // FutureCreateEncryptedWalletResult is a future promise to deliver the error // result of a CreateEncryptedWalletAsync RPC invocation. -type FutureCreateEncryptedWalletResult chan *response +type FutureCreateEncryptedWalletResult chan *Response -// Receive waits for and returns the error response promised by the future. +// Receive waits for and returns the error Response promised by the future. func (r FutureCreateEncryptedWalletResult) Receive() error { - _, err := receiveFuture(r) + _, err := ReceiveFuture(r) return err } @@ -85,7 +86,7 @@ func (r FutureCreateEncryptedWalletResult) Receive() error { // NOTE: This is a btcwallet extension. func (c *Client) CreateEncryptedWalletAsync(passphrase string) FutureCreateEncryptedWalletResult { cmd := btcjson.NewCreateEncryptedWalletCmd(passphrase) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // CreateEncryptedWallet requests the creation of an encrypted wallet. Wallets @@ -102,12 +103,12 @@ func (c *Client) CreateEncryptedWallet(passphrase string) error { // FutureListAddressTransactionsResult is a future promise to deliver the result // of a ListAddressTransactionsAsync RPC invocation (or an applicable error). -type FutureListAddressTransactionsResult chan *response +type FutureListAddressTransactionsResult chan *Response -// Receive waits for the response promised by the future and returns information +// Receive waits for the Response promised by the future and returns information // about all transactions associated with the provided addresses. func (r FutureListAddressTransactionsResult) Receive() ([]btcjson.ListTransactionsResult, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -135,7 +136,7 @@ func (c *Client) ListAddressTransactionsAsync(addresses []btcutil.Address, accou addrs = append(addrs, addr.EncodeAddress()) } cmd := btcjson.NewListAddressTransactionsCmd(addrs, &account) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // ListAddressTransactions returns information about all transactions associated @@ -148,12 +149,12 @@ func (c *Client) ListAddressTransactions(addresses []btcutil.Address, account st // FutureGetBestBlockResult is a future promise to deliver the result of a // GetBestBlockAsync RPC invocation (or an applicable error). -type FutureGetBestBlockResult chan *response +type FutureGetBestBlockResult chan *Response -// Receive waits for the response promised by the future and returns the hash +// Receive waits for the Response promised by the future and returns the hash // and height of the block in the longest (best) chain. func (r FutureGetBestBlockResult) Receive() (*chainhash.Hash, int32, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, 0, err } @@ -183,7 +184,7 @@ func (r FutureGetBestBlockResult) Receive() (*chainhash.Hash, int32, error) { // NOTE: This is a btcd extension. func (c *Client) GetBestBlockAsync() FutureGetBestBlockResult { cmd := btcjson.NewGetBestBlockCmd() - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetBestBlock returns the hash and height of the block in the longest (best) @@ -196,12 +197,12 @@ func (c *Client) GetBestBlock() (*chainhash.Hash, int32, error) { // FutureGetCurrentNetResult is a future promise to deliver the result of a // GetCurrentNetAsync RPC invocation (or an applicable error). -type FutureGetCurrentNetResult chan *response +type FutureGetCurrentNetResult chan *Response -// Receive waits for the response promised by the future and returns the network +// Receive waits for the Response promised by the future and returns the network // the server is running on. func (r FutureGetCurrentNetResult) Receive() (wire.BitcoinNet, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return 0, err } @@ -225,7 +226,7 @@ func (r FutureGetCurrentNetResult) Receive() (wire.BitcoinNet, error) { // NOTE: This is a btcd extension. func (c *Client) GetCurrentNetAsync() FutureGetCurrentNetResult { cmd := btcjson.NewGetCurrentNetCmd() - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetCurrentNet returns the network the server is running on. @@ -240,15 +241,15 @@ func (c *Client) GetCurrentNet() (wire.BitcoinNet, error) { // // NOTE: This is a btcsuite extension ported from // github.com/decred/dcrrpcclient. -type FutureGetHeadersResult chan *response +type FutureGetHeadersResult chan *Response -// Receive waits for the response promised by the future and returns the +// Receive waits for the Response promised by the future and returns the // getheaders result. // // NOTE: This is a btcsuite extension ported from // github.com/decred/dcrrpcclient. func (r FutureGetHeadersResult) Receive() ([]wire.BlockHeader, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -292,7 +293,7 @@ func (c *Client) GetHeadersAsync(blockLocators []chainhash.Hash, hashStop *chain hash = hashStop.String() } cmd := btcjson.NewGetHeadersCmd(locators, hash) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetHeaders mimics the wire protocol getheaders and headers messages by @@ -307,12 +308,12 @@ func (c *Client) GetHeaders(blockLocators []chainhash.Hash, hashStop *chainhash. // FutureExportWatchingWalletResult is a future promise to deliver the result of // an ExportWatchingWalletAsync RPC invocation (or an applicable error). -type FutureExportWatchingWalletResult chan *response +type FutureExportWatchingWalletResult chan *Response -// Receive waits for the response promised by the future and returns the +// Receive waits for the Response promised by the future and returns the // exported wallet. func (r FutureExportWatchingWalletResult) Receive() ([]byte, []byte, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, nil, err } @@ -361,7 +362,7 @@ func (r FutureExportWatchingWalletResult) Receive() ([]byte, []byte, error) { // NOTE: This is a btcwallet extension. func (c *Client) ExportWatchingWalletAsync(account string) FutureExportWatchingWalletResult { cmd := btcjson.NewExportWatchingWalletCmd(&account, btcjson.Bool(true)) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // ExportWatchingWallet returns the raw bytes for a watching-only version of @@ -376,12 +377,12 @@ func (c *Client) ExportWatchingWallet(account string) ([]byte, []byte, error) { // FutureSessionResult is a future promise to deliver the result of a // SessionAsync RPC invocation (or an applicable error). -type FutureSessionResult chan *response +type FutureSessionResult chan *Response -// Receive waits for the response promised by the future and returns the +// Receive waits for the Response promised by the future and returns the // session result. func (r FutureSessionResult) Receive() (*btcjson.SessionResult, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -410,7 +411,7 @@ func (c *Client) SessionAsync() FutureSessionResult { } cmd := btcjson.NewSessionCmd() - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // Session returns details regarding a websocket client's current connection. @@ -427,16 +428,16 @@ func (c *Client) Session() (*btcjson.SessionResult, error) { // // NOTE: This is a btcsuite extension ported from // github.com/decred/dcrrpcclient. -type FutureVersionResult chan *response +type FutureVersionResult chan *Response -// Receive waits for the response promised by the future and returns the version +// Receive waits for the Response promised by the future and returns the version // result. // // NOTE: This is a btcsuite extension ported from // github.com/decred/dcrrpcclient. func (r FutureVersionResult) Receive() (map[string]btcjson.VersionResult, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -461,7 +462,7 @@ func (r FutureVersionResult) Receive() (map[string]btcjson.VersionResult, // github.com/decred/dcrrpcclient. func (c *Client) VersionAsync() FutureVersionResult { cmd := btcjson.NewVersionCmd() - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // Version returns information about the server's JSON-RPC API versions. diff --git a/rpcclient/infrastructure.go b/rpcclient/infrastructure.go index 7a8f1885d1..9a9c2bb878 100644 --- a/rpcclient/infrastructure.go +++ b/rpcclient/infrastructure.go @@ -7,6 +7,7 @@ package rpcclient import ( "bytes" "container/list" + "context" "crypto/tls" "crypto/x509" "encoding/base64" @@ -19,12 +20,15 @@ import ( "net" "net/http" "net/url" + "os" + "strconv" "strings" "sync" "sync/atomic" "time" "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/go-socks/socks" "github.com/btcsuite/websocket" ) @@ -70,6 +74,9 @@ var ( // client having already connected to the RPC server. ErrClientAlreadyConnected = errors.New("websocket client has already " + "connected") + + // ErrEmptyBatch is an error to describe that there is nothing to send. + ErrEmptyBatch = errors.New("batch is empty") ) const ( @@ -84,15 +91,15 @@ const ( // connectionRetryInterval is the amount of time to wait in between // retries when automatically reconnecting to an RPC server. connectionRetryInterval = time.Second * 5 -) -// sendPostDetails houses an HTTP POST request to send to an RPC server as well -// as the original JSON-RPC command and a channel to reply on when the server -// responds with the result. -type sendPostDetails struct { - httpRequest *http.Request - jsonRequest *jsonRequest -} + // requestRetryInterval is the initial amount of time to wait in between + // retries when sending HTTP POST requests. + requestRetryInterval = time.Millisecond * 500 + + // defaultHTTPTimeout is the default timeout for an http request, so the + // request does not block indefinitely. + defaultHTTPTimeout = time.Minute +) // jsonRequest holds information about a json request that is used to properly // detect, interpret, and deliver a reply to it. @@ -101,25 +108,9 @@ type jsonRequest struct { method string cmd interface{} marshalledJSON []byte - responseChan chan *response + responseChan chan *Response } -// BackendVersion represents the version of the backend the client is currently -// connected to. -type BackendVersion uint8 - -const ( - // BitcoindPre19 represents a bitcoind version before 0.19.0. - BitcoindPre19 BackendVersion = iota - - // BitcoindPost19 represents a bitcoind version equal to or greater than - // 0.19.0. - BitcoindPost19 - - // Btcd represents a catch-all btcd version. - Btcd -) - // Client represents a Bitcoin RPC client which allows easy access to the // various RPC methods available on a Bitcoin RPC server. Each of the wrapper // functions handle the details of converting the passed and return types to and @@ -135,9 +126,13 @@ const ( type Client struct { id uint64 // atomic, so must stay 64-bit aligned - // config holds the connection configuration assoiated with this client. + // config holds the connection configuration associated with this client. config *ConnConfig + // chainParams holds the params for the chain that this client is using, + // and is used for many wallet methods. + chainParams *chaincfg.Params + // wsConn is the underlying websocket connection when not in HTTP POST // mode. wsConn *websocket.Conn @@ -149,7 +144,7 @@ type Client struct { // backendVersion is the version of the backend the client is currently // connected to. This should be retrieved through GetVersion. backendVersionMu sync.Mutex - backendVersion *BackendVersion + backendVersion BackendVersion // mtx is a mutex to protect access to connection related fields. mtx sync.Mutex @@ -157,6 +152,11 @@ type Client struct { // disconnected indicated whether or not the server is disconnected. disconnected bool + // whether or not to batch requests, false unless changed by Batch() + batch bool + batchLock sync.Mutex + batchList *list.List + // retryCount holds the number of times the client has tried to // reconnect to the RPC server. retryCount int64 @@ -173,7 +173,7 @@ type Client struct { // Networking infrastructure. sendChan chan []byte - sendPostChan chan *sendPostDetails + sendPostChan chan *jsonRequest connEstablished chan struct{} disconnect chan struct{} shutdown chan struct{} @@ -214,8 +214,16 @@ func (c *Client) addRequest(jReq *jsonRequest) error { default: } - element := c.requestList.PushBack(jReq) - c.requestMap[jReq.id] = element + if !c.batch { + element := c.requestList.PushBack(jReq) + c.requestMap[jReq.id] = element + } else { + c.batchLock.Lock() + element := c.batchList.PushBack(jReq) + c.batchLock.Unlock() + + c.requestMap[jReq.id] = element + } return nil } @@ -228,14 +236,23 @@ func (c *Client) removeRequest(id uint64) *jsonRequest { c.requestLock.Lock() defer c.requestLock.Unlock() - element := c.requestMap[id] - if element != nil { - delete(c.requestMap, id) - request := c.requestList.Remove(element).(*jsonRequest) - return request + element, ok := c.requestMap[id] + if !ok { + return nil } - return nil + delete(c.requestMap, id) + + var request *jsonRequest + if c.batch { + c.batchLock.Lock() + request = c.batchList.Remove(element).(*jsonRequest) + c.batchLock.Unlock() + } else { + request = c.requestList.Remove(element).(*jsonRequest) + } + + return request } // removeAllRequests removes all the jsonRequests which contain the response @@ -283,41 +300,74 @@ func (c *Client) trackRegisteredNtfns(cmd interface{}) { } } -type ( - // inMessage is the first type that an incoming message is unmarshaled - // into. It supports both requests (for notification support) and - // responses. The partially-unmarshaled message is a notification if - // the embedded ID (from the response) is nil. Otherwise, it is a - // response. - inMessage struct { - ID *float64 `json:"id"` - *rawNotification - *rawResponse - } +// FutureGetBulkResult waits for the responses promised by the future +// and returns them in a channel +type FutureGetBulkResult chan *Response - // rawNotification is a partially-unmarshaled JSON-RPC notification. - rawNotification struct { - Method string `json:"method"` - Params []json.RawMessage `json:"params"` +// Receive waits for the response promised by the future and returns an map +// of results by request id +func (r FutureGetBulkResult) Receive() (BulkResult, error) { + m := make(BulkResult) + res, err := ReceiveFuture(r) + if err != nil { + return nil, err + } + var arr []IndividualBulkResult + err = json.Unmarshal(res, &arr) + if err != nil { + return nil, err } - // rawResponse is a partially-unmarshaled JSON-RPC response. For this - // to be valid (according to JSON-RPC 1.0 spec), ID may not be nil. - rawResponse struct { - Result json.RawMessage `json:"result"` - Error *btcjson.RPCError `json:"error"` + for _, results := range arr { + m[results.Id] = results } -) -// response is the raw bytes of a JSON-RPC result, or the error if the response + return m, nil +} + +// IndividualBulkResult represents one result +// from a bulk json rpc api +type IndividualBulkResult struct { + Result interface{} `json:"result"` + Error *btcjson.RPCError `json:"error"` + Id uint64 `json:"id"` +} + +type BulkResult = map[uint64]IndividualBulkResult + +// inMessage is the first type that an incoming message is unmarshaled +// into. It supports both requests (for notification support) and +// responses. The partially-unmarshaled message is a notification if +// the embedded ID (from the response) is nil. Otherwise, it is a +// response. +type inMessage struct { + ID *float64 `json:"id"` + *rawNotification + *rawResponse +} + +// rawNotification is a partially-unmarshaled JSON-RPC notification. +type rawNotification struct { + Method string `json:"method"` + Params []json.RawMessage `json:"params"` +} + +// rawResponse is a partially-unmarshaled JSON-RPC response. For this +// to be valid (according to JSON-RPC 1.0 spec), ID may not be nil. +type rawResponse struct { + Result json.RawMessage `json:"result"` + Error *btcjson.RPCError `json:"error"` +} + +// Response is the raw bytes of a JSON-RPC result, or the error if the response // error object was non-null. -type response struct { +type Response struct { result []byte err error } // result checks whether the unmarshaled response contains a non-nil error, -// returning an unmarshaled btcjson.RPCError (or an unmarshaling error) if so. +// returning an unmarshaled btcjson.RPCError (or an unmarshalling error) if so. // If the response is not an error, the raw bytes of the request are // returned for further unmashaling into specific result types. func (r rawResponse) result() (result []byte, err error) { @@ -392,14 +442,14 @@ func (c *Client) handleMessage(msg []byte) { // Deliver the response. result, err := in.rawResponse.result() - request.responseChan <- &response{result: result, err: err} + request.responseChan <- &Response{result: result, err: err} } // shouldLogReadError returns whether or not the passed error, which is expected // to have come from reading from the websocket connection in wsInHandler, // should be logged. func (c *Client) shouldLogReadError(err error) bool { - // No logging when the connetion is being forcibly disconnected. + // No logging when the connection is being forcibly disconnected. select { case <-c.shutdown: return false @@ -689,10 +739,10 @@ out: // Reset the connection state and signal the reconnect // has happened. + c.mtx.Lock() c.wsConn = wsConn c.retryCount = 0 - c.mtx.Lock() c.disconnect = make(chan struct{}) c.disconnected = false c.mtx.Unlock() @@ -717,12 +767,87 @@ out: // handleSendPostMessage handles performing the passed HTTP request, reading the // result, unmarshalling it, and delivering the unmarshalled result to the // provided response channel. -func (c *Client) handleSendPostMessage(details *sendPostDetails) { - jReq := details.jsonRequest - log.Tracef("Sending command [%s] with id %d", jReq.method, jReq.id) - httpResponse, err := c.httpClient.Do(details.httpRequest) +func (c *Client) handleSendPostMessage(jReq *jsonRequest) { + var ( + lastErr error + backoff time.Duration + httpResponse *http.Response + ) + + httpURL, err := c.config.httpURL() + if err != nil { + jReq.responseChan <- &Response{ + err: fmt.Errorf("failed to parse address %v", err), + } + return + } + + tries := 10 + for i := 0; i < tries; i++ { + var httpReq *http.Request + + bodyReader := bytes.NewReader(jReq.marshalledJSON) + httpReq, err = http.NewRequest("POST", httpURL, bodyReader) + if err != nil { + jReq.responseChan <- &Response{result: nil, err: err} + return + } + httpReq.Close = true + httpReq.Header.Set("Content-Type", "application/json") + for key, value := range c.config.ExtraHeaders { + httpReq.Header.Set(key, value) + } + + // Configure basic access authorization. + user, pass, err := c.config.getAuth() + if err != nil { + jReq.responseChan <- &Response{result: nil, err: err} + return + } + httpReq.SetBasicAuth(user, pass) + + httpResponse, err = c.httpClient.Do(httpReq) + + // Quit the retry loop on success or if we can't retry anymore. + if err == nil || i == tries-1 { + break + } + + // Save the last error for the case where we backoff further, + // retry and get an invalid response but no error. If this + // happens the saved last error will be used to enrich the error + // message that we pass back to the caller. + lastErr = err + + // Backoff sleep otherwise. + backoff = requestRetryInterval * time.Duration(i+1) + if backoff > time.Minute { + backoff = time.Minute + } + log.Debugf("Failed command [%s] with id %d attempt %d."+ + " Retrying in %v... \n", jReq.method, jReq.id, + i, backoff) + + select { + case <-time.After(backoff): + + case <-c.shutdown: + return + } + } if err != nil { - jReq.responseChan <- &response{err: err} + jReq.responseChan <- &Response{err: err} + return + } + + // We still want to return an error if for any reason the response + // remains empty. + if httpResponse == nil { + jReq.responseChan <- &Response{ + err: fmt.Errorf("invalid http POST response (nil), "+ + "method: %s, id: %d, last error=%v", + jReq.method, jReq.id, lastErr), + } return } @@ -731,25 +856,36 @@ func (c *Client) handleSendPostMessage(details *sendPostDetails) { httpResponse.Body.Close() if err != nil { err = fmt.Errorf("error reading json reply: %v", err) - jReq.responseChan <- &response{err: err} + jReq.responseChan <- &Response{err: err} return } // Try to unmarshal the response as a regular JSON-RPC response. var resp rawResponse - err = json.Unmarshal(respBytes, &resp) + var batchResponse json.RawMessage + if c.batch { + err = json.Unmarshal(respBytes, &batchResponse) + } else { + err = json.Unmarshal(respBytes, &resp) + } if err != nil { // When the response itself isn't a valid JSON-RPC response // return an error which includes the HTTP status code and raw // response bytes. err = fmt.Errorf("status code: %d, response: %q", httpResponse.StatusCode, string(respBytes)) - jReq.responseChan <- &response{err: err} + jReq.responseChan <- &Response{err: err} return } - - res, err := resp.result() - jReq.responseChan <- &response{result: res, err: err} + var res []byte + if c.batch { + // errors must be dealt with downstream since a whole request cannot + // "error out" other than through the status code error handled above + res, err = batchResponse, nil + } else { + res, err = resp.result() + } + jReq.responseChan <- &Response{result: res, err: err} } // sendPostHandler handles all outgoing messages when the client is running @@ -762,8 +898,8 @@ out: // Send any messages ready for send until the shutdown channel // is closed. select { - case details := <-c.sendPostChan: - c.handleSendPostMessage(details) + case jReq := <-c.sendPostChan: + c.handleSendPostMessage(jReq) case <-c.shutdown: break out @@ -775,8 +911,8 @@ out: cleanup: for { select { - case details := <-c.sendPostChan: - details.jsonRequest.responseChan <- &response{ + case jReq := <-c.sendPostChan: + jReq.responseChan <- &Response{ result: nil, err: ErrClientShutdown, } @@ -787,73 +923,52 @@ cleanup: } c.wg.Done() log.Tracef("RPC client send handler done for %s", c.config.Host) - } // sendPostRequest sends the passed HTTP request to the RPC server using the // HTTP client associated with the client. It is backed by a buffered channel, // so it will not block until the send channel is full. -func (c *Client) sendPostRequest(httpReq *http.Request, jReq *jsonRequest) { +func (c *Client) sendPostRequest(jReq *jsonRequest) { // Don't send the message if shutting down. select { case <-c.shutdown: - jReq.responseChan <- &response{result: nil, err: ErrClientShutdown} + jReq.responseChan <- &Response{result: nil, err: ErrClientShutdown} default: } - c.sendPostChan <- &sendPostDetails{ - jsonRequest: jReq, - httpRequest: httpReq, + select { + case c.sendPostChan <- jReq: + log.Tracef("Sent command [%s] with id %d", jReq.method, jReq.id) + + case <-c.shutdown: + return } } // newFutureError returns a new future result channel that already has the // passed error waitin on the channel with the reply set to nil. This is useful // to easily return errors from the various Async functions. -func newFutureError(err error) chan *response { - responseChan := make(chan *response, 1) - responseChan <- &response{err: err} +func newFutureError(err error) chan *Response { + responseChan := make(chan *Response, 1) + responseChan <- &Response{err: err} return responseChan } -// receiveFuture receives from the passed futureResult channel to extract a +// Expose newFutureError for developer usage when creating custom commands. +func NewFutureError(err error) chan *Response { + return newFutureError(err) +} + +// ReceiveFuture receives from the passed futureResult channel to extract a // reply or any errors. The examined errors include an error in the // futureResult and the error in the reply from the server. This will block // until the result is available on the passed channel. -func receiveFuture(f chan *response) ([]byte, error) { +func ReceiveFuture(f chan *Response) ([]byte, error) { // Wait for a response on the returned channel. r := <-f return r.result, r.err } -// sendPost sends the passed request to the server by issuing an HTTP POST -// request using the provided response channel for the reply. Typically a new -// connection is opened and closed for each command when using this method, -// however, the underlying HTTP client might coalesce multiple commands -// depending on several factors including the remote server configuration. -func (c *Client) sendPost(jReq *jsonRequest) { - // Generate a request to the configured RPC server. - protocol := "http" - if !c.config.DisableTLS { - protocol = "https" - } - url := protocol + "://" + c.config.Host - bodyReader := bytes.NewReader(jReq.marshalledJSON) - httpReq, err := http.NewRequest("POST", url, bodyReader) - if err != nil { - jReq.responseChan <- &response{result: nil, err: err} - return - } - httpReq.Close = true - httpReq.Header.Set("Content-Type", "application/json") - - // Configure basic access authorization. - httpReq.SetBasicAuth(c.config.User, c.config.Pass) - - log.Tracef("Sending command [%s] with id %d", jReq.method, jReq.id) - c.sendPostRequest(httpReq, jReq) -} - // sendRequest sends the passed json request to the associated server using the // provided response channel for the reply. It handles both websocket and HTTP // POST mode depending on the configuration of the client. @@ -863,7 +978,13 @@ func (c *Client) sendRequest(jReq *jsonRequest) { // POST mode, the command is issued via an HTTP client. Otherwise, // the command is issued via the asynchronous websocket channels. if c.config.HTTPPostMode { - c.sendPost(jReq) + if c.batch { + if err := c.addRequest(jReq); err != nil { + log.Warn(err) + } + } else { + c.sendPostRequest(jReq) + } return } @@ -872,7 +993,7 @@ func (c *Client) sendRequest(jReq *jsonRequest) { select { case <-c.connEstablished: default: - jReq.responseChan <- &response{err: ErrClientNotConnected} + jReq.responseChan <- &Response{err: ErrClientNotConnected} return } @@ -881,18 +1002,22 @@ func (c *Client) sendRequest(jReq *jsonRequest) { // channel. Then send the marshalled request via the websocket // connection. if err := c.addRequest(jReq); err != nil { - jReq.responseChan <- &response{err: err} + jReq.responseChan <- &Response{err: err} return } log.Tracef("Sending command [%s] with id %d", jReq.method, jReq.id) c.sendMessage(jReq.marshalledJSON) } -// sendCmd sends the passed command to the associated server and returns a +// SendCmd sends the passed command to the associated server and returns a // response channel on which the reply will be delivered at some point in the // future. It handles both websocket and HTTP POST mode depending on the // configuration of the client. -func (c *Client) sendCmd(cmd interface{}) chan *response { +func (c *Client) SendCmd(cmd interface{}) chan *Response { + rpcVersion := btcjson.RpcVersion1 + if c.batch { + rpcVersion = btcjson.RpcVersion2 + } // Get the method associated with the command. method, err := btcjson.CmdMethod(cmd) if err != nil { @@ -901,13 +1026,13 @@ func (c *Client) sendCmd(cmd interface{}) chan *response { // Marshal the command. id := c.NextID() - marshalledJSON, err := btcjson.MarshalCmd(id, cmd) + marshalledJSON, err := btcjson.MarshalCmd(rpcVersion, id, cmd) if err != nil { return newFutureError(err) } // Generate the request and send it along with a channel to respond on. - responseChan := make(chan *response, 1) + responseChan := make(chan *Response, 1) jReq := &jsonRequest{ id: id, method: method, @@ -915,6 +1040,7 @@ func (c *Client) sendCmd(cmd interface{}) chan *response { marshalledJSON: marshalledJSON, responseChan: responseChan, } + c.sendRequest(jReq) return responseChan @@ -926,7 +1052,7 @@ func (c *Client) sendCmd(cmd interface{}) chan *response { func (c *Client) sendCmdAndWait(cmd interface{}) (interface{}, error) { // Marshal the command to JSON-RPC, send it to the connected server, and // wait for a response on the returned channel. - return receiveFuture(c.sendCmd(cmd)) + return ReceiveFuture(c.SendCmd(cmd)) } // Disconnected returns whether or not the server is disconnected. If a @@ -1007,7 +1133,7 @@ func (c *Client) Disconnect() { if c.config.DisableAutoReconnect { for e := c.requestList.Front(); e != nil; e = e.Next() { req := e.Value.(*jsonRequest) - req.responseChan <- &response{ + req.responseChan <- &Response{ result: nil, err: ErrClientDisconnect, } @@ -1035,7 +1161,7 @@ func (c *Client) Shutdown() { // Send the ErrClientShutdown error to any pending requests. for e := c.requestList.Front(); e != nil; e = e.Next() { req := e.Value.(*jsonRequest) - req.responseChan <- &response{ + req.responseChan <- &Response{ result: nil, err: ErrClientShutdown, } @@ -1093,6 +1219,22 @@ type ConnConfig struct { // Pass is the passphrase to use to authenticate to the RPC server. Pass string + // CookiePath is the path to a cookie file containing the username and + // passphrase to use to authenticate to the RPC server. It is used + // instead of User and Pass if non-empty. + CookiePath string + + cookieLastCheckTime time.Time + cookieLastModTime time.Time + cookieLastUser string + cookieLastPass string + cookieLastErr error + + // Params is the string representing the network that the server + // is running. If there is no parameter set in the config, then + // mainnet will be used by default. + Params string + // DisableTLS specifies whether transport layer security should be // disabled. It is recommended to always use TLS if the RPC server // supports it as otherwise your username and password is sent across @@ -1136,11 +1278,52 @@ type ConnConfig struct { // flag can be set to true to use basic HTTP POST requests instead. HTTPPostMode bool + // ExtraHeaders specifies the extra headers when perform request. It's + // useful when RPC provider need customized headers. + ExtraHeaders map[string]string + // EnableBCInfoHacks is an option provided to enable compatibility hacks // when connecting to blockchain.info RPC server EnableBCInfoHacks bool } +// getAuth returns the username and passphrase that will actually be used for +// this connection. This will be the result of checking the cookie if a cookie +// path is configured; if not, it will be the user-configured username and +// passphrase. +func (config *ConnConfig) getAuth() (username, passphrase string, err error) { + // Try username+passphrase auth first. + if config.Pass != "" { + return config.User, config.Pass, nil + } + + // If no username or passphrase is set, try cookie auth. + return config.retrieveCookie() +} + +// retrieveCookie returns the cookie username and passphrase. +func (config *ConnConfig) retrieveCookie() (username, passphrase string, err error) { + if !config.cookieLastCheckTime.IsZero() && time.Now().Before(config.cookieLastCheckTime.Add(30*time.Second)) { + return config.cookieLastUser, config.cookieLastPass, config.cookieLastErr + } + + config.cookieLastCheckTime = time.Now() + + st, err := os.Stat(config.CookiePath) + if err != nil { + config.cookieLastErr = err + return config.cookieLastUser, config.cookieLastPass, config.cookieLastErr + } + + modTime := st.ModTime() + if !modTime.Equal(config.cookieLastModTime) { + config.cookieLastModTime = modTime + config.cookieLastUser, config.cookieLastPass, config.cookieLastErr = readCookieFile(config.CookiePath) + } + + return config.cookieLastUser, config.cookieLastPass, config.cookieLastErr +} + // newHTTPClient returns a new http client that is configured according to the // proxy and TLS settings in the associated connection configuration. func newHTTPClient(config *ConnConfig) (*http.Client, error) { @@ -1166,16 +1349,55 @@ func newHTTPClient(config *ConnConfig) (*http.Client, error) { } } + parsedDialAddr, err := ParseAddressString(config.Host) + if err != nil { + return nil, err + } client := http.Client{ Transport: &http.Transport{ Proxy: proxyFunc, TLSClientConfig: tlsConfig, + DialContext: func(_ context.Context, _, + _ string) (net.Conn, error) { + + return net.Dial( + parsedDialAddr.Network(), + parsedDialAddr.String(), + ) + }, }, + Timeout: defaultHTTPTimeout, } return &client, nil } +// httpURL returns the URL to use for HTTP POST requests. +func (config *ConnConfig) httpURL() (string, error) { + protocol := "http" + if !config.DisableTLS { + protocol = "https" + } + + parsedAddr, err := ParseAddressString(config.Host) + if err != nil { + return "", fmt.Errorf("error parsing host '%v': %v", + config.Host, err) + } + + var httpURL string + switch parsedAddr.Network() { + case "unix", "unixpacket": + // Using a placeholder URL because a non-empty URL is required. + // The Unix domain socket is specified in the DialContext. + httpURL = protocol + "://unix" + default: + httpURL = protocol + "://" + config.Host + } + + return httpURL, nil +} + // dial opens a websocket connection using the passed connection configuration // details. func dial(config *ConnConfig) (*websocket.Conn, error) { @@ -1210,10 +1432,17 @@ func dial(config *ConnConfig) (*websocket.Conn, error) { // The RPC server requires basic authorization, so create a custom // request header with the Authorization header set. - login := config.User + ":" + config.Pass + user, pass, err := config.getAuth() + if err != nil { + return nil, err + } + login := user + ":" + pass auth := "Basic " + base64.StdEncoding.EncodeToString([]byte(login)) requestHeader := make(http.Header) requestHeader.Add("Authorization", auth) + for key, value := range config.ExtraHeaders { + requestHeader.Add(key, value) + } // Dial the connection. url := fmt.Sprintf("%s://%s/%s", scheme, config.Host, config.Endpoint) @@ -1281,15 +1510,36 @@ func New(config *ConnConfig, ntfnHandlers *NotificationHandlers) (*Client, error httpClient: httpClient, requestMap: make(map[uint64]*list.Element), requestList: list.New(), + batch: false, + batchList: list.New(), ntfnHandlers: ntfnHandlers, ntfnState: newNotificationState(), sendChan: make(chan []byte, sendBufferSize), - sendPostChan: make(chan *sendPostDetails, sendPostBufferSize), + sendPostChan: make(chan *jsonRequest, sendPostBufferSize), connEstablished: connEstablished, disconnect: make(chan struct{}), shutdown: make(chan struct{}), } + // Default network is mainnet, no parameters are necessary but if mainnet + // is specified it will be the param + switch config.Params { + case "": + fallthrough + case chaincfg.MainNetParams.Name: + client.chainParams = &chaincfg.MainNetParams + case chaincfg.TestNet3Params.Name: + client.chainParams = &chaincfg.TestNet3Params + case chaincfg.RegressionNetParams.Name: + client.chainParams = &chaincfg.RegressionNetParams + case chaincfg.SigNetParams.Name: + client.chainParams = &chaincfg.SigNetParams + case chaincfg.SimNetParams.Name: + client.chainParams = &chaincfg.SimNetParams + default: + return nil, fmt.Errorf("rpcclient.New: Unknown chain %s", config.Params) + } + if start { log.Infof("Established connection to RPC server %s", config.Host) @@ -1304,6 +1554,24 @@ func New(config *ConnConfig, ntfnHandlers *NotificationHandlers) (*Client, error return client, nil } +// Batch is a factory that creates a client able to interact with the server using +// JSON-RPC 2.0. The client is capable of accepting an arbitrary number of requests +// and having the server process the all at the same time. It's compatible with both +// btcd and bitcoind +func NewBatch(config *ConnConfig) (*Client, error) { + if !config.HTTPPostMode { + return nil, errors.New("http post mode is required to use batch client") + } + // notification parameter is nil since notifications are not supported in POST mode. + client, err := New(config, nil) + if err != nil { + return nil, err + } + client.batch = true //copy the client with changed batch setting + client.start() + return client, nil +} + // Connect establishes the initial websocket connection. This is necessary when // a client was created after setting the DisableConnectOnNew field of the // Config struct. @@ -1361,36 +1629,6 @@ func (c *Client) Connect(tries int) error { return err } -const ( - // bitcoind19Str is the string representation of bitcoind v0.19.0. - bitcoind19Str = "0.19.0" - - // bitcoindVersionPrefix specifies the prefix included in every bitcoind - // version exposed through GetNetworkInfo. - bitcoindVersionPrefix = "/Satoshi:" - - // bitcoindVersionSuffix specifies the suffix included in every bitcoind - // version exposed through GetNetworkInfo. - bitcoindVersionSuffix = "/" -) - -// parseBitcoindVersion parses the bitcoind version from its string -// representation. -func parseBitcoindVersion(version string) BackendVersion { - // Trim the version of its prefix and suffix to determine the - // appropriate version number. - version = strings.TrimPrefix( - strings.TrimSuffix(version, bitcoindVersionSuffix), - bitcoindVersionPrefix, - ) - switch { - case version < bitcoind19Str: - return BitcoindPre19 - default: - return BitcoindPost19 - } -} - // BackendVersion retrieves the version of the backend the client is currently // connected to. func (c *Client) BackendVersion() (BackendVersion, error) { @@ -1398,7 +1636,7 @@ func (c *Client) BackendVersion() (BackendVersion, error) { defer c.backendVersionMu.Unlock() if c.backendVersion != nil { - return *c.backendVersion, nil + return c.backendVersion, nil } // We'll start by calling GetInfo. This method doesn't exist for @@ -1410,20 +1648,20 @@ func (c *Client) BackendVersion() (BackendVersion, error) { // Parse the btcd version and cache it. case nil: log.Debugf("Detected btcd version: %v", info.Version) - version := Btcd - c.backendVersion = &version - return *c.backendVersion, nil + version := parseBtcdVersion(info.Version) + c.backendVersion = version + return c.backendVersion, nil // Inspect the RPC error to ensure the method was not found, otherwise // we actually ran into an error. case *btcjson.RPCError: if err.Code != btcjson.ErrRPCMethodNotFound.Code { - return 0, fmt.Errorf("unable to detect btcd version: "+ + return nil, fmt.Errorf("unable to detect btcd version: "+ "%v", err) } default: - return 0, fmt.Errorf("unable to detect btcd version: %v", err) + return nil, fmt.Errorf("unable to detect btcd version: %v", err) } // Since the GetInfo method was not found, we assume the client is @@ -1431,7 +1669,8 @@ func (c *Client) BackendVersion() (BackendVersion, error) { // GetNetworkInfo. networkInfo, err := c.GetNetworkInfo() if err != nil { - return 0, fmt.Errorf("unable to detect bitcoind version: %v", err) + return nil, fmt.Errorf("unable to detect bitcoind version: %v", + err) } // Parse the bitcoind version and cache it. @@ -1439,5 +1678,165 @@ func (c *Client) BackendVersion() (BackendVersion, error) { version := parseBitcoindVersion(networkInfo.SubVersion) c.backendVersion = &version - return *c.backendVersion, nil + return c.backendVersion, nil +} + +func (c *Client) sendAsync() (FutureGetBulkResult, error) { + c.batchLock.Lock() + defer c.batchLock.Unlock() + + // If batchList is empty, there's nothing to send. + if c.batchList.Len() == 0 { + return nil, ErrEmptyBatch + } + + // convert the array of marshalled json requests to a single request we can send + responseChan := make(chan *Response, 1) + marshalledRequest := []byte("[") + for iter := c.batchList.Front(); iter != nil; iter = iter.Next() { + request := iter.Value.(*jsonRequest) + marshalledRequest = append(marshalledRequest, request.marshalledJSON...) + marshalledRequest = append(marshalledRequest, []byte(",")...) + } + if len(marshalledRequest) > 0 { + // removes the trailing comma to process the request individually + marshalledRequest = marshalledRequest[:len(marshalledRequest)-1] + } + marshalledRequest = append(marshalledRequest, []byte("]")...) + request := jsonRequest{ + id: c.NextID(), + method: "", + cmd: nil, + marshalledJSON: marshalledRequest, + responseChan: responseChan, + } + c.sendPostRequest(&request) + return responseChan, nil +} + +// Marshall's bulk requests and sends to the server +// creates a response channel to receive the response +func (c *Client) Send() error { + future, err := c.sendAsync() + if err != nil { + return err + } + + batchResp, err := future.Receive() + if err != nil { + // Clear batchlist in case of an error. + + c.batchLock.Lock() + c.batchList = list.New() + c.batchLock.Unlock() + + return err + } + + // Iterate each response and send it to the corresponding request. + for id, resp := range batchResp { + // Perform a GC on batchList and requestMap before moving + // forward. + request := c.removeRequest(id) + if request == nil { + // Perhaps another goroutine has already processed this request. + continue + } + + // If there's an error, we log it and continue to the next + // request. + fullResult, err := json.Marshal(resp.Result) + if err != nil { + log.Errorf("Unable to marshal result: %v for req=%v", + err, request.id) + + continue + } + + // If there's a response error, we send it back the request. + var requestError error + if resp.Error != nil { + requestError = resp.Error + } + + result := Response{ + result: fullResult, + err: requestError, + } + request.responseChan <- &result + } + + return nil +} + +// cutPrefix returns s without the provided leading prefix string +// and reports whether it found the prefix. +// If s doesn't start with prefix, cutPrefix returns s, false. +// If prefix is the empty string, cutPrefix returns s, true. +// Copied from go1.20 version. +func cutPrefix(s, prefix string) (after string, found bool) { + if !strings.HasPrefix(s, prefix) { + return s, false + } + return s[len(prefix):], true +} + +// ParseAddressString converts an address in string format to a net.Addr that is +// compatible with btcd. UDP is not supported because btcd needs reliable +// connections. +func ParseAddressString(strAddress string) (net.Addr, error) { + // Addresses can either be in unix://address, unixpacket://address URL + // format, or just address:port host format for tcp. + if after, ok := cutPrefix(strAddress, "unix://"); ok { + return net.ResolveUnixAddr("unix", after) + } + if after, ok := cutPrefix(strAddress, "unixpacket://"); ok { + return net.ResolveUnixAddr("unixpacket", after) + } + + if strings.Contains(strAddress, "://") { + // Not supporting :// anywhere in the host or path. + return nil, fmt.Errorf("unsupported protocol in address: %s", + strAddress) + } + + // Parse it as a dummy URL to get the host and port. + u, err := url.Parse("dummy://" + strAddress) + if err != nil { + return nil, err + } + return net.ResolveTCPAddr("tcp", verifyPort(u.Host)) +} + +// verifyPort makes sure that an address string has both a host and a port. +// If the address is just a port, then we'll assume that the user is using the +// shortcut to specify a localhost:port address. +func verifyPort(address string) string { + host, port, err := net.SplitHostPort(address) + if err != nil { + // If the address itself is just an integer, then we'll assume + // that we're mapping this directly to a localhost:port pair. + // This ensures we maintain the legacy behavior. + if _, err := strconv.Atoi(address); err == nil { + return net.JoinHostPort("localhost", address) + } + + // Otherwise, we'll assume that the address just failed to + // attach its own port, so we'll leave it as is. In the + // case of IPv6 addresses, if the host is already surrounded by + // brackets, then we'll avoid using the JoinHostPort function, + // since it will always add a pair of brackets. + if strings.HasPrefix(address, "[") { + return address + } + return net.JoinHostPort(address, "") + } + + // In the case that both the host and port are empty, we'll use an empty + // port. + if host == "" && port == "" { + return ":" + } + + return address } diff --git a/rpcclient/infrastructure_test.go b/rpcclient/infrastructure_test.go new file mode 100644 index 0000000000..8416b7ad3c --- /dev/null +++ b/rpcclient/infrastructure_test.go @@ -0,0 +1,110 @@ +package rpcclient + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +// TestParseAddressString checks different variation of supported and +// unsupported addresses. +func TestParseAddressString(t *testing.T) { + t.Parallel() + + // Using localhost only to avoid network calls. + testCases := []struct { + name string + addressString string + expNetwork string + expAddress string + expErrStr string + }{ + { + name: "localhost", + addressString: "localhost", + expNetwork: "tcp", + expAddress: "127.0.0.1:0", + }, + { + name: "localhost ip", + addressString: "127.0.0.1", + expNetwork: "tcp", + expAddress: "127.0.0.1:0", + }, + { + name: "localhost ipv6", + addressString: "::1", + expNetwork: "tcp", + expAddress: "[::1]:0", + }, + { + name: "localhost and port", + addressString: "localhost:80", + expNetwork: "tcp", + expAddress: "127.0.0.1:80", + }, + { + name: "localhost ipv6 and port", + addressString: "[::1]:80", + expNetwork: "tcp", + expAddress: "[::1]:80", + }, + { + name: "colon and port", + addressString: ":80", + expNetwork: "tcp", + expAddress: ":80", + }, + { + name: "colon only", + addressString: ":", + expNetwork: "tcp", + expAddress: ":0", + }, + { + name: "localhost and path", + addressString: "localhost/path", + expNetwork: "tcp", + expAddress: "127.0.0.1:0", + }, + { + name: "localhost port and path", + addressString: "localhost:80/path", + expNetwork: "tcp", + expAddress: "127.0.0.1:80", + }, + { + name: "unix prefix", + addressString: "unix://the/rest/of/the/path", + expNetwork: "unix", + expAddress: "the/rest/of/the/path", + }, + { + name: "unix prefix", + addressString: "unixpacket://the/rest/of/the/path", + expNetwork: "unixpacket", + expAddress: "the/rest/of/the/path", + }, + { + name: "error http prefix", + addressString: "http://localhost:1010", + expErrStr: "unsupported protocol in address", + }, + } + + for _, tc := range testCases { + tc := tc + + t.Run(tc.name, func(t *testing.T) { + addr, err := ParseAddressString(tc.addressString) + if tc.expErrStr != "" { + require.Error(t, err) + require.Contains(t, err.Error(), tc.expErrStr) + return + } + require.NoError(t, err) + require.Equal(t, tc.expNetwork, addr.Network()) + require.Equal(t, tc.expAddress, addr.String()) + }) + } +} diff --git a/rpcclient/mining.go b/rpcclient/mining.go index 76a9d30580..9de2f27ed6 100644 --- a/rpcclient/mining.go +++ b/rpcclient/mining.go @@ -10,18 +10,18 @@ import ( "errors" "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg/chainhash" - "github.com/btcsuite/btcutil" ) // FutureGenerateResult is a future promise to deliver the result of a // GenerateAsync RPC invocation (or an applicable error). -type FutureGenerateResult chan *response +type FutureGenerateResult chan *Response -// Receive waits for the response promised by the future and returns a list of +// Receive waits for the Response promised by the future and returns a list of // block hashes generated by the call. func (r FutureGenerateResult) Receive() ([]*chainhash.Hash, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -53,7 +53,7 @@ func (r FutureGenerateResult) Receive() ([]*chainhash.Hash, error) { // See Generate for the blocking version and more details. func (c *Client) GenerateAsync(numBlocks uint32) FutureGenerateResult { cmd := btcjson.NewGenerateCmd(numBlocks) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // Generate generates numBlocks blocks and returns their hashes. @@ -61,14 +61,61 @@ func (c *Client) Generate(numBlocks uint32) ([]*chainhash.Hash, error) { return c.GenerateAsync(numBlocks).Receive() } +// FutureGenerateToAddressResult is a future promise to deliver the result of a +// GenerateToAddressResult RPC invocation (or an applicable error). +type FutureGenerateToAddressResult chan *Response + +// Receive waits for the Response promised by the future and returns the hashes of +// of the generated blocks. +func (f FutureGenerateToAddressResult) Receive() ([]*chainhash.Hash, error) { + res, err := ReceiveFuture(f) + if err != nil { + return nil, err + } + + // Unmarshal result as a list of strings. + var result []string + err = json.Unmarshal(res, &result) + if err != nil { + return nil, err + } + + // Convert each block hash to a chainhash.Hash and store a pointer to + // each. + convertedResult := make([]*chainhash.Hash, len(result)) + for i, hashString := range result { + convertedResult[i], err = chainhash.NewHashFromStr(hashString) + if err != nil { + return nil, err + } + } + + return convertedResult, nil +} + +// GenerateToAddressAsync returns an instance of a type that can be used to get +// the result of the RPC at some future time by invoking the Receive function on +// the returned instance. +// +// See GenerateToAddress for the blocking version and more details. +func (c *Client) GenerateToAddressAsync(numBlocks int64, address btcutil.Address, maxTries *int64) FutureGenerateToAddressResult { + cmd := btcjson.NewGenerateToAddressCmd(numBlocks, address.EncodeAddress(), maxTries) + return c.SendCmd(cmd) +} + +// GenerateToAddress generates numBlocks blocks to the given address and returns their hashes. +func (c *Client) GenerateToAddress(numBlocks int64, address btcutil.Address, maxTries *int64) ([]*chainhash.Hash, error) { + return c.GenerateToAddressAsync(numBlocks, address, maxTries).Receive() +} + // FutureGetGenerateResult is a future promise to deliver the result of a // GetGenerateAsync RPC invocation (or an applicable error). -type FutureGetGenerateResult chan *response +type FutureGetGenerateResult chan *Response -// Receive waits for the response promised by the future and returns true if the +// Receive waits for the Response promised by the future and returns true if the // server is set to mine, otherwise false. func (r FutureGetGenerateResult) Receive() (bool, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return false, err } @@ -90,7 +137,7 @@ func (r FutureGetGenerateResult) Receive() (bool, error) { // See GetGenerate for the blocking version and more details. func (c *Client) GetGenerateAsync() FutureGetGenerateResult { cmd := btcjson.NewGetGenerateCmd() - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetGenerate returns true if the server is set to mine, otherwise false. @@ -100,12 +147,12 @@ func (c *Client) GetGenerate() (bool, error) { // FutureSetGenerateResult is a future promise to deliver the result of a // SetGenerateAsync RPC invocation (or an applicable error). -type FutureSetGenerateResult chan *response +type FutureSetGenerateResult chan *Response -// Receive waits for the response promised by the future and returns an error if +// Receive waits for the Response promised by the future and returns an error if // any occurred when setting the server to generate coins (mine) or not. func (r FutureSetGenerateResult) Receive() error { - _, err := receiveFuture(r) + _, err := ReceiveFuture(r) return err } @@ -116,7 +163,7 @@ func (r FutureSetGenerateResult) Receive() error { // See SetGenerate for the blocking version and more details. func (c *Client) SetGenerateAsync(enable bool, numCPUs int) FutureSetGenerateResult { cmd := btcjson.NewSetGenerateCmd(enable, &numCPUs) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // SetGenerate sets the server to generate coins (mine) or not. @@ -126,13 +173,13 @@ func (c *Client) SetGenerate(enable bool, numCPUs int) error { // FutureGetHashesPerSecResult is a future promise to deliver the result of a // GetHashesPerSecAsync RPC invocation (or an applicable error). -type FutureGetHashesPerSecResult chan *response +type FutureGetHashesPerSecResult chan *Response -// Receive waits for the response promised by the future and returns a recent +// Receive waits for the Response promised by the future and returns a recent // hashes per second performance measurement while generating coins (mining). // Zero is returned if the server is not mining. func (r FutureGetHashesPerSecResult) Receive() (int64, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return -1, err } @@ -154,7 +201,7 @@ func (r FutureGetHashesPerSecResult) Receive() (int64, error) { // See GetHashesPerSec for the blocking version and more details. func (c *Client) GetHashesPerSecAsync() FutureGetHashesPerSecResult { cmd := btcjson.NewGetHashesPerSecCmd() - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetHashesPerSec returns a recent hashes per second performance measurement @@ -166,12 +213,12 @@ func (c *Client) GetHashesPerSec() (int64, error) { // FutureGetMiningInfoResult is a future promise to deliver the result of a // GetMiningInfoAsync RPC invocation (or an applicable error). -type FutureGetMiningInfoResult chan *response +type FutureGetMiningInfoResult chan *Response -// Receive waits for the response promised by the future and returns the mining +// Receive waits for the Response promised by the future and returns the mining // information. func (r FutureGetMiningInfoResult) Receive() (*btcjson.GetMiningInfoResult, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -193,7 +240,7 @@ func (r FutureGetMiningInfoResult) Receive() (*btcjson.GetMiningInfoResult, erro // See GetMiningInfo for the blocking version and more details. func (c *Client) GetMiningInfoAsync() FutureGetMiningInfoResult { cmd := btcjson.NewGetMiningInfoCmd() - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetMiningInfo returns mining information. @@ -203,19 +250,19 @@ func (c *Client) GetMiningInfo() (*btcjson.GetMiningInfoResult, error) { // FutureGetNetworkHashPS is a future promise to deliver the result of a // GetNetworkHashPSAsync RPC invocation (or an applicable error). -type FutureGetNetworkHashPS chan *response +type FutureGetNetworkHashPS chan *Response -// Receive waits for the response promised by the future and returns the +// Receive waits for the Response promised by the future and returns the // estimated network hashes per second for the block heights provided by the // parameters. -func (r FutureGetNetworkHashPS) Receive() (int64, error) { - res, err := receiveFuture(r) +func (r FutureGetNetworkHashPS) Receive() (float64, error) { + res, err := ReceiveFuture(r) if err != nil { return -1, err } - // Unmarshal result as an int64. - var result int64 + // Unmarshal result as an float64. + var result float64 err = json.Unmarshal(res, &result) if err != nil { return 0, err @@ -231,7 +278,7 @@ func (r FutureGetNetworkHashPS) Receive() (int64, error) { // See GetNetworkHashPS for the blocking version and more details. func (c *Client) GetNetworkHashPSAsync() FutureGetNetworkHashPS { cmd := btcjson.NewGetNetworkHashPSCmd(nil, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetNetworkHashPS returns the estimated network hashes per second using the @@ -239,7 +286,7 @@ func (c *Client) GetNetworkHashPSAsync() FutureGetNetworkHashPS { // // See GetNetworkHashPS2 to override the number of blocks to use and // GetNetworkHashPS3 to override the height at which to calculate the estimate. -func (c *Client) GetNetworkHashPS() (int64, error) { +func (c *Client) GetNetworkHashPS() (float64, error) { return c.GetNetworkHashPSAsync().Receive() } @@ -250,7 +297,7 @@ func (c *Client) GetNetworkHashPS() (int64, error) { // See GetNetworkHashPS2 for the blocking version and more details. func (c *Client) GetNetworkHashPS2Async(blocks int) FutureGetNetworkHashPS { cmd := btcjson.NewGetNetworkHashPSCmd(&blocks, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetNetworkHashPS2 returns the estimated network hashes per second for the @@ -260,7 +307,7 @@ func (c *Client) GetNetworkHashPS2Async(blocks int) FutureGetNetworkHashPS { // // See GetNetworkHashPS to use defaults and GetNetworkHashPS3 to override the // height at which to calculate the estimate. -func (c *Client) GetNetworkHashPS2(blocks int) (int64, error) { +func (c *Client) GetNetworkHashPS2(blocks int) (float64, error) { return c.GetNetworkHashPS2Async(blocks).Receive() } @@ -271,7 +318,7 @@ func (c *Client) GetNetworkHashPS2(blocks int) (int64, error) { // See GetNetworkHashPS3 for the blocking version and more details. func (c *Client) GetNetworkHashPS3Async(blocks, height int) FutureGetNetworkHashPS { cmd := btcjson.NewGetNetworkHashPSCmd(&blocks, &height) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetNetworkHashPS3 returns the estimated network hashes per second for the @@ -280,18 +327,18 @@ func (c *Client) GetNetworkHashPS3Async(blocks, height int) FutureGetNetworkHash // of blocks since the last difficulty change will be used. // // See GetNetworkHashPS and GetNetworkHashPS2 to use defaults. -func (c *Client) GetNetworkHashPS3(blocks, height int) (int64, error) { +func (c *Client) GetNetworkHashPS3(blocks, height int) (float64, error) { return c.GetNetworkHashPS3Async(blocks, height).Receive() } // FutureGetWork is a future promise to deliver the result of a // GetWorkAsync RPC invocation (or an applicable error). -type FutureGetWork chan *response +type FutureGetWork chan *Response -// Receive waits for the response promised by the future and returns the hash +// Receive waits for the Response promised by the future and returns the hash // data to work on. func (r FutureGetWork) Receive() (*btcjson.GetWorkResult, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -313,7 +360,7 @@ func (r FutureGetWork) Receive() (*btcjson.GetWorkResult, error) { // See GetWork for the blocking version and more details. func (c *Client) GetWorkAsync() FutureGetWork { cmd := btcjson.NewGetWorkCmd(nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetWork returns hash data to work on. @@ -325,12 +372,12 @@ func (c *Client) GetWork() (*btcjson.GetWorkResult, error) { // FutureGetWorkSubmit is a future promise to deliver the result of a // GetWorkSubmitAsync RPC invocation (or an applicable error). -type FutureGetWorkSubmit chan *response +type FutureGetWorkSubmit chan *Response -// Receive waits for the response promised by the future and returns whether +// Receive waits for the Response promised by the future and returns whether // or not the submitted block header was accepted. func (r FutureGetWorkSubmit) Receive() (bool, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return false, err } @@ -352,7 +399,7 @@ func (r FutureGetWorkSubmit) Receive() (bool, error) { // See GetWorkSubmit for the blocking version and more details. func (c *Client) GetWorkSubmitAsync(data string) FutureGetWorkSubmit { cmd := btcjson.NewGetWorkCmd(&data) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetWorkSubmit submits a block header which is a solution to previously @@ -365,12 +412,12 @@ func (c *Client) GetWorkSubmit(data string) (bool, error) { // FutureSubmitBlockResult is a future promise to deliver the result of a // SubmitBlockAsync RPC invocation (or an applicable error). -type FutureSubmitBlockResult chan *response +type FutureSubmitBlockResult chan *Response -// Receive waits for the response promised by the future and returns an error if +// Receive waits for the Response promised by the future and returns an error if // any occurred when submitting the block. func (r FutureSubmitBlockResult) Receive() error { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return err } @@ -406,7 +453,7 @@ func (c *Client) SubmitBlockAsync(block *btcutil.Block, options *btcjson.SubmitB } cmd := btcjson.NewSubmitBlockCmd(blockHex, options) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // SubmitBlock attempts to submit a new block into the bitcoin network. @@ -414,4 +461,39 @@ func (c *Client) SubmitBlock(block *btcutil.Block, options *btcjson.SubmitBlockO return c.SubmitBlockAsync(block, options).Receive() } -// TODO(davec): Implement GetBlockTemplate +// FutureGetBlockTemplateResponse is a future promise to deliver the result of a +// GetBlockTemplateAsync RPC invocation (or an applicable error). +type FutureGetBlockTemplateResponse chan *Response + +// Receive waits for the Response promised by the future and returns an error if +// any occurred when retrieving the block template. +func (r FutureGetBlockTemplateResponse) Receive() (*btcjson.GetBlockTemplateResult, error) { + res, err := ReceiveFuture(r) + if err != nil { + return nil, err + } + + // Unmarshal result as a getwork result object. + var result btcjson.GetBlockTemplateResult + err = json.Unmarshal(res, &result) + if err != nil { + return nil, err + } + + return &result, nil +} + +// GetBlockTemplateAsync returns an instance of a type that can be used to get the +// result of the RPC at some future time by invoking the Receive function on the +// returned instance. +// +// See GetBlockTemplate for the blocking version and more details. +func (c *Client) GetBlockTemplateAsync(req *btcjson.TemplateRequest) FutureGetBlockTemplateResponse { + cmd := btcjson.NewGetBlockTemplateCmd(req) + return c.SendCmd(cmd) +} + +// GetBlockTemplate returns a new block template for mining. +func (c *Client) GetBlockTemplate(req *btcjson.TemplateRequest) (*btcjson.GetBlockTemplateResult, error) { + return c.GetBlockTemplateAsync(req).Receive() +} diff --git a/rpcclient/net.go b/rpcclient/net.go index 6eb7362541..da2006c224 100644 --- a/rpcclient/net.go +++ b/rpcclient/net.go @@ -35,12 +35,12 @@ func (cmd AddNodeCommand) String() string { // FutureAddNodeResult is a future promise to deliver the result of an // AddNodeAsync RPC invocation (or an applicable error). -type FutureAddNodeResult chan *response +type FutureAddNodeResult chan *Response -// Receive waits for the response promised by the future and returns an error if +// Receive waits for the Response promised by the future and returns an error if // any occurred when performing the specified command. func (r FutureAddNodeResult) Receive() error { - _, err := receiveFuture(r) + _, err := ReceiveFuture(r) return err } @@ -51,7 +51,7 @@ func (r FutureAddNodeResult) Receive() error { // See AddNode for the blocking version and more details. func (c *Client) AddNodeAsync(host string, command AddNodeCommand) FutureAddNodeResult { cmd := btcjson.NewAddNodeCmd(host, btcjson.AddNodeSubCmd(command)) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // AddNode attempts to perform the passed command on the passed persistent peer. @@ -65,12 +65,12 @@ func (c *Client) AddNode(host string, command AddNodeCommand) error { // FutureNodeResult is a future promise to deliver the result of a NodeAsync // RPC invocation (or an applicable error). -type FutureNodeResult chan *response +type FutureNodeResult chan *Response -// Receive waits for the response promised by the future and returns an error if +// Receive waits for the Response promised by the future and returns an error if // any occurred when performing the specified command. func (r FutureNodeResult) Receive() error { - _, err := receiveFuture(r) + _, err := ReceiveFuture(r) return err } @@ -82,7 +82,7 @@ func (r FutureNodeResult) Receive() error { func (c *Client) NodeAsync(command btcjson.NodeSubCmd, host string, connectSubCmd *string) FutureNodeResult { cmd := btcjson.NewNodeCmd(command, host, connectSubCmd) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // Node attempts to perform the passed node command on the host. @@ -90,7 +90,7 @@ func (c *Client) NodeAsync(command btcjson.NodeSubCmd, host string, // connect or diconnect a non-persistent one. // // The connectSubCmd should be set either "perm" or "temp", depending on -// whether we are targetting a persistent or non-persistent peer. Passing nil +// whether we are targeting a persistent or non-persistent peer. Passing nil // will cause the default value to be used, which currently is "temp". func (c *Client) Node(command btcjson.NodeSubCmd, host string, connectSubCmd *string) error { @@ -99,12 +99,12 @@ func (c *Client) Node(command btcjson.NodeSubCmd, host string, // FutureGetAddedNodeInfoResult is a future promise to deliver the result of a // GetAddedNodeInfoAsync RPC invocation (or an applicable error). -type FutureGetAddedNodeInfoResult chan *response +type FutureGetAddedNodeInfoResult chan *Response -// Receive waits for the response promised by the future and returns information +// Receive waits for the Response promised by the future and returns information // about manually added (persistent) peers. func (r FutureGetAddedNodeInfoResult) Receive() ([]btcjson.GetAddedNodeInfoResult, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -126,7 +126,7 @@ func (r FutureGetAddedNodeInfoResult) Receive() ([]btcjson.GetAddedNodeInfoResul // See GetAddedNodeInfo for the blocking version and more details. func (c *Client) GetAddedNodeInfoAsync(peer string) FutureGetAddedNodeInfoResult { cmd := btcjson.NewGetAddedNodeInfoCmd(true, &peer) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetAddedNodeInfo returns information about manually added (persistent) peers. @@ -139,12 +139,12 @@ func (c *Client) GetAddedNodeInfo(peer string) ([]btcjson.GetAddedNodeInfoResult // FutureGetAddedNodeInfoNoDNSResult is a future promise to deliver the result // of a GetAddedNodeInfoNoDNSAsync RPC invocation (or an applicable error). -type FutureGetAddedNodeInfoNoDNSResult chan *response +type FutureGetAddedNodeInfoNoDNSResult chan *Response -// Receive waits for the response promised by the future and returns a list of +// Receive waits for the Response promised by the future and returns a list of // manually added (persistent) peers. func (r FutureGetAddedNodeInfoNoDNSResult) Receive() ([]string, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -166,7 +166,7 @@ func (r FutureGetAddedNodeInfoNoDNSResult) Receive() ([]string, error) { // See GetAddedNodeInfoNoDNS for the blocking version and more details. func (c *Client) GetAddedNodeInfoNoDNSAsync(peer string) FutureGetAddedNodeInfoNoDNSResult { cmd := btcjson.NewGetAddedNodeInfoCmd(false, &peer) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetAddedNodeInfoNoDNS returns a list of manually added (persistent) peers. @@ -180,12 +180,12 @@ func (c *Client) GetAddedNodeInfoNoDNS(peer string) ([]string, error) { // FutureGetConnectionCountResult is a future promise to deliver the result // of a GetConnectionCountAsync RPC invocation (or an applicable error). -type FutureGetConnectionCountResult chan *response +type FutureGetConnectionCountResult chan *Response -// Receive waits for the response promised by the future and returns the number +// Receive waits for the Response promised by the future and returns the number // of active connections to other peers. func (r FutureGetConnectionCountResult) Receive() (int64, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return 0, err } @@ -207,7 +207,7 @@ func (r FutureGetConnectionCountResult) Receive() (int64, error) { // See GetConnectionCount for the blocking version and more details. func (c *Client) GetConnectionCountAsync() FutureGetConnectionCountResult { cmd := btcjson.NewGetConnectionCountCmd() - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetConnectionCount returns the number of active connections to other peers. @@ -217,12 +217,12 @@ func (c *Client) GetConnectionCount() (int64, error) { // FuturePingResult is a future promise to deliver the result of a PingAsync RPC // invocation (or an applicable error). -type FuturePingResult chan *response +type FuturePingResult chan *Response -// Receive waits for the response promised by the future and returns the result +// Receive waits for the Response promised by the future and returns the result // of queueing a ping to be sent to each connected peer. func (r FuturePingResult) Receive() error { - _, err := receiveFuture(r) + _, err := ReceiveFuture(r) return err } @@ -233,7 +233,7 @@ func (r FuturePingResult) Receive() error { // See Ping for the blocking version and more details. func (c *Client) PingAsync() FuturePingResult { cmd := btcjson.NewPingCmd() - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // Ping queues a ping to be sent to each connected peer. @@ -246,12 +246,12 @@ func (c *Client) Ping() error { // FutureGetNetworkInfoResult is a future promise to deliver the result of a // GetNetworkInfoAsync RPC invocation (or an applicable error). -type FutureGetNetworkInfoResult chan *response +type FutureGetNetworkInfoResult chan *Response -// Receive waits for the response promised by the future and returns data about +// Receive waits for the Response promised by the future and returns data about // the current network. func (r FutureGetNetworkInfoResult) Receive() (*btcjson.GetNetworkInfoResult, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -273,7 +273,7 @@ func (r FutureGetNetworkInfoResult) Receive() (*btcjson.GetNetworkInfoResult, er // See GetNetworkInfo for the blocking version and more details. func (c *Client) GetNetworkInfoAsync() FutureGetNetworkInfoResult { cmd := btcjson.NewGetNetworkInfoCmd() - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetNetworkInfo returns data about the current network. @@ -281,14 +281,51 @@ func (c *Client) GetNetworkInfo() (*btcjson.GetNetworkInfoResult, error) { return c.GetNetworkInfoAsync().Receive() } +// FutureGetNodeAddressesResult is a future promise to deliver the result of a +// GetNodeAddressesAsync RPC invocation (or an applicable error). +type FutureGetNodeAddressesResult chan *Response + +// Receive waits for the Response promised by the future and returns data about +// known node addresses. +func (r FutureGetNodeAddressesResult) Receive() ([]btcjson.GetNodeAddressesResult, error) { + res, err := ReceiveFuture(r) + if err != nil { + return nil, err + } + + // Unmarshal result as an array of getnodeaddresses result objects. + var nodeAddresses []btcjson.GetNodeAddressesResult + err = json.Unmarshal(res, &nodeAddresses) + if err != nil { + return nil, err + } + + return nodeAddresses, nil +} + +// GetNodeAddressesAsync returns an instance of a type that can be used to get the +// result of the RPC at some future time by invoking the Receive function on the +// returned instance. +// +// See GetNodeAddresses for the blocking version and more details. +func (c *Client) GetNodeAddressesAsync(count *int32) FutureGetNodeAddressesResult { + cmd := btcjson.NewGetNodeAddressesCmd(count) + return c.SendCmd(cmd) +} + +// GetNodeAddresses returns data about known node addresses. +func (c *Client) GetNodeAddresses(count *int32) ([]btcjson.GetNodeAddressesResult, error) { + return c.GetNodeAddressesAsync(count).Receive() +} + // FutureGetPeerInfoResult is a future promise to deliver the result of a // GetPeerInfoAsync RPC invocation (or an applicable error). -type FutureGetPeerInfoResult chan *response +type FutureGetPeerInfoResult chan *Response -// Receive waits for the response promised by the future and returns data about +// Receive waits for the Response promised by the future and returns data about // each connected network peer. func (r FutureGetPeerInfoResult) Receive() ([]btcjson.GetPeerInfoResult, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -310,7 +347,7 @@ func (r FutureGetPeerInfoResult) Receive() ([]btcjson.GetPeerInfoResult, error) // See GetPeerInfo for the blocking version and more details. func (c *Client) GetPeerInfoAsync() FutureGetPeerInfoResult { cmd := btcjson.NewGetPeerInfoCmd() - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetPeerInfo returns data about each connected network peer. @@ -320,12 +357,12 @@ func (c *Client) GetPeerInfo() ([]btcjson.GetPeerInfoResult, error) { // FutureGetNetTotalsResult is a future promise to deliver the result of a // GetNetTotalsAsync RPC invocation (or an applicable error). -type FutureGetNetTotalsResult chan *response +type FutureGetNetTotalsResult chan *Response -// Receive waits for the response promised by the future and returns network +// Receive waits for the Response promised by the future and returns network // traffic statistics. func (r FutureGetNetTotalsResult) Receive() (*btcjson.GetNetTotalsResult, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -347,7 +384,7 @@ func (r FutureGetNetTotalsResult) Receive() (*btcjson.GetNetTotalsResult, error) // See GetNetTotals for the blocking version and more details. func (c *Client) GetNetTotalsAsync() FutureGetNetTotalsResult { cmd := btcjson.NewGetNetTotalsCmd() - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetNetTotals returns network traffic statistics. diff --git a/rpcclient/notify.go b/rpcclient/notify.go index 2454a94696..1f5cd48075 100644 --- a/rpcclient/notify.go +++ b/rpcclient/notify.go @@ -14,9 +14,9 @@ import ( "time" "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) var ( @@ -69,9 +69,9 @@ func newNotificationState() *notificationState { // result waiting on the channel with the reply set to nil. This is useful // to ignore things such as notifications when the caller didn't specify any // notification handlers. -func newNilFutureResult() chan *response { - responseChan := make(chan *response, 1) - responseChan <- &response{result: nil, err: nil} +func newNilFutureResult() chan *Response { + responseChan := make(chan *Response, 1) + responseChan <- &Response{result: nil, err: nil} return responseChan } @@ -95,7 +95,7 @@ type NotificationHandlers struct { // NotifyBlocks has been made to register for the notification and the // function is non-nil. // - // NOTE: Deprecated. Use OnFilteredBlockConnected instead. + // Deprecated: Use OnFilteredBlockConnected instead. OnBlockConnected func(hash *chainhash.Hash, height int32, t time.Time) // OnFilteredBlockConnected is invoked when a block is connected to the @@ -111,7 +111,7 @@ type NotificationHandlers struct { // NotifyBlocks has been made to register for the notification and the // function is non-nil. // - // NOTE: Deprecated. Use OnFilteredBlockDisconnected instead. + // Deprecated: Use OnFilteredBlockDisconnected instead. OnBlockDisconnected func(hash *chainhash.Hash, height int32, t time.Time) // OnFilteredBlockDisconnected is invoked when a block is disconnected @@ -127,7 +127,7 @@ type NotificationHandlers struct { // preceding call to NotifyReceived, Rescan, or RescanEndHeight has been // made to register for the notification and the function is non-nil. // - // NOTE: Deprecated. Use OnRelevantTxAccepted instead. + // Deprecated: Use OnRelevantTxAccepted instead. OnRecvTx func(transaction *btcutil.Tx, details *btcjson.BlockDetails) // OnRedeemingTx is invoked when a transaction that spends a registered @@ -141,7 +141,7 @@ type NotificationHandlers struct { // funds to the registered addresses. This means it is possible for // this to invoked indirectly as the result of a NotifyReceived call. // - // NOTE: Deprecated. Use OnRelevantTxAccepted instead. + // Deprecated: Use OnRelevantTxAccepted instead. OnRedeemingTx func(transaction *btcutil.Tx, details *btcjson.BlockDetails) // OnRelevantTxAccepted is invoked when an unmined transaction passes @@ -157,14 +157,14 @@ type NotificationHandlers struct { // result of a rescan request, due to how btcd may send various rescan // notifications after the rescan request has already returned. // - // NOTE: Deprecated. Not used with RescanBlocks. + // Deprecated: Not used with RescanBlocks. OnRescanFinished func(hash *chainhash.Hash, height int32, blkTime time.Time) // OnRescanProgress is invoked periodically when a rescan is underway. // It will only be invoked if a preceding call to Rescan or // RescanEndHeight has been made and the function is non-nil. // - // NOTE: Deprecated. Not used with RescanBlocks. + // Deprecated: Not used with RescanBlocks. OnRescanProgress func(hash *chainhash.Hash, height int32, blkTime time.Time) // OnTxAccepted is invoked when a transaction is accepted into the @@ -472,13 +472,13 @@ func (c *Client) handleNotification(ntfn *rawNotification) { } } -// wrongNumParams is an error type describing an unparseable JSON-RPC -// notificiation due to an incorrect number of parameters for the +// wrongNumParams is an error type describing an unparsable JSON-RPC +// notification due to an incorrect number of parameters for the // expected notification type. The value is the number of parameters // of the invalid notification. type wrongNumParams int -// Error satisifies the builtin error interface. +// Error satisfies the builtin error interface. func (e wrongNumParams) Error() string { return fmt.Sprintf("wrong number of parameters (%d)", e) } @@ -599,7 +599,7 @@ func parseFilteredBlockDisconnectedParams(params []json.RawMessage) (int32, return 0, nil, err } - // Unmarshal second parmeter as a slice of bytes. + // Unmarshal second parameter as a slice of bytes. blockHeaderBytes, err := parseHexParam(params[1]) if err != nil { return 0, nil, err @@ -856,12 +856,12 @@ func parseWalletLockStateNtfnParams(params []json.RawMessage) (account string, // FutureNotifyBlocksResult is a future promise to deliver the result of a // NotifyBlocksAsync RPC invocation (or an applicable error). -type FutureNotifyBlocksResult chan *response +type FutureNotifyBlocksResult chan *Response -// Receive waits for the response promised by the future and returns an error +// Receive waits for the Response promised by the future and returns an error // if the registration was not successful. func (r FutureNotifyBlocksResult) Receive() error { - _, err := receiveFuture(r) + _, err := ReceiveFuture(r) return err } @@ -885,7 +885,7 @@ func (c *Client) NotifyBlocksAsync() FutureNotifyBlocksResult { } cmd := btcjson.NewNotifyBlocksCmd() - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // NotifyBlocks registers the client to receive notifications when blocks are @@ -905,13 +905,13 @@ func (c *Client) NotifyBlocks() error { // FutureNotifySpentResult is a future promise to deliver the result of a // NotifySpentAsync RPC invocation (or an applicable error). // -// NOTE: Deprecated. Use FutureLoadTxFilterResult instead. -type FutureNotifySpentResult chan *response +// Deprecated: Use FutureLoadTxFilterResult instead. +type FutureNotifySpentResult chan *Response -// Receive waits for the response promised by the future and returns an error +// Receive waits for the Response promised by the future and returns an error // if the registration was not successful. func (r FutureNotifySpentResult) Receive() error { - _, err := receiveFuture(r) + _, err := ReceiveFuture(r) return err } @@ -931,7 +931,7 @@ func (c *Client) notifySpentInternal(outpoints []btcjson.OutPoint) FutureNotifyS } cmd := btcjson.NewNotifySpentCmd(outpoints) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // newOutPointFromWire constructs the btcjson representation of a transaction @@ -951,7 +951,7 @@ func newOutPointFromWire(op *wire.OutPoint) btcjson.OutPoint { // // NOTE: This is a btcd extension and requires a websocket connection. // -// NOTE: Deprecated. Use LoadTxFilterAsync instead. +// Deprecated: Use LoadTxFilterAsync instead. func (c *Client) NotifySpentAsync(outpoints []*wire.OutPoint) FutureNotifySpentResult { // Not supported in HTTP POST mode. if c.config.HTTPPostMode { @@ -969,7 +969,7 @@ func (c *Client) NotifySpentAsync(outpoints []*wire.OutPoint) FutureNotifySpentR ops = append(ops, newOutPointFromWire(outpoint)) } cmd := btcjson.NewNotifySpentCmd(ops) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // NotifySpent registers the client to receive notifications when the passed @@ -983,19 +983,19 @@ func (c *Client) NotifySpentAsync(outpoints []*wire.OutPoint) FutureNotifySpentR // // NOTE: This is a btcd extension and requires a websocket connection. // -// NOTE: Deprecated. Use LoadTxFilter instead. +// Deprecated: Use LoadTxFilter instead. func (c *Client) NotifySpent(outpoints []*wire.OutPoint) error { return c.NotifySpentAsync(outpoints).Receive() } // FutureNotifyNewTransactionsResult is a future promise to deliver the result // of a NotifyNewTransactionsAsync RPC invocation (or an applicable error). -type FutureNotifyNewTransactionsResult chan *response +type FutureNotifyNewTransactionsResult chan *Response -// Receive waits for the response promised by the future and returns an error +// Receive waits for the Response promised by the future and returns an error // if the registration was not successful. func (r FutureNotifyNewTransactionsResult) Receive() error { - _, err := receiveFuture(r) + _, err := ReceiveFuture(r) return err } @@ -1019,7 +1019,7 @@ func (c *Client) NotifyNewTransactionsAsync(verbose bool) FutureNotifyNewTransac } cmd := btcjson.NewNotifyNewTransactionsCmd(&verbose) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // NotifyNewTransactions registers the client to receive notifications every @@ -1040,13 +1040,13 @@ func (c *Client) NotifyNewTransactions(verbose bool) error { // FutureNotifyReceivedResult is a future promise to deliver the result of a // NotifyReceivedAsync RPC invocation (or an applicable error). // -// NOTE: Deprecated. Use FutureLoadTxFilterResult instead. -type FutureNotifyReceivedResult chan *response +// Deprecated: Use FutureLoadTxFilterResult instead. +type FutureNotifyReceivedResult chan *Response -// Receive waits for the response promised by the future and returns an error +// Receive waits for the Response promised by the future and returns an error // if the registration was not successful. func (r FutureNotifyReceivedResult) Receive() error { - _, err := receiveFuture(r) + _, err := ReceiveFuture(r) return err } @@ -1067,7 +1067,7 @@ func (c *Client) notifyReceivedInternal(addresses []string) FutureNotifyReceived // Convert addresses to strings. cmd := btcjson.NewNotifyReceivedCmd(addresses) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // NotifyReceivedAsync returns an instance of a type that can be used to get the @@ -1078,7 +1078,7 @@ func (c *Client) notifyReceivedInternal(addresses []string) FutureNotifyReceived // // NOTE: This is a btcd extension and requires a websocket connection. // -// NOTE: Deprecated. Use LoadTxFilterAsync instead. +// Deprecated: Use LoadTxFilterAsync instead. func (c *Client) NotifyReceivedAsync(addresses []btcutil.Address) FutureNotifyReceivedResult { // Not supported in HTTP POST mode. if c.config.HTTPPostMode { @@ -1097,7 +1097,7 @@ func (c *Client) NotifyReceivedAsync(addresses []btcutil.Address) FutureNotifyRe addrs = append(addrs, addr.String()) } cmd := btcjson.NewNotifyReceivedCmd(addrs) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // NotifyReceived registers the client to receive notifications every time a @@ -1118,7 +1118,7 @@ func (c *Client) NotifyReceivedAsync(addresses []btcutil.Address) FutureNotifyRe // // NOTE: This is a btcd extension and requires a websocket connection. // -// NOTE: Deprecated. Use LoadTxFilter instead. +// Deprecated: Use LoadTxFilter instead. func (c *Client) NotifyReceived(addresses []btcutil.Address) error { return c.NotifyReceivedAsync(addresses).Receive() } @@ -1126,13 +1126,13 @@ func (c *Client) NotifyReceived(addresses []btcutil.Address) error { // FutureRescanResult is a future promise to deliver the result of a RescanAsync // or RescanEndHeightAsync RPC invocation (or an applicable error). // -// NOTE: Deprecated. Use FutureRescanBlocksResult instead. -type FutureRescanResult chan *response +// Deprecated: Use FutureRescanBlocksResult instead. +type FutureRescanResult chan *Response -// Receive waits for the response promised by the future and returns an error +// Receive waits for the Response promised by the future and returns an error // if the rescan was not successful. func (r FutureRescanResult) Receive() error { - _, err := receiveFuture(r) + _, err := ReceiveFuture(r) return err } @@ -1150,7 +1150,7 @@ func (r FutureRescanResult) Receive() error { // // NOTE: This is a btcd extension and requires a websocket connection. // -// NOTE: Deprecated. Use RescanBlocksAsync instead. +// Deprecated: Use RescanBlocksAsync instead. func (c *Client) RescanAsync(startBlock *chainhash.Hash, addresses []btcutil.Address, outpoints []*wire.OutPoint) FutureRescanResult { @@ -1185,7 +1185,7 @@ func (c *Client) RescanAsync(startBlock *chainhash.Hash, } cmd := btcjson.NewRescanCmd(startBlockHashStr, addrs, ops, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // Rescan rescans the block chain starting from the provided starting block to @@ -1215,7 +1215,7 @@ func (c *Client) RescanAsync(startBlock *chainhash.Hash, // // NOTE: This is a btcd extension and requires a websocket connection. // -// NOTE: Deprecated. Use RescanBlocks instead. +// Deprecated: Use RescanBlocks instead. func (c *Client) Rescan(startBlock *chainhash.Hash, addresses []btcutil.Address, outpoints []*wire.OutPoint) error { @@ -1231,7 +1231,7 @@ func (c *Client) Rescan(startBlock *chainhash.Hash, // // NOTE: This is a btcd extension and requires a websocket connection. // -// NOTE: Deprecated. Use RescanBlocksAsync instead. +// Deprecated: Use RescanBlocksAsync instead. func (c *Client) RescanEndBlockAsync(startBlock *chainhash.Hash, addresses []btcutil.Address, outpoints []*wire.OutPoint, endBlock *chainhash.Hash) FutureRescanResult { @@ -1270,7 +1270,7 @@ func (c *Client) RescanEndBlockAsync(startBlock *chainhash.Hash, cmd := btcjson.NewRescanCmd(startBlockHashStr, addrs, ops, &endBlockHashStr) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // RescanEndHeight rescans the block chain starting from the provided starting @@ -1293,7 +1293,7 @@ func (c *Client) RescanEndBlockAsync(startBlock *chainhash.Hash, // // NOTE: This is a btcd extension and requires a websocket connection. // -// NOTE: Deprecated. Use RescanBlocks instead. +// Deprecated: Use RescanBlocks instead. func (c *Client) RescanEndHeight(startBlock *chainhash.Hash, addresses []btcutil.Address, outpoints []*wire.OutPoint, endBlock *chainhash.Hash) error { @@ -1307,15 +1307,15 @@ func (c *Client) RescanEndHeight(startBlock *chainhash.Hash, // // NOTE: This is a btcd extension ported from github.com/decred/dcrrpcclient // and requires a websocket connection. -type FutureLoadTxFilterResult chan *response +type FutureLoadTxFilterResult chan *Response -// Receive waits for the response promised by the future and returns an error +// Receive waits for the Response promised by the future and returns an error // if the registration was not successful. // // NOTE: This is a btcd extension ported from github.com/decred/dcrrpcclient // and requires a websocket connection. func (r FutureLoadTxFilterResult) Receive() error { - _, err := receiveFuture(r) + _, err := ReceiveFuture(r) return err } @@ -1343,7 +1343,7 @@ func (c *Client) LoadTxFilterAsync(reload bool, addresses []btcutil.Address, } cmd := btcjson.NewLoadTxFilterCmd(reload, addrStrs, outPointObjects) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // LoadTxFilter loads, reloads, or adds data to a websocket client's transaction diff --git a/rpcclient/rawrequest.go b/rpcclient/rawrequest.go index dd16fd049e..f446b0082b 100644 --- a/rpcclient/rawrequest.go +++ b/rpcclient/rawrequest.go @@ -13,12 +13,12 @@ import ( // FutureRawResult is a future promise to deliver the result of a RawRequest RPC // invocation (or an applicable error). -type FutureRawResult chan *response +type FutureRawResult chan *Response -// Receive waits for the response promised by the future and returns the raw +// Receive waits for the Response promised by the future and returns the raw // response, or an error if the request was unsuccessful. func (r FutureRawResult) Receive() (json.RawMessage, error) { - return receiveFuture(r) + return ReceiveFuture(r) } // RawRequestAsync returns an instance of a type that can be used to get the @@ -39,12 +39,12 @@ func (c *Client) RawRequestAsync(method string, params []json.RawMessage) Future } // Create a raw JSON-RPC request using the provided method and params - // and marshal it. This is done rather than using the sendCmd function + // and marshal it. This is done rather than using the SendCmd function // since that relies on marshalling registered btcjson commands rather // than custom commands. id := c.NextID() rawRequest := &btcjson.Request{ - Jsonrpc: "1.0", + Jsonrpc: btcjson.RpcVersion1, ID: id, Method: method, Params: params, @@ -55,7 +55,7 @@ func (c *Client) RawRequestAsync(method string, params []json.RawMessage) Future } // Generate the request and send it along with a channel to respond on. - responseChan := make(chan *response, 1) + responseChan := make(chan *Response, 1) jReq := &jsonRequest{ id: id, method: method, diff --git a/rpcclient/rawtransactions.go b/rpcclient/rawtransactions.go index 4bf4ee57fc..c72cabe5ec 100644 --- a/rpcclient/rawtransactions.go +++ b/rpcclient/rawtransactions.go @@ -8,17 +8,18 @@ import ( "bytes" "encoding/hex" "encoding/json" + "fmt" "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) const ( - // defaultMaxFeeRate is the default maximum fee rate in sat/KB enforced + // defaultMaxFeeRate is the default maximum fee rate in BTC/kvB enforced // by bitcoind v0.19.0 or after for transaction broadcast. - defaultMaxFeeRate = btcutil.SatoshiPerBitcoin / 10 + defaultMaxFeeRate btcjson.BTCPerkvB = 0.1 ) // SigHashType enumerates the available signature hashing types that the @@ -66,12 +67,12 @@ func (s SigHashType) String() string { // FutureGetRawTransactionResult is a future promise to deliver the result of a // GetRawTransactionAsync RPC invocation (or an applicable error). -type FutureGetRawTransactionResult chan *response +type FutureGetRawTransactionResult chan *Response -// Receive waits for the response promised by the future and returns a +// Receive waits for the Response promised by the future and returns a // transaction given its hash. func (r FutureGetRawTransactionResult) Receive() (*btcutil.Tx, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -109,7 +110,7 @@ func (c *Client) GetRawTransactionAsync(txHash *chainhash.Hash) FutureGetRawTran } cmd := btcjson.NewGetRawTransactionCmd(hash, btcjson.Int(0)) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetRawTransaction returns a transaction given its hash. @@ -123,12 +124,12 @@ func (c *Client) GetRawTransaction(txHash *chainhash.Hash) (*btcutil.Tx, error) // FutureGetRawTransactionVerboseResult is a future promise to deliver the // result of a GetRawTransactionVerboseAsync RPC invocation (or an applicable // error). -type FutureGetRawTransactionVerboseResult chan *response +type FutureGetRawTransactionVerboseResult chan *Response -// Receive waits for the response promised by the future and returns information +// Receive waits for the Response promised by the future and returns information // about a transaction given its hash. func (r FutureGetRawTransactionVerboseResult) Receive() (*btcjson.TxRawResult, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -155,7 +156,7 @@ func (c *Client) GetRawTransactionVerboseAsync(txHash *chainhash.Hash) FutureGet } cmd := btcjson.NewGetRawTransactionCmd(hash, btcjson.Int(1)) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetRawTransactionVerbose returns information about a transaction given @@ -168,12 +169,12 @@ func (c *Client) GetRawTransactionVerbose(txHash *chainhash.Hash) (*btcjson.TxRa // FutureDecodeRawTransactionResult is a future promise to deliver the result // of a DecodeRawTransactionAsync RPC invocation (or an applicable error). -type FutureDecodeRawTransactionResult chan *response +type FutureDecodeRawTransactionResult chan *Response -// Receive waits for the response promised by the future and returns information +// Receive waits for the Response promised by the future and returns information // about a transaction given its serialized bytes. func (r FutureDecodeRawTransactionResult) Receive() (*btcjson.TxRawResult, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -196,7 +197,7 @@ func (r FutureDecodeRawTransactionResult) Receive() (*btcjson.TxRawResult, error func (c *Client) DecodeRawTransactionAsync(serializedTx []byte) FutureDecodeRawTransactionResult { txHex := hex.EncodeToString(serializedTx) cmd := btcjson.NewDecodeRawTransactionCmd(txHex) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // DecodeRawTransaction returns information about a transaction given its @@ -205,15 +206,56 @@ func (c *Client) DecodeRawTransaction(serializedTx []byte) (*btcjson.TxRawResult return c.DecodeRawTransactionAsync(serializedTx).Receive() } +// FutureFundRawTransactionResult is a future promise to deliver the result +// of a FutureFundRawTransactionAsync RPC invocation (or an applicable error). +type FutureFundRawTransactionResult chan *Response + +// Receive waits for the Response promised by the future and returns information +// about a funding attempt +func (r FutureFundRawTransactionResult) Receive() (*btcjson.FundRawTransactionResult, error) { + res, err := ReceiveFuture(r) + if err != nil { + return nil, err + } + + var marshalled btcjson.FundRawTransactionResult + if err := json.Unmarshal(res, &marshalled); err != nil { + return nil, err + } + + return &marshalled, nil +} + +// FundRawTransactionAsync returns an instance of a type that can be used to +// get the result of the RPC at some future time by invoking the Receive +// function on the returned instance. +// +// See FundRawTransaction for the blocking version and more details. +func (c *Client) FundRawTransactionAsync(tx *wire.MsgTx, opts btcjson.FundRawTransactionOpts, isWitness *bool) FutureFundRawTransactionResult { + var txBuf bytes.Buffer + if err := tx.Serialize(&txBuf); err != nil { + return newFutureError(err) + } + + cmd := btcjson.NewFundRawTransactionCmd(txBuf.Bytes(), opts, isWitness) + return c.SendCmd(cmd) +} + +// FundRawTransaction returns the result of trying to fund the given transaction with +// funds from the node wallet +func (c *Client) FundRawTransaction(tx *wire.MsgTx, opts btcjson.FundRawTransactionOpts, isWitness *bool) (*btcjson.FundRawTransactionResult, error) { + return c.FundRawTransactionAsync(tx, opts, isWitness).Receive() +} + // FutureCreateRawTransactionResult is a future promise to deliver the result // of a CreateRawTransactionAsync RPC invocation (or an applicable error). -type FutureCreateRawTransactionResult chan *response +type FutureCreateRawTransactionResult chan *Response -// Receive waits for the response promised by the future and returns a new +// Receive waits for the Response promised by the future and returns a new // transaction spending the provided inputs and sending to the provided // addresses. func (r FutureCreateRawTransactionResult) Receive() (*wire.MsgTx, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -233,8 +275,13 @@ func (r FutureCreateRawTransactionResult) Receive() (*wire.MsgTx, error) { // Deserialize the transaction and return it. var msgTx wire.MsgTx - if err := msgTx.Deserialize(bytes.NewReader(serializedTx)); err != nil { - return nil, err + // we try both the new and old encoding format + witnessErr := msgTx.Deserialize(bytes.NewReader(serializedTx)) + if witnessErr != nil { + legacyErr := msgTx.DeserializeNoWitness(bytes.NewReader(serializedTx)) + if legacyErr != nil { + return nil, legacyErr + } } return &msgTx, nil } @@ -252,11 +299,12 @@ func (c *Client) CreateRawTransactionAsync(inputs []btcjson.TransactionInput, convertedAmts[addr.String()] = amount.ToBTC() } cmd := btcjson.NewCreateRawTransactionCmd(inputs, convertedAmts, lockTime) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // CreateRawTransaction returns a new transaction spending the provided inputs -// and sending to the provided addresses. +// and sending to the provided addresses. If the inputs are either nil or an +// empty slice, it is interpreted as an empty slice. func (c *Client) CreateRawTransaction(inputs []btcjson.TransactionInput, amounts map[btcutil.Address]btcutil.Amount, lockTime *int64) (*wire.MsgTx, error) { @@ -265,13 +313,13 @@ func (c *Client) CreateRawTransaction(inputs []btcjson.TransactionInput, // FutureSendRawTransactionResult is a future promise to deliver the result // of a SendRawTransactionAsync RPC invocation (or an applicable error). -type FutureSendRawTransactionResult chan *response +type FutureSendRawTransactionResult chan *Response -// Receive waits for the response promised by the future and returns the result +// Receive waits for the Response promised by the future and returns the result // of submitting the encoded transaction to the server which then relays it to // the network. func (r FutureSendRawTransactionResult) Receive() (*chainhash.Hash, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -311,23 +359,23 @@ func (c *Client) SendRawTransactionAsync(tx *wire.MsgTx, allowHighFees bool) Fut } var cmd *btcjson.SendRawTransactionCmd - switch version { // Starting from bitcoind v0.19.0, the MaxFeeRate field should be used. - case BitcoindPost19: + // + // When unified softforks format is supported, it's 0.19 and above. + if version.SupportUnifiedSoftForks() { // Using a 0 MaxFeeRate is interpreted as a maximum fee rate not // being enforced by bitcoind. - var maxFeeRate int32 + var maxFeeRate btcjson.BTCPerkvB if !allowHighFees { maxFeeRate = defaultMaxFeeRate } cmd = btcjson.NewBitcoindSendRawTransactionCmd(txHex, maxFeeRate) - - // Otherwise, use the AllowHighFees field. - default: + } else { + // Otherwise, use the AllowHighFees field. cmd = btcjson.NewSendRawTransactionCmd(txHex, &allowHighFees) } - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // SendRawTransaction submits the encoded transaction to the server which will @@ -339,12 +387,12 @@ func (c *Client) SendRawTransaction(tx *wire.MsgTx, allowHighFees bool) (*chainh // FutureSignRawTransactionResult is a future promise to deliver the result // of one of the SignRawTransactionAsync family of RPC invocations (or an // applicable error). -type FutureSignRawTransactionResult chan *response +type FutureSignRawTransactionResult chan *Response -// Receive waits for the response promised by the future and returns the +// Receive waits for the Response promised by the future and returns the // signed transaction as well as whether or not all inputs are now signed. func (r FutureSignRawTransactionResult) Receive() (*wire.MsgTx, bool, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, false, err } @@ -388,7 +436,7 @@ func (c *Client) SignRawTransactionAsync(tx *wire.MsgTx) FutureSignRawTransactio } cmd := btcjson.NewSignRawTransactionCmd(txHex, nil, nil, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // SignRawTransaction signs inputs for the passed transaction and returns the @@ -419,7 +467,7 @@ func (c *Client) SignRawTransaction2Async(tx *wire.MsgTx, inputs []btcjson.RawTx } cmd := btcjson.NewSignRawTransactionCmd(txHex, &inputs, nil, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // SignRawTransaction2 signs inputs for the passed transaction given the list @@ -457,7 +505,7 @@ func (c *Client) SignRawTransaction3Async(tx *wire.MsgTx, cmd := btcjson.NewSignRawTransactionCmd(txHex, &inputs, &privKeysWIF, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // SignRawTransaction3 signs inputs for the passed transaction given the list @@ -505,10 +553,10 @@ func (c *Client) SignRawTransaction4Async(tx *wire.MsgTx, cmd := btcjson.NewSignRawTransactionCmd(txHex, &inputs, &privKeysWIF, btcjson.String(string(hashType))) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } -// SignRawTransaction4 signs inputs for the passed transaction using the +// SignRawTransaction4 signs inputs for the passed transaction using // the specified signature hash type given the list of information about extra // input transactions and a potential list of private keys needed to perform // the signing process. The private keys, if specified, must be in wallet @@ -535,14 +583,157 @@ func (c *Client) SignRawTransaction4(tx *wire.MsgTx, hashType).Receive() } +// FutureSignRawTransactionWithWalletResult is a future promise to deliver +// the result of the SignRawTransactionWithWalletAsync RPC invocation (or +// an applicable error). +type FutureSignRawTransactionWithWalletResult chan *Response + +// Receive waits for the Response promised by the future and returns the +// signed transaction as well as whether or not all inputs are now signed. +func (r FutureSignRawTransactionWithWalletResult) Receive() (*wire.MsgTx, bool, error) { + res, err := ReceiveFuture(r) + if err != nil { + return nil, false, err + } + + // Unmarshal as a signtransactionwithwallet result. + var signRawTxWithWalletResult btcjson.SignRawTransactionWithWalletResult + err = json.Unmarshal(res, &signRawTxWithWalletResult) + if err != nil { + return nil, false, err + } + + // Decode the serialized transaction hex to raw bytes. + serializedTx, err := hex.DecodeString(signRawTxWithWalletResult.Hex) + if err != nil { + return nil, false, err + } + + // Deserialize the transaction and return it. + var msgTx wire.MsgTx + if err := msgTx.Deserialize(bytes.NewReader(serializedTx)); err != nil { + return nil, false, err + } + + return &msgTx, signRawTxWithWalletResult.Complete, nil +} + +// SignRawTransactionWithWalletAsync returns an instance of a type that can be used +// to get the result of the RPC at some future time by invoking the Receive function +// on the returned instance. +// +// See SignRawTransactionWithWallet for the blocking version and more details. +func (c *Client) SignRawTransactionWithWalletAsync(tx *wire.MsgTx) FutureSignRawTransactionWithWalletResult { + txHex := "" + if tx != nil { + // Serialize the transaction and convert to hex string. + buf := bytes.NewBuffer(make([]byte, 0, tx.SerializeSize())) + if err := tx.Serialize(buf); err != nil { + return newFutureError(err) + } + txHex = hex.EncodeToString(buf.Bytes()) + } + + cmd := btcjson.NewSignRawTransactionWithWalletCmd(txHex, nil, nil) + return c.SendCmd(cmd) +} + +// SignRawTransactionWithWallet signs inputs for the passed transaction and returns +// the signed transaction as well as whether or not all inputs are now signed. +// +// This function assumes the RPC server already knows the input transactions for the +// passed transaction which needs to be signed and uses the default signature hash +// type. Use one of the SignRawTransactionWithWallet# variants to specify that +// information if needed. +func (c *Client) SignRawTransactionWithWallet(tx *wire.MsgTx) (*wire.MsgTx, bool, error) { + return c.SignRawTransactionWithWalletAsync(tx).Receive() +} + +// SignRawTransactionWithWallet2Async returns an instance of a type that can be +// used to get the result of the RPC at some future time by invoking the Receive +// function on the returned instance. +// +// See SignRawTransactionWithWallet2 for the blocking version and more details. +func (c *Client) SignRawTransactionWithWallet2Async(tx *wire.MsgTx, + inputs []btcjson.RawTxWitnessInput) FutureSignRawTransactionWithWalletResult { + + txHex := "" + if tx != nil { + // Serialize the transaction and convert to hex string. + buf := bytes.NewBuffer(make([]byte, 0, tx.SerializeSize())) + if err := tx.Serialize(buf); err != nil { + return newFutureError(err) + } + txHex = hex.EncodeToString(buf.Bytes()) + } + + cmd := btcjson.NewSignRawTransactionWithWalletCmd(txHex, &inputs, nil) + return c.SendCmd(cmd) +} + +// SignRawTransactionWithWallet2 signs inputs for the passed transaction given the +// list of information about the input transactions needed to perform the signing +// process. +// +// This only input transactions that need to be specified are ones the +// RPC server does not already know. Already known input transactions will be +// merged with the specified transactions. +// +// See SignRawTransactionWithWallet if the RPC server already knows the input +// transactions. +func (c *Client) SignRawTransactionWithWallet2(tx *wire.MsgTx, + inputs []btcjson.RawTxWitnessInput) (*wire.MsgTx, bool, error) { + + return c.SignRawTransactionWithWallet2Async(tx, inputs).Receive() +} + +// SignRawTransactionWithWallet3Async returns an instance of a type that can +// be used to get the result of the RPC at some future time by invoking the +// Receive function on the returned instance. +// +// See SignRawTransactionWithWallet3 for the blocking version and more details. +func (c *Client) SignRawTransactionWithWallet3Async(tx *wire.MsgTx, + inputs []btcjson.RawTxWitnessInput, hashType SigHashType) FutureSignRawTransactionWithWalletResult { + + txHex := "" + if tx != nil { + // Serialize the transaction and convert to hex string. + buf := bytes.NewBuffer(make([]byte, 0, tx.SerializeSize())) + if err := tx.Serialize(buf); err != nil { + return newFutureError(err) + } + txHex = hex.EncodeToString(buf.Bytes()) + } + + cmd := btcjson.NewSignRawTransactionWithWalletCmd(txHex, &inputs, btcjson.String(string(hashType))) + return c.SendCmd(cmd) +} + +// SignRawTransactionWithWallet3 signs inputs for the passed transaction using +// the specified signature hash type given the list of information about extra +// input transactions. +// +// The only input transactions that need to be specified are ones the RPC server +// does not already know. This means the list of transaction inputs can be nil +// if the RPC server already knows them all. +// +// This function should only used if a non-default signature hash type is +// desired. Otherwise, see SignRawTransactionWithWallet if the RPC server already +// knows the input transactions, or SignRawTransactionWithWallet2 if it does not. +func (c *Client) SignRawTransactionWithWallet3(tx *wire.MsgTx, + inputs []btcjson.RawTxWitnessInput, hashType SigHashType) (*wire.MsgTx, bool, error) { + + return c.SignRawTransactionWithWallet3Async(tx, inputs, hashType).Receive() +} + // FutureSearchRawTransactionsResult is a future promise to deliver the result // of the SearchRawTransactionsAsync RPC invocation (or an applicable error). -type FutureSearchRawTransactionsResult chan *response +type FutureSearchRawTransactionsResult chan *Response -// Receive waits for the response promised by the future and returns the +// Receive waits for the Response promised by the future and returns the // found raw transactions. func (r FutureSearchRawTransactionsResult) Receive() ([]*wire.MsgTx, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -585,7 +776,7 @@ func (c *Client) SearchRawTransactionsAsync(address btcutil.Address, skip, count verbose := btcjson.Int(0) cmd := btcjson.NewSearchRawTransactionsCmd(addr, verbose, &skip, &count, nil, &reverse, &filterAddrs) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // SearchRawTransactions returns transactions that involve the passed address. @@ -602,12 +793,12 @@ func (c *Client) SearchRawTransactions(address btcutil.Address, skip, count int, // FutureSearchRawTransactionsVerboseResult is a future promise to deliver the // result of the SearchRawTransactionsVerboseAsync RPC invocation (or an // applicable error). -type FutureSearchRawTransactionsVerboseResult chan *response +type FutureSearchRawTransactionsVerboseResult chan *Response -// Receive waits for the response promised by the future and returns the +// Receive waits for the Response promised by the future and returns the // found raw transactions. func (r FutureSearchRawTransactionsVerboseResult) Receive() ([]*btcjson.SearchRawTransactionsResult, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -638,7 +829,7 @@ func (c *Client) SearchRawTransactionsVerboseAsync(address btcutil.Address, skip } cmd := btcjson.NewSearchRawTransactionsCmd(addr, verbose, &skip, &count, prevOut, &reverse, filterAddrs) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // SearchRawTransactionsVerbose returns a list of data structures that describe @@ -657,12 +848,12 @@ func (c *Client) SearchRawTransactionsVerbose(address btcutil.Address, skip, // FutureDecodeScriptResult is a future promise to deliver the result // of a DecodeScriptAsync RPC invocation (or an applicable error). -type FutureDecodeScriptResult chan *response +type FutureDecodeScriptResult chan *Response -// Receive waits for the response promised by the future and returns information +// Receive waits for the Response promised by the future and returns information // about a script given its serialized bytes. func (r FutureDecodeScriptResult) Receive() (*btcjson.DecodeScriptResult, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -685,10 +876,209 @@ func (r FutureDecodeScriptResult) Receive() (*btcjson.DecodeScriptResult, error) func (c *Client) DecodeScriptAsync(serializedScript []byte) FutureDecodeScriptResult { scriptHex := hex.EncodeToString(serializedScript) cmd := btcjson.NewDecodeScriptCmd(scriptHex) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // DecodeScript returns information about a script given its serialized bytes. func (c *Client) DecodeScript(serializedScript []byte) (*btcjson.DecodeScriptResult, error) { return c.DecodeScriptAsync(serializedScript).Receive() } + +// FutureTestMempoolAcceptResult is a future promise to deliver the result +// of a TestMempoolAccept RPC invocation (or an applicable error). +type FutureTestMempoolAcceptResult chan *Response + +// Receive waits for the Response promised by the future and returns the +// response from TestMempoolAccept. +func (r FutureTestMempoolAcceptResult) Receive() ( + []*btcjson.TestMempoolAcceptResult, error) { + + response, err := ReceiveFuture(r) + if err != nil { + return nil, err + } + + // Unmarshal as an array of TestMempoolAcceptResult items. + var results []*btcjson.TestMempoolAcceptResult + + err = json.Unmarshal(response, &results) + if err != nil { + return nil, err + } + + return results, nil +} + +// TestMempoolAcceptAsync returns an instance of a type that can be used to get +// the result of the RPC at some future time by invoking the Receive function +// on the returned instance. +// +// See TestMempoolAccept for the blocking version and more details. +func (c *Client) TestMempoolAcceptAsync(txns []*wire.MsgTx, + maxFeeRate btcjson.BTCPerkvB) FutureTestMempoolAcceptResult { + + // Due to differences in the testmempoolaccept API for different + // backends, we'll need to inspect our version and construct the + // appropriate request. + version, err := c.BackendVersion() + if err != nil { + return newFutureError(err) + } + + log.Debugf("TestMempoolAcceptAsync: backend version %s", version) + + // Exit early if the version is below 22.0.0. + // + // Based on the history of `testmempoolaccept` in bitcoind, + // - introduced in 0.17.0 + // - unchanged in 0.18.0 + // - allowhighfees(bool) param is changed to maxfeerate(numeric) in + // 0.19.0 + // - unchanged in 0.20.0 + // - added fees and vsize fields in its response in 0.21.0 + // - allow more than one txes in param rawtx and added package-error + // and wtxid fields in its response in 0.22.0 + // - unchanged in 0.23.0 + // - unchanged in 0.24.0 + // - added effective-feerate and effective-includes fields in its + // response in 0.25.0 + // + // We decide to not support this call for versions below 22.0.0. as the + // request/response formats are very different. + if !version.SupportTestMempoolAccept() { + err := fmt.Errorf("%w: %v", ErrBackendVersion, version) + return newFutureError(err) + } + + // The maximum number of transactions allowed is 25. + if len(txns) > 25 { + err := fmt.Errorf("%w: too many transactions provided", + ErrInvalidParam) + return newFutureError(err) + } + + // Exit early if an empty array of transactions is provided. + if len(txns) == 0 { + err := fmt.Errorf("%w: no transactions provided", + ErrInvalidParam) + return newFutureError(err) + } + + // Iterate all the transactions and turn them into hex strings. + rawTxns := make([]string, 0, len(txns)) + for _, tx := range txns { + // Serialize the transaction and convert to hex string. + buf := bytes.NewBuffer(make([]byte, 0, tx.SerializeSize())) + + // TODO(yy): add similar checks found in `BtcDecode` to + // `BtcEncode` - atm it just serializes bytes without any + // bitcoin-specific checks. + if err := tx.Serialize(buf); err != nil { + err = fmt.Errorf("%w: %v", ErrInvalidParam, err) + return newFutureError(err) + } + + rawTx := hex.EncodeToString(buf.Bytes()) + rawTxns = append(rawTxns, rawTx) + + // Sanity check the provided tx is valid, which can be removed + // once we have similar checks added in `BtcEncode`. + // + // NOTE: must be performed after buf.Bytes is copied above. + // + // TODO(yy): remove it once the above TODO is addressed. + if err := tx.Deserialize(buf); err != nil { + err = fmt.Errorf("%w: %v", ErrInvalidParam, err) + return newFutureError(err) + } + } + + cmd := btcjson.NewTestMempoolAcceptCmd(rawTxns, maxFeeRate) + + return c.SendCmd(cmd) +} + +// TestMempoolAccept returns result of mempool acceptance tests indicating if +// raw transaction(s) would be accepted by mempool. +// +// If multiple transactions are passed in, parents must come before children +// and package policies apply: the transactions cannot conflict with any +// mempool transactions or each other. +// +// If one transaction fails, other transactions may not be fully validated (the +// 'allowed' key will be blank). +// +// The maximum number of transactions allowed is 25. +func (c *Client) TestMempoolAccept(txns []*wire.MsgTx, + maxFeeRate btcjson.BTCPerkvB) ([]*btcjson.TestMempoolAcceptResult, error) { + + return c.TestMempoolAcceptAsync(txns, maxFeeRate).Receive() +} + +// FutureGetTxSpendingPrevOut is a future promise to deliver the result of a +// GetTxSpendingPrevOut RPC invocation (or an applicable error). +type FutureGetTxSpendingPrevOut chan *Response + +// Receive waits for the Response promised by the future and returns the +// response from GetTxSpendingPrevOut. +func (r FutureGetTxSpendingPrevOut) Receive() ( + []*btcjson.GetTxSpendingPrevOutResult, error) { + + response, err := ReceiveFuture(r) + if err != nil { + return nil, err + } + + // Unmarshal as an array of GetTxSpendingPrevOutResult items. + var results []*btcjson.GetTxSpendingPrevOutResult + + err = json.Unmarshal(response, &results) + if err != nil { + return nil, err + } + + return results, nil +} + +// GetTxSpendingPrevOutAsync returns an instance of a type that can be used to +// get the result of the RPC at some future time by invoking the Receive +// function on the returned instance. +// +// See GetTxSpendingPrevOut for the blocking version and more details. +func (c *Client) GetTxSpendingPrevOutAsync( + outpoints []wire.OutPoint) FutureGetTxSpendingPrevOut { + + // Due to differences in the testmempoolaccept API for different + // backends, we'll need to inspect our version and construct the + // appropriate request. + version, err := c.BackendVersion() + if err != nil { + return newFutureError(err) + } + + log.Debugf("GetTxSpendingPrevOutAsync: backend version %s", version) + + // Exit early if the version is below 24.0.0. + if !version.SupportGetTxSpendingPrevOut() { + err := fmt.Errorf("%w: %v", ErrBackendVersion, version) + return newFutureError(err) + } + + // Exit early if an empty array of outpoints is provided. + if len(outpoints) == 0 { + err := fmt.Errorf("%w: no outpoints provided", ErrInvalidParam) + return newFutureError(err) + } + + cmd := btcjson.NewGetTxSpendingPrevOutCmd(outpoints) + + return c.SendCmd(cmd) +} + +// GetTxSpendingPrevOut returns the result from calling `gettxspendingprevout` +// RPC. +func (c *Client) GetTxSpendingPrevOut(outpoints []wire.OutPoint) ( + []*btcjson.GetTxSpendingPrevOutResult, error) { + + return c.GetTxSpendingPrevOutAsync(outpoints).Receive() +} diff --git a/rpcclient/wallet.go b/rpcclient/wallet.go index 27546f5de0..f43c20074a 100644 --- a/rpcclient/wallet.go +++ b/rpcclient/wallet.go @@ -1,4 +1,4 @@ -// Copyright (c) 2014-2017 The btcsuite developers +// Copyright (c) 2014-2020 The btcsuite developers // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. @@ -9,10 +9,10 @@ import ( "strconv" "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) // ***************************** @@ -20,13 +20,14 @@ import ( // ***************************** // FutureGetTransactionResult is a future promise to deliver the result -// of a GetTransactionAsync RPC invocation (or an applicable error). -type FutureGetTransactionResult chan *response +// of a GetTransactionAsync or GetTransactionWatchOnlyAsync RPC invocation +// (or an applicable error). +type FutureGetTransactionResult chan *Response -// Receive waits for the response promised by the future and returns detailed +// Receive waits for the Response promised by the future and returns detailed // information about a wallet transaction. func (r FutureGetTransactionResult) Receive() (*btcjson.GetTransactionResult, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -53,7 +54,7 @@ func (c *Client) GetTransactionAsync(txHash *chainhash.Hash) FutureGetTransactio } cmd := btcjson.NewGetTransactionCmd(hash, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetTransaction returns detailed information about a wallet transaction. @@ -63,15 +64,37 @@ func (c *Client) GetTransaction(txHash *chainhash.Hash) (*btcjson.GetTransaction return c.GetTransactionAsync(txHash).Receive() } +// GetTransactionWatchOnlyAsync returns an instance of a type that can be used +// to get the result of the RPC at some future time by invoking the Receive function on +// the returned instance. +// +// See GetTransactionWatchOnly for the blocking version and more details. +func (c *Client) GetTransactionWatchOnlyAsync(txHash *chainhash.Hash, watchOnly bool) FutureGetTransactionResult { + hash := "" + if txHash != nil { + hash = txHash.String() + } + + cmd := btcjson.NewGetTransactionCmd(hash, &watchOnly) + return c.SendCmd(cmd) +} + +// GetTransactionWatchOnly returns detailed information about a wallet +// transaction, and allow including watch-only addresses in balance +// calculation and details. +func (c *Client) GetTransactionWatchOnly(txHash *chainhash.Hash, watchOnly bool) (*btcjson.GetTransactionResult, error) { + return c.GetTransactionWatchOnlyAsync(txHash, watchOnly).Receive() +} + // FutureListTransactionsResult is a future promise to deliver the result of a // ListTransactionsAsync, ListTransactionsCountAsync, or // ListTransactionsCountFromAsync RPC invocation (or an applicable error). -type FutureListTransactionsResult chan *response +type FutureListTransactionsResult chan *Response -// Receive waits for the response promised by the future and returns a list of +// Receive waits for the Response promised by the future and returns a list of // the most recent transactions. func (r FutureListTransactionsResult) Receive() ([]btcjson.ListTransactionsResult, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -93,7 +116,7 @@ func (r FutureListTransactionsResult) Receive() ([]btcjson.ListTransactionsResul // See ListTransactions for the blocking version and more details. func (c *Client) ListTransactionsAsync(account string) FutureListTransactionsResult { cmd := btcjson.NewListTransactionsCmd(&account, nil, nil, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // ListTransactions returns a list of the most recent transactions. @@ -111,7 +134,7 @@ func (c *Client) ListTransactions(account string) ([]btcjson.ListTransactionsRes // See ListTransactionsCount for the blocking version and more details. func (c *Client) ListTransactionsCountAsync(account string, count int) FutureListTransactionsResult { cmd := btcjson.NewListTransactionsCmd(&account, &count, nil, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // ListTransactionsCount returns a list of the most recent transactions up @@ -130,7 +153,7 @@ func (c *Client) ListTransactionsCount(account string, count int) ([]btcjson.Lis // See ListTransactionsCountFrom for the blocking version and more details. func (c *Client) ListTransactionsCountFromAsync(account string, count, from int) FutureListTransactionsResult { cmd := btcjson.NewListTransactionsCmd(&account, &count, &from, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // ListTransactionsCountFrom returns a list of the most recent transactions up @@ -141,18 +164,37 @@ func (c *Client) ListTransactionsCountFrom(account string, count, from int) ([]b return c.ListTransactionsCountFromAsync(account, count, from).Receive() } +// ListTransactionsCountFromWatchOnlyAsync returns an instance of a type that can be used +// to get the result of the RPC at some future time by invoking the Receive +// function on the returned instance. +// +// See ListTransactionsCountFromWatchOnly for the blocking version and more details. +func (c *Client) ListTransactionsCountFromWatchOnlyAsync(account string, count, from int, watchOnly bool) FutureListTransactionsResult { + cmd := btcjson.NewListTransactionsCmd(&account, &count, &from, &watchOnly) + return c.SendCmd(cmd) +} + +// ListTransactionsCountFromWatchOnly returns a list of the most recent transactions up +// to the passed count while skipping the first 'from' transactions. It will include or +// exclude transactions from watch-only addresses based on the passed value for the watchOnly parameter +// +// See the ListTransactions and ListTransactionsCount functions to use defaults. +func (c *Client) ListTransactionsCountFromWatchOnly(account string, count, from int, watchOnly bool) ([]btcjson.ListTransactionsResult, error) { + return c.ListTransactionsCountFromWatchOnlyAsync(account, count, from, watchOnly).Receive() +} + // FutureListUnspentResult is a future promise to deliver the result of a // ListUnspentAsync, ListUnspentMinAsync, ListUnspentMinMaxAsync, or // ListUnspentMinMaxAddressesAsync RPC invocation (or an applicable error). -type FutureListUnspentResult chan *response +type FutureListUnspentResult chan *Response -// Receive waits for the response promised by the future and returns all +// Receive waits for the Response promised by the future and returns all // unspent wallet transaction outputs returned by the RPC call. If the // future wac returned by a call to ListUnspentMinAsync, ListUnspentMinMaxAsync, // or ListUnspentMinMaxAddressesAsync, the range may be limited by the // parameters of the RPC invocation. func (r FutureListUnspentResult) Receive() ([]btcjson.ListUnspentResult, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -174,7 +216,7 @@ func (r FutureListUnspentResult) Receive() ([]btcjson.ListUnspentResult, error) // See ListUnspent for the blocking version and more details. func (c *Client) ListUnspentAsync() FutureListUnspentResult { cmd := btcjson.NewListUnspentCmd(nil, nil, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // ListUnspentMinAsync returns an instance of a type that can be used to get @@ -184,7 +226,7 @@ func (c *Client) ListUnspentAsync() FutureListUnspentResult { // See ListUnspentMin for the blocking version and more details. func (c *Client) ListUnspentMinAsync(minConf int) FutureListUnspentResult { cmd := btcjson.NewListUnspentCmd(&minConf, nil, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // ListUnspentMinMaxAsync returns an instance of a type that can be used to get @@ -194,7 +236,7 @@ func (c *Client) ListUnspentMinAsync(minConf int) FutureListUnspentResult { // See ListUnspentMinMax for the blocking version and more details. func (c *Client) ListUnspentMinMaxAsync(minConf, maxConf int) FutureListUnspentResult { cmd := btcjson.NewListUnspentCmd(&minConf, &maxConf, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // ListUnspentMinMaxAddressesAsync returns an instance of a type that can be @@ -209,7 +251,7 @@ func (c *Client) ListUnspentMinMaxAddressesAsync(minConf, maxConf int, addrs []b } cmd := btcjson.NewListUnspentCmd(&minConf, &maxConf, &addrStrs) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // ListUnspent returns all unspent transaction outputs known to a wallet, using @@ -220,8 +262,8 @@ func (c *Client) ListUnspent() ([]btcjson.ListUnspentResult, error) { } // ListUnspentMin returns all unspent transaction outputs known to a wallet, -// using the specified number of minimum conformations and default number of -// maximum confiramtions (999999) as a filter. +// using the specified number of minimum confirmations and default number of +// maximum confirmations (999999) as a filter. func (c *Client) ListUnspentMin(minConf int) ([]btcjson.ListUnspentResult, error) { return c.ListUnspentMinAsync(minConf).Receive() } @@ -243,13 +285,13 @@ func (c *Client) ListUnspentMinMaxAddresses(minConf, maxConf int, addrs []btcuti // FutureListSinceBlockResult is a future promise to deliver the result of a // ListSinceBlockAsync or ListSinceBlockMinConfAsync RPC invocation (or an // applicable error). -type FutureListSinceBlockResult chan *response +type FutureListSinceBlockResult chan *Response -// Receive waits for the response promised by the future and returns all +// Receive waits for the Response promised by the future and returns all // transactions added in blocks since the specified block hash, or all // transactions if it is nil. func (r FutureListSinceBlockResult) Receive() (*btcjson.ListSinceBlockResult, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -276,7 +318,7 @@ func (c *Client) ListSinceBlockAsync(blockHash *chainhash.Hash) FutureListSinceB } cmd := btcjson.NewListSinceBlockCmd(hash, nil, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // ListSinceBlock returns all transactions added in blocks since the specified @@ -284,6 +326,7 @@ func (c *Client) ListSinceBlockAsync(blockHash *chainhash.Hash) FutureListSinceB // minimum confirmations as a filter. // // See ListSinceBlockMinConf to override the minimum number of confirmations. +// See ListSinceBlockMinConfWatchOnly to override the minimum number of confirmations and watch only parameter. func (c *Client) ListSinceBlock(blockHash *chainhash.Hash) (*btcjson.ListSinceBlockResult, error) { return c.ListSinceBlockAsync(blockHash).Receive() } @@ -300,7 +343,7 @@ func (c *Client) ListSinceBlockMinConfAsync(blockHash *chainhash.Hash, minConfir } cmd := btcjson.NewListSinceBlockCmd(hash, &minConfirms, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // ListSinceBlockMinConf returns all transactions added in blocks since the @@ -312,18 +355,42 @@ func (c *Client) ListSinceBlockMinConf(blockHash *chainhash.Hash, minConfirms in return c.ListSinceBlockMinConfAsync(blockHash, minConfirms).Receive() } +// ListSinceBlockMinConfWatchOnlyAsync returns an instance of a type that can be used to +// get the result of the RPC at some future time by invoking the Receive +// function on the returned instance. +// +// See ListSinceBlockMinConfWatchOnly for the blocking version and more details. +func (c *Client) ListSinceBlockMinConfWatchOnlyAsync(blockHash *chainhash.Hash, minConfirms int, watchOnly bool) FutureListSinceBlockResult { + var hash *string + if blockHash != nil { + hash = btcjson.String(blockHash.String()) + } + + cmd := btcjson.NewListSinceBlockCmd(hash, &minConfirms, &watchOnly) + return c.SendCmd(cmd) +} + +// ListSinceBlockMinConfWatchOnly returns all transactions added in blocks since the +// specified block hash, or all transactions if it is nil, using the specified +// number of minimum confirmations as a filter. +// +// See ListSinceBlock to use the default minimum number of confirmations and default watch only parameter. +func (c *Client) ListSinceBlockMinConfWatchOnly(blockHash *chainhash.Hash, minConfirms int, watchOnly bool) (*btcjson.ListSinceBlockResult, error) { + return c.ListSinceBlockMinConfWatchOnlyAsync(blockHash, minConfirms, watchOnly).Receive() +} + // ************************** // Transaction Send Functions // ************************** // FutureLockUnspentResult is a future promise to deliver the error result of a // LockUnspentAsync RPC invocation. -type FutureLockUnspentResult chan *response +type FutureLockUnspentResult chan *Response -// Receive waits for the response promised by the future and returns the result +// Receive waits for the Response promised by the future and returns the result // of locking or unlocking the unspent output(s). func (r FutureLockUnspentResult) Receive() error { - _, err := receiveFuture(r) + _, err := ReceiveFuture(r) return err } @@ -341,7 +408,7 @@ func (c *Client) LockUnspentAsync(unlock bool, ops []*wire.OutPoint) FutureLockU } } cmd := btcjson.NewLockUnspentCmd(unlock, outputs) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // LockUnspent marks outputs as locked or unlocked, depending on the value of @@ -367,12 +434,12 @@ func (c *Client) LockUnspent(unlock bool, ops []*wire.OutPoint) error { // FutureListLockUnspentResult is a future promise to deliver the result of a // ListLockUnspentAsync RPC invocation (or an applicable error). -type FutureListLockUnspentResult chan *response +type FutureListLockUnspentResult chan *Response -// Receive waits for the response promised by the future and returns the result +// Receive waits for the Response promised by the future and returns the result // of all currently locked unspent outputs. func (r FutureListLockUnspentResult) Receive() ([]*wire.OutPoint, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -404,7 +471,7 @@ func (r FutureListLockUnspentResult) Receive() ([]*wire.OutPoint, error) { // See ListLockUnspent for the blocking version and more details. func (c *Client) ListLockUnspentAsync() FutureListLockUnspentResult { cmd := btcjson.NewListLockUnspentCmd() - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // ListLockUnspent returns a slice of outpoints for all unspent outputs marked @@ -416,13 +483,13 @@ func (c *Client) ListLockUnspent() ([]*wire.OutPoint, error) { // FutureSetTxFeeResult is a future promise to deliver the result of a // SetTxFeeAsync RPC invocation (or an applicable error). -type FutureSetTxFeeResult chan *response +type FutureSetTxFeeResult chan *Response -// Receive waits for the response promised by the future and returns the result +// Receive waits for the Response promised by the future and returns the result // of setting an optional transaction fee per KB that helps ensure transactions // are processed quickly. Most transaction are 1KB. func (r FutureSetTxFeeResult) Receive() error { - _, err := receiveFuture(r) + _, err := ReceiveFuture(r) return err } @@ -433,7 +500,7 @@ func (r FutureSetTxFeeResult) Receive() error { // See SetTxFee for the blocking version and more details. func (c *Client) SetTxFeeAsync(fee btcutil.Amount) FutureSetTxFeeResult { cmd := btcjson.NewSetTxFeeCmd(fee.ToBTC()) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // SetTxFee sets an optional transaction fee per KB that helps ensure @@ -444,12 +511,12 @@ func (c *Client) SetTxFee(fee btcutil.Amount) error { // FutureSendToAddressResult is a future promise to deliver the result of a // SendToAddressAsync RPC invocation (or an applicable error). -type FutureSendToAddressResult chan *response +type FutureSendToAddressResult chan *Response -// Receive waits for the response promised by the future and returns the hash +// Receive waits for the Response promised by the future and returns the hash // of the transaction sending the passed amount to the given address. func (r FutureSendToAddressResult) Receive() (*chainhash.Hash, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -472,7 +539,7 @@ func (r FutureSendToAddressResult) Receive() (*chainhash.Hash, error) { func (c *Client) SendToAddressAsync(address btcutil.Address, amount btcutil.Amount) FutureSendToAddressResult { addr := address.EncodeAddress() cmd := btcjson.NewSendToAddressCmd(addr, amount.ToBTC(), nil, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // SendToAddress sends the passed amount to the given address. @@ -499,13 +566,13 @@ func (c *Client) SendToAddressCommentAsync(address btcutil.Address, addr := address.EncodeAddress() cmd := btcjson.NewSendToAddressCmd(addr, amount.ToBTC(), &comment, &commentTo) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // SendToAddressComment sends the passed amount to the given address and stores // the provided comment and comment to in the wallet. The comment parameter is // intended to be used for the purpose of the transaction while the commentTo -// parameter is indended to be used for who the transaction is being sent to. +// parameter is intended to be used for who the transaction is being sent to. // // The comments are not part of the transaction and are only internal // to the wallet. @@ -522,13 +589,13 @@ func (c *Client) SendToAddressComment(address btcutil.Address, amount btcutil.Am // FutureSendFromResult is a future promise to deliver the result of a // SendFromAsync, SendFromMinConfAsync, or SendFromCommentAsync RPC invocation // (or an applicable error). -type FutureSendFromResult chan *response +type FutureSendFromResult chan *Response -// Receive waits for the response promised by the future and returns the hash +// Receive waits for the Response promised by the future and returns the hash // of the transaction sending amount to the given address using the provided // account as a source of funds. func (r FutureSendFromResult) Receive() (*chainhash.Hash, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -552,7 +619,7 @@ func (c *Client) SendFromAsync(fromAccount string, toAddress btcutil.Address, am addr := toAddress.EncodeAddress() cmd := btcjson.NewSendFromCmd(fromAccount, addr, amount.ToBTC(), nil, nil, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // SendFrom sends the passed amount to the given address using the provided @@ -576,7 +643,7 @@ func (c *Client) SendFromMinConfAsync(fromAccount string, toAddress btcutil.Addr addr := toAddress.EncodeAddress() cmd := btcjson.NewSendFromCmd(fromAccount, addr, amount.ToBTC(), &minConfirms, nil, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // SendFromMinConf sends the passed amount to the given address using the @@ -605,13 +672,13 @@ func (c *Client) SendFromCommentAsync(fromAccount string, addr := toAddress.EncodeAddress() cmd := btcjson.NewSendFromCmd(fromAccount, addr, amount.ToBTC(), &minConfirms, &comment, &commentTo) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // SendFromComment sends the passed amount to the given address using the // provided account as a source of funds and stores the provided comment and // comment to in the wallet. The comment parameter is intended to be used for -// the purpose of the transaction while the commentTo parameter is indended to +// the purpose of the transaction while the commentTo parameter is intended to // be used for who the transaction is being sent to. Only funds with the passed // number of minimum confirmations will be used. // @@ -630,13 +697,13 @@ func (c *Client) SendFromComment(fromAccount string, toAddress btcutil.Address, // FutureSendManyResult is a future promise to deliver the result of a // SendManyAsync, SendManyMinConfAsync, or SendManyCommentAsync RPC invocation // (or an applicable error). -type FutureSendManyResult chan *response +type FutureSendManyResult chan *Response -// Receive waits for the response promised by the future and returns the hash +// Receive waits for the Response promised by the future and returns the hash // of the transaction sending multiple amounts to multiple addresses using the // provided account as a source of funds. func (r FutureSendManyResult) Receive() (*chainhash.Hash, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -662,7 +729,7 @@ func (c *Client) SendManyAsync(fromAccount string, amounts map[btcutil.Address]b convertedAmounts[addr.EncodeAddress()] = amount.ToBTC() } cmd := btcjson.NewSendManyCmd(fromAccount, convertedAmounts, nil, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // SendMany sends multiple amounts to multiple addresses using the provided @@ -692,7 +759,7 @@ func (c *Client) SendManyMinConfAsync(fromAccount string, } cmd := btcjson.NewSendManyCmd(fromAccount, convertedAmounts, &minConfirms, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // SendManyMinConf sends multiple amounts to multiple addresses using the @@ -726,7 +793,7 @@ func (c *Client) SendManyCommentAsync(fromAccount string, } cmd := btcjson.NewSendManyCmd(fromAccount, convertedAmounts, &minConfirms, &comment) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // SendManyComment sends multiple amounts to multiple addresses using the @@ -753,13 +820,16 @@ func (c *Client) SendManyComment(fromAccount string, // FutureAddMultisigAddressResult is a future promise to deliver the result of a // AddMultisigAddressAsync RPC invocation (or an applicable error). -type FutureAddMultisigAddressResult chan *response +type FutureAddMultisigAddressResult struct { + responseChannel chan *Response + network *chaincfg.Params +} -// Receive waits for the response promised by the future and returns the +// Receive waits for the Response promised by the future and returns the // multisignature address that requires the specified number of signatures for // the provided addresses. func (r FutureAddMultisigAddressResult) Receive() (btcutil.Address, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r.responseChannel) if err != nil { return nil, err } @@ -771,7 +841,7 @@ func (r FutureAddMultisigAddressResult) Receive() (btcutil.Address, error) { return nil, err } - return btcutil.DecodeAddress(addr, &chaincfg.MainNetParams) + return btcutil.DecodeAddress(addr, r.network) } // AddMultisigAddressAsync returns an instance of a type that can be used to get @@ -786,24 +856,27 @@ func (c *Client) AddMultisigAddressAsync(requiredSigs int, addresses []btcutil.A } cmd := btcjson.NewAddMultisigAddressCmd(requiredSigs, addrs, &account) - return c.sendCmd(cmd) + result := FutureAddMultisigAddressResult{ + network: c.chainParams, + responseChannel: c.SendCmd(cmd), + } + return result } // AddMultisigAddress adds a multisignature address that requires the specified // number of signatures for the provided addresses to the wallet. func (c *Client) AddMultisigAddress(requiredSigs int, addresses []btcutil.Address, account string) (btcutil.Address, error) { - return c.AddMultisigAddressAsync(requiredSigs, addresses, - account).Receive() + return c.AddMultisigAddressAsync(requiredSigs, addresses, account).Receive() } // FutureCreateMultisigResult is a future promise to deliver the result of a // CreateMultisigAsync RPC invocation (or an applicable error). -type FutureCreateMultisigResult chan *response +type FutureCreateMultisigResult chan *Response -// Receive waits for the response promised by the future and returns the +// Receive waits for the Response promised by the future and returns the // multisignature address and script needed to redeem it. func (r FutureCreateMultisigResult) Receive() (*btcjson.CreateMultiSigResult, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -830,7 +903,7 @@ func (c *Client) CreateMultisigAsync(requiredSigs int, addresses []btcutil.Addre } cmd := btcjson.NewCreateMultisigCmd(requiredSigs, addrs) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // CreateMultisig creates a multisignature address that requires the specified @@ -842,12 +915,12 @@ func (c *Client) CreateMultisig(requiredSigs int, addresses []btcutil.Address) ( // FutureCreateNewAccountResult is a future promise to deliver the result of a // CreateNewAccountAsync RPC invocation (or an applicable error). -type FutureCreateNewAccountResult chan *response +type FutureCreateNewAccountResult chan *Response -// Receive waits for the response promised by the future and returns the +// Receive waits for the Response promised by the future and returns the // result of creating new account. func (r FutureCreateNewAccountResult) Receive() error { - _, err := receiveFuture(r) + _, err := ReceiveFuture(r) return err } @@ -858,7 +931,7 @@ func (r FutureCreateNewAccountResult) Receive() error { // See CreateNewAccount for the blocking version and more details. func (c *Client) CreateNewAccountAsync(account string) FutureCreateNewAccountResult { cmd := btcjson.NewCreateNewAccountCmd(account) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // CreateNewAccount creates a new wallet account. @@ -866,14 +939,137 @@ func (c *Client) CreateNewAccount(account string) error { return c.CreateNewAccountAsync(account).Receive() } +// FutureCreateWalletResult is a future promise to deliver the result of a +// CreateWalletAsync RPC invocation (or an applicable error). +type FutureCreateWalletResult chan *Response + +// Receive waits for the Response promised by the future and returns the +// result of creating a new wallet. +func (r FutureCreateWalletResult) Receive() (*btcjson.CreateWalletResult, error) { + res, err := ReceiveFuture(r) + if err != nil { + return nil, err + } + + var createWalletResult btcjson.CreateWalletResult + err = json.Unmarshal(res, &createWalletResult) + if err != nil { + return nil, err + } + return &createWalletResult, nil +} + +// CreateWalletOpt defines a functional-option to be used with CreateWallet +// method. +type CreateWalletOpt func(*btcjson.CreateWalletCmd) + +// WithCreateWalletDisablePrivateKeys disables the possibility of private keys +// to be used with a wallet created using the CreateWallet method. Using this +// option will make the wallet watch-only. +func WithCreateWalletDisablePrivateKeys() CreateWalletOpt { + return func(c *btcjson.CreateWalletCmd) { + c.DisablePrivateKeys = btcjson.Bool(true) + } +} + +// WithCreateWalletBlank specifies creation of a blank wallet. +func WithCreateWalletBlank() CreateWalletOpt { + return func(c *btcjson.CreateWalletCmd) { + c.Blank = btcjson.Bool(true) + } +} + +// WithCreateWalletPassphrase specifies a passphrase to encrypt the wallet +// with. +func WithCreateWalletPassphrase(value string) CreateWalletOpt { + return func(c *btcjson.CreateWalletCmd) { + c.Passphrase = btcjson.String(value) + } +} + +// WithCreateWalletAvoidReuse specifies keeping track of coin reuse, and +// treat dirty and clean coins differently with privacy considerations in mind. +func WithCreateWalletAvoidReuse() CreateWalletOpt { + return func(c *btcjson.CreateWalletCmd) { + c.AvoidReuse = btcjson.Bool(true) + } +} + +// CreateWalletAsync returns an instance of a type that can be used to get the +// result of the RPC at some future time by invoking the Receive function on the +// returned instance. +// +// See CreateWallet for the blocking version and more details. +func (c *Client) CreateWalletAsync(name string, opts ...CreateWalletOpt) FutureCreateWalletResult { + cmd := btcjson.NewCreateWalletCmd(name, nil, nil, nil, nil) + + // Apply each specified option to mutate the default command. + for _, opt := range opts { + opt(cmd) + } + + return c.SendCmd(cmd) +} + +// CreateWallet creates a new wallet account, with the possibility to use +// private keys. +// +// Optional parameters can be specified using functional-options pattern. The +// following functions are available: +// - WithCreateWalletDisablePrivateKeys +// - WithCreateWalletBlank +// - WithCreateWalletPassphrase +// - WithCreateWalletAvoidReuse +func (c *Client) CreateWallet(name string, opts ...CreateWalletOpt) (*btcjson.CreateWalletResult, error) { + return c.CreateWalletAsync(name, opts...).Receive() +} + +// FutureGetAddressInfoResult is a future promise to deliver the result of an +// GetAddressInfoAsync RPC invocation (or an applicable error). +type FutureGetAddressInfoResult chan *Response + +// Receive waits for the Response promised by the future and returns the information +// about the given bitcoin address. +func (r FutureGetAddressInfoResult) Receive() (*btcjson.GetAddressInfoResult, error) { + res, err := ReceiveFuture(r) + if err != nil { + return nil, err + } + + var getAddressInfoResult btcjson.GetAddressInfoResult + err = json.Unmarshal(res, &getAddressInfoResult) + if err != nil { + return nil, err + } + return &getAddressInfoResult, nil +} + +// GetAddressInfoAsync returns an instance of a type that can be used to get the result +// of the RPC at some future time by invoking the Receive function on the +// returned instance. +// +// See GetAddressInfo for the blocking version and more details. +func (c *Client) GetAddressInfoAsync(address string) FutureGetAddressInfoResult { + cmd := btcjson.NewGetAddressInfoCmd(address) + return c.SendCmd(cmd) +} + +// GetAddressInfo returns information about the given bitcoin address. +func (c *Client) GetAddressInfo(address string) (*btcjson.GetAddressInfoResult, error) { + return c.GetAddressInfoAsync(address).Receive() +} + // FutureGetNewAddressResult is a future promise to deliver the result of a // GetNewAddressAsync RPC invocation (or an applicable error). -type FutureGetNewAddressResult chan *response +type FutureGetNewAddressResult struct { + responseChannel chan *Response + network *chaincfg.Params +} -// Receive waits for the response promised by the future and returns a new +// Receive waits for the Response promised by the future and returns a new // address. func (r FutureGetNewAddressResult) Receive() (btcutil.Address, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r.responseChannel) if err != nil { return nil, err } @@ -885,7 +1081,7 @@ func (r FutureGetNewAddressResult) Receive() (btcutil.Address, error) { return nil, err } - return btcutil.DecodeAddress(addr, &chaincfg.MainNetParams) + return btcutil.DecodeAddress(addr, r.network) } // GetNewAddressAsync returns an instance of a type that can be used to get the @@ -894,24 +1090,52 @@ func (r FutureGetNewAddressResult) Receive() (btcutil.Address, error) { // // See GetNewAddress for the blocking version and more details. func (c *Client) GetNewAddressAsync(account string) FutureGetNewAddressResult { - cmd := btcjson.NewGetNewAddressCmd(&account) - return c.sendCmd(cmd) + cmd := btcjson.NewGetNewAddressCmd(&account, nil) + result := FutureGetNewAddressResult{ + network: c.chainParams, + responseChannel: c.SendCmd(cmd), + } + return result } -// GetNewAddress returns a new address. +// GetNewAddress returns a new address, and decodes based on the client's +// chain params. func (c *Client) GetNewAddress(account string) (btcutil.Address, error) { return c.GetNewAddressAsync(account).Receive() } +// GetNewAddressTypeAsync returns an instance of a type that can be used to get +// the result of the RPC at some future time by invoking the Receive function on +// the returned instance. +// +// See GetNewAddressType for the blocking version and more details. +func (c *Client) GetNewAddressTypeAsync(account, addrType string) FutureGetNewAddressResult { + cmd := btcjson.NewGetNewAddressCmd(&account, &addrType) + result := FutureGetNewAddressResult{ + network: c.chainParams, + responseChannel: c.SendCmd(cmd), + } + return result +} + +// GetNewAddressType returns a new address, and decodes based on the client's +// chain params. +func (c *Client) GetNewAddressType(account, addrType string) (btcutil.Address, error) { + return c.GetNewAddressTypeAsync(account, addrType).Receive() +} + // FutureGetRawChangeAddressResult is a future promise to deliver the result of // a GetRawChangeAddressAsync RPC invocation (or an applicable error). -type FutureGetRawChangeAddressResult chan *response +type FutureGetRawChangeAddressResult struct { + responseChannel chan *Response + network *chaincfg.Params +} -// Receive waits for the response promised by the future and returns a new +// Receive waits for the Response promised by the future and returns a new // address for receiving change that will be associated with the provided // account. Note that this is only for raw transactions and NOT for normal use. func (r FutureGetRawChangeAddressResult) Receive() (btcutil.Address, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r.responseChannel) if err != nil { return nil, err } @@ -923,7 +1147,7 @@ func (r FutureGetRawChangeAddressResult) Receive() (btcutil.Address, error) { return nil, err } - return btcutil.DecodeAddress(addr, &chaincfg.MainNetParams) + return btcutil.DecodeAddress(addr, r.network) } // GetRawChangeAddressAsync returns an instance of a type that can be used to @@ -932,8 +1156,12 @@ func (r FutureGetRawChangeAddressResult) Receive() (btcutil.Address, error) { // // See GetRawChangeAddress for the blocking version and more details. func (c *Client) GetRawChangeAddressAsync(account string) FutureGetRawChangeAddressResult { - cmd := btcjson.NewGetRawChangeAddressCmd(&account) - return c.sendCmd(cmd) + cmd := btcjson.NewGetRawChangeAddressCmd(&account, nil) + result := FutureGetRawChangeAddressResult{ + network: c.chainParams, + responseChannel: c.SendCmd(cmd), + } + return result } // GetRawChangeAddress returns a new address for receiving change that will be @@ -943,14 +1171,38 @@ func (c *Client) GetRawChangeAddress(account string) (btcutil.Address, error) { return c.GetRawChangeAddressAsync(account).Receive() } +// GetRawChangeAddressTypeAsync returns an instance of a type that can be used +// to get the result of the RPC at some future time by invoking the Receive +// function on the returned instance. +// +// See GetRawChangeAddressType for the blocking version and more details. +func (c *Client) GetRawChangeAddressTypeAsync(account, addrType string) FutureGetRawChangeAddressResult { + cmd := btcjson.NewGetRawChangeAddressCmd(&account, &addrType) + result := FutureGetRawChangeAddressResult{ + network: c.chainParams, + responseChannel: c.SendCmd(cmd), + } + return result +} + +// GetRawChangeAddressType returns a new address for receiving change that will +// be associated with the provided account. Note that this is only for raw +// transactions and NOT for normal use. +func (c *Client) GetRawChangeAddressType(account, addrType string) (btcutil.Address, error) { + return c.GetRawChangeAddressTypeAsync(account, addrType).Receive() +} + // FutureAddWitnessAddressResult is a future promise to deliver the result of // a AddWitnessAddressAsync RPC invocation (or an applicable error). -type FutureAddWitnessAddressResult chan *response +type FutureAddWitnessAddressResult struct { + responseChannel chan *Response + network *chaincfg.Params +} -// Receive waits for the response promised by the future and returns the new +// Receive waits for the Response promised by the future and returns the new // address. func (r FutureAddWitnessAddressResult) Receive() (btcutil.Address, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r.responseChannel) if err != nil { return nil, err } @@ -962,7 +1214,7 @@ func (r FutureAddWitnessAddressResult) Receive() (btcutil.Address, error) { return nil, err } - return btcutil.DecodeAddress(addr, &chaincfg.MainNetParams) + return btcutil.DecodeAddress(addr, r.network) } // AddWitnessAddressAsync returns an instance of a type that can be used to get @@ -972,7 +1224,11 @@ func (r FutureAddWitnessAddressResult) Receive() (btcutil.Address, error) { // See AddWitnessAddress for the blocking version and more details. func (c *Client) AddWitnessAddressAsync(address string) FutureAddWitnessAddressResult { cmd := btcjson.NewAddWitnessAddressCmd(address) - return c.sendCmd(cmd) + response := FutureAddWitnessAddressResult{ + network: c.chainParams, + responseChannel: c.SendCmd(cmd), + } + return response } // AddWitnessAddress adds a witness address for a script and returns the new @@ -983,12 +1239,15 @@ func (c *Client) AddWitnessAddress(address string) (btcutil.Address, error) { // FutureGetAccountAddressResult is a future promise to deliver the result of a // GetAccountAddressAsync RPC invocation (or an applicable error). -type FutureGetAccountAddressResult chan *response +type FutureGetAccountAddressResult struct { + responseChannel chan *Response + network *chaincfg.Params +} -// Receive waits for the response promised by the future and returns the current +// Receive waits for the Response promised by the future and returns the current // Bitcoin address for receiving payments to the specified account. func (r FutureGetAccountAddressResult) Receive() (btcutil.Address, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r.responseChannel) if err != nil { return nil, err } @@ -1000,7 +1259,7 @@ func (r FutureGetAccountAddressResult) Receive() (btcutil.Address, error) { return nil, err } - return btcutil.DecodeAddress(addr, &chaincfg.MainNetParams) + return btcutil.DecodeAddress(addr, r.network) } // GetAccountAddressAsync returns an instance of a type that can be used to get @@ -1010,7 +1269,11 @@ func (r FutureGetAccountAddressResult) Receive() (btcutil.Address, error) { // See GetAccountAddress for the blocking version and more details. func (c *Client) GetAccountAddressAsync(account string) FutureGetAccountAddressResult { cmd := btcjson.NewGetAccountAddressCmd(account) - return c.sendCmd(cmd) + result := FutureGetAccountAddressResult{ + network: c.chainParams, + responseChannel: c.SendCmd(cmd), + } + return result } // GetAccountAddress returns the current Bitcoin address for receiving payments @@ -1021,12 +1284,12 @@ func (c *Client) GetAccountAddress(account string) (btcutil.Address, error) { // FutureGetAccountResult is a future promise to deliver the result of a // GetAccountAsync RPC invocation (or an applicable error). -type FutureGetAccountResult chan *response +type FutureGetAccountResult chan *Response -// Receive waits for the response promised by the future and returns the account +// Receive waits for the Response promised by the future and returns the account // associated with the passed address. func (r FutureGetAccountResult) Receive() (string, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return "", err } @@ -1049,7 +1312,7 @@ func (r FutureGetAccountResult) Receive() (string, error) { func (c *Client) GetAccountAsync(address btcutil.Address) FutureGetAccountResult { addr := address.EncodeAddress() cmd := btcjson.NewGetAccountCmd(addr) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetAccount returns the account associated with the passed address. @@ -1059,12 +1322,12 @@ func (c *Client) GetAccount(address btcutil.Address) (string, error) { // FutureSetAccountResult is a future promise to deliver the result of a // SetAccountAsync RPC invocation (or an applicable error). -type FutureSetAccountResult chan *response +type FutureSetAccountResult chan *Response -// Receive waits for the response promised by the future and returns the result +// Receive waits for the Response promised by the future and returns the result // of setting the account to be associated with the passed address. func (r FutureSetAccountResult) Receive() error { - _, err := receiveFuture(r) + _, err := ReceiveFuture(r) return err } @@ -1076,7 +1339,7 @@ func (r FutureSetAccountResult) Receive() error { func (c *Client) SetAccountAsync(address btcutil.Address, account string) FutureSetAccountResult { addr := address.EncodeAddress() cmd := btcjson.NewSetAccountCmd(addr, account) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // SetAccount sets the account associated with the passed address. @@ -1086,12 +1349,15 @@ func (c *Client) SetAccount(address btcutil.Address, account string) error { // FutureGetAddressesByAccountResult is a future promise to deliver the result // of a GetAddressesByAccountAsync RPC invocation (or an applicable error). -type FutureGetAddressesByAccountResult chan *response +type FutureGetAddressesByAccountResult struct { + responseChannel chan *Response + network *chaincfg.Params +} -// Receive waits for the response promised by the future and returns the list of +// Receive waits for the Response promised by the future and returns the list of // addresses associated with the passed account. func (r FutureGetAddressesByAccountResult) Receive() ([]btcutil.Address, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r.responseChannel) if err != nil { return nil, err } @@ -1103,17 +1369,15 @@ func (r FutureGetAddressesByAccountResult) Receive() ([]btcutil.Address, error) return nil, err } - addrs := make([]btcutil.Address, 0, len(addrStrings)) - for _, addrStr := range addrStrings { - addr, err := btcutil.DecodeAddress(addrStr, - &chaincfg.MainNetParams) + addresses := make([]btcutil.Address, len(addrStrings)) + for i, addrString := range addrStrings { + addresses[i], err = btcutil.DecodeAddress(addrString, r.network) if err != nil { return nil, err } - addrs = append(addrs, addr) } - return addrs, nil + return addresses, nil } // GetAddressesByAccountAsync returns an instance of a type that can be used to @@ -1123,7 +1387,11 @@ func (r FutureGetAddressesByAccountResult) Receive() ([]btcutil.Address, error) // See GetAddressesByAccount for the blocking version and more details. func (c *Client) GetAddressesByAccountAsync(account string) FutureGetAddressesByAccountResult { cmd := btcjson.NewGetAddressesByAccountCmd(account) - return c.sendCmd(cmd) + result := FutureGetAddressesByAccountResult{ + network: c.chainParams, + responseChannel: c.SendCmd(cmd), + } + return result } // GetAddressesByAccount returns the list of addresses associated with the @@ -1135,12 +1403,12 @@ func (c *Client) GetAddressesByAccount(account string) ([]btcutil.Address, error // FutureMoveResult is a future promise to deliver the result of a MoveAsync, // MoveMinConfAsync, or MoveCommentAsync RPC invocation (or an applicable // error). -type FutureMoveResult chan *response +type FutureMoveResult chan *Response -// Receive waits for the response promised by the future and returns the result +// Receive waits for the Response promised by the future and returns the result // of the move operation. func (r FutureMoveResult) Receive() (bool, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return false, err } @@ -1163,7 +1431,7 @@ func (r FutureMoveResult) Receive() (bool, error) { func (c *Client) MoveAsync(fromAccount, toAccount string, amount btcutil.Amount) FutureMoveResult { cmd := btcjson.NewMoveCmd(fromAccount, toAccount, amount.ToBTC(), nil, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // Move moves specified amount from one account in your wallet to another. Only @@ -1184,7 +1452,7 @@ func (c *Client) MoveMinConfAsync(fromAccount, toAccount string, cmd := btcjson.NewMoveCmd(fromAccount, toAccount, amount.ToBTC(), &minConfirms, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // MoveMinConf moves specified amount from one account in your wallet to @@ -1207,7 +1475,7 @@ func (c *Client) MoveCommentAsync(fromAccount, toAccount string, cmd := btcjson.NewMoveCmd(fromAccount, toAccount, amount.ToBTC(), &minConfirms, &comment) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // MoveComment moves specified amount from one account in your wallet to @@ -1225,12 +1493,12 @@ func (c *Client) MoveComment(fromAccount, toAccount string, amount btcutil.Amoun // FutureRenameAccountResult is a future promise to deliver the result of a // RenameAccountAsync RPC invocation (or an applicable error). -type FutureRenameAccountResult chan *response +type FutureRenameAccountResult chan *Response -// Receive waits for the response promised by the future and returns the +// Receive waits for the Response promised by the future and returns the // result of creating new account. func (r FutureRenameAccountResult) Receive() error { - _, err := receiveFuture(r) + _, err := ReceiveFuture(r) return err } @@ -1241,7 +1509,7 @@ func (r FutureRenameAccountResult) Receive() error { // See RenameAccount for the blocking version and more details. func (c *Client) RenameAccountAsync(oldAccount, newAccount string) FutureRenameAccountResult { cmd := btcjson.NewRenameAccountCmd(oldAccount, newAccount) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // RenameAccount creates a new wallet account. @@ -1251,12 +1519,12 @@ func (c *Client) RenameAccount(oldAccount, newAccount string) error { // FutureValidateAddressResult is a future promise to deliver the result of a // ValidateAddressAsync RPC invocation (or an applicable error). -type FutureValidateAddressResult chan *response +type FutureValidateAddressResult chan *Response -// Receive waits for the response promised by the future and returns information +// Receive waits for the Response promised by the future and returns information // about the given bitcoin address. func (r FutureValidateAddressResult) Receive() (*btcjson.ValidateAddressWalletResult, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -1279,7 +1547,7 @@ func (r FutureValidateAddressResult) Receive() (*btcjson.ValidateAddressWalletRe func (c *Client) ValidateAddressAsync(address btcutil.Address) FutureValidateAddressResult { addr := address.EncodeAddress() cmd := btcjson.NewValidateAddressCmd(addr) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // ValidateAddress returns information about the given bitcoin address. @@ -1289,12 +1557,12 @@ func (c *Client) ValidateAddress(address btcutil.Address) (*btcjson.ValidateAddr // FutureKeyPoolRefillResult is a future promise to deliver the result of a // KeyPoolRefillAsync RPC invocation (or an applicable error). -type FutureKeyPoolRefillResult chan *response +type FutureKeyPoolRefillResult chan *Response -// Receive waits for the response promised by the future and returns the result +// Receive waits for the Response promised by the future and returns the result // of refilling the key pool. func (r FutureKeyPoolRefillResult) Receive() error { - _, err := receiveFuture(r) + _, err := ReceiveFuture(r) return err } @@ -1305,7 +1573,7 @@ func (r FutureKeyPoolRefillResult) Receive() error { // See KeyPoolRefill for the blocking version and more details. func (c *Client) KeyPoolRefillAsync() FutureKeyPoolRefillResult { cmd := btcjson.NewKeyPoolRefillCmd(nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // KeyPoolRefill fills the key pool as necessary to reach the default size. @@ -1322,7 +1590,7 @@ func (c *Client) KeyPoolRefill() error { // See KeyPoolRefillSize for the blocking version and more details. func (c *Client) KeyPoolRefillSizeAsync(newSize uint) FutureKeyPoolRefillResult { cmd := btcjson.NewKeyPoolRefillCmd(&newSize) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // KeyPoolRefillSize fills the key pool as necessary to reach the specified @@ -1338,12 +1606,12 @@ func (c *Client) KeyPoolRefillSize(newSize uint) error { // FutureListAccountsResult is a future promise to deliver the result of a // ListAccountsAsync or ListAccountsMinConfAsync RPC invocation (or an // applicable error). -type FutureListAccountsResult chan *response +type FutureListAccountsResult chan *Response -// Receive waits for the response promised by the future and returns returns a +// Receive waits for the Response promised by the future and returns returns a // map of account names and their associated balances. func (r FutureListAccountsResult) Receive() (map[string]btcutil.Amount, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -1375,7 +1643,7 @@ func (r FutureListAccountsResult) Receive() (map[string]btcutil.Amount, error) { // See ListAccounts for the blocking version and more details. func (c *Client) ListAccountsAsync() FutureListAccountsResult { cmd := btcjson.NewListAccountsCmd(nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // ListAccounts returns a map of account names and their associated balances @@ -1393,7 +1661,7 @@ func (c *Client) ListAccounts() (map[string]btcutil.Amount, error) { // See ListAccountsMinConf for the blocking version and more details. func (c *Client) ListAccountsMinConfAsync(minConfirms int) FutureListAccountsResult { cmd := btcjson.NewListAccountsCmd(&minConfirms) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // ListAccountsMinConf returns a map of account names and their associated @@ -1407,12 +1675,12 @@ func (c *Client) ListAccountsMinConf(minConfirms int) (map[string]btcutil.Amount // FutureGetBalanceResult is a future promise to deliver the result of a // GetBalanceAsync or GetBalanceMinConfAsync RPC invocation (or an applicable // error). -type FutureGetBalanceResult chan *response +type FutureGetBalanceResult chan *Response -// Receive waits for the response promised by the future and returns the +// Receive waits for the Response promised by the future and returns the // available balance from the server for the specified account. func (r FutureGetBalanceResult) Receive() (btcutil.Amount, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return 0, err } @@ -1436,12 +1704,12 @@ func (r FutureGetBalanceResult) Receive() (btcutil.Amount, error) { // that the result is expected to be a string which is then parsed into // a float64 value // This is required for compatibility with servers like blockchain.info -type FutureGetBalanceParseResult chan *response +type FutureGetBalanceParseResult chan *Response -// Receive waits for the response promised by the future and returns the +// Receive waits for the Response promised by the future and returns the // available balance from the server for the specified account. func (r FutureGetBalanceParseResult) Receive() (btcutil.Amount, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return 0, err } @@ -1472,7 +1740,7 @@ func (r FutureGetBalanceParseResult) Receive() (btcutil.Amount, error) { // See GetBalance for the blocking version and more details. func (c *Client) GetBalanceAsync(account string) FutureGetBalanceResult { cmd := btcjson.NewGetBalanceCmd(&account, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetBalance returns the available balance from the server for the specified @@ -1491,7 +1759,7 @@ func (c *Client) GetBalance(account string) (btcutil.Amount, error) { // See GetBalanceMinConf for the blocking version and more details. func (c *Client) GetBalanceMinConfAsync(account string, minConfirms int) FutureGetBalanceResult { cmd := btcjson.NewGetBalanceCmd(&account, &minConfirms) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetBalanceMinConf returns the available balance from the server for the @@ -1507,15 +1775,52 @@ func (c *Client) GetBalanceMinConf(account string, minConfirms int) (btcutil.Amo return c.GetBalanceMinConfAsync(account, minConfirms).Receive() } +// FutureGetBalancesResult is a future promise to deliver the result of a +// GetBalancesAsync RPC invocation (or an applicable error). +type FutureGetBalancesResult chan *Response + +// Receive waits for the Response promised by the future and returns the +// available balances from the server. +func (r FutureGetBalancesResult) Receive() (*btcjson.GetBalancesResult, error) { + res, err := ReceiveFuture(r) + if err != nil { + return nil, err + } + + // Unmarshal result as a floating point number. + var balances btcjson.GetBalancesResult + err = json.Unmarshal(res, &balances) + if err != nil { + return nil, err + } + + return &balances, nil +} + +// GetBalancesAsync returns an instance of a type that can be used to get the +// result of the RPC at some future time by invoking the Receive function on the +// returned instance. +// +// See GetBalances for the blocking version and more details. +func (c *Client) GetBalancesAsync() FutureGetBalancesResult { + cmd := btcjson.NewGetBalancesCmd() + return c.SendCmd(cmd) +} + +// GetBalances returns the available balances from the server. +func (c *Client) GetBalances() (*btcjson.GetBalancesResult, error) { + return c.GetBalancesAsync().Receive() +} + // FutureGetReceivedByAccountResult is a future promise to deliver the result of // a GetReceivedByAccountAsync or GetReceivedByAccountMinConfAsync RPC // invocation (or an applicable error). -type FutureGetReceivedByAccountResult chan *response +type FutureGetReceivedByAccountResult chan *Response -// Receive waits for the response promised by the future and returns the total +// Receive waits for the Response promised by the future and returns the total // amount received with the specified account. func (r FutureGetReceivedByAccountResult) Receive() (btcutil.Amount, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return 0, err } @@ -1542,7 +1847,7 @@ func (r FutureGetReceivedByAccountResult) Receive() (btcutil.Amount, error) { // See GetReceivedByAccount for the blocking version and more details. func (c *Client) GetReceivedByAccountAsync(account string) FutureGetReceivedByAccountResult { cmd := btcjson.NewGetReceivedByAccountCmd(account, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetReceivedByAccount returns the total amount received with the specified @@ -1561,7 +1866,7 @@ func (c *Client) GetReceivedByAccount(account string) (btcutil.Amount, error) { // See GetReceivedByAccountMinConf for the blocking version and more details. func (c *Client) GetReceivedByAccountMinConfAsync(account string, minConfirms int) FutureGetReceivedByAccountResult { cmd := btcjson.NewGetReceivedByAccountCmd(account, &minConfirms) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetReceivedByAccountMinConf returns the total amount received with the @@ -1575,12 +1880,12 @@ func (c *Client) GetReceivedByAccountMinConf(account string, minConfirms int) (b // FutureGetUnconfirmedBalanceResult is a future promise to deliver the result // of a GetUnconfirmedBalanceAsync RPC invocation (or an applicable error). -type FutureGetUnconfirmedBalanceResult chan *response +type FutureGetUnconfirmedBalanceResult chan *Response -// Receive waits for the response promised by the future and returns returns the +// Receive waits for the Response promised by the future and returns returns the // unconfirmed balance from the server for the specified account. func (r FutureGetUnconfirmedBalanceResult) Receive() (btcutil.Amount, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return 0, err } @@ -1607,7 +1912,7 @@ func (r FutureGetUnconfirmedBalanceResult) Receive() (btcutil.Amount, error) { // See GetUnconfirmedBalance for the blocking version and more details. func (c *Client) GetUnconfirmedBalanceAsync(account string) FutureGetUnconfirmedBalanceResult { cmd := btcjson.NewGetUnconfirmedBalanceCmd(&account) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetUnconfirmedBalance returns the unconfirmed balance from the server for @@ -1619,12 +1924,12 @@ func (c *Client) GetUnconfirmedBalance(account string) (btcutil.Amount, error) { // FutureGetReceivedByAddressResult is a future promise to deliver the result of // a GetReceivedByAddressAsync or GetReceivedByAddressMinConfAsync RPC // invocation (or an applicable error). -type FutureGetReceivedByAddressResult chan *response +type FutureGetReceivedByAddressResult chan *Response -// Receive waits for the response promised by the future and returns the total +// Receive waits for the Response promised by the future and returns the total // amount received by the specified address. func (r FutureGetReceivedByAddressResult) Receive() (btcutil.Amount, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return 0, err } @@ -1652,7 +1957,7 @@ func (r FutureGetReceivedByAddressResult) Receive() (btcutil.Amount, error) { func (c *Client) GetReceivedByAddressAsync(address btcutil.Address) FutureGetReceivedByAddressResult { addr := address.EncodeAddress() cmd := btcjson.NewGetReceivedByAddressCmd(addr, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } @@ -1673,7 +1978,7 @@ func (c *Client) GetReceivedByAddress(address btcutil.Address) (btcutil.Amount, func (c *Client) GetReceivedByAddressMinConfAsync(address btcutil.Address, minConfirms int) FutureGetReceivedByAddressResult { addr := address.EncodeAddress() cmd := btcjson.NewGetReceivedByAddressCmd(addr, &minConfirms) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetReceivedByAddressMinConf returns the total amount received by the specified @@ -1688,12 +1993,12 @@ func (c *Client) GetReceivedByAddressMinConf(address btcutil.Address, minConfirm // of a ListReceivedByAccountAsync, ListReceivedByAccountMinConfAsync, or // ListReceivedByAccountIncludeEmptyAsync RPC invocation (or an applicable // error). -type FutureListReceivedByAccountResult chan *response +type FutureListReceivedByAccountResult chan *Response -// Receive waits for the response promised by the future and returns a list of +// Receive waits for the Response promised by the future and returns a list of // balances by account. func (r FutureListReceivedByAccountResult) Receive() ([]btcjson.ListReceivedByAccountResult, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -1715,7 +2020,7 @@ func (r FutureListReceivedByAccountResult) Receive() ([]btcjson.ListReceivedByAc // See ListReceivedByAccount for the blocking version and more details. func (c *Client) ListReceivedByAccountAsync() FutureListReceivedByAccountResult { cmd := btcjson.NewListReceivedByAccountCmd(nil, nil, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // ListReceivedByAccount lists balances by account using the default number @@ -1736,7 +2041,7 @@ func (c *Client) ListReceivedByAccount() ([]btcjson.ListReceivedByAccountResult, // See ListReceivedByAccountMinConf for the blocking version and more details. func (c *Client) ListReceivedByAccountMinConfAsync(minConfirms int) FutureListReceivedByAccountResult { cmd := btcjson.NewListReceivedByAccountCmd(&minConfirms, nil, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // ListReceivedByAccountMinConf lists balances by account using the specified @@ -1758,7 +2063,7 @@ func (c *Client) ListReceivedByAccountMinConf(minConfirms int) ([]btcjson.ListRe func (c *Client) ListReceivedByAccountIncludeEmptyAsync(minConfirms int, includeEmpty bool) FutureListReceivedByAccountResult { cmd := btcjson.NewListReceivedByAccountCmd(&minConfirms, &includeEmpty, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // ListReceivedByAccountIncludeEmpty lists balances by account using the @@ -1775,12 +2080,12 @@ func (c *Client) ListReceivedByAccountIncludeEmpty(minConfirms int, includeEmpty // of a ListReceivedByAddressAsync, ListReceivedByAddressMinConfAsync, or // ListReceivedByAddressIncludeEmptyAsync RPC invocation (or an applicable // error). -type FutureListReceivedByAddressResult chan *response +type FutureListReceivedByAddressResult chan *Response -// Receive waits for the response promised by the future and returns a list of +// Receive waits for the Response promised by the future and returns a list of // balances by address. func (r FutureListReceivedByAddressResult) Receive() ([]btcjson.ListReceivedByAddressResult, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -1802,7 +2107,7 @@ func (r FutureListReceivedByAddressResult) Receive() ([]btcjson.ListReceivedByAd // See ListReceivedByAddress for the blocking version and more details. func (c *Client) ListReceivedByAddressAsync() FutureListReceivedByAddressResult { cmd := btcjson.NewListReceivedByAddressCmd(nil, nil, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // ListReceivedByAddress lists balances by address using the default number @@ -1823,7 +2128,7 @@ func (c *Client) ListReceivedByAddress() ([]btcjson.ListReceivedByAddressResult, // See ListReceivedByAddressMinConf for the blocking version and more details. func (c *Client) ListReceivedByAddressMinConfAsync(minConfirms int) FutureListReceivedByAddressResult { cmd := btcjson.NewListReceivedByAddressCmd(&minConfirms, nil, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // ListReceivedByAddressMinConf lists balances by address using the specified @@ -1845,7 +2150,7 @@ func (c *Client) ListReceivedByAddressMinConf(minConfirms int) ([]btcjson.ListRe func (c *Client) ListReceivedByAddressIncludeEmptyAsync(minConfirms int, includeEmpty bool) FutureListReceivedByAddressResult { cmd := btcjson.NewListReceivedByAddressCmd(&minConfirms, &includeEmpty, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // ListReceivedByAddressIncludeEmpty lists balances by address using the @@ -1864,12 +2169,12 @@ func (c *Client) ListReceivedByAddressIncludeEmpty(minConfirms int, includeEmpty // FutureWalletLockResult is a future promise to deliver the result of a // WalletLockAsync RPC invocation (or an applicable error). -type FutureWalletLockResult chan *response +type FutureWalletLockResult chan *Response -// Receive waits for the response promised by the future and returns the result +// Receive waits for the Response promised by the future and returns the result // of locking the wallet. func (r FutureWalletLockResult) Receive() error { - _, err := receiveFuture(r) + _, err := ReceiveFuture(r) return err } @@ -1880,7 +2185,7 @@ func (r FutureWalletLockResult) Receive() error { // See WalletLock for the blocking version and more details. func (c *Client) WalletLockAsync() FutureWalletLockResult { cmd := btcjson.NewWalletLockCmd() - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // WalletLock locks the wallet by removing the encryption key from memory. @@ -1903,12 +2208,12 @@ func (c *Client) WalletPassphrase(passphrase string, timeoutSecs int64) error { // FutureWalletPassphraseChangeResult is a future promise to deliver the result // of a WalletPassphraseChangeAsync RPC invocation (or an applicable error). -type FutureWalletPassphraseChangeResult chan *response +type FutureWalletPassphraseChangeResult chan *Response -// Receive waits for the response promised by the future and returns the result +// Receive waits for the Response promised by the future and returns the result // of changing the wallet passphrase. func (r FutureWalletPassphraseChangeResult) Receive() error { - _, err := receiveFuture(r) + _, err := ReceiveFuture(r) return err } @@ -1919,7 +2224,7 @@ func (r FutureWalletPassphraseChangeResult) Receive() error { // See WalletPassphraseChange for the blocking version and more details. func (c *Client) WalletPassphraseChangeAsync(old, new string) FutureWalletPassphraseChangeResult { cmd := btcjson.NewWalletPassphraseChangeCmd(old, new) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // WalletPassphraseChange changes the wallet passphrase from the specified old @@ -1934,12 +2239,12 @@ func (c *Client) WalletPassphraseChange(old, new string) error { // FutureSignMessageResult is a future promise to deliver the result of a // SignMessageAsync RPC invocation (or an applicable error). -type FutureSignMessageResult chan *response +type FutureSignMessageResult chan *Response -// Receive waits for the response promised by the future and returns the message +// Receive waits for the Response promised by the future and returns the message // signed with the private key of the specified address. func (r FutureSignMessageResult) Receive() (string, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return "", err } @@ -1962,7 +2267,7 @@ func (r FutureSignMessageResult) Receive() (string, error) { func (c *Client) SignMessageAsync(address btcutil.Address, message string) FutureSignMessageResult { addr := address.EncodeAddress() cmd := btcjson.NewSignMessageCmd(addr, message) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // SignMessage signs a message with the private key of the specified address. @@ -1975,12 +2280,12 @@ func (c *Client) SignMessage(address btcutil.Address, message string) (string, e // FutureVerifyMessageResult is a future promise to deliver the result of a // VerifyMessageAsync RPC invocation (or an applicable error). -type FutureVerifyMessageResult chan *response +type FutureVerifyMessageResult chan *Response -// Receive waits for the response promised by the future and returns whether or +// Receive waits for the Response promised by the future and returns whether or // not the message was successfully verified. func (r FutureVerifyMessageResult) Receive() (bool, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return false, err } @@ -2003,7 +2308,7 @@ func (r FutureVerifyMessageResult) Receive() (bool, error) { func (c *Client) VerifyMessageAsync(address btcutil.Address, signature, message string) FutureVerifyMessageResult { addr := address.EncodeAddress() cmd := btcjson.NewVerifyMessageCmd(addr, signature, message) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // VerifyMessage verifies a signed message. @@ -2020,13 +2325,13 @@ func (c *Client) VerifyMessage(address btcutil.Address, signature, message strin // FutureDumpPrivKeyResult is a future promise to deliver the result of a // DumpPrivKeyAsync RPC invocation (or an applicable error). -type FutureDumpPrivKeyResult chan *response +type FutureDumpPrivKeyResult chan *Response -// Receive waits for the response promised by the future and returns the private +// Receive waits for the Response promised by the future and returns the private // key corresponding to the passed address encoded in the wallet import format // (WIF) func (r FutureDumpPrivKeyResult) Receive() (*btcutil.WIF, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -2049,7 +2354,7 @@ func (r FutureDumpPrivKeyResult) Receive() (*btcutil.WIF, error) { func (c *Client) DumpPrivKeyAsync(address btcutil.Address) FutureDumpPrivKeyResult { addr := address.EncodeAddress() cmd := btcjson.NewDumpPrivKeyCmd(addr) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // DumpPrivKey gets the private key corresponding to the passed address encoded @@ -2063,12 +2368,12 @@ func (c *Client) DumpPrivKey(address btcutil.Address) (*btcutil.WIF, error) { // FutureImportAddressResult is a future promise to deliver the result of an // ImportAddressAsync RPC invocation (or an applicable error). -type FutureImportAddressResult chan *response +type FutureImportAddressResult chan *Response -// Receive waits for the response promised by the future and returns the result +// Receive waits for the Response promised by the future and returns the result // of importing the passed public address. func (r FutureImportAddressResult) Receive() error { - _, err := receiveFuture(r) + _, err := ReceiveFuture(r) return err } @@ -2079,7 +2384,7 @@ func (r FutureImportAddressResult) Receive() error { // See ImportAddress for the blocking version and more details. func (c *Client) ImportAddressAsync(address string) FutureImportAddressResult { cmd := btcjson.NewImportAddressCmd(address, "", nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // ImportAddress imports the passed public address. @@ -2094,7 +2399,7 @@ func (c *Client) ImportAddress(address string) error { // See ImportAddress for the blocking version and more details. func (c *Client) ImportAddressRescanAsync(address string, account string, rescan bool) FutureImportAddressResult { cmd := btcjson.NewImportAddressCmd(address, account, &rescan) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // ImportAddressRescan imports the passed public address. When rescan is true, @@ -2103,15 +2408,53 @@ func (c *Client) ImportAddressRescan(address string, account string, rescan bool return c.ImportAddressRescanAsync(address, account, rescan).Receive() } +// FutureImportMultiResult is a future promise to deliver the result of an +// ImportMultiAsync RPC invocation (or an applicable error). +type FutureImportMultiResult chan *Response + +// Receive waits for the Response promised by the future and returns the result +// of importing multiple addresses/scripts. +func (r FutureImportMultiResult) Receive() (btcjson.ImportMultiResults, error) { + res, err := ReceiveFuture(r) + if err != nil { + return nil, err + } + + var importMultiResults btcjson.ImportMultiResults + err = json.Unmarshal(res, &importMultiResults) + if err != nil { + return nil, err + } + return importMultiResults, nil +} + +// ImportMultiAsync returns an instance of a type that can be used to get the result +// of the RPC at some future time by invoking the Receive function on the +// returned instance. +// +// See ImportMulti for the blocking version and more details. +func (c *Client) ImportMultiAsync(requests []btcjson.ImportMultiRequest, options *btcjson.ImportMultiOptions) FutureImportMultiResult { + cmd := btcjson.NewImportMultiCmd(requests, options) + return c.SendCmd(cmd) +} + +// ImportMulti imports addresses/scripts, optionally rescanning the blockchain +// from the earliest creation time of the imported scripts. +// +// See btcjson.ImportMultiRequest for details on the requests parameter. +func (c *Client) ImportMulti(requests []btcjson.ImportMultiRequest, options *btcjson.ImportMultiOptions) (btcjson.ImportMultiResults, error) { + return c.ImportMultiAsync(requests, options).Receive() +} + // FutureImportPrivKeyResult is a future promise to deliver the result of an // ImportPrivKeyAsync RPC invocation (or an applicable error). -type FutureImportPrivKeyResult chan *response +type FutureImportPrivKeyResult chan *Response -// Receive waits for the response promised by the future and returns the result +// Receive waits for the Response promised by the future and returns the result // of importing the passed private key which must be the wallet import format // (WIF). func (r FutureImportPrivKeyResult) Receive() error { - _, err := receiveFuture(r) + _, err := ReceiveFuture(r) return err } @@ -2127,7 +2470,7 @@ func (c *Client) ImportPrivKeyAsync(privKeyWIF *btcutil.WIF) FutureImportPrivKey } cmd := btcjson.NewImportPrivKeyCmd(wif, nil, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // ImportPrivKey imports the passed private key which must be the wallet import @@ -2148,7 +2491,7 @@ func (c *Client) ImportPrivKeyLabelAsync(privKeyWIF *btcutil.WIF, label string) } cmd := btcjson.NewImportPrivKeyCmd(wif, &label, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // ImportPrivKeyLabel imports the passed private key which must be the wallet import @@ -2169,7 +2512,7 @@ func (c *Client) ImportPrivKeyRescanAsync(privKeyWIF *btcutil.WIF, label string, } cmd := btcjson.NewImportPrivKeyCmd(wif, &label, &rescan) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // ImportPrivKeyRescan imports the passed private key which must be the wallet import @@ -2181,12 +2524,12 @@ func (c *Client) ImportPrivKeyRescan(privKeyWIF *btcutil.WIF, label string, resc // FutureImportPubKeyResult is a future promise to deliver the result of an // ImportPubKeyAsync RPC invocation (or an applicable error). -type FutureImportPubKeyResult chan *response +type FutureImportPubKeyResult chan *Response -// Receive waits for the response promised by the future and returns the result +// Receive waits for the Response promised by the future and returns the result // of importing the passed public key. func (r FutureImportPubKeyResult) Receive() error { - _, err := receiveFuture(r) + _, err := ReceiveFuture(r) return err } @@ -2197,7 +2540,7 @@ func (r FutureImportPubKeyResult) Receive() error { // See ImportPubKey for the blocking version and more details. func (c *Client) ImportPubKeyAsync(pubKey string) FutureImportPubKeyResult { cmd := btcjson.NewImportPubKeyCmd(pubKey, nil) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // ImportPubKey imports the passed public key. @@ -2212,7 +2555,7 @@ func (c *Client) ImportPubKey(pubKey string) error { // See ImportPubKey for the blocking version and more details. func (c *Client) ImportPubKeyRescanAsync(pubKey string, rescan bool) FutureImportPubKeyResult { cmd := btcjson.NewImportPubKeyCmd(pubKey, &rescan) - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // ImportPubKeyRescan imports the passed public key. When rescan is true, the @@ -2230,12 +2573,12 @@ func (c *Client) ImportPubKeyRescan(pubKey string, rescan bool) error { // FutureGetInfoResult is a future promise to deliver the result of a // GetInfoAsync RPC invocation (or an applicable error). -type FutureGetInfoResult chan *response +type FutureGetInfoResult chan *Response -// Receive waits for the response promised by the future and returns the info +// Receive waits for the Response promised by the future and returns the info // provided by the server. func (r FutureGetInfoResult) Receive() (*btcjson.InfoWalletResult, error) { - res, err := receiveFuture(r) + res, err := ReceiveFuture(r) if err != nil { return nil, err } @@ -2257,7 +2600,7 @@ func (r FutureGetInfoResult) Receive() (*btcjson.InfoWalletResult, error) { // See GetInfo for the blocking version and more details. func (c *Client) GetInfoAsync() FutureGetInfoResult { cmd := btcjson.NewGetInfoCmd() - return c.sendCmd(cmd) + return c.SendCmd(cmd) } // GetInfo returns miscellaneous info regarding the RPC server. The returned @@ -2267,13 +2610,265 @@ func (c *Client) GetInfo() (*btcjson.InfoWalletResult, error) { return c.GetInfoAsync().Receive() } +// FutureWalletCreateFundedPsbtResult is a future promise to deliver the result of an +// WalletCreateFundedPsbt RPC invocation (or an applicable error). +type FutureWalletCreateFundedPsbtResult chan *Response + +// Receive waits for the Response promised by the future and returns the +// partially signed transaction in PSBT format along with the resulting fee +// and change output index. +func (r FutureWalletCreateFundedPsbtResult) Receive() (*btcjson.WalletCreateFundedPsbtResult, error) { + res, err := ReceiveFuture(r) + if err != nil { + return nil, err + } + + // Unmarshal result as a getinfo result object. + var psbtRes btcjson.WalletCreateFundedPsbtResult + err = json.Unmarshal(res, &psbtRes) + if err != nil { + return nil, err + } + + return &psbtRes, nil +} + +// WalletCreateFundedPsbtAsync returns an instance of a type that can be used +// to get the result of the RPC at some future time by invoking the Receive +// function on the returned instance. +// +// See WalletCreateFundedPsbt for the blocking version and more details. +func (c *Client) WalletCreateFundedPsbtAsync( + inputs []btcjson.PsbtInput, outputs []btcjson.PsbtOutput, locktime *uint32, + options *btcjson.WalletCreateFundedPsbtOpts, bip32Derivs *bool, +) FutureWalletCreateFundedPsbtResult { + cmd := btcjson.NewWalletCreateFundedPsbtCmd(inputs, outputs, locktime, options, bip32Derivs) + return c.SendCmd(cmd) +} + +// WalletCreateFundedPsbt creates and funds a transaction in the Partially +// Signed Transaction format. Inputs will be added if supplied inputs are not +// enough. +func (c *Client) WalletCreateFundedPsbt( + inputs []btcjson.PsbtInput, outputs []btcjson.PsbtOutput, locktime *uint32, + options *btcjson.WalletCreateFundedPsbtOpts, bip32Derivs *bool, +) (*btcjson.WalletCreateFundedPsbtResult, error) { + return c.WalletCreateFundedPsbtAsync(inputs, outputs, locktime, options, bip32Derivs).Receive() +} + +// FutureWalletProcessPsbtResult is a future promise to deliver the result of a +// WalletCreateFundedPsb RPC invocation (or an applicable error). +type FutureWalletProcessPsbtResult chan *Response + +// Receive waits for the Response promised by the future and returns an updated +// PSBT with signed inputs from the wallet and a boolean indicating if the +// transaction has a complete set of signatures. +func (r FutureWalletProcessPsbtResult) Receive() (*btcjson.WalletProcessPsbtResult, error) { + res, err := ReceiveFuture(r) + if err != nil { + return nil, err + } + + // Unmarshal result as a getinfo result object. + var psbtRes btcjson.WalletProcessPsbtResult + err = json.Unmarshal(res, &psbtRes) + if err != nil { + return nil, err + } + + return &psbtRes, nil +} + +// WalletProcessPsbtAsync returns an instance of a type that can be used +// to get the result of the RPC at some future time by invoking the Receive +// function on the returned instance. +// +// See WalletProcessPsbt for the blocking version and more details. +func (c *Client) WalletProcessPsbtAsync( + psbt string, sign *bool, sighashType SigHashType, bip32Derivs *bool, +) FutureWalletProcessPsbtResult { + cmd := btcjson.NewWalletProcessPsbtCmd(psbt, sign, btcjson.String(sighashType.String()), bip32Derivs) + return c.SendCmd(cmd) +} + +// WalletProcessPsbt updates a PSBT with input information from our wallet and +// then signs inputs. +func (c *Client) WalletProcessPsbt( + psbt string, sign *bool, sighashType SigHashType, bip32Derivs *bool, +) (*btcjson.WalletProcessPsbtResult, error) { + return c.WalletProcessPsbtAsync(psbt, sign, sighashType, bip32Derivs).Receive() +} + +// FutureGetWalletInfoResult is a future promise to deliver the result of an +// GetWalletInfoAsync RPC invocation (or an applicable error). +type FutureGetWalletInfoResult chan *Response + +// Receive waits for the Response promised by the future and returns the result +// of wallet state info. +func (r FutureGetWalletInfoResult) Receive() (*btcjson.GetWalletInfoResult, error) { + res, err := ReceiveFuture(r) + if err != nil { + return nil, err + } + + var getWalletInfoResult btcjson.GetWalletInfoResult + err = json.Unmarshal(res, &getWalletInfoResult) + if err != nil { + return nil, err + } + return &getWalletInfoResult, nil +} + +// GetWalletInfoAsync returns an instance of a type that can be used to get the result +// of the RPC at some future time by invoking the Receive function on the +// returned instance. +// +// See GetWalletInfo for the blocking version and more details. +func (c *Client) GetWalletInfoAsync() FutureGetWalletInfoResult { + cmd := btcjson.NewGetWalletInfoCmd() + return c.SendCmd(cmd) +} + +// GetWalletInfo returns various wallet state info. +func (c *Client) GetWalletInfo() (*btcjson.GetWalletInfoResult, error) { + return c.GetWalletInfoAsync().Receive() +} + +// FutureBackupWalletResult is a future promise to deliver the result of an +// BackupWalletAsync RPC invocation (or an applicable error) +type FutureBackupWalletResult chan *Response + +// Receive waits for the Response promised by the future +func (r FutureBackupWalletResult) Receive() error { + _, err := ReceiveFuture(r) + return err +} + +// BackupWalletAsync returns an instance of a type that can be used to get the result +// of the RPC at some future time by invoking the Receive function on the +// returned instance. +// +// See BackupWallet for the blocking version and more details. +func (c *Client) BackupWalletAsync(destination string) FutureBackupWalletResult { + return c.SendCmd(btcjson.NewBackupWalletCmd(destination)) +} + +// BackupWallet safely copies current wallet file to destination, which can +// be a directory or a path with filename +func (c *Client) BackupWallet(destination string) error { + return c.BackupWalletAsync(destination).Receive() +} + +// FutureDumpWalletResult is a future promise to deliver the result of an +// DumpWallet RPC invocation (or an applicable error) +type FutureDumpWalletResult chan *Response + +// Receive waits for the Response promised by the future +func (r FutureDumpWalletResult) Receive() (*btcjson.DumpWalletResult, error) { + bytes, err := ReceiveFuture(r) + if err != nil { + return nil, err + } + + var res btcjson.DumpWalletResult + err = json.Unmarshal(bytes, &res) + return &res, err +} + +// DumpWalletAsync returns an instance of a type that can be used to get the result +// of the RPC at some future time by invoking the Receive function on the +// returned instance. +// +// See DumpWalletAsync for the blocking version and more details. +func (c *Client) DumpWalletAsync(destination string) FutureDumpWalletResult { + return c.SendCmd(btcjson.NewDumpWalletCmd(destination)) +} + +// DumpWallet dumps all wallet keys in a human-readable format to a server-side file. +func (c *Client) DumpWallet(destination string) (*btcjson.DumpWalletResult, error) { + return c.DumpWalletAsync(destination).Receive() +} + +// FutureImportWalletResult is a future promise to deliver the result of an +// ImportWalletAsync RPC invocation (or an applicable error) +type FutureImportWalletResult chan *Response + +// Receive waits for the Response promised by the future +func (r FutureImportWalletResult) Receive() error { + _, err := ReceiveFuture(r) + return err +} + +// ImportWalletAsync returns an instance of a type that can be used to get the result +// of the RPC at some future time by invoking the Receive function on the +// returned instance. +// +// See ImportWallet for the blocking version and more details. +func (c *Client) ImportWalletAsync(filename string) FutureImportWalletResult { + return c.SendCmd(btcjson.NewImportWalletCmd(filename)) +} + +// ImportWallet imports keys from a wallet dump file (see DumpWallet). +func (c *Client) ImportWallet(filename string) error { + return c.ImportWalletAsync(filename).Receive() +} + +// FutureUnloadWalletResult is a future promise to deliver the result of an +// UnloadWalletAsync RPC invocation (or an applicable error) +type FutureUnloadWalletResult chan *Response + +// Receive waits for the Response promised by the future +func (r FutureUnloadWalletResult) Receive() error { + _, err := ReceiveFuture(r) + return err +} + +// UnloadWalletAsync returns an instance of a type that can be used to get the result +// of the RPC at some future time by invoking the Receive function on the +// returned instance. +// +// See UnloadWallet for the blocking version and more details. +func (c *Client) UnloadWalletAsync(walletName *string) FutureUnloadWalletResult { + return c.SendCmd(btcjson.NewUnloadWalletCmd(walletName)) +} + +// UnloadWallet unloads the referenced wallet. If the RPC server URL already +// contains the name of the wallet, like http://127.0.0.1:8332/wallet/, +// the parameter must be nil, or it'll return an error. +func (c *Client) UnloadWallet(walletName *string) error { + return c.UnloadWalletAsync(walletName).Receive() +} + +// FutureLoadWalletResult is a future promise to deliver the result of an +// LoadWalletAsync RPC invocation (or an applicable error) +type FutureLoadWalletResult chan *Response + +// Receive waits for the Response promised by the future +func (r FutureLoadWalletResult) Receive() (*btcjson.LoadWalletResult, error) { + bytes, err := ReceiveFuture(r) + if err != nil { + return nil, err + } + var result btcjson.LoadWalletResult + err = json.Unmarshal(bytes, &result) + return &result, err +} + +// LoadWalletAsync returns an instance of a type that can be used to get the result +// of the RPC at some future time by invoking the Receive function on the +// returned instance. +// +// See LoadWallet for the blocking version and more details. +func (c *Client) LoadWalletAsync(walletName string) FutureLoadWalletResult { + return c.SendCmd(btcjson.NewLoadWalletCmd(walletName)) +} + +// LoadWallet loads a wallet from a wallet file or directory. +func (c *Client) LoadWallet(walletName string) (*btcjson.LoadWalletResult, error) { + return c.LoadWalletAsync(walletName).Receive() +} + // TODO(davec): Implement -// backupwallet (NYI in btcwallet) // encryptwallet (Won't be supported by btcwallet since it's always encrypted) -// getwalletinfo (NYI in btcwallet or btcjson) // listaddressgroupings (NYI in btcwallet) // listreceivedbyaccount (NYI in btcwallet) - -// DUMP -// importwallet (NYI in btcwallet) -// dumpwallet (NYI in btcwallet) diff --git a/rpcclient/zmq.go b/rpcclient/zmq.go new file mode 100644 index 0000000000..52adeed76b --- /dev/null +++ b/rpcclient/zmq.go @@ -0,0 +1,39 @@ +package rpcclient + +import ( + "encoding/json" + + "github.com/btcsuite/btcd/btcjson" +) + +// FutureGetZmqNotificationsResult is a future promise to deliver the result of +// a GetZmqNotifications RPC invocation +type FutureGetZmqNotificationsResult chan *Response + +// Receive waits for the response promised by the future and returns the unmarshalled +// response, or an error if the request was unsuccessful. +func (r FutureGetZmqNotificationsResult) Receive() (btcjson.GetZmqNotificationResult, error) { + res, err := ReceiveFuture(r) + if err != nil { + return nil, err + } + var notifications btcjson.GetZmqNotificationResult + if err := json.Unmarshal(res, ¬ifications); err != nil { + return nil, err + } + return notifications, nil +} + +// GetZmqNotificationsAsync returns an instance of a type that can be used to get +// the result of a custom RPC request at some future time by invoking the Receive +// function on the returned instance. +// +// See GetZmqNotifications for the blocking version and more details. +func (c *Client) GetZmqNotificationsAsync() FutureGetZmqNotificationsResult { + return c.SendCmd(btcjson.NewGetZmqNotificationsCmd()) +} + +// GetZmqNotifications returns information about the active ZeroMQ notifications. +func (c *Client) GetZmqNotifications() (btcjson.GetZmqNotificationResult, error) { + return c.GetZmqNotificationsAsync().Receive() +} diff --git a/rpcserver.go b/rpcserver.go index e762cc1a9d..363661d787 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -29,8 +29,9 @@ import ( "github.com/btcsuite/btcd/blockchain" "github.com/btcsuite/btcd/blockchain/indexers" - "github.com/btcsuite/btcd/btcec" + "github.com/btcsuite/btcd/btcec/v2/ecdsa" "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/database" @@ -40,7 +41,6 @@ import ( "github.com/btcsuite/btcd/peer" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" "github.com/btcsuite/websocket" ) @@ -75,6 +75,10 @@ const ( // maxProtocolVersion is the max protocol version the server supports. maxProtocolVersion = 70002 + + // defaultMaxFeeRate is the default value to use(0.1 BTC/kvB) when the + // `MaxFee` field is not set when calling `testmempoolaccept`. + defaultMaxFeeRate = 0.1 ) var ( @@ -101,6 +105,9 @@ var ( // declared here to avoid the overhead of creating the slice on every // invocation for constant data. gbtCapabilities = []string{"proposal"} + + // JSON 2.0 batched request prefix + batchedRequestPrefix = []byte("[") ) // Errors @@ -127,52 +134,59 @@ type commandHandler func(*rpcServer, interface{}, <-chan struct{}) (interface{}, // a dependency loop. var rpcHandlers map[string]commandHandler var rpcHandlersBeforeInit = map[string]commandHandler{ - "addnode": handleAddNode, - "createrawtransaction": handleCreateRawTransaction, - "debuglevel": handleDebugLevel, - "decoderawtransaction": handleDecodeRawTransaction, - "decodescript": handleDecodeScript, - "estimatefee": handleEstimateFee, - "generate": handleGenerate, - "getaddednodeinfo": handleGetAddedNodeInfo, - "getbestblock": handleGetBestBlock, - "getbestblockhash": handleGetBestBlockHash, - "getblock": handleGetBlock, - "getblockchaininfo": handleGetBlockChainInfo, - "getblockcount": handleGetBlockCount, - "getblockhash": handleGetBlockHash, - "getblockheader": handleGetBlockHeader, - "getblocktemplate": handleGetBlockTemplate, - "getcfilter": handleGetCFilter, - "getcfilterheader": handleGetCFilterHeader, - "getconnectioncount": handleGetConnectionCount, - "getcurrentnet": handleGetCurrentNet, - "getdifficulty": handleGetDifficulty, - "getgenerate": handleGetGenerate, - "gethashespersec": handleGetHashesPerSec, - "getheaders": handleGetHeaders, - "getinfo": handleGetInfo, - "getmempoolinfo": handleGetMempoolInfo, - "getmininginfo": handleGetMiningInfo, - "getnettotals": handleGetNetTotals, - "getnetworkhashps": handleGetNetworkHashPS, - "getpeerinfo": handleGetPeerInfo, - "getrawmempool": handleGetRawMempool, - "getrawtransaction": handleGetRawTransaction, - "gettxout": handleGetTxOut, - "help": handleHelp, - "node": handleNode, - "ping": handlePing, - "searchrawtransactions": handleSearchRawTransactions, - "sendrawtransaction": handleSendRawTransaction, - "setgenerate": handleSetGenerate, - "stop": handleStop, - "submitblock": handleSubmitBlock, - "uptime": handleUptime, - "validateaddress": handleValidateAddress, - "verifychain": handleVerifyChain, - "verifymessage": handleVerifyMessage, - "version": handleVersion, + "addnode": handleAddNode, + "createrawtransaction": handleCreateRawTransaction, + "debuglevel": handleDebugLevel, + "decoderawtransaction": handleDecodeRawTransaction, + "decodescript": handleDecodeScript, + "estimatefee": handleEstimateFee, + "generate": handleGenerate, + "getaddednodeinfo": handleGetAddedNodeInfo, + "getbestblock": handleGetBestBlock, + "getbestblockhash": handleGetBestBlockHash, + "getblock": handleGetBlock, + "getblockchaininfo": handleGetBlockChainInfo, + "getblockcount": handleGetBlockCount, + "getblockhash": handleGetBlockHash, + "getblockheader": handleGetBlockHeader, + "getblocktemplate": handleGetBlockTemplate, + "getchaintips": handleGetChainTips, + "getcfilter": handleGetCFilter, + "getcfilterheader": handleGetCFilterHeader, + "getconnectioncount": handleGetConnectionCount, + "getcurrentnet": handleGetCurrentNet, + "getdifficulty": handleGetDifficulty, + "getgenerate": handleGetGenerate, + "gethashespersec": handleGetHashesPerSec, + "getheaders": handleGetHeaders, + "getinfo": handleGetInfo, + "getmempoolinfo": handleGetMempoolInfo, + "getmininginfo": handleGetMiningInfo, + "getnettotals": handleGetNetTotals, + "getnetworkhashps": handleGetNetworkHashPS, + "getnodeaddresses": handleGetNodeAddresses, + "getpeerinfo": handleGetPeerInfo, + "getrawmempool": handleGetRawMempool, + "getrawtransaction": handleGetRawTransaction, + "gettxout": handleGetTxOut, + "help": handleHelp, + "invalidateblock": handleInvalidateBlock, + "node": handleNode, + "ping": handlePing, + "reconsiderblock": handleReconsiderBlock, + "searchrawtransactions": handleSearchRawTransactions, + "sendrawtransaction": handleSendRawTransaction, + "setgenerate": handleSetGenerate, + "signmessagewithprivkey": handleSignMessageWithPrivKey, + "stop": handleStop, + "submitblock": handleSubmitBlock, + "uptime": handleUptime, + "validateaddress": handleValidateAddress, + "verifychain": handleVerifyChain, + "verifymessage": handleVerifyMessage, + "version": handleVersion, + "testmempoolaccept": handleTestMempoolAccept, + "gettxspendingprevout": handleGetTxSpendingPrevOut, } // list of commands that we recognize, but for which btcd has no support because @@ -226,13 +240,10 @@ var rpcAskWallet = map[string]struct{}{ // Commands that are currently unimplemented, but should ultimately be. var rpcUnimplemented = map[string]struct{}{ "estimatepriority": {}, - "getchaintips": {}, "getmempoolentry": {}, "getnetworkinfo": {}, "getwork": {}, - "invalidateblock": {}, "preciousblock": {}, - "reconsiderblock": {}, } // Commands that are available to a limited user @@ -261,6 +272,7 @@ var rpcLimited = map[string]struct{}{ "getblockcount": {}, "getblockhash": {}, "getblockheader": {}, + "getchaintips": {}, "getcfilter": {}, "getcfilterheader": {}, "getcurrentnet": {}, @@ -272,6 +284,8 @@ var rpcLimited = map[string]struct{}{ "getrawmempool": {}, "getrawtransaction": {}, "gettxout": {}, + "invalidateblock": {}, + "reconsiderblock": {}, "searchrawtransactions": {}, "sendrawtransaction": {}, "submitblock": {}, @@ -543,7 +557,7 @@ func handleCreateRawTransaction(s *rpcServer, cmd interface{}, closeChan <-chan params := s.cfg.ChainParams for encodedAddr, amount := range c.Amounts { // Ensure amount is in the valid range for monetary amounts. - if amount <= 0 || amount > btcutil.MaxSatoshi { + if amount <= 0 || amount*btcutil.SatoshiPerBitcoin > btcutil.MaxSatoshi { return nil, &btcjson.RPCError{ Code: btcjson.ErrRPCType, Message: "Invalid amount", @@ -634,23 +648,6 @@ func handleDebugLevel(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) return "Done.", nil } -// witnessToHex formats the passed witness stack as a slice of hex-encoded -// strings to be used in a JSON response. -func witnessToHex(witness wire.TxWitness) []string { - // Ensure nil is returned when there are no entries versus an empty - // slice so it can properly be omitted as necessary. - if len(witness) == 0 { - return nil - } - - result := make([]string, 0, len(witness)) - for _, wit := range witness { - result = append(result, hex.EncodeToString(wit)) - } - - return result -} - // createVinList returns a slice of JSON objects for the inputs of the passed // transaction. func createVinList(mtx *wire.MsgTx) []btcjson.Vin { @@ -660,7 +657,7 @@ func createVinList(mtx *wire.MsgTx) []btcjson.Vin { txIn := mtx.TxIn[0] vinList[0].Coinbase = hex.EncodeToString(txIn.SignatureScript) vinList[0].Sequence = txIn.Sequence - vinList[0].Witness = witnessToHex(txIn.Witness) + vinList[0].Witness = txIn.Witness.ToHexStrings() return vinList } @@ -680,7 +677,7 @@ func createVinList(mtx *wire.MsgTx) []btcjson.Vin { } if mtx.HasWitness() { - vinEntry.Witness = witnessToHex(txIn.Witness) + vinEntry.Witness = txIn.Witness.ToHexStrings() } } @@ -733,6 +730,13 @@ func createVoutList(mtx *wire.MsgTx, chainParams *chaincfg.Params, filterAddrMap vout.ScriptPubKey.Type = scriptClass.String() vout.ScriptPubKey.ReqSigs = int32(reqSigs) + // Address is defined when there's a single well-defined + // receiver address. To spend the output a signature for this, + // and only this, address is required. + if len(encodedAddrs) == 1 && reqSigs <= 1 { + vout.ScriptPubKey.Address = encodedAddrs[0] + } + voutList = append(voutList, vout) } @@ -759,7 +763,7 @@ func createTxRawResult(chainParams *chaincfg.Params, mtx *wire.MsgTx, Weight: int32(blockchain.GetTransactionWeight(btcutil.NewTx(mtx))), Vin: createVinList(mtx), Vout: createVoutList(mtx, chainParams, nil), - Version: mtx.Version, + Version: uint32(mtx.Version), LockTime: mtx.LockTime, } @@ -827,7 +831,7 @@ func handleDecodeScript(s *rpcServer, cmd interface{}, closeChan <-chan struct{} // Get information about the script. // Ignore the error here since an error means the script couldn't parse - // and there is no additinal information about it anyways. + // and there is no additional information about it anyways. scriptClass, addrs, reqSigs, _ := txscript.ExtractPkScriptAddrs(script, s.cfg.ChainParams) addresses := make([]string, len(addrs)) @@ -852,6 +856,13 @@ func handleDecodeScript(s *rpcServer, cmd interface{}, closeChan <-chan struct{} if scriptClass != txscript.ScriptHashTy { reply.P2sh = p2sh.EncodeAddress() } + + // Address is defined when there's a single well-defined + // receiver address. To spend the output a signature for this, + // and only this, address is required. + if len(addresses) == 1 && reqSigs <= 1 { + reply.Address = addresses[0] + } return reply, nil } @@ -1081,14 +1092,12 @@ func handleGetBlock(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (i Message: "Block not found", } } - - // When the verbose flag isn't set, simply return the serialized block - // as a hex-encoded string. - if c.Verbose != nil && !*c.Verbose { + // If verbosity is 0, return the serialized block as a hex encoded string. + if c.Verbosity != nil && *c.Verbosity == 0 { return hex.EncodeToString(blkBytes), nil } - // The verbose flag is set, so generate the JSON object and return it. + // Otherwise, generate the JSON object and return it. // Deserialize the block. blk, err := btcutil.NewBlockFromBytes(blkBytes) @@ -1137,7 +1146,7 @@ func handleGetBlock(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (i NextHash: nextHashString, } - if c.VerboseTx == nil || !*c.VerboseTx { + if *c.Verbosity == 1 { transactions := blk.Transactions() txNames := make([]string, len(transactions)) for i, tx := range transactions { @@ -1197,7 +1206,7 @@ func handleGetBlockChainInfo(s *rpcServer, cmd interface{}, closeChan <-chan str BestBlockHash: chainSnapshot.Hash.String(), Difficulty: getDifficultyRatio(chainSnapshot.Bits, params), MedianTime: chainSnapshot.MedianTime.Unix(), - Pruned: false, + Pruned: cfg.Prune != 0, SoftForks: &btcjson.SoftForks{ Bip9SoftForks: make(map[string]*btcjson.Bip9SoftForkDescription), }, @@ -1247,12 +1256,18 @@ func handleGetBlockChainInfo(s *rpcServer, cmd interface{}, closeChan <-chan str case chaincfg.DeploymentTestDummy: forkName = "dummy" + case chaincfg.DeploymentTestDummyMinActivation: + forkName = "dummy-min-activation" + case chaincfg.DeploymentCSV: forkName = "csv" case chaincfg.DeploymentSegwit: forkName = "segwit" + case chaincfg.DeploymentTaproot: + forkName = "taproot" + default: return nil, &btcjson.RPCError{ Code: btcjson.ErrRPCInternal.Code, @@ -1283,11 +1298,19 @@ func handleGetBlockChainInfo(s *rpcServer, cmd interface{}, closeChan <-chan str // Finally, populate the soft-fork description with all the // information gathered above. + var startTime, endTime int64 + if starter, ok := deploymentDetails.DeploymentStarter.(*chaincfg.MedianTimeDeploymentStarter); ok { + startTime = starter.StartTime().Unix() + } + if ender, ok := deploymentDetails.DeploymentEnder.(*chaincfg.MedianTimeDeploymentEnder); ok { + endTime = ender.EndTime().Unix() + } chainInfo.SoftForks.Bip9SoftForks[forkName] = &btcjson.Bip9SoftForkDescription{ - Status: strings.ToLower(statusString), - Bit: deploymentDetails.BitNumber, - StartTime2: int64(deploymentDetails.StartTime), - Timeout: int64(deploymentDetails.ExpireTime), + Status: strings.ToLower(statusString), + Bit: deploymentDetails.BitNumber, + StartTime2: startTime, + Timeout: endTime, + MinActivationHeight: int32(deploymentDetails.MinActivationHeight), } } @@ -1634,8 +1657,8 @@ func (state *gbtWorkState) updateBlockTemplate(s *rpcServer, useCoinbaseValue bo // Update the merkle root. block := btcutil.NewBlock(template.Block) - merkles := blockchain.BuildMerkleTreeStore(block.Transactions(), false) - template.Block.Header.MerkleRoot = *merkles[len(merkles)-1] + merkleRoot := blockchain.CalcMerkleRoot(block.Transactions(), false) + template.Block.Header.MerkleRoot = merkleRoot } // Set locals for convenience. @@ -1689,8 +1712,8 @@ func (state *gbtWorkState) blockTemplateResult(useCoinbaseValue bool, submitOld transactions := make([]btcjson.GetBlockTemplateResultTx, 0, numTx-1) txIndex := make(map[chainhash.Hash]int64, numTx) for i, tx := range msgBlock.Transactions { - txHash := tx.TxHash() - txIndex[txHash] = int64(i) + txID := tx.TxHash() + txIndex[txID] = int64(i) // Skip the coinbase transaction. if i == 0 { @@ -1724,7 +1747,8 @@ func (state *gbtWorkState) blockTemplateResult(useCoinbaseValue bool, submitOld bTx := btcutil.NewTx(tx) resultTx := btcjson.GetBlockTemplateResultTx{ Data: hex.EncodeToString(txBuf.Bytes()), - Hash: txHash.String(), + TxID: txID.String(), + Hash: tx.WitnessHash().String(), Depends: depends, Fee: template.Fees[i], SigOps: template.SigOpCosts[i], @@ -2174,6 +2198,28 @@ func handleGetBlockTemplate(s *rpcServer, cmd interface{}, closeChan <-chan stru } } +// handleGetChainTips implements the getchaintips command. +func handleGetChainTips(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) { + chainTips := s.cfg.Chain.ChainTips() + + ret := make([]btcjson.GetChainTipsResult, 0, len(chainTips)) + for _, chainTip := range chainTips { + ret = append(ret, struct { + Height int32 "json:\"height\"" + Hash string "json:\"hash\"" + BranchLen int32 "json:\"branchlen\"" + Status string "json:\"status\"" + }{ + Height: chainTip.Height, + Hash: chainTip.BlockHash.String(), + BranchLen: chainTip.BranchLen, + Status: chainTip.Status.String(), + }) + } + + return ret, nil +} + // handleGetCFilter implements the getcfilter command. func handleGetCFilter(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) { if s.cfg.CfIndex == nil { @@ -2348,11 +2394,11 @@ func handleGetMiningInfo(s *rpcServer, cmd interface{}, closeChan <-chan struct{ if err != nil { return nil, err } - networkHashesPerSec, ok := networkHashesPerSecIface.(int64) + networkHashesPerSec, ok := networkHashesPerSecIface.(float64) if !ok { return nil, &btcjson.RPCError{ Code: btcjson.ErrRPCInternal.Code, - Message: "networkHashesPerSec is not an int64", + Message: "networkHashesPerSec is not a float64", } } @@ -2365,7 +2411,7 @@ func handleGetMiningInfo(s *rpcServer, cmd interface{}, closeChan <-chan struct{ Difficulty: getDifficultyRatio(best.Bits, s.cfg.ChainParams), Generate: s.cfg.CPUMiner.IsMining(), GenProcLimit: s.cfg.CPUMiner.NumWorkers(), - HashesPerSec: int64(s.cfg.CPUMiner.HashesPerSecond()), + HashesPerSec: s.cfg.CPUMiner.HashesPerSecond(), NetworkHashPS: networkHashesPerSec, PooledTx: uint64(s.cfg.TxMemPool.Count()), TestNet: cfg.TestNet3, @@ -2386,8 +2432,8 @@ func handleGetNetTotals(s *rpcServer, cmd interface{}, closeChan <-chan struct{} // handleGetNetworkHashPS implements the getnetworkhashps command. func handleGetNetworkHashPS(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) { - // Note: All valid error return paths should return an int64. - // Literal zeros are inferred as int, and won't coerce to int64 + // Note: All valid error return paths should return a float64. + // Literal zeros are inferred as int, and won't coerce to float64 // because the return value is an interface{}. c := cmd.(*btcjson.GetNetworkHashPSCmd) @@ -2402,7 +2448,7 @@ func handleGetNetworkHashPS(s *rpcServer, cmd interface{}, closeChan <-chan stru endHeight = int32(*c.Height) } if endHeight > best.Height || endHeight == 0 { - return int64(0), nil + return float64(0), nil } if endHeight < 0 { endHeight = best.Height @@ -2469,13 +2515,47 @@ func handleGetNetworkHashPS(s *rpcServer, cmd interface{}, closeChan <-chan stru // Calculate the difference in seconds between the min and max block // timestamps and avoid division by zero in the case where there is no // time difference. - timeDiff := int64(maxTimestamp.Sub(minTimestamp) / time.Second) + timeDiff := maxTimestamp.Sub(minTimestamp).Seconds() if timeDiff == 0 { - return int64(0), nil + return timeDiff, nil } - hashesPerSec := new(big.Int).Div(totalWork, big.NewInt(timeDiff)) - return hashesPerSec.Int64(), nil + hashesPerSec, _ := new(big.Float).Quo(new(big.Float).SetInt(totalWork), new(big.Float).SetFloat64(timeDiff)).Float64() + return hashesPerSec, nil +} + +// handleGetNodeAddresses implements the getnodeaddresses command. +func handleGetNodeAddresses(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) { + c := cmd.(*btcjson.GetNodeAddressesCmd) + + count := int32(1) + if c.Count != nil { + count = *c.Count + if count <= 0 { + return nil, &btcjson.RPCError{ + Code: btcjson.ErrRPCInvalidParameter, + Message: "Address count out of range", + } + } + } + + nodes := s.cfg.ConnMgr.NodeAddresses() + if n := int32(len(nodes)); n < count { + count = n + } + + addresses := make([]*btcjson.GetNodeAddressesResult, 0, count) + for _, node := range nodes[:count] { + address := &btcjson.GetNodeAddressesResult{ + Time: node.Timestamp.Unix(), + Services: uint64(node.Services), + Address: node.Addr.String(), + Port: node.Port, + } + addresses = append(addresses, address) + } + + return addresses, nil } // handleGetPeerInfo implements the getpeerinfo command. @@ -2673,6 +2753,7 @@ func handleGetTxOut(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (i var value int64 var pkScript []byte var isCoinbase bool + var address string includeMempool := true if c.IncludeMempool != nil { includeMempool = *c.IncludeMempool @@ -2746,6 +2827,13 @@ func handleGetTxOut(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (i addresses[i] = addr.EncodeAddress() } + // Address is defined when there's a single well-defined + // receiver address. To spend the output a signature for this, + // and only this, address is required. + if len(addresses) == 1 && reqSigs <= 1 { + address = addresses[0] + } + txOutReply := &btcjson.GetTxOutResult{ BestBlock: bestBlockHash, Confirmations: int64(confirmations), @@ -2755,13 +2843,32 @@ func handleGetTxOut(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (i Hex: hex.EncodeToString(pkScript), ReqSigs: int32(reqSigs), Type: scriptClass.String(), + Address: address, Addresses: addresses, }, Coinbase: isCoinbase, } + return txOutReply, nil } +// handleInvalidateBlock implements the invalidateblock command. +func handleInvalidateBlock(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) { + c := cmd.(*btcjson.InvalidateBlockCmd) + + invalidateHash, err := chainhash.NewHashFromStr(c.BlockHash) + if err != nil { + return nil, &btcjson.RPCError{ + Code: btcjson.ErrRPCDeserialization, + Message: fmt.Sprintf("Failed to deserialize blockhash from string of %s", + invalidateHash), + } + } + + err = s.cfg.Chain.InvalidateBlock(invalidateHash) + return nil, err +} + // handleHelp implements the help command. func handleHelp(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) { c := cmd.(*btcjson.HelpCmd) @@ -2947,7 +3054,7 @@ func createVinListPrevOut(s *rpcServer, mtx *wire.MsgTx, chainParams *chaincfg.P } if len(txIn.Witness) != 0 { - vinEntry.Witness = witnessToHex(txIn.Witness) + vinEntry.Witness = txIn.Witness.ToHexStrings() } // Add the entry to the list now if it already passed the filter @@ -3035,6 +3142,23 @@ func fetchMempoolTxnsForAddress(s *rpcServer, addr btcutil.Address, numToSkip, n return mpTxns[numToSkip:rangeEnd], numToSkip } +// handleReconsiderBlock implements the reconsiderblock command. +func handleReconsiderBlock(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) { + c := cmd.(*btcjson.ReconsiderBlockCmd) + + reconsiderHash, err := chainhash.NewHashFromStr(c.BlockHash) + if err != nil { + return nil, &btcjson.RPCError{ + Code: btcjson.ErrRPCDeserialization, + Message: fmt.Sprintf("Failed to deserialize blockhash from string of %s", + reconsiderHash), + } + } + + err = s.cfg.Chain.ReconsiderBlock(reconsiderHash) + return nil, err +} + // handleSearchRawTransactions implements the searchrawtransactions command. func handleSearchRawTransactions(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) { // Respond with an error if the address index is not enabled. @@ -3115,7 +3239,7 @@ func handleSearchRawTransactions(s *rpcServer, cmd interface{}, closeChan <-chan addressTxns := make([]retrievedTx, 0, numRequested) if reverse { // Transactions in the mempool are not in a block header yet, - // so the block header field in the retieved transaction struct + // so the block header field in the retrieved transaction struct // is left nil. mpTxns, mpSkipped := fetchMempoolTxnsForAddress(s, addr, uint32(numToSkip), uint32(numRequested)) @@ -3169,7 +3293,7 @@ func handleSearchRawTransactions(s *rpcServer, cmd interface{}, closeChan <-chan // order and the number of results is still under the number requested. if !reverse && len(addressTxns) < numRequested { // Transactions in the mempool are not in a block header yet, - // so the block header field in the retieved transaction struct + // so the block header field in the retrieved transaction struct // is left nil. mpTxns, mpSkipped := fetchMempoolTxnsForAddress(s, addr, uint32(numToSkip)-numSkipped, uint32(numRequested- @@ -3437,6 +3561,45 @@ func handleSetGenerate(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) return nil, nil } +// Text used to signify that a signed message follows and to prevent +// inadvertently signing a transaction. +const messageSignatureHeader = "Bitcoin Signed Message:\n" + +// handleSignMessageWithPrivKey implements the signmessagewithprivkey command. +func handleSignMessageWithPrivKey(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) { + c := cmd.(*btcjson.SignMessageWithPrivKeyCmd) + + wif, err := btcutil.DecodeWIF(c.PrivKey) + if err != nil { + message := "Invalid private key" + switch err { + case btcutil.ErrMalformedPrivateKey: + message = "Malformed private key" + case btcutil.ErrChecksumMismatch: + message = "Private key checksum mismatch" + } + return nil, &btcjson.RPCError{ + Code: btcjson.ErrRPCInvalidAddressOrKey, + Message: message, + } + } + if !wif.IsForNet(s.cfg.ChainParams) { + return nil, &btcjson.RPCError{ + Code: btcjson.ErrRPCInvalidAddressOrKey, + Message: "Private key for wrong network", + } + } + + var buf bytes.Buffer + wire.WriteVarString(&buf, 0, messageSignatureHeader) + wire.WriteVarString(&buf, 0, c.Message) + messageHash := chainhash.DoubleHashB(buf.Bytes()) + + sig := ecdsa.SignCompact(wif.PrivKey, messageHash, wif.CompressPubKey) + + return base64.StdEncoding.EncodeToString(sig), nil +} + // handleStop implements the stop command. func handleStop(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) { select { @@ -3495,6 +3658,37 @@ func handleValidateAddress(s *rpcServer, cmd interface{}, closeChan <-chan struc return result, nil } + switch addr := addr.(type) { + case *btcutil.AddressPubKeyHash: + result.IsScript = btcjson.Bool(false) + result.IsWitness = btcjson.Bool(false) + + case *btcutil.AddressScriptHash: + result.IsScript = btcjson.Bool(true) + result.IsWitness = btcjson.Bool(false) + + case *btcutil.AddressPubKey: + result.IsScript = btcjson.Bool(false) + result.IsWitness = btcjson.Bool(false) + + case *btcutil.AddressWitnessPubKeyHash: + result.IsScript = btcjson.Bool(false) + result.IsWitness = btcjson.Bool(true) + result.WitnessVersion = btcjson.Int32(int32(addr.WitnessVersion())) + result.WitnessProgram = btcjson.String(hex.EncodeToString(addr.WitnessProgram())) + + case *btcutil.AddressWitnessScriptHash: + result.IsScript = btcjson.Bool(true) + result.IsWitness = btcjson.Bool(true) + result.WitnessVersion = btcjson.Int32(int32(addr.WitnessVersion())) + result.WitnessProgram = btcjson.String(hex.EncodeToString(addr.WitnessProgram())) + + default: + // Handle the case when a new Address is supported by btcutil, but none + // of the cases were matched in the switch block. The current behaviour + // is to do nothing, and only populate the Address and IsValid fields. + } + result.Address = addr.EncodeAddress() result.IsValid = true @@ -3586,10 +3780,10 @@ func handleVerifyMessage(s *rpcServer, cmd interface{}, closeChan <-chan struct{ // Validate the signature - this just shows that it was valid at all. // we will compare it with the key next. var buf bytes.Buffer - wire.WriteVarString(&buf, 0, "Bitcoin Signed Message:\n") + wire.WriteVarString(&buf, 0, messageSignatureHeader) wire.WriteVarString(&buf, 0, c.Message) expectedMessageHash := chainhash.DoubleHashB(buf.Bytes()) - pk, wasCompressed, err := btcec.RecoverCompact(btcec.S256(), sig, + pk, wasCompressed, err := ecdsa.RecoverCompact(sig, expectedMessageHash) if err != nil { // Mirror Bitcoin Core behavior, which treats error in @@ -3630,6 +3824,168 @@ func handleVersion(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (in return result, nil } +// handleTestMempoolAccept implements the testmempoolaccept command. +func handleTestMempoolAccept(s *rpcServer, cmd interface{}, + closeChan <-chan struct{}) (interface{}, error) { + + c := cmd.(*btcjson.TestMempoolAcceptCmd) + + // Create txns to hold the decoded tx. + txns := make([]*btcutil.Tx, 0, len(c.RawTxns)) + + // Iterate the raw hex slice and decode them. + for _, rawTx := range c.RawTxns { + rawBytes, err := hex.DecodeString(rawTx) + if err != nil { + return nil, rpcDecodeHexError(rawTx) + } + + tx, err := btcutil.NewTxFromBytes(rawBytes) + if err != nil { + return nil, &btcjson.RPCError{ + Code: btcjson.ErrRPCDeserialization, + Message: "TX decode failed: " + err.Error(), + } + } + + txns = append(txns, tx) + } + + results := make([]*btcjson.TestMempoolAcceptResult, 0, len(txns)) + for _, tx := range txns { + // Create a test result item. + item := &btcjson.TestMempoolAcceptResult{ + Txid: tx.Hash().String(), + Wtxid: tx.WitnessHash().String(), + } + + // Check the mempool acceptance. + result, err := s.cfg.TxMemPool.CheckMempoolAcceptance(tx) + + // If an error is returned, this tx is not allow, hence we + // record the reason. + if err != nil { + item.Allowed = false + + // TODO(yy): differentiate the errors and put package + // error in `PackageError` field. + item.RejectReason = err.Error() + + results = append(results, item) + + // Move to the next transaction. + continue + } + + // If this transaction is an orphan, it's not allowed. + if result.MissingParents != nil { + item.Allowed = false + + // NOTE: "missing-inputs" is what bitcoind returns + // here, so we mimic the same error message. + item.RejectReason = "missing-inputs" + + results = append(results, item) + + // Move to the next transaction. + continue + } + + // Otherwise this tx is allowed if its fee rate is below the + // max fee rate, we now patch the fields in + // `TestMempoolAcceptItem` as much as possible. + // + // Calculate the fee field and validate its fee rate. + item.Fees, item.Allowed = validateFeeRate( + result.TxFee, result.TxSize, c.MaxFeeRate, + ) + + // If the fee rate check passed, assign the corresponding + // fields. + if item.Allowed { + item.Vsize = int32(result.TxSize) + } else { + // NOTE: "max-fee-exceeded" is what bitcoind returns + // here, so we mimic the same error message. + item.RejectReason = "max-fee-exceeded" + } + + results = append(results, item) + } + + return results, nil +} + +// handleGetTxSpendingPrevOut implements the gettxspendingprevout command. +func handleGetTxSpendingPrevOut(s *rpcServer, cmd interface{}, + closeChan <-chan struct{}) (interface{}, error) { + + c := cmd.(*btcjson.GetTxSpendingPrevOutCmd) + + // Convert the outpoints. + ops := make([]wire.OutPoint, 0, len(c.Outputs)) + for _, o := range c.Outputs { + hash, err := chainhash.NewHashFromStr(o.Txid) + if err != nil { + return nil, err + } + + ops = append(ops, wire.OutPoint{ + Hash: *hash, + Index: o.Vout, + }) + } + + // Check mempool spend for all the outpoints. + results := make([]*btcjson.GetTxSpendingPrevOutResult, 0, len(ops)) + for _, op := range ops { + // Create a result entry. + result := &btcjson.GetTxSpendingPrevOutResult{ + Txid: op.Hash.String(), + Vout: op.Index, + } + + // Check the mempool spend. + spendingTx := s.cfg.TxMemPool.CheckSpend(op) + + // Set the spending txid if found. + if spendingTx != nil { + result.SpendingTxid = spendingTx.Hash().String() + } + + results = append(results, result) + } + + return results, nil +} + +// validateFeeRate checks that the fee rate used by transaction doesn't exceed +// the max fee rate specified. +func validateFeeRate(feeSats btcutil.Amount, txSize int64, + maxFeeRate float64) (*btcjson.TestMempoolAcceptFees, bool) { + + // Calculate fee rate in sats/kvB. + feeRateSatsPerKVB := feeSats * 1e3 / btcutil.Amount(txSize) + + // Convert sats/vB to BTC/kvB. + feeRate := feeRateSatsPerKVB.ToBTC() + + // Get the max fee rate, if not provided, default to 0.1 BTC/kvB. + if maxFeeRate == 0 { + maxFeeRate = defaultMaxFeeRate + } + + // If the fee rate is above the max fee rate, this tx is not accepted. + if feeRate > maxFeeRate { + return nil, false + } + + return &btcjson.TestMempoolAcceptFees{ + Base: feeSats.ToBTC(), + EffectiveFeeRate: feeRate, + }, true +} + // rpcServer provides a concurrent safe RPC server to a chain server. type rpcServer struct { started int32 @@ -3827,10 +4183,11 @@ func (s *rpcServer) checkAuth(r *http.Request, require bool) (bool, bool, error) // a known concrete command along with any error that might have happened while // parsing it. type parsedRPCCmd struct { - id interface{} - method string - cmd interface{} - err *btcjson.RPCError + jsonrpc btcjson.RPCVersion + id interface{} + method string + cmd interface{} + err *btcjson.RPCError } // standardCmdResult checks that a parsed command is a standard Bitcoin JSON-RPC @@ -3863,9 +4220,11 @@ handled: // is suitable for use in replies if the command is invalid in some way such as // an unregistered command or invalid parameters. func parseCmd(request *btcjson.Request) *parsedRPCCmd { - var parsedCmd parsedRPCCmd - parsedCmd.id = request.ID - parsedCmd.method = request.Method + parsedCmd := parsedRPCCmd{ + jsonrpc: request.Jsonrpc, + id: request.ID, + method: request.Method, + } cmd, err := btcjson.UnmarshalCmd(request) if err != nil { @@ -3892,7 +4251,7 @@ func parseCmd(request *btcjson.Request) *parsedRPCCmd { // createMarshalledReply returns a new marshalled JSON-RPC response given the // passed parameters. It will automatically convert errors that are not of // the type *btcjson.RPCError to the appropriate type as needed. -func createMarshalledReply(id, result interface{}, replyErr error) ([]byte, error) { +func createMarshalledReply(rpcVersion btcjson.RPCVersion, id interface{}, result interface{}, replyErr error) ([]byte, error) { var jsonErr *btcjson.RPCError if replyErr != nil { if jErr, ok := replyErr.(*btcjson.RPCError); ok { @@ -3902,7 +4261,71 @@ func createMarshalledReply(id, result interface{}, replyErr error) ([]byte, erro } } - return btcjson.MarshalResponse(id, result, jsonErr) + return btcjson.MarshalResponse(rpcVersion, id, result, jsonErr) +} + +// processRequest determines the incoming request type (single or batched), +// parses it and returns a marshalled response. +func (s *rpcServer) processRequest(request *btcjson.Request, isAdmin bool, closeChan <-chan struct{}) []byte { + var result interface{} + var err error + var jsonErr *btcjson.RPCError + + if !isAdmin { + if _, ok := rpcLimited[request.Method]; !ok { + jsonErr = internalRPCError("limited user not "+ + "authorized for this method", "") + } + } + + if jsonErr == nil { + if request.Method == "" || request.Params == nil { + jsonErr = &btcjson.RPCError{ + Code: btcjson.ErrRPCInvalidRequest.Code, + Message: "Invalid request: malformed", + } + msg, err := createMarshalledReply(request.Jsonrpc, request.ID, result, jsonErr) + if err != nil { + rpcsLog.Errorf("Failed to marshal reply: %v", err) + return nil + } + return msg + } + + // Valid requests with no ID (notifications) must not have a response + // per the JSON-RPC spec. + if request.ID == nil { + return nil + } + + // Attempt to parse the JSON-RPC request into a known + // concrete command. + parsedCmd := parseCmd(request) + if parsedCmd.err != nil { + jsonErr = parsedCmd.err + } else { + result, err = s.standardCmdResult(parsedCmd, + closeChan) + if err != nil { + if rpcErr, ok := err.(*btcjson.RPCError); ok { + jsonErr = rpcErr + } else { + jsonErr = &btcjson.RPCError{ + Code: btcjson.ErrRPCInvalidRequest.Code, + Message: "Invalid request: malformed", + } + } + } + } + } + + // Marshal the response. + msg, err := createMarshalledReply(request.Jsonrpc, request.ID, result, jsonErr) + if err != nil { + rpcsLog.Errorf("Failed to marshal reply: %v", err) + return nil + } + return msg } // jsonRPCRead handles reading and responding to RPC messages. @@ -3925,7 +4348,7 @@ func (s *rpcServer) jsonRPCRead(w http.ResponseWriter, r *http.Request, isAdmin // change the read deadline for the new connection and having one breaks // long polling. However, not having a read deadline on the initial // connection would mean clients can connect and idle forever. Thus, - // hijack the connecton from the HTTP server, clear the read deadline, + // hijack the connection from the HTTP server, clear the read deadline, // and handle writing the response manually. hj, ok := w.(http.Hijacker) if !ok { @@ -3947,80 +4370,186 @@ func (s *rpcServer) jsonRPCRead(w http.ResponseWriter, r *http.Request, isAdmin conn.SetReadDeadline(timeZeroVal) // Attempt to parse the raw body into a JSON-RPC request. - var responseID interface{} - var jsonErr error - var result interface{} - var request btcjson.Request - if err := json.Unmarshal(body, &request); err != nil { - jsonErr = &btcjson.RPCError{ - Code: btcjson.ErrRPCParse.Code, - Message: "Failed to parse request: " + err.Error(), + // Setup a close notifier. Since the connection is hijacked, + // the CloseNotifier on the ResponseWriter is not available. + closeChan := make(chan struct{}, 1) + go func() { + _, err = conn.Read(make([]byte, 1)) + if err != nil { + close(closeChan) } + }() + + var results []json.RawMessage + var batchSize int + var batchedRequest bool + + // Determine request type + if bytes.HasPrefix(body, batchedRequestPrefix) { + batchedRequest = true } - if jsonErr == nil { - // The JSON-RPC 1.0 spec defines that notifications must have their "id" - // set to null and states that notifications do not have a response. - // - // A JSON-RPC 2.0 notification is a request with "json-rpc":"2.0", and - // without an "id" member. The specification states that notifications - // must not be responded to. JSON-RPC 2.0 permits the null value as a - // valid request id, therefore such requests are not notifications. - // - // Bitcoin Core serves requests with "id":null or even an absent "id", - // and responds to such requests with "id":null in the response. - // - // Btcd does not respond to any request without and "id" or "id":null, - // regardless the indicated JSON-RPC protocol version unless RPC quirks - // are enabled. With RPC quirks enabled, such requests will be responded - // to if the reqeust does not indicate JSON-RPC version. - // - // RPC quirks can be enabled by the user to avoid compatibility issues - // with software relying on Core's behavior. - if request.ID == nil && !(cfg.RPCQuirks && request.Jsonrpc == "") { - return + + // Process a single request + if !batchedRequest { + var req btcjson.Request + var resp json.RawMessage + err = json.Unmarshal(body, &req) + if err != nil { + jsonErr := &btcjson.RPCError{ + Code: btcjson.ErrRPCParse.Code, + Message: fmt.Sprintf("Failed to parse request: %v", + err), + } + resp, err = btcjson.MarshalResponse(btcjson.RpcVersion1, nil, nil, jsonErr) + if err != nil { + rpcsLog.Errorf("Failed to create reply: %v", err) + } + } + + if err == nil { + // The JSON-RPC 1.0 spec defines that notifications must have their "id" + // set to null and states that notifications do not have a response. + // + // A JSON-RPC 2.0 notification is a request with "json-rpc":"2.0", and + // without an "id" member. The specification states that notifications + // must not be responded to. JSON-RPC 2.0 permits the null value as a + // valid request id, therefore such requests are not notifications. + // + // Bitcoin Core serves requests with "id":null or even an absent "id", + // and responds to such requests with "id":null in the response. + // + // Btcd does not respond to any request without and "id" or "id":null, + // regardless the indicated JSON-RPC protocol version unless RPC quirks + // are enabled. With RPC quirks enabled, such requests will be responded + // to if the request does not indicate JSON-RPC version. + // + // RPC quirks can be enabled by the user to avoid compatibility issues + // with software relying on Core's behavior. + if req.ID == nil && !(cfg.RPCQuirks && req.Jsonrpc == "") { + return + } + resp = s.processRequest(&req, isAdmin, closeChan) } - // The parse was at least successful enough to have an ID so - // set it for the response. - responseID = request.ID + if resp != nil { + results = append(results, resp) + } + } - // Setup a close notifier. Since the connection is hijacked, - // the CloseNotifer on the ResponseWriter is not available. - closeChan := make(chan struct{}, 1) - go func() { - _, err := conn.Read(make([]byte, 1)) + // Process a batched request + if batchedRequest { + var batchedRequests []interface{} + var resp json.RawMessage + err = json.Unmarshal(body, &batchedRequests) + if err != nil { + jsonErr := &btcjson.RPCError{ + Code: btcjson.ErrRPCParse.Code, + Message: fmt.Sprintf("Failed to parse request: %v", + err), + } + resp, err = btcjson.MarshalResponse(btcjson.RpcVersion2, nil, nil, jsonErr) if err != nil { - close(closeChan) + rpcsLog.Errorf("Failed to create reply: %v", err) + } + + if resp != nil { + results = append(results, resp) } - }() - - // Check if the user is limited and set error if method unauthorized - if !isAdmin { - if _, ok := rpcLimited[request.Method]; !ok { - jsonErr = &btcjson.RPCError{ - Code: btcjson.ErrRPCInvalidParams.Code, - Message: "limited user not authorized for this method", + } + + if err == nil { + // Response with an empty batch error if the batch size is zero + if len(batchedRequests) == 0 { + jsonErr := &btcjson.RPCError{ + Code: btcjson.ErrRPCInvalidRequest.Code, + Message: "Invalid request: empty batch", + } + resp, err = btcjson.MarshalResponse(btcjson.RpcVersion2, nil, nil, jsonErr) + if err != nil { + rpcsLog.Errorf("Failed to marshal reply: %v", err) + } + + if resp != nil { + results = append(results, resp) + } + } + + // Process each batch entry individually + if len(batchedRequests) > 0 { + batchSize = len(batchedRequests) + + for _, entry := range batchedRequests { + var reqBytes []byte + reqBytes, err = json.Marshal(entry) + if err != nil { + jsonErr := &btcjson.RPCError{ + Code: btcjson.ErrRPCInvalidRequest.Code, + Message: fmt.Sprintf("Invalid request: %v", + err), + } + resp, err = btcjson.MarshalResponse(btcjson.RpcVersion2, nil, nil, jsonErr) + if err != nil { + rpcsLog.Errorf("Failed to create reply: %v", err) + } + + if resp != nil { + results = append(results, resp) + } + continue + } + + var req btcjson.Request + err := json.Unmarshal(reqBytes, &req) + if err != nil { + jsonErr := &btcjson.RPCError{ + Code: btcjson.ErrRPCInvalidRequest.Code, + Message: fmt.Sprintf("Invalid request: %v", + err), + } + resp, err = btcjson.MarshalResponse("", nil, nil, jsonErr) + if err != nil { + rpcsLog.Errorf("Failed to create reply: %v", err) + } + + if resp != nil { + results = append(results, resp) + } + continue + } + + resp = s.processRequest(&req, isAdmin, closeChan) + if resp != nil { + results = append(results, resp) + } } } } + } - if jsonErr == nil { - // Attempt to parse the JSON-RPC request into a known concrete - // command. - parsedCmd := parseCmd(&request) - if parsedCmd.err != nil { - jsonErr = parsedCmd.err - } else { - result, jsonErr = s.standardCmdResult(parsedCmd, closeChan) + var msg = []byte{} + if batchedRequest && batchSize > 0 { + if len(results) > 0 { + // Form the batched response json + var buffer bytes.Buffer + buffer.WriteByte('[') + for idx, reply := range results { + if idx == len(results)-1 { + buffer.Write(reply) + buffer.WriteByte(']') + break + } + buffer.Write(reply) + buffer.WriteByte(',') } + msg = buffer.Bytes() } } - // Marshal the response. - msg, err := createMarshalledReply(responseID, result, jsonErr) - if err != nil { - rpcsLog.Errorf("Failed to marshal reply: %v", err) - return + if !batchedRequest || batchSize == 0 { + // Respond with the first results entry for single requests + if len(results) > 0 { + msg = results[0] + } } // Write the response. @@ -4130,10 +4659,10 @@ func genCertPair(certFile, keyFile string) error { } // Write cert and key files. - if err = ioutil.WriteFile(certFile, cert, 0666); err != nil { + if err = os.WriteFile(certFile, cert, 0666); err != nil { return err } - if err = ioutil.WriteFile(keyFile, key, 0600); err != nil { + if err = os.WriteFile(keyFile, key, 0600); err != nil { os.Remove(certFile) return err } @@ -4222,6 +4751,10 @@ type rpcserverConnManager interface { // RelayTransactions generates and relays inventory vectors for all of // the passed transactions to all connected peers. RelayTransactions(txns []*mempool.TxDesc) + + // NodeAddresses returns an array consisting node addresses which can + // potentially be used to find new nodes in the network. + NodeAddresses() []*wire.NetAddressV2 } // rpcserverSyncManager represents a sync manager for use with the RPC server. @@ -4280,7 +4813,7 @@ type rpcserverConfig struct { DB database.DB // TxMemPool defines the transaction memory pool to interact with. - TxMemPool *mempool.TxPool + TxMemPool mempool.TxMempool // These fields allow the RPC server to interface with mining. // diff --git a/rpcserver_test.go b/rpcserver_test.go new file mode 100644 index 0000000000..0aa9391321 --- /dev/null +++ b/rpcserver_test.go @@ -0,0 +1,497 @@ +package main + +import ( + "encoding/hex" + "errors" + "testing" + + "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/mempool" + "github.com/btcsuite/btcd/wire" + "github.com/stretchr/testify/require" +) + +// TestHandleTestMempoolAcceptFailDecode checks that when invalid hex string is +// used as the raw txns, the corresponding error is returned. +func TestHandleTestMempoolAcceptFailDecode(t *testing.T) { + t.Parallel() + + require := require.New(t) + + // Create a testing server. + s := &rpcServer{} + + testCases := []struct { + name string + txns []string + expectedErrCode btcjson.RPCErrorCode + }{ + { + name: "hex decode fail", + txns: []string{"invalid"}, + expectedErrCode: btcjson.ErrRPCDecodeHexString, + }, + { + name: "tx decode fail", + txns: []string{"696e76616c6964"}, + expectedErrCode: btcjson.ErrRPCDeserialization, + }, + } + + for _, tc := range testCases { + tc := tc + + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + // Create a request that uses invalid raw txns. + cmd := btcjson.NewTestMempoolAcceptCmd(tc.txns, 0) + + // Call the method under test. + closeChan := make(chan struct{}) + result, err := handleTestMempoolAccept( + s, cmd, closeChan, + ) + + // Ensure the expected error is returned. + require.Error(err) + rpcErr, ok := err.(*btcjson.RPCError) + require.True(ok) + require.Equal(tc.expectedErrCode, rpcErr.Code) + + // No result should be returned. + require.Nil(result) + }) + } +} + +var ( + // TODO(yy): make a `btctest` package and move these testing txns there + // so they be used in other tests. + // + // txHex1 is taken from `txscript/data/tx_valid.json`. + txHex1 = "0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b" + + "49aa43ad90ba26000000000490047304402203f16c6f40162ab686621ef3" + + "000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507a" + + "c48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0" + + "140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271a" + + "d504b88ac00000000" + + // txHex2 is taken from `txscript/data/tx_valid.json`. + txHex2 = "0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b" + + "49aa43ad90ba260000000004a0048304402203f16c6f40162ab686621ef3" + + "000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507a" + + "c48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2bab01fffffff" + + "f0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c27" + + "1ad504b88ac00000000" + + // txHex3 is taken from `txscript/data/tx_valid.json`. + txHex3 = "0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b" + + "49aa43ad90ba260000000004a01ff47304402203f16c6f40162ab686621e" + + "f3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc350" + + "7ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01fffffff" + + "f0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c27" + + "1ad504b88ac00000000" +) + +// decodeTxHex decodes the given hex string into a transaction. +func decodeTxHex(t *testing.T, txHex string) *btcutil.Tx { + rawBytes, err := hex.DecodeString(txHex) + require.NoError(t, err) + tx, err := btcutil.NewTxFromBytes(rawBytes) + require.NoError(t, err) + + return tx +} + +// TestHandleTestMempoolAcceptMixedResults checks that when different txns get +// different responses from calling the mempool method `CheckMempoolAcceptance` +// their results are correctly returned. +func TestHandleTestMempoolAcceptMixedResults(t *testing.T) { + t.Parallel() + + require := require.New(t) + + // Create a mock mempool. + mm := &mempool.MockTxMempool{} + + // Create a testing server with the mock mempool. + s := &rpcServer{cfg: rpcserverConfig{ + TxMemPool: mm, + }} + + // Decode the hex so we can assert the mock mempool is called with it. + tx1 := decodeTxHex(t, txHex1) + tx2 := decodeTxHex(t, txHex2) + tx3 := decodeTxHex(t, txHex3) + + // Create a slice to hold the expected results. We will use three txns + // so we expect threeresults. + expectedResults := make([]*btcjson.TestMempoolAcceptResult, 3) + + // We now mock the first call to `CheckMempoolAcceptance` to return an + // error. + dummyErr := errors.New("dummy error") + mm.On("CheckMempoolAcceptance", tx1).Return(nil, dummyErr).Once() + + // Since the call failed, we expect the first result to give us the + // error. + expectedResults[0] = &btcjson.TestMempoolAcceptResult{ + Txid: tx1.Hash().String(), + Wtxid: tx1.WitnessHash().String(), + Allowed: false, + RejectReason: dummyErr.Error(), + } + + // We mock the second call to `CheckMempoolAcceptance` to return a + // result saying the tx is missing inputs. + mm.On("CheckMempoolAcceptance", tx2).Return( + &mempool.MempoolAcceptResult{ + MissingParents: []*chainhash.Hash{}, + }, nil, + ).Once() + + // We expect the second result to give us the missing-inputs error. + expectedResults[1] = &btcjson.TestMempoolAcceptResult{ + Txid: tx2.Hash().String(), + Wtxid: tx2.WitnessHash().String(), + Allowed: false, + RejectReason: "missing-inputs", + } + + // We mock the third call to `CheckMempoolAcceptance` to return a + // result saying the tx allowed. + const feeSats = btcutil.Amount(1000) + mm.On("CheckMempoolAcceptance", tx3).Return( + &mempool.MempoolAcceptResult{ + TxFee: feeSats, + TxSize: 100, + }, nil, + ).Once() + + // We expect the third result to give us the fee details. + expectedResults[2] = &btcjson.TestMempoolAcceptResult{ + Txid: tx3.Hash().String(), + Wtxid: tx3.WitnessHash().String(), + Allowed: true, + Vsize: 100, + Fees: &btcjson.TestMempoolAcceptFees{ + Base: feeSats.ToBTC(), + EffectiveFeeRate: feeSats.ToBTC() * 1e3 / 100, + }, + } + + // Create a mock request with default max fee rate of 0.1 BTC/KvB. + cmd := btcjson.NewTestMempoolAcceptCmd( + []string{txHex1, txHex2, txHex3}, 0.1, + ) + + // Call the method handler and assert the expected results are + // returned. + closeChan := make(chan struct{}) + results, err := handleTestMempoolAccept(s, cmd, closeChan) + require.NoError(err) + require.Equal(expectedResults, results) + + // Assert the mocked method is called as expected. + mm.AssertExpectations(t) +} + +// TestValidateFeeRate checks that `validateFeeRate` behaves as expected. +func TestValidateFeeRate(t *testing.T) { + t.Parallel() + + const ( + // testFeeRate is in BTC/kvB. + testFeeRate = 0.1 + + // testTxSize is in vb. + testTxSize = 100 + + // testFeeSats is in sats. + // We have 0.1BTC/kvB = + // 0.1 * 1e8 sats/kvB = + // 0.1 * 1e8 / 1e3 sats/vb = 0.1 * 1e5 sats/vb. + testFeeSats = btcutil.Amount(testFeeRate * 1e5 * testTxSize) + ) + + testCases := []struct { + name string + feeSats btcutil.Amount + txSize int64 + maxFeeRate float64 + expectedFees *btcjson.TestMempoolAcceptFees + allowed bool + }{ + { + // When the fee rate(0.1) is above the max fee + // rate(0.01), we expect a nil result and false. + name: "fee rate above max", + feeSats: testFeeSats, + txSize: testTxSize, + maxFeeRate: testFeeRate / 10, + expectedFees: nil, + allowed: false, + }, + { + // When the fee rate(0.1) is no greater than the max + // fee rate(0.1), we expect a result and true. + name: "fee rate below max", + feeSats: testFeeSats, + txSize: testTxSize, + maxFeeRate: testFeeRate, + expectedFees: &btcjson.TestMempoolAcceptFees{ + Base: testFeeSats.ToBTC(), + EffectiveFeeRate: testFeeRate, + }, + allowed: true, + }, + { + // When the fee rate(1) is above the default max fee + // rate(0.1), we expect a nil result and false. + name: "fee rate above default max", + feeSats: testFeeSats, + txSize: testTxSize / 10, + expectedFees: nil, + allowed: false, + }, + { + // When the fee rate(0.1) is no greater than the + // default max fee rate(0.1), we expect a result and + // true. + name: "fee rate below default max", + feeSats: testFeeSats, + txSize: testTxSize, + expectedFees: &btcjson.TestMempoolAcceptFees{ + Base: testFeeSats.ToBTC(), + EffectiveFeeRate: testFeeRate, + }, + allowed: true, + }, + } + + for _, tc := range testCases { + tc := tc + + t.Run(tc.name, func(t *testing.T) { + require := require.New(t) + + result, allowed := validateFeeRate( + tc.feeSats, tc.txSize, tc.maxFeeRate, + ) + + require.Equal(tc.expectedFees, result) + require.Equal(tc.allowed, allowed) + }) + } +} + +// TestHandleTestMempoolAcceptFees checks that the `Fees` field is correctly +// populated based on the max fee rate and the tx being checked. +func TestHandleTestMempoolAcceptFees(t *testing.T) { + t.Parallel() + + // Create a mock mempool. + mm := &mempool.MockTxMempool{} + + // Create a testing server with the mock mempool. + s := &rpcServer{cfg: rpcserverConfig{ + TxMemPool: mm, + }} + + const ( + // Set transaction's fee rate to be 0.2BTC/kvB. + feeRate = defaultMaxFeeRate * 2 + + // txSize is 100vb. + txSize = 100 + + // feeSats is 2e6 sats. + feeSats = feeRate * 1e8 * txSize / 1e3 + ) + + testCases := []struct { + name string + maxFeeRate float64 + txHex string + rejectReason string + allowed bool + }{ + { + // When the fee rate(0.2) used by the tx is below the + // max fee rate(2) specified, the result should allow + // it. + name: "below max fee rate", + maxFeeRate: feeRate * 10, + txHex: txHex1, + allowed: true, + }, + { + // When the fee rate(0.2) used by the tx is above the + // max fee rate(0.02) specified, the result should + // disallow it. + name: "above max fee rate", + maxFeeRate: feeRate / 10, + txHex: txHex1, + allowed: false, + rejectReason: "max-fee-exceeded", + }, + { + // When the max fee rate is not set, the default + // 0.1BTC/kvB is used and the fee rate(0.2) used by the + // tx is above it, the result should disallow it. + name: "above default max fee rate", + txHex: txHex1, + allowed: false, + rejectReason: "max-fee-exceeded", + }, + } + + for _, tc := range testCases { + tc := tc + + t.Run(tc.name, func(t *testing.T) { + require := require.New(t) + + // Decode the hex so we can assert the mock mempool is + // called with it. + tx := decodeTxHex(t, txHex1) + + // We mock the call to `CheckMempoolAcceptance` to + // return the result. + mm.On("CheckMempoolAcceptance", tx).Return( + &mempool.MempoolAcceptResult{ + TxFee: feeSats, + TxSize: txSize, + }, nil, + ).Once() + + // We expect the third result to give us the fee + // details. + expected := &btcjson.TestMempoolAcceptResult{ + Txid: tx.Hash().String(), + Wtxid: tx.WitnessHash().String(), + Allowed: tc.allowed, + } + + if tc.allowed { + expected.Vsize = txSize + expected.Fees = &btcjson.TestMempoolAcceptFees{ + Base: feeSats / 1e8, + EffectiveFeeRate: feeRate, + } + } else { + expected.RejectReason = tc.rejectReason + } + + // Create a mock request with specified max fee rate. + cmd := btcjson.NewTestMempoolAcceptCmd( + []string{txHex1}, tc.maxFeeRate, + ) + + // Call the method handler and assert the expected + // result is returned. + closeChan := make(chan struct{}) + r, err := handleTestMempoolAccept(s, cmd, closeChan) + require.NoError(err) + + // Check the interface type. + results, ok := r.([]*btcjson.TestMempoolAcceptResult) + require.True(ok) + + // Expect exactly one result. + require.Len(results, 1) + + // Check the result is returned as expected. + require.Equal(expected, results[0]) + + // Assert the mocked method is called as expected. + mm.AssertExpectations(t) + }) + } +} + +// TestGetTxSpendingPrevOut checks that handleGetTxSpendingPrevOut handles the +// cmd as expected. +func TestGetTxSpendingPrevOut(t *testing.T) { + t.Parallel() + + require := require.New(t) + + // Create a mock mempool. + mm := &mempool.MockTxMempool{} + defer mm.AssertExpectations(t) + + // Create a testing server with the mock mempool. + s := &rpcServer{cfg: rpcserverConfig{ + TxMemPool: mm, + }} + + // First, check the error case. + // + // Create a request that will cause an error. + cmd := &btcjson.GetTxSpendingPrevOutCmd{ + Outputs: []*btcjson.GetTxSpendingPrevOutCmdOutput{ + {Txid: "invalid"}, + }, + } + + // Call the method handler and assert the error is returned. + closeChan := make(chan struct{}) + results, err := handleGetTxSpendingPrevOut(s, cmd, closeChan) + require.Error(err) + require.Nil(results) + + // We now check the normal case. Two outputs will be tested - one found + // in mempool and other not. + // + // Decode the hex so we can assert the mock mempool is called with it. + tx := decodeTxHex(t, txHex1) + + // Create testing outpoints. + opInMempool := wire.OutPoint{Hash: chainhash.Hash{1}, Index: 1} + opNotInMempool := wire.OutPoint{Hash: chainhash.Hash{2}, Index: 1} + + // We only expect to see one output being found as spent in mempool. + expectedResults := []*btcjson.GetTxSpendingPrevOutResult{ + { + Txid: opInMempool.Hash.String(), + Vout: opInMempool.Index, + SpendingTxid: tx.Hash().String(), + }, + { + Txid: opNotInMempool.Hash.String(), + Vout: opNotInMempool.Index, + }, + } + + // We mock the first call to `CheckSpend` to return a result saying the + // output is found. + mm.On("CheckSpend", opInMempool).Return(tx).Once() + + // We mock the second call to `CheckSpend` to return a result saying the + // output is NOT found. + mm.On("CheckSpend", opNotInMempool).Return(nil).Once() + + // Create a request with the above outputs. + cmd = &btcjson.GetTxSpendingPrevOutCmd{ + Outputs: []*btcjson.GetTxSpendingPrevOutCmdOutput{ + { + Txid: opInMempool.Hash.String(), + Vout: opInMempool.Index, + }, + { + Txid: opNotInMempool.Hash.String(), + Vout: opNotInMempool.Index, + }, + }, + } + + // Call the method handler and assert the expected result is returned. + closeChan = make(chan struct{}) + results, err = handleGetTxSpendingPrevOut(s, cmd, closeChan) + require.NoError(err) + require.Equal(expectedResults, results) +} diff --git a/rpcserverhelp.go b/rpcserverhelp.go index cc6935b512..71f96e99fd 100644 --- a/rpcserverhelp.go +++ b/rpcserverhelp.go @@ -84,9 +84,10 @@ var helpDescsEnUS = map[string]string{ // ScriptPubKeyResult help. "scriptpubkeyresult-asm": "Disassembly of the script", "scriptpubkeyresult-hex": "Hex-encoded bytes of the script", - "scriptpubkeyresult-reqSigs": "The number of required signatures", + "scriptpubkeyresult-reqSigs": "(DEPRECATED) The number of required signatures", "scriptpubkeyresult-type": "The type of the script (e.g. 'pubkeyhash')", - "scriptpubkeyresult-addresses": "The bitcoin addresses associated with this script", + "scriptpubkeyresult-address": "The bitcoin address associated with this script (only if a well-defined address exists)", + "scriptpubkeyresult-addresses": "(DEPRECATED) The bitcoin addresses associated with this script", // Vout help. "vout-value": "The amount in BTC", @@ -106,9 +107,10 @@ var helpDescsEnUS = map[string]string{ // DecodeScriptResult help. "decodescriptresult-asm": "Disassembly of the script", - "decodescriptresult-reqSigs": "The number of required signatures", + "decodescriptresult-reqSigs": "(DEPRECATED) The number of required signatures", "decodescriptresult-type": "The type of the script (e.g. 'pubkeyhash')", - "decodescriptresult-addresses": "The bitcoin addresses associated with this script", + "decodescriptresult-address": "The bitcoin address associated with this script (only if a well-defined address exists)", + "decodescriptresult-addresses": "(DEPRECATED) The bitcoin addresses associated with this script", "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)", // DecodeScriptCmd help. @@ -162,10 +164,9 @@ var helpDescsEnUS = map[string]string{ // GetBlockCmd help. "getblock--synopsis": "Returns information about a block given its hash.", "getblock-hash": "The hash of the block", - "getblock-verbose": "Specifies the block is returned as a JSON object instead of hex-encoded string", - "getblock-verbosetx": "Specifies that each transaction is returned as a JSON object and only applies if the verbose flag is true (btcd extension)", - "getblock--condition0": "verbose=false", - "getblock--condition1": "verbose=true", + "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) ", + "getblock--condition0": "verbosity=0", + "getblock--condition1": "verbosity=1", "getblock--result0": "Hex-encoded bytes of the serialized block", // GetBlockChainInfoCmd help. @@ -182,6 +183,8 @@ var helpDescsEnUS = map[string]string{ "getblockchaininforesult-pruned": "A bool that indicates if the node is pruned or not", "getblockchaininforesult-pruneheight": "The lowest block retained in the current pruned chain", "getblockchaininforesult-chainwork": "The total cumulative work in the best chain", + "getblockchaininforesult-size_on_disk": "The estimated size of the block and undo files on disk", + "getblockchaininforesult-initialblockdownload": "Estimate of whether this node is in Initial Block Download mode", "getblockchaininforesult-softforks": "The status of the super-majority soft-forks", "getblockchaininforesult-unifiedsoftforks": "The status of the super-majority soft-forks used by bitcoind on or after v0.19.0", @@ -244,8 +247,8 @@ var helpDescsEnUS = map[string]string{ "getblockverboseresult-version": "The block version", "getblockverboseresult-versionHex": "The block version in hexadecimal", "getblockverboseresult-merkleroot": "Root hash of the merkle tree", - "getblockverboseresult-tx": "The transaction hashes (only when verbosetx=false)", - "getblockverboseresult-rawtx": "The transactions as JSON objects (only when verbosetx=true)", + "getblockverboseresult-tx": "The transaction hashes (only when verbosity=1)", + "getblockverboseresult-rawtx": "The transactions as JSON objects (only when verbosity=2)", "getblockverboseresult-time": "The block time in seconds since 1 Jan 1970 GMT", "getblockverboseresult-nonce": "The block nonce", "getblockverboseresult-bits": "The bits which represent the block difficulty", @@ -296,6 +299,7 @@ var helpDescsEnUS = map[string]string{ "templaterequest-target": "The desired target for the block template (this parameter is ignored)", "templaterequest-data": "Hex-encoded block data (only for mode=proposal)", "templaterequest-workid": "The server provided workid if provided in block template (not applicable)", + "templaterequest-rules": "Specific block rules that are to be enforced e.g. '[\"segwit\"]", // GetBlockTemplateResultTx help. "getblocktemplateresulttx-data": "Hex-encoded transaction data (byte-for-byte)", @@ -303,6 +307,7 @@ var helpDescsEnUS = map[string]string{ "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", "getblocktemplateresulttx-fee": "Difference in value between transaction inputs and outputs (in Satoshi)", "getblocktemplateresulttx-sigops": "Total number of signature operations as counted for purposes of block limits", + "getblocktemplateresulttx-txid": "The transaction id, can be different from hash.", "getblocktemplateresulttx-weight": "The weight of the transaction", // GetBlockTemplateResultAux help. @@ -344,6 +349,15 @@ var helpDescsEnUS = map[string]string{ "getblocktemplate--condition2": "mode=proposal, accepted", "getblocktemplate--result1": "An error string which represents why the proposal was rejected or nothing if accepted", + // GetChainTipsResult help. + "getchaintipsresult-chaintips": "The chaintips that this node is aware of", + "getchaintipsresult-height": "The height of the chain tip", + "getchaintipsresult-hash": "The block hash of the chain tip", + "getchaintipsresult-branchlen": "Returns zero for main chain. Otherwise is the length of branch connecting the tip to the main chain", + "getchaintipsresult-status": "Status of the chain. Returns \"active\" for the main chain", + // GetChainTipsCmd help. + "getchaintips--synopsis": "Returns information about all known tips in the block tree, including the main chain as well as orphaned branches.", + // GetCFilterCmd help. "getcfilter--synopsis": "Returns a block's committed filter given its hash.", "getcfilter-filtertype": "The type of filter to return (0=regular)", @@ -362,7 +376,7 @@ var helpDescsEnUS = map[string]string{ // GetCurrentNetCmd help. "getcurrentnet--synopsis": "Get bitcoin network the server is running on.", - "getcurrentnet--result0": "The network identifer", + "getcurrentnet--result0": "The network identifier", // GetDifficultyCmd help. "getdifficulty--synopsis": "Returns the proof-of-work difficulty as a multiple of the minimum difficulty.", @@ -453,6 +467,17 @@ var helpDescsEnUS = map[string]string{ "getnettotalsresult-totalbytessent": "Total bytes sent", "getnettotalsresult-timemillis": "Number of milliseconds since 1 Jan 1970 GMT", + // GetNodeAddressesResult help. + "getnodeaddressesresult-time": "Timestamp in seconds since epoch (Jan 1 1970 GMT) keeping track of when the node was last seen", + "getnodeaddressesresult-services": "The services offered", + "getnodeaddressesresult-address": "The address of the node", + "getnodeaddressesresult-port": "The port of the node", + + // GetNodeAddressesCmd help. + "getnodeaddresses--synopsis": "Return known addresses which can potentially be used to find new nodes in the network", + "getnodeaddresses-count": "How many addresses to return. Limited to the smaller of 2500 or 23% of all known addresses", + "getnodeaddresses--result0": "List of node addresses", + // GetPeerInfoResult help. "getpeerinforesult-id": "A unique node ID", "getpeerinforesult-addr": "The ip address and port of the peer", @@ -514,11 +539,15 @@ var helpDescsEnUS = map[string]string{ "gettxoutresult-coinbase": "Whether or not the transaction is a coinbase", // GetTxOutCmd help. - "gettxout--synopsis": "Returns information about an unspent transaction output..", + "gettxout--synopsis": "Returns information about an unspent transaction output.", "gettxout-txid": "The hash of the transaction", "gettxout-vout": "The index of the output", "gettxout-includemempool": "Include the mempool when true", + // InvalidateBlockCmd help. + "invalidateblock--synopsis": "Invalidates the block of the given block hash. To re-validate the invalidated block, use the reconsiderblock rpc", + "invalidateblock-blockhash": "The block hash of the block to invalidate", + // HelpCmd help. "help--synopsis": "Returns a list of all commands or help for a specified command.", "help-command": "The command to retrieve help for", @@ -549,17 +578,23 @@ var helpDescsEnUS = map[string]string{ "searchrawtransactions--result0": "Hex-encoded serialized transaction", // SendRawTransactionCmd help. - "sendrawtransaction--synopsis": "Submits the serialized, hex-encoded transaction to the local peer and relays it to the network.", - "sendrawtransaction-hextx": "Serialized, hex-encoded signed transaction", - "sendrawtransaction-allowhighfees": "Whether or not to allow insanely high fees (btcd does not yet implement this parameter, so it has no effect)", - "sendrawtransaction-maxfeerate": "Used by bitcoind on or after v0.19.0", - "sendrawtransaction--result0": "The hash of the transaction", + "sendrawtransaction--synopsis": "Submits the serialized, hex-encoded transaction to the local peer and relays it to the network.", + "sendrawtransaction-hextx": "Serialized, hex-encoded signed transaction", + "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)", + "sendrawtransaction--result0": "The hash of the transaction", + "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", // SetGenerateCmd help. "setgenerate--synopsis": "Set the server to generate coins (mine) or not.", "setgenerate-generate": "Use true to enable generation, false to disable it", "setgenerate-genproclimit": "The number of processors (cores) to limit generation to or -1 for default", + // SignMessageWithPrivKeyCmd help. + "signmessagewithprivkey--synopsis": "Sign a message with the private key of an address", + "signmessagewithprivkey-privkey": "The private key to sign the message with", + "signmessagewithprivkey-message": "The message to create a signature of", + "signmessagewithprivkey--result0": "The signature of the message encoded in base 64", + // StopCmd help. "stop--synopsis": "Shutdown btcd.", "stop--result0": "The string 'btcd stopping.'", @@ -576,8 +611,12 @@ var helpDescsEnUS = map[string]string{ "submitblock--result1": "The reason the block was rejected", // ValidateAddressResult help. - "validateaddresschainresult-isvalid": "Whether or not the address is valid", - "validateaddresschainresult-address": "The bitcoin address (only when isvalid is true)", + "validateaddresschainresult-isvalid": "Whether or not the address is valid", + "validateaddresschainresult-address": "The bitcoin address (only when isvalid is true)", + "validateaddresschainresult-isscript": "If the key is a script", + "validateaddresschainresult-iswitness": "If the address is a witness address", + "validateaddresschainresult-witness_version": "The version number of the witness program", + "validateaddresschainresult-witness_program": "The hex value of the witness program", // ValidateAddressCmd help. "validateaddress--synopsis": "Verify an address is valid.", @@ -646,6 +685,10 @@ var helpDescsEnUS = map[string]string{ "loadtxfilter-addresses": "Array of addresses to add to the transaction filter", "loadtxfilter-outpoints": "Array of outpoints to add to the transaction filter", + // ReconsiderBlockCmd help. + "reconsiderblock--synopsis": "Reconsiders the block of the given block hash. Can be used to re-validate blocks invalidated with invalidateblock", + "reconsiderblock-blockhash": "The block hash of the block to reconsider", + // Rescan help. "rescan--synopsis": "Rescan block chain for transactions to addresses.\n" + "When the endblock parameter is omitted, the rescan continues through the best block in the main chain.\n" + @@ -682,58 +725,93 @@ var helpDescsEnUS = map[string]string{ "versionresult-patch": "The patch component of the JSON-RPC API version", "versionresult-prerelease": "Prerelease info about the current build", "versionresult-buildmetadata": "Metadata about the current build", + + // TestMempoolAcceptCmd help. + "testmempoolaccept--synopsis": "Returns result of mempool acceptance tests indicating if raw transaction(s) would be accepted by mempool.", + "testmempoolaccept-rawtxns": "Serialized transactions to test.", + "testmempoolaccept-maxfeerate": "Maximum acceptable fee rate in BTC/kB", + + // TestMempoolAcceptCmd result help. + "testmempoolacceptresult-txid": "The transaction hash in hex.", + "testmempoolacceptresult-wtxid": "The transaction witness hash in hex.", + "testmempoolacceptresult-package-error": "Package validation error, if any (only possible if rawtxs had more than 1 transaction).", + "testmempoolacceptresult-allowed": "Whether the transaction would be accepted to the mempool.", + "testmempoolacceptresult-vsize": "Virtual transaction size as defined in BIP 141.(only present when 'allowed' is true)", + "testmempoolacceptresult-reject-reason": "Rejection string (only present when 'allowed' is false).", + "testmempoolacceptresult-fees": "Transaction fees (only present if 'allowed' is true).", + "testmempoolacceptfees-base": "Transaction fees (only present if 'allowed' is true).", + "testmempoolacceptfees-effective-feerate": "The effective feerate in BTC per KvB.", + "testmempoolacceptfees-effective-includes": "Transactions whose fees and vsizes are included in effective-feerate. Each item is a transaction wtxid in hex.", + + // GetTxSpendingPrevOutCmd help. + "gettxspendingprevout--synopsis": "Scans the mempool to find transactions spending any of the given outputs", + "gettxspendingprevout-outputs": "The transaction outputs that we want to check, and within each, the txid (string) vout (numeric).", + "gettxspendingprevout-txid": "The transaction id", + "gettxspendingprevout-vout": "The output number", + + // GetTxSpendingPrevOutCmd result help. + "gettxspendingprevoutresult-txid": "The transaction hash in hex.", + "gettxspendingprevoutresult-vout": "The output index.", + "gettxspendingprevoutresult-spendingtxid": "The hash of the transaction that spends the output.", } // rpcResultTypes specifies the result types that each RPC command can return. // This information is used to generate the help. Each result type must be a // pointer to the type (or nil to indicate no return value). var rpcResultTypes = map[string][]interface{}{ - "addnode": nil, - "createrawtransaction": {(*string)(nil)}, - "debuglevel": {(*string)(nil), (*string)(nil)}, - "decoderawtransaction": {(*btcjson.TxRawDecodeResult)(nil)}, - "decodescript": {(*btcjson.DecodeScriptResult)(nil)}, - "estimatefee": {(*float64)(nil)}, - "generate": {(*[]string)(nil)}, - "getaddednodeinfo": {(*[]string)(nil), (*[]btcjson.GetAddedNodeInfoResult)(nil)}, - "getbestblock": {(*btcjson.GetBestBlockResult)(nil)}, - "getbestblockhash": {(*string)(nil)}, - "getblock": {(*string)(nil), (*btcjson.GetBlockVerboseResult)(nil)}, - "getblockcount": {(*int64)(nil)}, - "getblockhash": {(*string)(nil)}, - "getblockheader": {(*string)(nil), (*btcjson.GetBlockHeaderVerboseResult)(nil)}, - "getblocktemplate": {(*btcjson.GetBlockTemplateResult)(nil), (*string)(nil), nil}, - "getblockchaininfo": {(*btcjson.GetBlockChainInfoResult)(nil)}, - "getcfilter": {(*string)(nil)}, - "getcfilterheader": {(*string)(nil)}, - "getconnectioncount": {(*int32)(nil)}, - "getcurrentnet": {(*uint32)(nil)}, - "getdifficulty": {(*float64)(nil)}, - "getgenerate": {(*bool)(nil)}, - "gethashespersec": {(*float64)(nil)}, - "getheaders": {(*[]string)(nil)}, - "getinfo": {(*btcjson.InfoChainResult)(nil)}, - "getmempoolinfo": {(*btcjson.GetMempoolInfoResult)(nil)}, - "getmininginfo": {(*btcjson.GetMiningInfoResult)(nil)}, - "getnettotals": {(*btcjson.GetNetTotalsResult)(nil)}, - "getnetworkhashps": {(*int64)(nil)}, - "getpeerinfo": {(*[]btcjson.GetPeerInfoResult)(nil)}, - "getrawmempool": {(*[]string)(nil), (*btcjson.GetRawMempoolVerboseResult)(nil)}, - "getrawtransaction": {(*string)(nil), (*btcjson.TxRawResult)(nil)}, - "gettxout": {(*btcjson.GetTxOutResult)(nil)}, - "node": nil, - "help": {(*string)(nil), (*string)(nil)}, - "ping": nil, - "searchrawtransactions": {(*string)(nil), (*[]btcjson.SearchRawTransactionsResult)(nil)}, - "sendrawtransaction": {(*string)(nil)}, - "setgenerate": nil, - "stop": {(*string)(nil)}, - "submitblock": {nil, (*string)(nil)}, - "uptime": {(*int64)(nil)}, - "validateaddress": {(*btcjson.ValidateAddressChainResult)(nil)}, - "verifychain": {(*bool)(nil)}, - "verifymessage": {(*bool)(nil)}, - "version": {(*map[string]btcjson.VersionResult)(nil)}, + "addnode": nil, + "createrawtransaction": {(*string)(nil)}, + "debuglevel": {(*string)(nil), (*string)(nil)}, + "decoderawtransaction": {(*btcjson.TxRawDecodeResult)(nil)}, + "decodescript": {(*btcjson.DecodeScriptResult)(nil)}, + "estimatefee": {(*float64)(nil)}, + "generate": {(*[]string)(nil)}, + "getaddednodeinfo": {(*[]string)(nil), (*[]btcjson.GetAddedNodeInfoResult)(nil)}, + "getbestblock": {(*btcjson.GetBestBlockResult)(nil)}, + "getbestblockhash": {(*string)(nil)}, + "getblock": {(*string)(nil), (*btcjson.GetBlockVerboseResult)(nil)}, + "getblockcount": {(*int64)(nil)}, + "getblockhash": {(*string)(nil)}, + "getblockheader": {(*string)(nil), (*btcjson.GetBlockHeaderVerboseResult)(nil)}, + "getblocktemplate": {(*btcjson.GetBlockTemplateResult)(nil), (*string)(nil), nil}, + "getblockchaininfo": {(*btcjson.GetBlockChainInfoResult)(nil)}, + "getchaintips": {(*[]btcjson.GetChainTipsResult)(nil)}, + "getcfilter": {(*string)(nil)}, + "getcfilterheader": {(*string)(nil)}, + "getconnectioncount": {(*int32)(nil)}, + "getcurrentnet": {(*uint32)(nil)}, + "getdifficulty": {(*float64)(nil)}, + "getgenerate": {(*bool)(nil)}, + "gethashespersec": {(*float64)(nil)}, + "getheaders": {(*[]string)(nil)}, + "getinfo": {(*btcjson.InfoChainResult)(nil)}, + "getmempoolinfo": {(*btcjson.GetMempoolInfoResult)(nil)}, + "getmininginfo": {(*btcjson.GetMiningInfoResult)(nil)}, + "getnettotals": {(*btcjson.GetNetTotalsResult)(nil)}, + "getnetworkhashps": {(*float64)(nil)}, + "getnodeaddresses": {(*[]btcjson.GetNodeAddressesResult)(nil)}, + "getpeerinfo": {(*[]btcjson.GetPeerInfoResult)(nil)}, + "getrawmempool": {(*[]string)(nil), (*btcjson.GetRawMempoolVerboseResult)(nil)}, + "getrawtransaction": {(*string)(nil), (*btcjson.TxRawResult)(nil)}, + "gettxout": {(*btcjson.GetTxOutResult)(nil)}, + "node": nil, + "help": {(*string)(nil), (*string)(nil)}, + "invalidateblock": nil, + "ping": nil, + "reconsiderblock": nil, + "searchrawtransactions": {(*string)(nil), (*[]btcjson.SearchRawTransactionsResult)(nil)}, + "sendrawtransaction": {(*string)(nil)}, + "setgenerate": nil, + "signmessagewithprivkey": {(*string)(nil)}, + "stop": {(*string)(nil)}, + "submitblock": {nil, (*string)(nil)}, + "uptime": {(*int64)(nil)}, + "validateaddress": {(*btcjson.ValidateAddressChainResult)(nil)}, + "verifychain": {(*bool)(nil)}, + "verifymessage": {(*bool)(nil)}, + "version": {(*map[string]btcjson.VersionResult)(nil)}, + "testmempoolaccept": {(*[]btcjson.TestMempoolAcceptResult)(nil)}, + "gettxspendingprevout": {(*[]btcjson.GetTxSpendingPrevOutResult)(nil)}, // Websocket commands. "loadtxfilter": nil, @@ -819,7 +897,7 @@ func (c *helpCacher) rpcUsage(includeWebsockets bool) (string, error) { } } - sort.Sort(sort.StringSlice(usageTexts)) + sort.Strings(usageTexts) c.usage = strings.Join(usageTexts, "\n") return c.usage, nil } diff --git a/rpcwebsocket.go b/rpcwebsocket.go index 32e466d115..02f59d58bf 100644 --- a/rpcwebsocket.go +++ b/rpcwebsocket.go @@ -22,12 +22,12 @@ import ( "github.com/btcsuite/btcd/blockchain" "github.com/btcsuite/btcd/btcjson" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/database" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" "github.com/btcsuite/websocket" "golang.org/x/crypto/ripemd160" ) @@ -132,8 +132,8 @@ type wsNotificationManager struct { queueNotification chan interface{} // notificationMsgs feeds notificationHandler with notifications - // and client (un)registeration requests from a queue as well as - // registeration and unregisteration requests from clients. + // and client (un)registration requests from a queue as well as + // registration and unregistration requests from clients. notificationMsgs chan interface{} // Access channel for current number of connected clients. @@ -228,7 +228,7 @@ func (m *wsNotificationManager) NotifyBlockDisconnected(block *btcutil.Block) { // NotifyMempoolTx passes a transaction accepted by mempool to the // notification manager for transaction notification processing. If -// isNew is true, the tx is is a new transaction, rather than one +// isNew is true, the tx is a new transaction, rather than one // added to the mempool during a reorg. func (m *wsNotificationManager) NotifyMempoolTx(tx *btcutil.Tx, isNew bool) { n := ¬ificationTxAcceptedByMempool{ @@ -695,7 +695,7 @@ func (*wsNotificationManager) notifyBlockConnected(clients map[chan struct{}]*ws // Notify interested websocket clients about the connected block. ntfn := btcjson.NewBlockConnectedNtfn(block.Hash().String(), block.Height(), block.MsgBlock().Header.Timestamp.Unix()) - marshalledJSON, err := btcjson.MarshalCmd(nil, ntfn) + marshalledJSON, err := btcjson.MarshalCmd(btcjson.RpcVersion1, nil, ntfn) if err != nil { rpcsLog.Errorf("Failed to marshal block connected notification: "+ "%v", err) @@ -719,7 +719,7 @@ func (*wsNotificationManager) notifyBlockDisconnected(clients map[chan struct{}] // Notify interested websocket clients about the disconnected block. ntfn := btcjson.NewBlockDisconnectedNtfn(block.Hash().String(), block.Height(), block.MsgBlock().Header.Timestamp.Unix()) - marshalledJSON, err := btcjson.MarshalCmd(nil, ntfn) + marshalledJSON, err := btcjson.MarshalCmd(btcjson.RpcVersion1, nil, ntfn) if err != nil { rpcsLog.Errorf("Failed to marshal block disconnected "+ "notification: %v", err) @@ -765,7 +765,7 @@ func (m *wsNotificationManager) notifyFilteredBlockConnected(clients map[chan st ntfn.SubscribedTxs = subscribedTxs[quitChan] // Marshal and queue notification. - marshalledJSON, err := btcjson.MarshalCmd(nil, ntfn) + marshalledJSON, err := btcjson.MarshalCmd(btcjson.RpcVersion1, nil, ntfn) if err != nil { rpcsLog.Errorf("Failed to marshal filtered block "+ "connected notification: %v", err) @@ -796,7 +796,7 @@ func (*wsNotificationManager) notifyFilteredBlockDisconnected(clients map[chan s } ntfn := btcjson.NewFilteredBlockDisconnectedNtfn(block.Height(), hex.EncodeToString(w.Bytes())) - marshalledJSON, err := btcjson.MarshalCmd(nil, ntfn) + marshalledJSON, err := btcjson.MarshalCmd(btcjson.RpcVersion1, nil, ntfn) if err != nil { rpcsLog.Errorf("Failed to marshal filtered block disconnected "+ "notification: %v", err) @@ -831,7 +831,7 @@ func (m *wsNotificationManager) notifyForNewTx(clients map[chan struct{}]*wsClie } ntfn := btcjson.NewTxAcceptedNtfn(txHashStr, btcutil.Amount(amount).ToBTC()) - marshalledJSON, err := btcjson.MarshalCmd(nil, ntfn) + marshalledJSON, err := btcjson.MarshalCmd(btcjson.RpcVersion1, nil, ntfn) if err != nil { rpcsLog.Errorf("Failed to marshal tx notification: %s", err.Error()) return @@ -854,7 +854,7 @@ func (m *wsNotificationManager) notifyForNewTx(clients map[chan struct{}]*wsClie } verboseNtfn = btcjson.NewTxAcceptedVerboseNtfn(*rawTx) - marshalledJSONVerbose, err = btcjson.MarshalCmd(nil, + marshalledJSONVerbose, err = btcjson.MarshalCmd(btcjson.RpcVersion1, nil, verboseNtfn) if err != nil { rpcsLog.Errorf("Failed to marshal verbose tx "+ @@ -980,7 +980,7 @@ func blockDetails(block *btcutil.Block, txIndex int) *btcjson.BlockDetails { func newRedeemingTxNotification(txHex string, index int, block *btcutil.Block) ([]byte, error) { // Create and marshal the notification. ntfn := btcjson.NewRedeemingTxNtfn(txHex, blockDetails(block, index)) - return btcjson.MarshalCmd(nil, ntfn) + return btcjson.MarshalCmd(btcjson.RpcVersion1, nil, ntfn) } // notifyForTxOuts examines each transaction output, notifying interested @@ -1016,7 +1016,7 @@ func (m *wsNotificationManager) notifyForTxOuts(ops map[wire.OutPoint]map[chan s ntfn := btcjson.NewRecvTxNtfn(txHex, blockDetails(block, tx.Index())) - marshalledJSON, err := btcjson.MarshalCmd(nil, ntfn) + marshalledJSON, err := btcjson.MarshalCmd(btcjson.RpcVersion1, nil, ntfn) if err != nil { rpcsLog.Errorf("Failed to marshal processedtx notification: %v", err) continue @@ -1047,7 +1047,7 @@ func (m *wsNotificationManager) notifyRelevantTxAccepted(tx *btcutil.Tx, if len(clientsToNotify) != 0 { n := btcjson.NewRelevantTxAcceptedNtfn(txHexString(tx.MsgTx())) - marshalled, err := btcjson.MarshalCmd(nil, n) + marshalled, err := btcjson.MarshalCmd(btcjson.RpcVersion1, nil, n) if err != nil { rpcsLog.Errorf("Failed to marshal notification: %v", err) return @@ -1236,7 +1236,7 @@ type wsResponse struct { // requested notifications to all connected websocket clients. Inbound // messages are read via the inHandler goroutine and generally dispatched to // their own handler. However, certain potentially long-running operations such -// as rescans, are sent to the asyncHander goroutine and are limited to one at a +// as rescans, are sent to the asyncHandler goroutine and are limited to one at a // time. There are two outbound message types - one for responding to client // requests and another for async notifications. Responses to client requests // use SendMessage which employs a buffered channel thereby limiting the number @@ -1323,153 +1323,435 @@ out: break out } - var request btcjson.Request - err = json.Unmarshal(msg, &request) - if err != nil { - if !c.authenticated { - break out - } + var batchedRequest bool - jsonErr := &btcjson.RPCError{ - Code: btcjson.ErrRPCParse.Code, - Message: "Failed to parse request: " + err.Error(), - } - reply, err := createMarshalledReply(nil, nil, jsonErr) - if err != nil { - rpcsLog.Errorf("Failed to marshal parse failure "+ - "reply: %v", err) - continue - } - c.SendMessage(reply, nil) - continue + // Determine request type + if bytes.HasPrefix(msg, batchedRequestPrefix) { + batchedRequest = true } - // The JSON-RPC 1.0 spec defines that notifications must have their "id" - // set to null and states that notifications do not have a response. - // - // A JSON-RPC 2.0 notification is a request with "json-rpc":"2.0", and - // without an "id" member. The specification states that notifications - // must not be responded to. JSON-RPC 2.0 permits the null value as a - // valid request id, therefore such requests are not notifications. - // - // Bitcoin Core serves requests with "id":null or even an absent "id", - // and responds to such requests with "id":null in the response. - // - // Btcd does not respond to any request without and "id" or "id":null, - // regardless the indicated JSON-RPC protocol version unless RPC quirks - // are enabled. With RPC quirks enabled, such requests will be responded - // to if the reqeust does not indicate JSON-RPC version. - // - // RPC quirks can be enabled by the user to avoid compatibility issues - // with software relying on Core's behavior. - if request.ID == nil && !(cfg.RPCQuirks && request.Jsonrpc == "") { - if !c.authenticated { - break out - } - continue - } + if !batchedRequest { + var req btcjson.Request + var reply json.RawMessage + err = json.Unmarshal(msg, &req) + if err != nil { + // only process requests from authenticated clients + if !c.authenticated { + break out + } - cmd := parseCmd(&request) - if cmd.err != nil { - if !c.authenticated { - break out + jsonErr := &btcjson.RPCError{ + Code: btcjson.ErrRPCParse.Code, + Message: "Failed to parse request: " + err.Error(), + } + reply, err = createMarshalledReply(btcjson.RpcVersion1, nil, nil, jsonErr) + if err != nil { + rpcsLog.Errorf("Failed to marshal reply: %v", err) + continue + } + c.SendMessage(reply, nil) + continue } - reply, err := createMarshalledReply(cmd.id, nil, cmd.err) - if err != nil { - rpcsLog.Errorf("Failed to marshal parse failure "+ - "reply: %v", err) + if req.Method == "" || req.Params == nil { + jsonErr := &btcjson.RPCError{ + Code: btcjson.ErrRPCInvalidRequest.Code, + Message: "Invalid request: malformed", + } + reply, err := createMarshalledReply(req.Jsonrpc, req.ID, nil, jsonErr) + if err != nil { + rpcsLog.Errorf("Failed to marshal reply: %v", err) + continue + } + c.SendMessage(reply, nil) continue } - c.SendMessage(reply, nil) - continue - } - rpcsLog.Debugf("Received command <%s> from %s", cmd.method, c.addr) - - // Check auth. The client is immediately disconnected if the - // first request of an unauthentiated websocket client is not - // the authenticate request, an authenticate request is received - // when the client is already authenticated, or incorrect - // authentication credentials are provided in the request. - switch authCmd, ok := cmd.cmd.(*btcjson.AuthenticateCmd); { - case c.authenticated && ok: - rpcsLog.Warnf("Websocket client %s is already authenticated", - c.addr) - break out - case !c.authenticated && !ok: - rpcsLog.Warnf("Unauthenticated websocket message " + - "received") - break out - case !c.authenticated: - // Check credentials. - login := authCmd.Username + ":" + authCmd.Passphrase - auth := "Basic " + base64.StdEncoding.EncodeToString([]byte(login)) - authSha := sha256.Sum256([]byte(auth)) - cmp := subtle.ConstantTimeCompare(authSha[:], c.server.authsha[:]) - limitcmp := subtle.ConstantTimeCompare(authSha[:], c.server.limitauthsha[:]) - if cmp != 1 && limitcmp != 1 { - rpcsLog.Warnf("Auth failure.") - break out + + // Valid requests with no ID (notifications) must not have a response + // per the JSON-RPC spec. + if req.ID == nil { + if !c.authenticated { + break out + } + continue } - c.authenticated = true - c.isAdmin = cmp == 1 - // Marshal and send response. - reply, err := createMarshalledReply(cmd.id, nil, nil) - if err != nil { - rpcsLog.Errorf("Failed to marshal authenticate reply: "+ - "%v", err.Error()) + cmd := parseCmd(&req) + if cmd.err != nil { + // Only process requests from authenticated clients + if !c.authenticated { + break out + } + + reply, err = createMarshalledReply(cmd.jsonrpc, cmd.id, nil, cmd.err) + if err != nil { + rpcsLog.Errorf("Failed to marshal reply: %v", err) + continue + } + c.SendMessage(reply, nil) continue } - c.SendMessage(reply, nil) - continue - } - // Check if the client is using limited RPC credentials and - // error when not authorized to call this RPC. - if !c.isAdmin { - if _, ok := rpcLimited[request.Method]; !ok { - jsonErr := &btcjson.RPCError{ - Code: btcjson.ErrRPCInvalidParams.Code, - Message: "limited user not authorized for this method", + rpcsLog.Debugf("Received command <%s> from %s", cmd.method, c.addr) + + // Check auth. The client is immediately disconnected if the + // first request of an unauthentiated websocket client is not + // the authenticate request, an authenticate request is received + // when the client is already authenticated, or incorrect + // authentication credentials are provided in the request. + switch authCmd, ok := cmd.cmd.(*btcjson.AuthenticateCmd); { + case c.authenticated && ok: + rpcsLog.Warnf("Websocket client %s is already authenticated", + c.addr) + break out + case !c.authenticated && !ok: + rpcsLog.Warnf("Unauthenticated websocket message " + + "received") + break out + case !c.authenticated: + // Check credentials. + login := authCmd.Username + ":" + authCmd.Passphrase + auth := "Basic " + base64.StdEncoding.EncodeToString([]byte(login)) + authSha := sha256.Sum256([]byte(auth)) + cmp := subtle.ConstantTimeCompare(authSha[:], c.server.authsha[:]) + limitcmp := subtle.ConstantTimeCompare(authSha[:], c.server.limitauthsha[:]) + if cmp != 1 && limitcmp != 1 { + rpcsLog.Warnf("Auth failure.") + break out } + c.authenticated = true + c.isAdmin = cmp == 1 + // Marshal and send response. - reply, err := createMarshalledReply(request.ID, nil, jsonErr) + reply, err = createMarshalledReply(cmd.jsonrpc, cmd.id, nil, nil) if err != nil { - rpcsLog.Errorf("Failed to marshal parse failure "+ - "reply: %v", err) + rpcsLog.Errorf("Failed to marshal authenticate reply: "+ + "%v", err.Error()) continue } c.SendMessage(reply, nil) continue } + + // Check if the client is using limited RPC credentials and + // error when not authorized to call the supplied RPC. + if !c.isAdmin { + if _, ok := rpcLimited[req.Method]; !ok { + jsonErr := &btcjson.RPCError{ + Code: btcjson.ErrRPCInvalidParams.Code, + Message: "limited user not authorized for this method", + } + // Marshal and send response. + reply, err = createMarshalledReply("", req.ID, nil, jsonErr) + if err != nil { + rpcsLog.Errorf("Failed to marshal parse failure "+ + "reply: %v", err) + continue + } + c.SendMessage(reply, nil) + continue + } + } + + // Asynchronously handle the request. A semaphore is used to + // limit the number of concurrent requests currently being + // serviced. If the semaphore can not be acquired, simply wait + // until a request finished before reading the next RPC request + // from the websocket client. + // + // This could be a little fancier by timing out and erroring + // when it takes too long to service the request, but if that is + // done, the read of the next request should not be blocked by + // this semaphore, otherwise the next request will be read and + // will probably sit here for another few seconds before timing + // out as well. This will cause the total timeout duration for + // later requests to be much longer than the check here would + // imply. + // + // If a timeout is added, the semaphore acquiring should be + // moved inside of the new goroutine with a select statement + // that also reads a time.After channel. This will unblock the + // read of the next request from the websocket client and allow + // many requests to be waited on concurrently. + c.serviceRequestSem.acquire() + go func() { + c.serviceRequest(cmd) + c.serviceRequestSem.release() + }() } - // Asynchronously handle the request. A semaphore is used to - // limit the number of concurrent requests currently being - // serviced. If the semaphore can not be acquired, simply wait - // until a request finished before reading the next RPC request - // from the websocket client. - // - // This could be a little fancier by timing out and erroring - // when it takes too long to service the request, but if that is - // done, the read of the next request should not be blocked by - // this semaphore, otherwise the next request will be read and - // will probably sit here for another few seconds before timing - // out as well. This will cause the total timeout duration for - // later requests to be much longer than the check here would - // imply. - // - // If a timeout is added, the semaphore acquiring should be - // moved inside of the new goroutine with a select statement - // that also reads a time.After channel. This will unblock the - // read of the next request from the websocket client and allow - // many requests to be waited on concurrently. - c.serviceRequestSem.acquire() - go func() { - c.serviceRequest(cmd) + // Process a batched request + if batchedRequest { + var batchedRequests []interface{} + var results []json.RawMessage + var batchSize int + var reply json.RawMessage + c.serviceRequestSem.acquire() + err = json.Unmarshal(msg, &batchedRequests) + if err != nil { + // Only process requests from authenticated clients + if !c.authenticated { + break out + } + + jsonErr := &btcjson.RPCError{ + Code: btcjson.ErrRPCParse.Code, + Message: fmt.Sprintf("Failed to parse request: %v", + err), + } + reply, err = btcjson.MarshalResponse(btcjson.RpcVersion2, nil, nil, jsonErr) + if err != nil { + rpcsLog.Errorf("Failed to create reply: %v", err) + } + + if reply != nil { + results = append(results, reply) + } + } + + if err == nil { + // Response with an empty batch error if the batch size is zero + if len(batchedRequests) == 0 { + if !c.authenticated { + break out + } + + jsonErr := &btcjson.RPCError{ + Code: btcjson.ErrRPCInvalidRequest.Code, + Message: "Invalid request: empty batch", + } + reply, err = btcjson.MarshalResponse(btcjson.RpcVersion2, nil, nil, jsonErr) + if err != nil { + rpcsLog.Errorf("Failed to marshal reply: %v", err) + } + + if reply != nil { + results = append(results, reply) + } + } + + // Process each batch entry individually + if len(batchedRequests) > 0 { + batchSize = len(batchedRequests) + for _, entry := range batchedRequests { + var reqBytes []byte + reqBytes, err = json.Marshal(entry) + if err != nil { + // Only process requests from authenticated clients + if !c.authenticated { + break out + } + + jsonErr := &btcjson.RPCError{ + Code: btcjson.ErrRPCInvalidRequest.Code, + Message: fmt.Sprintf("Invalid request: %v", + err), + } + reply, err = btcjson.MarshalResponse(btcjson.RpcVersion2, nil, nil, jsonErr) + if err != nil { + rpcsLog.Errorf("Failed to create reply: %v", err) + continue + } + + if reply != nil { + results = append(results, reply) + } + continue + } + + var req btcjson.Request + err := json.Unmarshal(reqBytes, &req) + if err != nil { + // Only process requests from authenticated clients + if !c.authenticated { + break out + } + + jsonErr := &btcjson.RPCError{ + Code: btcjson.ErrRPCInvalidRequest.Code, + Message: fmt.Sprintf("Invalid request: %v", + err), + } + reply, err = btcjson.MarshalResponse(btcjson.RpcVersion2, nil, nil, jsonErr) + if err != nil { + rpcsLog.Errorf("Failed to create reply: %v", err) + continue + } + + if reply != nil { + results = append(results, reply) + } + continue + } + + if req.Method == "" || req.Params == nil { + jsonErr := &btcjson.RPCError{ + Code: btcjson.ErrRPCInvalidRequest.Code, + Message: "Invalid request: malformed", + } + reply, err := createMarshalledReply(req.Jsonrpc, req.ID, nil, jsonErr) + if err != nil { + rpcsLog.Errorf("Failed to marshal reply: %v", err) + continue + } + + if reply != nil { + results = append(results, reply) + } + continue + } + + // Valid requests with no ID (notifications) must not have a response + // per the JSON-RPC spec. + if req.ID == nil { + if !c.authenticated { + break out + } + continue + } + + cmd := parseCmd(&req) + if cmd.err != nil { + // Only process requests from authenticated clients + if !c.authenticated { + break out + } + + reply, err = createMarshalledReply(cmd.jsonrpc, cmd.id, nil, cmd.err) + if err != nil { + rpcsLog.Errorf("Failed to marshal reply: %v", err) + continue + } + + if reply != nil { + results = append(results, reply) + } + continue + } + + rpcsLog.Debugf("Received command <%s> from %s", cmd.method, c.addr) + + // Check auth. The client is immediately disconnected if the + // first request of an unauthentiated websocket client is not + // the authenticate request, an authenticate request is received + // when the client is already authenticated, or incorrect + // authentication credentials are provided in the request. + switch authCmd, ok := cmd.cmd.(*btcjson.AuthenticateCmd); { + case c.authenticated && ok: + rpcsLog.Warnf("Websocket client %s is already authenticated", + c.addr) + break out + case !c.authenticated && !ok: + rpcsLog.Warnf("Unauthenticated websocket message " + + "received") + break out + case !c.authenticated: + // Check credentials. + login := authCmd.Username + ":" + authCmd.Passphrase + auth := "Basic " + base64.StdEncoding.EncodeToString([]byte(login)) + authSha := sha256.Sum256([]byte(auth)) + cmp := subtle.ConstantTimeCompare(authSha[:], c.server.authsha[:]) + limitcmp := subtle.ConstantTimeCompare(authSha[:], c.server.limitauthsha[:]) + if cmp != 1 && limitcmp != 1 { + rpcsLog.Warnf("Auth failure.") + break out + } + + c.authenticated = true + c.isAdmin = cmp == 1 + + // Marshal and send response. + reply, err = createMarshalledReply(cmd.jsonrpc, cmd.id, nil, nil) + if err != nil { + rpcsLog.Errorf("Failed to marshal authenticate reply: "+ + "%v", err.Error()) + continue + } + + if reply != nil { + results = append(results, reply) + } + continue + } + + // Check if the client is using limited RPC credentials and + // error when not authorized to call the supplied RPC. + if !c.isAdmin { + if _, ok := rpcLimited[req.Method]; !ok { + jsonErr := &btcjson.RPCError{ + Code: btcjson.ErrRPCInvalidParams.Code, + Message: "limited user not authorized for this method", + } + // Marshal and send response. + reply, err = createMarshalledReply(req.Jsonrpc, req.ID, nil, jsonErr) + if err != nil { + rpcsLog.Errorf("Failed to marshal parse failure "+ + "reply: %v", err) + continue + } + + if reply != nil { + results = append(results, reply) + } + continue + } + } + + // Lookup the websocket extension for the command, if it doesn't + // exist fallback to handling the command as a standard command. + var resp interface{} + wsHandler, ok := wsHandlers[cmd.method] + if ok { + resp, err = wsHandler(c, cmd.cmd) + } else { + resp, err = c.server.standardCmdResult(cmd, nil) + } + + // Marshal request output. + reply, err := createMarshalledReply(cmd.jsonrpc, cmd.id, resp, err) + if err != nil { + rpcsLog.Errorf("Failed to marshal reply for <%s> "+ + "command: %v", cmd.method, err) + return + } + + if reply != nil { + results = append(results, reply) + } + } + } + } + + // generate reply + var payload = []byte{} + if batchedRequest && batchSize > 0 { + if len(results) > 0 { + // Form the batched response json + var buffer bytes.Buffer + buffer.WriteByte('[') + for idx, marshalledReply := range results { + if idx == len(results)-1 { + buffer.Write(marshalledReply) + buffer.WriteByte(']') + break + } + buffer.Write(marshalledReply) + buffer.WriteByte(',') + } + payload = buffer.Bytes() + } + } + + if !batchedRequest || batchSize == 0 { + // Respond with the first results entry for single requests + if len(results) > 0 { + payload = results[0] + } + } + + c.SendMessage(payload, nil) c.serviceRequestSem.release() - }() + } } // Ensure the connection is closed. @@ -1495,7 +1777,7 @@ func (c *wsClient) serviceRequest(r *parsedRPCCmd) { } else { result, err = c.server.standardCmdResult(r, nil) } - reply, err := createMarshalledReply(r.id, result, err) + reply, err := createMarshalledReply(r.jsonrpc, r.id, result, err) if err != nil { rpcsLog.Errorf("Failed to marshal reply for <%s> "+ "command: %v", r.method, err) @@ -1862,7 +2144,7 @@ func handleNotifySpent(wsc *wsClient, icmd interface{}) (interface{}, error) { return nil, nil } -// handleNotifyNewTransations implements the notifynewtransactions command +// handleNotifyNewTransactions implements the notifynewtransactions command // extension for websocket connections. func handleNotifyNewTransactions(wsc *wsClient, icmd interface{}) (interface{}, error) { cmd, ok := icmd.(*btcjson.NotifyNewTransactionsCmd) @@ -1875,7 +2157,7 @@ func handleNotifyNewTransactions(wsc *wsClient, icmd interface{}) (interface{}, return nil, nil } -// handleStopNotifyNewTransations implements the stopnotifynewtransactions +// handleStopNotifyNewTransactions implements the stopnotifynewtransactions // command extension for websocket connections. func handleStopNotifyNewTransactions(wsc *wsClient, icmd interface{}) (interface{}, error) { wsc.server.ntfnMgr.UnregisterNewMempoolTxsUpdates(wsc) @@ -2125,7 +2407,7 @@ func rescanBlock(wsc *wsClient, lookups *rescanKeys, blk *btcutil.Block) { ntfn := btcjson.NewRecvTxNtfn(txHex, blockDetails(blk, tx.Index())) - marshalledJSON, err := btcjson.MarshalCmd(nil, ntfn) + marshalledJSON, err := btcjson.MarshalCmd(btcjson.RpcVersion1, nil, ntfn) if err != nil { rpcsLog.Errorf("Failed to marshal recvtx notification: %v", err) return @@ -2442,7 +2724,7 @@ fetchRange: // was any) still exists in the database. If it // doesn't, we error. // - // A goto is used to branch executation back to + // A goto is used to branch execution back to // before the range was evaluated, as it must be // reevaluated for the new hashList. minBlock += int32(i) @@ -2492,7 +2774,7 @@ fetchRange: hashList[i].String(), blk.Height(), blk.MsgBlock().Header.Timestamp.Unix(), ) - mn, err := btcjson.MarshalCmd(nil, n) + mn, err := btcjson.MarshalCmd(btcjson.RpcVersion1, nil, n) if err != nil { rpcsLog.Errorf("Failed to marshal rescan "+ "progress notification: %v", err) @@ -2637,7 +2919,7 @@ func handleRescan(wsc *wsClient, icmd interface{}) (interface{}, error) { lastBlockHash.String(), lastBlock.Height(), lastBlock.MsgBlock().Header.Timestamp.Unix(), ) - if mn, err := btcjson.MarshalCmd(nil, n); err != nil { + if mn, err := btcjson.MarshalCmd(btcjson.RpcVersion1, nil, n); err != nil { rpcsLog.Errorf("Failed to marshal rescan finished "+ "notification: %v", err) } else { diff --git a/sample-btcd.conf b/sample-btcd.conf index e2beb99cf8..74b20e1660 100644 --- a/sample-btcd.conf +++ b/sample-btcd.conf @@ -48,7 +48,7 @@ ; Use Universal Plug and Play (UPnP) to automatically open the listen port ; and obtain the external IP address from supported devices. NOTE: This option -; will have no effect if exernal IP addresses are specified. +; will have no effect if external IP addresses are specified. ; upnp=1 ; Specify the external IP addresses your node is listening on. One address per @@ -324,7 +324,7 @@ ; sizes have the highest priority. One consequence of this is that as low-fee ; or free transactions age, they raise in priority thereby making them more ; likely to be included in this section of a new block. This value is limited -; by the blackmaxsize option and will be limited as needed. +; by the blockmaxsize option and will be limited as needed. ; blockprioritysize=50000 diff --git a/scripts/tidy_modules.sh b/scripts/tidy_modules.sh new file mode 100755 index 0000000000..3fa5bfb252 --- /dev/null +++ b/scripts/tidy_modules.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +SUBMODULES=$(find . -mindepth 2 -name "go.mod" | cut -d'/' -f2) + + +# Run 'go mod tidy' for root. +go mod tidy + +# Run 'go mod tidy' for each module. +for submodule in $SUBMODULES +do + pushd $submodule + + go mod tidy + + popd +done diff --git a/server.go b/server.go index edbc1c036e..66794e4bb7 100644 --- a/server.go +++ b/server.go @@ -25,6 +25,8 @@ import ( "github.com/btcsuite/btcd/addrmgr" "github.com/btcsuite/btcd/blockchain" "github.com/btcsuite/btcd/blockchain/indexers" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/btcutil/bloom" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/connmgr" @@ -36,15 +38,14 @@ import ( "github.com/btcsuite/btcd/peer" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" - "github.com/btcsuite/btcutil/bloom" + "github.com/decred/dcrd/lru" ) const ( // defaultServices describes the default services that are supported by // the server. - defaultServices = wire.SFNodeNetwork | wire.SFNodeBloom | - wire.SFNodeWitness | wire.SFNodeCF + defaultServices = wire.SFNodeNetwork | wire.SFNodeNetworkLimited | + wire.SFNodeBloom | wire.SFNodeWitness | wire.SFNodeCF // defaultRequiredServices describes the default services that are // required to be supported by outbound peers. @@ -274,7 +275,7 @@ type serverPeer struct { isWhitelisted bool filter *bloom.Filter addressesMtx sync.RWMutex - knownAddresses map[string]struct{} + knownAddresses lru.Cache banScore connmgr.DynamicBanScore quit chan struct{} // The following chans are used to sync blockmanager and server. @@ -289,7 +290,7 @@ func newServerPeer(s *server, isPersistent bool) *serverPeer { server: s, persistent: isPersistent, filter: bloom.LoadFilter(nil), - knownAddresses: make(map[string]struct{}), + knownAddresses: lru.NewCache(5000), quit: make(chan struct{}), txProcessed: make(chan struct{}, 1), blockProcessed: make(chan struct{}, 1), @@ -305,18 +306,18 @@ func (sp *serverPeer) newestBlock() (*chainhash.Hash, int32, error) { // addKnownAddresses adds the given addresses to the set of known addresses to // the peer to prevent sending duplicate addresses. -func (sp *serverPeer) addKnownAddresses(addresses []*wire.NetAddress) { +func (sp *serverPeer) addKnownAddresses(addresses []*wire.NetAddressV2) { sp.addressesMtx.Lock() for _, na := range addresses { - sp.knownAddresses[addrmgr.NetAddressKey(na)] = struct{}{} + sp.knownAddresses.Add(addrmgr.NetAddressKey(na)) } sp.addressesMtx.Unlock() } // addressKnown true if the given address is already known to the peer. -func (sp *serverPeer) addressKnown(na *wire.NetAddress) bool { +func (sp *serverPeer) addressKnown(na *wire.NetAddressV2) bool { sp.addressesMtx.RLock() - _, exists := sp.knownAddresses[addrmgr.NetAddressKey(na)] + exists := sp.knownAddresses.Contains(addrmgr.NetAddressKey(na)) sp.addressesMtx.RUnlock() return exists } @@ -340,23 +341,73 @@ func (sp *serverPeer) relayTxDisabled() bool { return isDisabled } -// pushAddrMsg sends an addr message to the connected peer using the provided -// addresses. -func (sp *serverPeer) pushAddrMsg(addresses []*wire.NetAddress) { - // Filter addresses already known to the peer. +// pushAddrMsg sends a legacy addr message to the connected peer using the +// provided addresses. +func (sp *serverPeer) pushAddrMsg(addresses []*wire.NetAddressV2) { + if sp.WantsAddrV2() { + // If the peer supports addrv2, we'll be pushing an addrv2 + // message instead. The logic is otherwise identical to the + // addr case below. + addrs := make([]*wire.NetAddressV2, 0, len(addresses)) + for _, addr := range addresses { + // Filter addresses already known to the peer. + if sp.addressKnown(addr) { + continue + } + + addrs = append(addrs, addr) + } + + known, err := sp.PushAddrV2Msg(addrs) + if err != nil { + peerLog.Errorf("Can't push addrv2 message to %s: %v", + sp.Peer, err) + sp.Disconnect() + return + } + + // Add the final set of addresses sent to the set the peer + // knows of. + sp.addKnownAddresses(known) + return + } + addrs := make([]*wire.NetAddress, 0, len(addresses)) for _, addr := range addresses { - if !sp.addressKnown(addr) { - addrs = append(addrs, addr) + // Filter addresses already known to the peer. + if sp.addressKnown(addr) { + continue } + + // Must skip the V3 addresses for legacy ADDR messages. + if addr.IsTorV3() { + continue + } + + // Convert the NetAddressV2 to a legacy address. + addrs = append(addrs, addr.ToLegacy()) } + known, err := sp.PushAddrMsg(addrs) if err != nil { - peerLog.Errorf("Can't push address message to %s: %v", sp.Peer, err) + peerLog.Errorf( + "Can't push address message to %s: %v", sp.Peer, err, + ) sp.Disconnect() return } - sp.addKnownAddresses(known) + + // Convert all of the known addresses to NetAddressV2 to add them to + // the set of known addresses. + knownAddrs := make([]*wire.NetAddressV2, 0, len(known)) + for _, knownAddr := range known { + currentKna := wire.NetAddressV2FromBytes( + knownAddr.Timestamp, knownAddr.Services, + knownAddr.IP, knownAddr.Port, + ) + knownAddrs = append(knownAddrs, currentKna) + } + sp.addKnownAddresses(knownAddrs) } // addBanScore increases the persistent and decaying ban score fields by the @@ -364,14 +415,14 @@ func (sp *serverPeer) pushAddrMsg(addresses []*wire.NetAddress) { // threshold, a warning is logged including the reason provided. Further, if // the score is above the ban threshold, the peer will be banned and // disconnected. -func (sp *serverPeer) addBanScore(persistent, transient uint32, reason string) { +func (sp *serverPeer) addBanScore(persistent, transient uint32, reason string) bool { // No warning is logged and no score is calculated if banning is disabled. if cfg.DisableBanning { - return + return false } if sp.isWhitelisted { peerLog.Debugf("Misbehaving whitelisted peer %s: %s", sp, reason) - return + return false } warnThreshold := cfg.BanThreshold >> 1 @@ -383,7 +434,7 @@ func (sp *serverPeer) addBanScore(persistent, transient uint32, reason string) { peerLog.Warnf("Misbehaving peer %s: %s -- ban score is %d, "+ "it was not increased this time", sp, reason, score) } - return + return false } score := sp.banScore.Increase(persistent, transient) if score > warnThreshold { @@ -394,8 +445,10 @@ func (sp *serverPeer) addBanScore(persistent, transient uint32, reason string) { sp) sp.server.BanPeer(sp) sp.Disconnect() + return true } } + return false } // hasServices returns whether or not the provided advertised service flags have @@ -425,7 +478,7 @@ func (sp *serverPeer) OnVersion(_ *peer.Peer, msg *wire.MsgVersion) *wire.MsgRej addrManager.SetServices(remoteAddr, msg.Services) } - // Ignore peers that have a protcol version that is too old. The peer + // Ignore peers that have a protocol version that is too old. The peer // negotiation logic will disconnect it after this callback returns. if msg.ProtocolVersion < int32(peer.MinAcceptableProtocolVersion) { return nil @@ -498,7 +551,9 @@ func (sp *serverPeer) OnMemPool(_ *peer.Peer, msg *wire.MsgMemPool) { // The ban score accumulates and passes the ban threshold if a burst of // mempool messages comes from a peer. The score decays each minute to // half of its value. - sp.addBanScore(0, 33, "mempool") + if sp.addBanScore(0, 33, "mempool") { + return + } // Generate inventory message with the available transactions in the // transaction memory pool. Limit it to the max allowed inventory @@ -638,7 +693,9 @@ func (sp *serverPeer) OnGetData(_ *peer.Peer, msg *wire.MsgGetData) { // bursts of small requests are not penalized as that would potentially ban // peers performing IBD. // This incremental score decays each minute to half of its value. - sp.addBanScore(0, uint32(length)*99/wire.MaxInvPerMsg, "getdata") + if sp.addBanScore(0, uint32(length)*99/wire.MaxInvPerMsg, "getdata") { + return + } // We wait on this wait channel periodically to prevent queuing // far more data than we can send in a reasonable time, wasting memory. @@ -1221,7 +1278,7 @@ func (sp *serverPeer) OnGetAddr(_ *peer.Peer, msg *wire.MsgGetAddr) { // Do not accept getaddr requests from outbound peers. This reduces // fingerprinting attacks. if !sp.Inbound() { - peerLog.Debugf("Ignoring getaddr request from outbound peer ", + peerLog.Debugf("Ignoring getaddr request from outbound peer "+ "%v", sp) return } @@ -1229,7 +1286,7 @@ func (sp *serverPeer) OnGetAddr(_ *peer.Peer, msg *wire.MsgGetAddr) { // Only allow one getaddr request per connection to discourage // address stamping of inv announcements. if sp.sentAddrs { - peerLog.Debugf("Ignoring repeated getaddr request from peer ", + peerLog.Debugf("Ignoring repeated getaddr request from peer "+ "%v", sp) return } @@ -1266,6 +1323,7 @@ func (sp *serverPeer) OnAddr(_ *peer.Peer, msg *wire.MsgAddr) { return } + addrs := make([]*wire.NetAddressV2, 0, len(msg.AddrList)) for _, na := range msg.AddrList { // Don't add more address if we're disconnecting. if !sp.Connected() { @@ -1280,8 +1338,14 @@ func (sp *serverPeer) OnAddr(_ *peer.Peer, msg *wire.MsgAddr) { na.Timestamp = now.Add(-1 * time.Hour * 24 * 5) } - // Add address to known addresses for this peer. - sp.addKnownAddresses([]*wire.NetAddress{na}) + // Add address to known addresses for this peer. This is + // converted to NetAddressV2 since that's what the address + // manager uses. + currentNa := wire.NetAddressV2FromBytes( + na.Timestamp, na.Services, na.IP, na.Port, + ) + addrs = append(addrs, currentNa) + sp.addKnownAddresses([]*wire.NetAddressV2{currentNa}) } // Add addresses to server address manager. The address manager handles @@ -1289,6 +1353,45 @@ func (sp *serverPeer) OnAddr(_ *peer.Peer, msg *wire.MsgAddr) { // addresses, and last seen updates. // XXX bitcoind gives a 2 hour time penalty here, do we want to do the // same? + sp.server.addrManager.AddAddresses(addrs, sp.NA()) +} + +// OnAddrV2 is invoked when a peer receives an addrv2 bitcoin message and is +// used to notify the server about advertised addresses. +func (sp *serverPeer) OnAddrV2(_ *peer.Peer, msg *wire.MsgAddrV2) { + // Ignore if simnet for the same reasons as the regular addr message. + if cfg.SimNet { + return + } + + // An empty AddrV2 message is invalid. + if len(msg.AddrList) == 0 { + peerLog.Errorf("Command [%s] from %s does not contain any "+ + "addresses", msg.Command(), sp.Peer) + sp.Disconnect() + return + } + + for _, na := range msg.AddrList { + // Don't add more to the set of known addresses if we're + // disconnecting. + if !sp.Connected() { + return + } + + // Set the timestamp to 5 days ago if the timestamp received is + // more than 10 minutes in the future so this address is one of + // the first to be removed. + now := time.Now() + if na.Timestamp.After(now.Add(time.Minute * 10)) { + na.Timestamp = now.Add(-1 * time.Hour * 24 * 5) + } + + // Add to the set of known addresses. + sp.addKnownAddresses([]*wire.NetAddressV2{na}) + } + + // Add the addresses to the addrmanager. sp.server.addrManager.AddAddresses(msg.AddrList, sp.NA()) } @@ -1304,6 +1407,48 @@ func (sp *serverPeer) OnWrite(_ *peer.Peer, bytesWritten int, msg wire.Message, sp.server.AddBytesSent(uint64(bytesWritten)) } +// OnNotFound is invoked when a peer sends a notfound message. +func (sp *serverPeer) OnNotFound(p *peer.Peer, msg *wire.MsgNotFound) { + if !sp.Connected() { + return + } + + var numBlocks, numTxns uint32 + for _, inv := range msg.InvList { + switch inv.Type { + case wire.InvTypeBlock: + numBlocks++ + case wire.InvTypeWitnessBlock: + numBlocks++ + case wire.InvTypeTx: + numTxns++ + case wire.InvTypeWitnessTx: + numTxns++ + default: + peerLog.Debugf("Invalid inv type '%d' in notfound message from %s", + inv.Type, sp) + sp.Disconnect() + return + } + } + if numBlocks > 0 { + blockStr := pickNoun(uint64(numBlocks), "block", "blocks") + reason := fmt.Sprintf("%d %v not found", numBlocks, blockStr) + if sp.addBanScore(20*numBlocks, 0, reason) { + return + } + } + if numTxns > 0 { + txStr := pickNoun(uint64(numTxns), "transaction", "transactions") + reason := fmt.Sprintf("%d %v not found", numTxns, txStr) + if sp.addBanScore(0, 10*numTxns, reason) { + return + } + } + + sp.server.syncManager.QueueNotFound(msg, p) +} + // randomUint16Number returns a random uint16 in a specified input range. Note // that the range is in zeroth ordering; if you pass it 1800, you will get // values from 0 to 1800. @@ -1652,7 +1797,7 @@ func (s *server) handleAddPeerMsg(state *peerState, sp *serverPeer) bool { lna := s.addrManager.GetBestLocalAddress(sp.NA()) if addrmgr.IsRoutable(lna) { // Filter addresses the peer already knows about. - addresses := []*wire.NetAddress{lna} + addresses := []*wire.NetAddressV2{lna} sp.pushAddrMsg(addresses) } } @@ -1996,8 +2141,10 @@ func newPeerConfig(sp *serverPeer) *peer.Config { OnFilterLoad: sp.OnFilterLoad, OnGetAddr: sp.OnGetAddr, OnAddr: sp.OnAddr, + OnAddrV2: sp.OnAddrV2, OnRead: sp.OnRead, OnWrite: sp.OnWrite, + OnNotFound: sp.OnNotFound, // Note: The reference client currently bans peers that send alerts // not signed with its key. We could verify against their key, but @@ -2005,17 +2152,18 @@ func newPeerConfig(sp *serverPeer) *peer.Config { // other implementations' alert messages, we will not relay theirs. OnAlert: nil, }, - NewestBlock: sp.newestBlock, - HostToNetAddress: sp.server.addrManager.HostToNetAddress, - Proxy: cfg.Proxy, - UserAgentName: userAgentName, - UserAgentVersion: userAgentVersion, - UserAgentComments: cfg.UserAgentComments, - ChainParams: sp.server.chainParams, - Services: sp.server.services, - DisableRelayTx: cfg.BlocksOnly, - ProtocolVersion: peer.MaxProtocolVersion, - TrickleInterval: cfg.TrickleInterval, + NewestBlock: sp.newestBlock, + HostToNetAddress: sp.server.addrManager.HostToNetAddress, + Proxy: cfg.Proxy, + UserAgentName: userAgentName, + UserAgentVersion: userAgentVersion, + UserAgentComments: cfg.UserAgentComments, + ChainParams: sp.server.chainParams, + Services: sp.server.services, + DisableRelayTx: cfg.BlocksOnly, + ProtocolVersion: peer.MaxProtocolVersion, + TrickleInterval: cfg.TrickleInterval, + DisableStallHandler: cfg.DisableStallHandler, } } @@ -2056,7 +2204,7 @@ func (s *server) outboundPeerConnected(c *connmgr.ConnReq, conn net.Conn) { go s.peerDoneHandler(sp) } -// peerDoneHandler handles peer disconnects by notifiying the server that it's +// peerDoneHandler handles peer disconnects by notifying the server that it's // done along with other performing other desirable cleanup. func (s *server) peerDoneHandler(sp *serverPeer) { sp.WaitForDisconnect() @@ -2083,7 +2231,7 @@ func (s *server) peerDoneHandler(sp *serverPeer) { func (s *server) peerHandler() { // Start the address manager and sync manager, both of which are needed // by peers. This is done here since their lifecycle is closely tied - // to this handler and rather than adding more channels to sychronize + // to this handler and rather than adding more channels to synchronize // things, it's easier and slightly faster to simply start and stop them // in this handler. s.addrManager.Start() @@ -2102,7 +2250,7 @@ func (s *server) peerHandler() { if !cfg.DisableDNSSeed { // Add peers discovered through DNS to the address manager. connmgr.SeedFromDNS(activeNetParams.Params, defaultRequiredServices, - btcdLookup, func(addrs []*wire.NetAddress) { + btcdLookup, func(addrs []*wire.NetAddressV2) { // Bitcoind uses a lookup of the dns seeder here. This // is rather strange since the values looked up by the // DNS seed lookups will vary quite a lot. @@ -2270,9 +2418,7 @@ out: // When an InvVect has been added to a block, we can // now remove it, if it was present. case broadcastInventoryDel: - if _, ok := pendingInvs[*msg]; ok { - delete(pendingInvs, *msg) - } + delete(pendingInvs, *msg) } case <-timer.C: @@ -2337,6 +2483,7 @@ func (s *server) Start() { // the RPC server are rebroadcast until being included in a block. go s.rebroadcastHandler() + s.rpcServer.cfg.StartupTime = s.startupTime s.rpcServer.Start() } @@ -2495,8 +2642,8 @@ out: srvrLog.Warnf("UPnP can't get external address: %v", err) continue out } - na := wire.NewNetAddressIPPort(externalip, uint16(listenPort), - s.services) + na := wire.NetAddressV2FromBytes(time.Now(), s.services, + externalip, uint16(listenPort)) err = s.addrManager.AddLocalAddress(na, addrmgr.UpnpPrio) if err != nil { // XXX DeletePortMapping? @@ -2584,6 +2731,9 @@ func newServer(listenAddrs, agentBlacklist, agentWhitelist []string, if cfg.NoCFilters { services &^= wire.SFNodeCF } + if cfg.Prune != 0 { + services &^= wire.SFNodeNetwork + } amgr := addrmgr.New(cfg.DataDir, btcdLookup) @@ -2674,17 +2824,24 @@ func newServer(listenAddrs, agentBlacklist, agentWhitelist []string, checkpoints = mergeCheckpoints(s.chainParams.Checkpoints, cfg.addCheckpoints) } + // Log that the node is pruned. + if cfg.Prune != 0 { + btcdLog.Infof("Prune set to %d MiB", cfg.Prune) + } + // Create a new block chain instance with the appropriate configuration. var err error s.chain, err = blockchain.New(&blockchain.Config{ - DB: s.db, - Interrupt: interrupt, - ChainParams: s.chainParams, - Checkpoints: checkpoints, - TimeSource: s.timeSource, - SigCache: s.sigCache, - IndexManager: indexManager, - HashCache: s.hashCache, + DB: s.db, + Interrupt: interrupt, + ChainParams: s.chainParams, + Checkpoints: checkpoints, + TimeSource: s.timeSource, + SigCache: s.sigCache, + IndexManager: indexManager, + HashCache: s.hashCache, + Prune: cfg.Prune * 1024 * 1024, + UtxoCacheMaxSize: uint64(cfg.UtxoCacheMaxSizeMiB) * 1024 * 1024, }) if err != nil { return nil, err @@ -3069,7 +3226,9 @@ func addLocalAddress(addrMgr *addrmgr.AddrManager, addr string, services wire.Se continue } - netAddr := wire.NewNetAddressIPPort(ifaceIP, uint16(port), services) + netAddr := wire.NetAddressV2FromBytes( + time.Now(), services, ifaceIP, uint16(port), + ) addrMgr.AddLocalAddress(netAddr, addrmgr.BoundPrio) } } else { diff --git a/service_windows.go b/service_windows.go index 8101ae6514..01edf3db77 100644 --- a/service_windows.go +++ b/service_windows.go @@ -153,7 +153,7 @@ func installService() error { // Support events to the event log using the standard "standard" Windows // EventCreate.exe message file. This allows easy logging of custom - // messges instead of needing to create our own message catalog. + // messages instead of needing to create our own message catalog. eventlog.Remove(svcName) eventsSupported := uint32(eventlog.Error | eventlog.Warning | eventlog.Info) return eventlog.InstallAsEventCreate(svcName, eventsSupported) @@ -275,6 +275,22 @@ func performServiceCommand(command string) error { // returned to the caller so the application can determine whether to exit (when // running as a service) or launch in normal interactive mode. func serviceMain() (bool, error) { + // Don't run as a service if the user explicitly requested it. This is + // needed to run btcd on Windows in CI environments like Travis. + // We can't use the config struct to access the value because that's not + // parsed yet. But we add the flag to the struct anyway so the parser + // won't complain about it later. + noService := false + for _, arg := range os.Args { + if arg == "--nowinservice" { + noService = true + break + } + } + if noService { + return false, nil + } + // Don't run as a service if we're running interactively (or that can't // be determined due to an error). isInteractive, err := svc.IsAnInteractiveSession() diff --git a/signalsigterm.go b/signalsigterm.go index 831655010e..63bdb9c01d 100644 --- a/signalsigterm.go +++ b/signalsigterm.go @@ -2,6 +2,7 @@ // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. +//go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris // +build darwin dragonfly freebsd linux netbsd openbsd solaris package main diff --git a/txscript/README.md b/txscript/README.md index 5793173451..f0abb51884 100644 --- a/txscript/README.md +++ b/txscript/README.md @@ -1,9 +1,9 @@ txscript ======== -[![Build Status](https://travis-ci.org/btcsuite/btcd.png?branch=master)](https://travis-ci.org/btcsuite/btcd) +[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions) [![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) -[![GoDoc](https://godoc.org/github.com/btcsuite/btcd/txscript?status.png)](http://godoc.org/github.com/btcsuite/btcd/txscript) +[![GoDoc](https://pkg.go.dev/github.com/btcsuite/btcd/txscript?status.png)](https://pkg.go.dev/github.com/btcsuite/btcd/txscript) Package txscript implements the bitcoin transaction script language. There is a comprehensive test suite. @@ -26,17 +26,21 @@ $ go get -u github.com/btcsuite/btcd/txscript ## Examples -* [Standard Pay-to-pubkey-hash Script](http://godoc.org/github.com/btcsuite/btcd/txscript#example-PayToAddrScript) +* [Standard Pay-to-pubkey-hash Script](https://pkg.go.dev/github.com/btcsuite/btcd/txscript#example-PayToAddrScript) Demonstrates creating a script which pays to a bitcoin address. It also prints the created script hex and uses the DisasmString function to display the disassembled script. -* [Extracting Details from Standard Scripts](http://godoc.org/github.com/btcsuite/btcd/txscript#example-ExtractPkScriptAddrs) +* [Extracting Details from Standard Scripts](https://pkg.go.dev/github.com/btcsuite/btcd/txscript#example-ExtractPkScriptAddrs) Demonstrates extracting information from a standard public key script. -* [Manually Signing a Transaction Output](http://godoc.org/github.com/btcsuite/btcd/txscript#example-SignTxOutput) +* [Manually Signing a Transaction Output](https://pkg.go.dev/github.com/btcsuite/btcd/txscript#example-SignTxOutput) Demonstrates manually creating and signing a redeem transaction. +* [Counting Opcodes in Scripts](http://godoc.org/github.com/decred/dcrd/txscript#example-ScriptTokenizer) + Demonstrates creating a script tokenizer instance and using it to count the + number of opcodes a script contains. + ## GPG Verification Key All official release tags are signed by Conformal so users can ensure the code diff --git a/txscript/bench_test.go b/txscript/bench_test.go new file mode 100644 index 0000000000..60b0d9e12e --- /dev/null +++ b/txscript/bench_test.go @@ -0,0 +1,538 @@ +// Copyright (c) 2018-2019 The Decred developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package txscript + +import ( + "bytes" + "fmt" + "os" + "testing" + + "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/wire" +) + +var ( + // manyInputsBenchTx is a transaction that contains a lot of inputs which is + // useful for benchmarking signature hash calculation. + manyInputsBenchTx wire.MsgTx + + // A mock previous output script to use in the signing benchmark. + prevOutScript = hexToBytes("a914f5916158e3e2c4551c1796708db8367207ed13bb87") +) + +func init() { + // tx 620f57c92cf05a7f7e7f7d28255d5f7089437bc48e34dcfebf7751d08b7fb8f5 + txHex, err := os.ReadFile("data/many_inputs_tx.hex") + if err != nil { + panic(fmt.Sprintf("unable to read benchmark tx file: %v", err)) + } + + txBytes := hexToBytes(string(txHex)) + err = manyInputsBenchTx.Deserialize(bytes.NewReader(txBytes)) + if err != nil { + panic(err) + } +} + +// BenchmarkCalcSigHash benchmarks how long it takes to calculate the signature +// hashes for all inputs of a transaction with many inputs. +func BenchmarkCalcSigHash(b *testing.B) { + b.ReportAllocs() + for i := 0; i < b.N; i++ { + for j := 0; j < len(manyInputsBenchTx.TxIn); j++ { + _, err := CalcSignatureHash(prevOutScript, SigHashAll, + &manyInputsBenchTx, j) + if err != nil { + b.Fatalf("failed to calc signature hash: %v", err) + } + } + } +} + +// BenchmarkCalcWitnessSigHash benchmarks how long it takes to calculate the +// witness signature hashes for all inputs of a transaction with many inputs. +func BenchmarkCalcWitnessSigHash(b *testing.B) { + prevOutFetcher := NewCannedPrevOutputFetcher(prevOutScript, 5) + sigHashes := NewTxSigHashes(&manyInputsBenchTx, prevOutFetcher) + + b.ResetTimer() + b.ReportAllocs() + for i := 0; i < b.N; i++ { + for j := 0; j < len(manyInputsBenchTx.TxIn); j++ { + _, err := CalcWitnessSigHash( + prevOutScript, sigHashes, SigHashAll, + &manyInputsBenchTx, j, 5, + ) + if err != nil { + b.Fatalf("failed to calc signature hash: %v", err) + } + } + } +} + +// genComplexScript returns a script comprised of half as many opcodes as the +// maximum allowed followed by as many max size data pushes fit without +// exceeding the max allowed script size. +func genComplexScript() ([]byte, error) { + var scriptLen int + builder := NewScriptBuilder() + for i := 0; i < MaxOpsPerScript/2; i++ { + builder.AddOp(OP_TRUE) + scriptLen++ + } + maxData := bytes.Repeat([]byte{0x02}, MaxScriptElementSize) + for i := 0; i < (MaxScriptSize-scriptLen)/(MaxScriptElementSize+3); i++ { + builder.AddData(maxData) + } + return builder.Script() +} + +// BenchmarkScriptParsing benchmarks how long it takes to parse a very large +// script. +func BenchmarkScriptParsing(b *testing.B) { + script, err := genComplexScript() + if err != nil { + b.Fatalf("failed to create benchmark script: %v", err) + } + + const scriptVersion = 0 + b.ResetTimer() + b.ReportAllocs() + for i := 0; i < b.N; i++ { + tokenizer := MakeScriptTokenizer(scriptVersion, script) + for tokenizer.Next() { + _ = tokenizer.Opcode() + _ = tokenizer.Data() + _ = tokenizer.ByteIndex() + } + if err := tokenizer.Err(); err != nil { + b.Fatalf("failed to parse script: %v", err) + } + } +} + +// BenchmarkDisasmString benchmarks how long it takes to disassemble a very +// large script. +func BenchmarkDisasmString(b *testing.B) { + script, err := genComplexScript() + if err != nil { + b.Fatalf("failed to create benchmark script: %v", err) + } + + b.ResetTimer() + b.ReportAllocs() + for i := 0; i < b.N; i++ { + _, err := DisasmString(script) + if err != nil { + b.Fatalf("failed to disasm script: %v", err) + } + } +} + +// BenchmarkIsPubKeyScript benchmarks how long it takes to analyze a very large +// script to determine if it is a standard pay-to-pubkey script. +func BenchmarkIsPubKeyScript(b *testing.B) { + script, err := genComplexScript() + if err != nil { + b.Fatalf("failed to create benchmark script: %v", err) + } + + b.ResetTimer() + b.ReportAllocs() + for i := 0; i < b.N; i++ { + _ = IsPayToPubKey(script) + } +} + +// BenchmarkIsPubKeyHashScript benchmarks how long it takes to analyze a very +// large script to determine if it is a standard pay-to-pubkey-hash script. +func BenchmarkIsPubKeyHashScript(b *testing.B) { + script, err := genComplexScript() + if err != nil { + b.Fatalf("failed to create benchmark script: %v", err) + } + + b.ResetTimer() + b.ReportAllocs() + for i := 0; i < b.N; i++ { + _ = IsPayToPubKeyHash(script) + } +} + +// BenchmarkIsPayToScriptHash benchmarks how long it takes IsPayToScriptHash to +// analyze a very large script. +func BenchmarkIsPayToScriptHash(b *testing.B) { + script, err := genComplexScript() + if err != nil { + b.Fatalf("failed to create benchmark script: %v", err) + } + + b.ResetTimer() + b.ReportAllocs() + for i := 0; i < b.N; i++ { + _ = IsPayToScriptHash(script) + } +} + +// BenchmarkIsMultisigScriptLarge benchmarks how long it takes IsMultisigScript +// to analyze a very large script. +func BenchmarkIsMultisigScriptLarge(b *testing.B) { + script, err := genComplexScript() + if err != nil { + b.Fatalf("failed to create benchmark script: %v", err) + } + + b.ResetTimer() + b.ReportAllocs() + for i := 0; i < b.N; i++ { + isMultisig, err := IsMultisigScript(script) + if err != nil { + b.Fatalf("unexpected err: %v", err) + } + if isMultisig { + b.Fatalf("script should NOT be reported as mutisig script") + } + } +} + +// BenchmarkIsMultisigScript benchmarks how long it takes IsMultisigScript to +// analyze a 1-of-2 multisig public key script. +func BenchmarkIsMultisigScript(b *testing.B) { + multisigShortForm := "1 " + + "DATA_33 " + + "0x030478aaaa2be30772f1e69e581610f1840b3cf2fe7228ee0281cd599e5746f81e " + + "DATA_33 " + + "0x0284f4d078b236a9ff91661f8ffbe012737cd3507566f30fd97d25f2b23539f3cd " + + "2 CHECKMULTISIG" + pkScript := mustParseShortForm(multisigShortForm) + + b.ResetTimer() + b.ReportAllocs() + for i := 0; i < b.N; i++ { + isMultisig, err := IsMultisigScript(pkScript) + if err != nil { + b.Fatalf("unexpected err: %v", err) + } + if !isMultisig { + b.Fatalf("script should be reported as a mutisig script") + } + } +} + +// BenchmarkIsMultisigSigScript benchmarks how long it takes IsMultisigSigScript +// to analyze a very large script. +func BenchmarkIsMultisigSigScriptLarge(b *testing.B) { + script, err := genComplexScript() + if err != nil { + b.Fatalf("failed to create benchmark script: %v", err) + } + + b.ResetTimer() + b.ReportAllocs() + for i := 0; i < b.N; i++ { + if IsMultisigSigScript(script) { + b.Fatalf("script should NOT be reported as mutisig sig script") + } + } +} + +// BenchmarkIsMultisigSigScript benchmarks how long it takes IsMultisigSigScript +// to analyze both a 1-of-2 multisig public key script (which should be false) +// and a signature script comprised of a pay-to-script-hash 1-of-2 multisig +// redeem script (which should be true). +func BenchmarkIsMultisigSigScript(b *testing.B) { + multisigShortForm := "1 " + + "DATA_33 " + + "0x030478aaaa2be30772f1e69e581610f1840b3cf2fe7228ee0281cd599e5746f81e " + + "DATA_33 " + + "0x0284f4d078b236a9ff91661f8ffbe012737cd3507566f30fd97d25f2b23539f3cd " + + "2 CHECKMULTISIG" + pkScript := mustParseShortForm(multisigShortForm) + + sigHex := "0x304402205795c3ab6ba11331eeac757bf1fc9c34bef0c7e1a9c8bd5eebb8" + + "82f3b79c5838022001e0ab7b4c7662e4522dc5fa479e4b4133fa88c6a53d895dc1d5" + + "2eddc7bbcf2801 " + sigScript := mustParseShortForm("DATA_71 " + sigHex + "DATA_71 " + + multisigShortForm) + + b.ResetTimer() + b.ReportAllocs() + for i := 0; i < b.N; i++ { + if IsMultisigSigScript(pkScript) { + b.Fatalf("script should NOT be reported as mutisig sig script") + } + if !IsMultisigSigScript(sigScript) { + b.Fatalf("script should be reported as a mutisig sig script") + } + } +} + +// BenchmarkIsPushOnlyScript benchmarks how long it takes IsPushOnlyScript to +// analyze a very large script. +func BenchmarkIsPushOnlyScript(b *testing.B) { + script, err := genComplexScript() + if err != nil { + b.Fatalf("failed to create benchmark script: %v", err) + } + + b.ResetTimer() + b.ReportAllocs() + for i := 0; i < b.N; i++ { + _ = IsPushOnlyScript(script) + } +} + +// BenchmarkIsWitnessPubKeyHash benchmarks how long it takes to analyze a very +// large script to determine if it is a standard witness pubkey hash script. +func BenchmarkIsWitnessPubKeyHash(b *testing.B) { + script, err := genComplexScript() + if err != nil { + b.Fatalf("failed to create benchmark script: %v", err) + } + + b.ResetTimer() + b.ReportAllocs() + for i := 0; i < b.N; i++ { + _ = IsPayToWitnessPubKeyHash(script) + } +} + +// BenchmarkIsWitnessScriptHash benchmarks how long it takes to analyze a very +// large script to determine if it is a standard witness script hash script. +func BenchmarkIsWitnessScriptHash(b *testing.B) { + script, err := genComplexScript() + if err != nil { + b.Fatalf("failed to create benchmark script: %v", err) + } + + b.ResetTimer() + b.ReportAllocs() + for i := 0; i < b.N; i++ { + _ = IsPayToWitnessScriptHash(script) + } +} + +// BenchmarkIsNullDataScript benchmarks how long it takes to analyze a very +// large script to determine if it is a standard nulldata script. +func BenchmarkIsNullDataScript(b *testing.B) { + script, err := genComplexScript() + if err != nil { + b.Fatalf("failed to create benchmark script: %v", err) + } + + b.ResetTimer() + b.ReportAllocs() + for i := 0; i < b.N; i++ { + _ = IsNullData(script) + } +} + +// BenchmarkIsUnspendable benchmarks how long it takes IsUnspendable to analyze +// a very large script. +func BenchmarkIsUnspendable(b *testing.B) { + script, err := genComplexScript() + if err != nil { + b.Fatalf("failed to create benchmark script: %v", err) + } + b.ResetTimer() + b.ReportAllocs() + for i := 0; i < b.N; i++ { + _ = IsUnspendable(script) + } +} + +// BenchmarkGetSigOpCount benchmarks how long it takes to count the signature +// operations of a very large script. +func BenchmarkGetSigOpCount(b *testing.B) { + script, err := genComplexScript() + if err != nil { + b.Fatalf("failed to create benchmark script: %v", err) + } + + b.ResetTimer() + b.ReportAllocs() + for i := 0; i < b.N; i++ { + _ = GetSigOpCount(script) + } +} + +// BenchmarkGetPreciseSigOpCount benchmarks how long it takes to count the +// signature operations of a very large script using the more precise counting +// method. +func BenchmarkGetPreciseSigOpCount(b *testing.B) { + redeemScript, err := genComplexScript() + if err != nil { + b.Fatalf("failed to create benchmark script: %v", err) + } + + // Create a fake pay-to-script-hash to pass the necessary checks and create + // the signature script accordingly by pushing the generated "redeem" script + // as the final data push so the benchmark will cover the p2sh path. + scriptHash := "0x0000000000000000000000000000000000000001" + pkScript := mustParseShortForm("HASH160 DATA_20 " + scriptHash + " EQUAL") + sigScript, err := NewScriptBuilder().AddFullData(redeemScript).Script() + if err != nil { + b.Fatalf("failed to create signature script: %v", err) + } + + b.ResetTimer() + b.ReportAllocs() + for i := 0; i < b.N; i++ { + _ = GetPreciseSigOpCount(sigScript, pkScript, true) + } +} + +// BenchmarkGetWitnessSigOpCount benchmarks how long it takes to count the +// witness signature operations of a very large script. +func BenchmarkGetWitnessSigOpCountP2WKH(b *testing.B) { + pkScript := mustParseShortForm("OP_0 DATA_20 0x0000000000000000000000000000000000000000") + redeemScript, err := genComplexScript() + if err != nil { + b.Fatalf("failed to create benchmark script: %v", err) + } + + witness := wire.TxWitness{ + redeemScript, + } + + b.ResetTimer() + b.ReportAllocs() + for i := 0; i < b.N; i++ { + _ = GetWitnessSigOpCount(nil, pkScript, witness) + } +} + +// BenchmarkGetWitnessSigOpCount benchmarks how long it takes to count the +// witness signature operations of a very large script. +func BenchmarkGetWitnessSigOpCountNested(b *testing.B) { + pkScript := mustParseShortForm("HASH160 DATA_20 0x0000000000000000000000000000000000000000 OP_EQUAL") + sigScript := mustParseShortForm("DATA_22 0x001600000000000000000000000000000000000000000000") + redeemScript, err := genComplexScript() + if err != nil { + b.Fatalf("failed to create benchmark script: %v", err) + } + + witness := wire.TxWitness{ + redeemScript, + } + + b.ResetTimer() + b.ReportAllocs() + for i := 0; i < b.N; i++ { + _ = GetWitnessSigOpCount(sigScript, pkScript, witness) + } +} + +// BenchmarkGetScriptClass benchmarks how long it takes GetScriptClass to +// analyze a very large script. +func BenchmarkGetScriptClass(b *testing.B) { + script, err := genComplexScript() + if err != nil { + b.Fatalf("failed to create benchmark script: %v", err) + } + + b.ResetTimer() + b.ReportAllocs() + for i := 0; i < b.N; i++ { + _ = GetScriptClass(script) + } +} + +// BenchmarkPushedData benchmarks how long it takes to extract the pushed data +// from a very large script. +func BenchmarkPushedData(b *testing.B) { + script, err := genComplexScript() + if err != nil { + b.Fatalf("failed to create benchmark script: %v", err) + } + + b.ResetTimer() + b.ReportAllocs() + for i := 0; i < b.N; i++ { + _, err := PushedData(script) + if err != nil { + b.Fatalf("unexpected err: %v", err) + } + } +} + +// BenchmarkExtractAtomicSwapDataPushesLarge benchmarks how long it takes +// ExtractAtomicSwapDataPushes to analyze a very large script. +func BenchmarkExtractAtomicSwapDataPushesLarge(b *testing.B) { + script, err := genComplexScript() + if err != nil { + b.Fatalf("failed to create benchmark script: %v", err) + } + + const scriptVersion = 0 + b.ResetTimer() + b.ReportAllocs() + for i := 0; i < b.N; i++ { + _, err := ExtractAtomicSwapDataPushes(scriptVersion, script) + if err != nil { + b.Fatalf("unexpected err: %v", err) + } + } +} + +// BenchmarkExtractAtomicSwapDataPushesLarge benchmarks how long it takes +// ExtractAtomicSwapDataPushes to analyze a standard atomic swap script. +func BenchmarkExtractAtomicSwapDataPushes(b *testing.B) { + secret := "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08" + recipient := "0000000000000000000000000000000000000001" + refund := "0000000000000000000000000000000000000002" + script := mustParseShortForm(fmt.Sprintf("IF SIZE 32 EQUALVERIFY SHA256 "+ + "DATA_32 0x%s EQUALVERIFY DUP HASH160 DATA_20 0x%s ELSE 300000 "+ + "CHECKLOCKTIMEVERIFY DROP DUP HASH160 DATA_20 0x%s ENDIF "+ + "EQUALVERIFY CHECKSIG", secret, recipient, refund)) + + const scriptVersion = 0 + b.ResetTimer() + b.ReportAllocs() + for i := 0; i < b.N; i++ { + _, err := ExtractAtomicSwapDataPushes(scriptVersion, script) + if err != nil { + b.Fatalf("unexpected err: %v", err) + } + } +} + +// BenchmarkExtractPkScriptAddrsLarge benchmarks how long it takes to analyze +// and potentially extract addresses from a very large non-standard script. +func BenchmarkExtractPkScriptAddrsLarge(b *testing.B) { + script, err := genComplexScript() + if err != nil { + b.Fatalf("failed to create benchmark script: %v", err) + } + + params := &chaincfg.MainNetParams + b.ResetTimer() + b.ReportAllocs() + for i := 0; i < b.N; i++ { + _, _, _, err := ExtractPkScriptAddrs(script, params) + if err != nil { + b.Fatalf("unexpected err: %v", err) + } + } +} + +// BenchmarkExtractPkScriptAddrs benchmarks how long it takes to analyze and +// potentially extract addresses from a typical script. +func BenchmarkExtractPkScriptAddrs(b *testing.B) { + script := mustParseShortForm("OP_DUP HASH160 " + + "DATA_20 0x0102030405060708090a0b0c0d0e0f1011121314 " + + "EQUAL") + + params := &chaincfg.MainNetParams + b.ResetTimer() + b.ReportAllocs() + for i := 0; i < b.N; i++ { + _, _, _, err := ExtractPkScriptAddrs(script, params) + if err != nil { + b.Fatalf("unexpected err: %v", err) + } + } +} diff --git a/txscript/data/many_inputs_tx.hex b/txscript/data/many_inputs_tx.hex new file mode 100644 index 0000000000..2f9833de02 --- /dev/null +++ b/txscript/data/many_inputs_tx.hex @@ -0,0 +1 @@ +010000005901fa054079e69a46e5aacd8b57f94c3c99744d68c6097957eaa9021c344141a90000000000ffffffff020706fa6444e4c9d110274488a4641161165370cd11a208ad3a3a00178e1d9c0000000000ffffffff0210805cd4cceae0873daaf8b81d2eb7122cdcdf2dfae5a90569378f847e293c0000000000ffffffff021d93a6970f13f10f6b8b1b5763f772f1f37350f893cb305005319a76069f5a0000000000ffffffff021fa71c8d5f8c455820e6d83c6fca218ed2e70391c7dfba4119168c7ebc68c30000000000ffffffff0227b4b9041f1c8ac86ea16f48909c94adac7081b26a36ed5863e4c53175262b0000000000ffffffff0228a49d6e91275b9d0d8aa5f6e81d4e1e9cd957ecfdabd6df68fe6f4970a0b60000000000ffffffff022db9dd2128b6d1f1eba30a681f062f6eaad362e58b23e6cadcd2cb8d65d6880000000000ffffffff0243411baa5b4b3357849e505310dbd29a8a50e6324c4655e403043ac07ce9d10000000000ffffffff024b630ce631441c527d555c237bb68b694d50010b7723957ef4537185eef6c40000000000ffffffff025312b6a2f95a25a109b4f0b46fb35abd74b15a39241291dd3673f1dd58fd3b0000000000ffffffff02554f0d7fe6df9454c8152c6f46429596abc08b57d7cfbc7f5f22db8a0787e00000000000ffffffff025793409101621f48c0f9ebdef0867088c015c5e412ccbdd1d32a5de62ae1b80000000000ffffffff025b53aa8359a7a3fd92d69ef96be30dfed1ea99fa03db0050f3f6d3b9e2b7320000000000ffffffff025cfc35711a57b373b807bbfaadf0950b81a74d0215a0508f2e62989bdbb4aa0000000000ffffffff025ddd8921db66b54f1ad8ef2eae70913d22e5579e2781a1e485fc6a555f6e410000000000ffffffff026466da9b3ebf93b07e7de704789d5ae04f584fa39043716a9830edf5bf99140000000000ffffffff027904d29d4cb521d7c884325b1d42434bc99b6d712681e5e254597821a944550000000000ffffffff027c662f67150bca47a7b23f0fb7c50956b21a4f46b9f4c4a304d51ce9c5900f0000000000ffffffff027ef5afdeab2ec6515a739dc00c2ef8994303c19a74fd0512f8306fb601d10f0000000000ffffffff0284cdef7bdd0c45efdecb2a3a68079d7e01ccc8e229a3e72160ec93218b1ad90000000000ffffffff028885c672656acd03755167361be6ccd94ad72c5e3890773f11a5c627f046890000000000ffffffff028b372c55109471551db0aa772aa66321862fb3a11e4cd7a31cdc4ed989436d0000000000ffffffff0290198f3a73a8febae55d559676303ae495acbad11dde304c21483a951078270000000000ffffffff0298dc5698fb1823ee1ec7469936e0b9b71e69e843d993b2c0096ac3c1d86bb20000000000ffffffff029c5d6da641328e356368383951c5dad56398f29f58a922eb54afaf888e41430000000000ffffffff02d702320af97f4f498aedf0886cd6123692f6d7b6f0b1da3910703648bc80c40000000000ffffffff02d90670fc2d34b7fcfce03ecb3a3650a4cd384eca645c2b05263721e9a5c19f0000000000ffffffff02de1f9e03b532c0bd6a28a7066c81b7abf0f9dc7e40003f638b9a872fa9a74c0000000000ffffffff02ded955aaf74a935a479fb08d4e8ded2a99664cb2235bc617627616e0e313630000000000ffffffff02e3f8ded8a0d2716817259e4144faa83facd27a5c9550c7c65835cc2c93738a0000000000ffffffff03012cf75972966f2c7abb609b43c7e85dd65cada0ee20118c80d92d766a32400000000000ffffffff0307efdd04c2f3e033a0294aaa894b4245695876fc76c12b8523d448ef05e6620000000000ffffffff030db2a3d8afa67b68f0ae663cc88bee0af0a8900e88f099d2ee648603e7b0e30000000000ffffffff03133fb852424925f55c8a660fdec8a10dce9bb9b500bf07bc73e2641f1a55310000000000ffffffff0313954647c73d9c63e4e83d36e337b17797be10eb0d641deaff0c768aa6db060000000000ffffffff031bfd6a0bfc310e204fc0eb5e1c83b9d21dab82847b909db111a371ffdcb5a20000000000ffffffff032588268e35fbd648c621638633ef8188e8b946ebd3d5833a18d9bae556ee5c0000000000ffffffff03378677fc365f67102c2559a2a4300344d41a63920e7450951fc6d8d63fb0110000000000ffffffff033c9955351d351b4f5ac398adce94b2a7ed3ab14a1c790c8e4742b1558c6b200000000000ffffffff034061cfcca9fb77d28d2411f4502c3696e0aa28b040f6780a4bd00c3fa8a02b0000000000ffffffff034b063b587eb75409e56b5ff2f9cc24a994e3ecbf9de56bd46983443067e81b0000000000ffffffff034cb2f8a145b3a55bb07dcdb904859808b29a5f53a01ba3a3cd707211afb7190000000000ffffffff034f96fa5e134b5310731b23fa9235aad58008c7c61f1b8128542b51622a52250000000000ffffffff0357236d19aef1428f117c3067a89adbecfe234ef32d744acdd6b6a5107a95e90000000000ffffffff0362504fcc65272e50ba6cc4583b4b1486592b59d943ab375ea7d6f44ba8038c0000000000ffffffff0369b02dad4259759408f8a3b1fad3c24df0873b767a9d0f1d50bd68f18c789d0000000000ffffffff036e080ba3f983e5bd7d8700dfd4b510a502231d0112c38e804b59d8a84026230000000000ffffffff038298149c290f73c535c3a184d181316ef695146a58d3bb3d2e61ed993cc11c0000000000ffffffff038538c9d6b8200609e4ca2443910daa6d9bbe772b2793e11fcf1763202c998b0000000000ffffffff038aad027dade93191c546648f7125bda82c895f1d80bf174d9637e533e12a1a0000000000ffffffff03960708a37a5654abd75755d1b8f49a84cdbde4676e14fd4863b125a94e9fc40000000000ffffffff03b0e09c55ecabf221c30a086c812e35bc9b586547cde8a83961a7ffa9067cb20000000000ffffffff03b28e682c13e7ada60cb905f8070109ec5a7800a0424c5f7afb6bd3039d48cd0000000000ffffffff03b7e8adc6174ca369ec31b4f944a6b74231d09254fde6b2bfe3416f3c6096ad0000000000ffffffff03c4f1eef6176ce6a2114dce78dd292f6db20fdae7c534d22cbada58befad6cf0000000000ffffffff03c7b5bf7fef69ae11c467f68fb551d58424e8723d05ce3ccf88385187898a710000000000ffffffff03d5150f5295b1e817f44fa34cade950c13789c4129e98eb32634aaad2abe13e0000000000ffffffff03d8250c9557188c7672009c4b14f37f96528e3f9c6889607b2e25299efe08720000000000ffffffff03de1dc49d0146dcc0cdbeb84c68a14ecb7075aba67d6494a5c8d098147843640000000000ffffffff03df8c8392bc17eddab688530697c2c221420464eb643ca8edfd30d7371ed5460000000000ffffffff03ea1dbbe72e20229648695a9b01e09b6080fb1c4632931fb810c5bfbe4b4eed0000000000ffffffff03ebf599f34a7d2cfe7bda1722f76e3df5c7fe299fd5c6e4099cfec4f551f46b0000000000ffffffff03edf95bb2c93c07d734ee8b3b1de4d4085c6b65cdbc3ca23eceec0c4d2b29a00000000000ffffffff03fe259ab7c4c03447011200d7d5236f4b1eeffd075926b78650cf1a59d570590000000000ffffffff040f71baef9c5273ac67fcba44ab29456a820274654624255c27e53ff62fdf8e0000000000ffffffff042938cae95e712592060f872cca771dfcd0218562928311c81127c3170a57bc0000000000ffffffff043a09d788547db3d1bfd8512000f9ad8bb3caab6fc24fd186663542c9f06d750000000000ffffffff043fe8a5586d0309c8dad9277bfba04fb27e7a39d279c0c9a2232e2927874d470000000000ffffffff04426f1fb4981529c32ba5756f59a2211ee9d2b9cab2c5de06a07680e833c33c0000000000ffffffff04454fa62f2c03d785307982ae406224025343f19f183e0fdff83d8e1d4cc1500000000000ffffffff04496141484d641e3b0a661210b225df50221b13bcbcb3cb8c86786890c745db0000000000ffffffff045731a8be6bfab1f9d62d2b2158591029cae655fbde8c8bdee80f183e72ca4e0000000000ffffffff04610a21533b98d3360a6f2c65be5685a1bb3a43f67da08dc1674a0f517618990000000000ffffffff0471b7883558587879bd53e13694069d95acc0d809fd0a65125ba3acdcfd66900000000000ffffffff04729b78d9b706fcb20c9cbb49ec1baf5fa782ff44d45d9a23868bcbdcbca1330000000000ffffffff04747b056b7cdd34c9891845220c2b7227a7c7c4f90e1ced6f36fd2197b26af90000000000ffffffff047a37d63a2a17986896072c77fa2e068f6e593dc64bf2ad8e180fde729fe3250000000000ffffffff04875cf5c94486e6596beaffbd7d08cf5e3111df06a89f59d65989d1485949190000000000ffffffff048944d4aa4d42ae9e864bea755a4c934713c63ce1c61d177a1ef03fd679ee330000000000ffffffff0489d5c9638a3f689c232fc1b9b59e5f82bd2e720744c4405d6537d7931edb030000000000ffffffff04a206bfdb054b041ddca180111aad2abf7b31813e4551da3a29bfb16c03534c0000000000ffffffff04a5feab7629e0cd9569aa62ea70f7ab3fdd58d3aa9bf73e8f76ac32a949d31a0000000000ffffffff04a70237d798a0b48b5abf682b806f31ff425406d93e74cde1ab4b9939ce9bc20000000000ffffffff04acd550baa26049b3dc52fb9efef1cca0b8dfa228c64482440d7217a81e587a0000000000ffffffff04b1caf936f5746da6d683eb00ae36b885fd031a8928df91e3172b1ca17f4e520000000000ffffffff04c45bd25f17cc765d8a67ca80a801c1f1c2131eb51b7b8ceb71eb898582b0380000000000ffffffff04c99a8ab69a640f9891aff371876a9d0c9043cda0430cbd436145c5574c124b0000000000ffffffff04cc0c4723cf9952c0a51db275c9d11370a95f478de98dce603d09de8e3d8e680000000000ffffffff02c6afbe970400000000001976a914c055f905fe8d14a2766801307a418f1e03ba566e88ac5ee85e0d00000000000017a914f5916158e3e2c4551c1796708db8367207ed13bb8700000000000000005923aaa80d0000000018f6020000000000fd4301473044022044e60dc7ff9d720bdc8329f97c5b321a84e0846fed248b23d399d222a074bff402204aaab1ed5df1e4b94d627d8b06171df51140e65eb056536e91103b75d032cacf0147304402200fcc38b7bff890fbd390f4bd1057c72df74c2487a3cd20edee80a20d6b2ce02902200b7893fa29f24e09358b6777a946d40166bc71c25f8e5f850059a1914e25959401473044022006430580bc312023db40b6928ba0c39141a8a59bb0613c5f6feca1c1f9b2bce90220055ffd441357bc34c246024281a7b394c7ee6a2a3c013689d95a3b9dbbb98d9e014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000009503030000000000fd4501473044022059a8f1680e80b50cb8a9180c1fabe8a66e84b34fb6c10912715fa71a5bc0f9770220531c0836d4de61d8e291c517cda25919a8b822b80b5737068120411976e5577e01483045022100a48b720930c142235cc5585a97a11d20e73a81049791526cdcee34d36f92fcef02204d2523393dfc4ba21451fa563b08f53df7c7115b65a9f2f01fd578474d308eaa01483045022100a73d3ebefadefc6dd9c7041b32bf7a3a25e49afd41bb3251c502ae6fef89316102201652f9ee39ef09335f5c8e83b3fc7591b592ff0651c5e8c4786875710cb9d1bb014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000006113030000000000fd4501483045022100a5af3c72e2e15539caf81189fa020cd4b3ac5432c512dc48772d825dfca7c60802203ad5f3caaf54593b8068ce50db67111ac166c2efb73b52b30dfb7884682faadc0147304402207796a265903387a8a612cf47a8df0aae7c251a339590b24b6d813fb4cfb2dacc022076df8e67ec560d8fb74ec7ed0cd368a4da09c98846635c662e5484f5ac5b862101483045022100eb3318b340dd14f8fb797af81d8c1784668f082e54e58cd59c1224890d7f6c19022064ce22ff6bb93806930dd34dcbc846d38028db4d4d4b9c5527b6d493dba01cbd014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d0000000099f2020000000000fd460148304502210081e68619898e8b0f9eadf2b5a324fdd7a684f935bf2cb72eef221e4310631ebc02206c7d5f1067d2980a95bfdf3b8530898ee94138dd99715c44e30b0894a5a6031b01483045022100f675ced0b828f2bae7a8046b41869ff865c081a79e32cbd400baa8ad99a975cb022075f347b57272df25c5d49c810af71fd1ba515b27166e61ad0c2bcbbd746a818101483045022100f271a0a0a8c5cfd149bf99411c4504d9905e6f9ce9f9787744c9593cab7f1c1b0220527057676ffcdd60caf0812b20b08b94ee1f935b44614b29bb9ab59e5bc0080c014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000001b02030000000000fd4401483045022100d068f2da5ba187b9d16b06dc87f1ff241063efaa786e07668abd06f8c2bea77e02206c541479ba49347104b386c36df7e14bc087bff7a17bd9c4096356a8c780fb2701473044022027336ad739d3ae08d1d136a9b7002a97873199d82abdd4bfd0531d62294116a9022001925305ccab8a328b873126baf7977b51154b4f0436685fc21f483ad347fb8b01473044022031a20fbdd66cf2a0d59ed37eda8ac50772c25adc62035b53ea675200fc85cc1c02204c1ab7d35c53ab9a5086fbcb669452367d68c8a3f07e47843c8fc2e2dbbbccc2014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d00000000c7f9020000000000fd4301473044022022bfa36e676571479c3dff1d1a5a5c0cee3677b5ac45c14314d242bee32664270220736875bcd0807c93c3a542dbf98c753c7164ad6830acec833cc43e157eb665180147304402203c2d6ce11bff536cd9bd4f58a930649f708a5735a26971dfd8d4efa7748c48b302201e4c69309d99c41d1c19ee200fe23547f1972173f0954e8833b8ba8ecedb6aca0147304402200e9ac49f352071840f13104f247d1a506a637d898495ffcc4aec7743ca56a2e702203e279aea8208e3128dc27173a6cfbab2bd8c2bc8f273794028ac77a129d5cab7014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000005210030000000000fd4401483045022100d8e2743e7051807e428574f9c881781b40daf0ec572dcc30357350c48683fd84022032a131a11df9571b53284a2cdceb7668e7b6442897fbfd54dfc7e26f8a3a19130147304402207798db2d9031f37eca9788b63869a91b100abfff8ba9966c91c42636e43c56bc0220499af71936bfae1579f6ae8d88dd6ff980ae1dc4fa8d1c5585d08a6461ce1e1301473044022062d193f3c5f74685fbccdd8795515f67b88c8a9aac089591fdc07a8238cbf5390220200f0d61cf48c33f7800150c8af578107c20875846b4a0f2af2a4aff9d2b172e014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d00000000dcfb020000000000fd4501483045022100e4711a4de4d6cb64e8cdaae2a4a5033c1ae87549c8d419b42b8170ee5217e04602202784ec57a6591083dbabaabd49dea7cddd3f8a32d9497e23d4b4219a56a9395f01483045022100fd776ca1d482c1d39e3a414bd0e6d353637ef626929ca5ee37db62e3dbe3501802202abe2e1279e5a354745fc5c8f8dcf367c616d82f91052925b1e2880f3906e7670147304402201976bceee0c3bb19da53e80a10a92dd6d135c86e581f349268f58b7d6b387bb5022042616ed8eee7f19ba7bee1fd5ae5415b521615aae99c45d56f9bde39d2577b9c014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000008f00030000000000fd4501483045022100fda77866c51a7ded28a6e12d3459e32b33401b1c0426f3c727ba4542ded40d1302205981be0eafc9b2c702038844769765df04bef8e17c80d1fef65c2bdba0a8e6ca01473044022018343c7eb59ef103fe102361f9ab8c789dadcfb3e60dc9b25b429165a9625af10220367f3f95f988ae6bc29c8a400687ffd70d009fe0b650994f48c1875620440fe501483045022100ac63791400e4ab5fee7f8c8ac602017409764dd7ef7ffc07d793298277661a2202200c3de5c22cad718ae83c101e987b66f31f62cc3364e8c8505407ebf11b392b66014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000006211030000000000fd4501473044022029a09ec85ea2c7741cdab03fb1185d94029a5511bbe830d11ac22dfa7f21f452022060d4039356c9cf06be106dc81390025735cde670de5c0a5a38e3946cca95211e01483045022100ca82755fa0c2a23e207c665099d102d13a393ace8cfabee79b1a6f97ffb001a2022014e2ef964e3fb5e90743c54e620d40d79ef111be1299d917f762c442d40c2f770148304502210094e9d5926748124f8c215fb006ec2bec55e4cf469a7f8579a339c08a267ed2540220323b0224d9964cd55b9ccc3f1dd919073d83edb293d022b00497b8681624bec3014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000b009030000000000fd4501483045022100a308d49610b603e9ff378fb40620f255216f3325aedc8d9a909f9c5e8983cd4e02205c93d14a43aa5d4cf7a3d4d483c6d47ccb8c2c4b78647e6cbe490ca6e03cfad601473044022004b8e60724ecba532e2677411e2617cbc49ba42cd4843423d724797aed8ba60f0220198d033cf732b5451d5ef00666ecd19bf4ea8a08f6c5fc16f4e153f1759021ba01483045022100e6217183d6869b431befccd5f4b12372028e7975640cebaeefd5f5172b871ad10220152db2015f3a8c16129f34e2488a4cf19a85f26956e3818f2cf76fdc9c43fd35014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000005805030000000000fd4401473044022011d6116b37d985ed52d59aa4fee1c67a44668f55d2db37fcecc3cf89245994a002202ecb47c384e42351995cfac7ee0fa8f55053dbaa11784a1890be84c164a5cdfd01483045022100922746c881c2becbadee3859902d93c9f623d1ccf3cdc0231d31e3ee806a1db90220715d1689faa159f4abe4959063e4dd8f108b4dae79167367843dc31e0fd46e97014730440220280556147f23f8cad1907869154a98b025baae29367cc80c6d23a3a0d3b6443e02207a62c31f1331459885ee236245d3e122013b77b304ed512914b05acd1886ce79014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d000000004bff020000000000fd45014730440220053f5cb6b633930fc7ccd1abd012292cee5b64d6d5c25220f9d9f22ab16d1df40220430e464f5823ee503616dfbfca55fdd01949cca336c8586f4e1de72ec3f3063201483045022100e16f4708245ca99bb01ab257f495d6a33b2db4ee9ee5089a6a2074ea9070d8f602201d3302d14c85f11b2f42af10e2ac31739f085036f26aa1723c3cfd2d4b35b2b501483045022100a0be245e53ce42f783481e3ff658c13ac850eda7ad21b8206bb48fa20fa2bc5d022072963db0ace1449652a083be585dc75574490248d1069c0a48f7f7a6902fddc2014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000001703030000000000fd4401473044022029960cfa720d3818d4d2d7a55fb1a68323e34678a2a8fa3e68505cd78184cf9d0220723861ca8cee7eaed1f503a9668d9866ccae44f15a3e9da77e4dd23679715e4201483045022100f3054837f1aa88101e983b28466b679fc43fac26c48d0359c4b881ed3cf8e73b02204f4579fffdb2a96fc82b0ede6bb5eab53a86b0bc04e1ea0fc1bae9953ff5a7f90147304402207e3132303406ca2924ad934d49e4027f52083638f08d73bed7138b6d267948ea022018720dc7f47cb13d3d37555c0abeca90cb00060ce1308a3de317d63da5d1f4f1014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d0000000002f3020000000000fd4301473044022012cdbabc4d98705db72c8a6448d8b5e5483b404ce0ff26fad16b3751ccd667be022044bda8f743f51515281b41e7b7a0347e8d52e9aff07ad0c4c84486034b2257a201473044022021e2029bd87c699931a5eb4f997e56f1efe1dcc26a7fb8c8147a762bbea389ac02202ff5feed06720f5bba0c12107dca3d83c349a35c43256429b8f12eacc6b5df16014730440220269980cf3256b87c9ff83b29e3005b6af9c85c5a8fb7a501055b486bb51fe3e0022073196474be83c9cc24a843777835b97c4eca0ddf7956547f6cdc48a1cb42ddb3014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d0000000030f9020000000000fd450147304402204442fa3cbc6d9ca9a217069f984e8fa1bda35a825d6bf39804c92faed97f2b8d02200976a8fa7653918fa23dc3adf15408d09a8069b033f4addb723a028f9928fbda01483045022100a36c038f7e49fea33c9f2a26a4d8e510095d42912ba1cabdd7da19ceccd2466802203b78e02c86e2fec18eea2ae2b94f1e6736dfa7a3453be9ee571c90832978509901483045022100af4a52bf94e8618d387c8f54feccdf0ef49b6b5503102cd405ab28c48c6597ea022031053ae17323c0fb24dc2cbd3107ca374279cac0b54c4a6633747effec83fc9c014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000006508030000000000fd440147304402206391486dc686a643c26e9b43038b2cb1b465ee6ba81ba9203d0d82f9550bd26602202ca9ebd53b20a6238c3d8abd4236b10d9ca304f5e5808db4d5004ab9ede10ad101483045022100e419233679a71a3380b662425657eca9ad26cb425a8aaaceb10de1847b3957ae02206780b4b428765f9bcee90443aaa497ade22fb813951205fd53c999f7ae27c168014730440220656dd7808be7db3a7e448608ccd3b8696cdefb687de8a4e37a58a2a0db8c714b022044683a0d0299b6eaed1ef4162d85f563aced9306d3e4a84961a301604234649d014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000cb13030000000000fd440147304402200ec0afc3a6b07063c61400fdd53e5419bb755bfcc99b1d6d2cf275b3f6848c75022036fa64742979454ce0c6b2e16963dca1d4509360cd35cb85fe533982a2ad9e690147304402206ca03acffd0198c7ea1d78e713eb45812dd0a296929bd679137dfe56f3f0601702201b9d6b25d85e86bc747b8c9d19a1a2329b02ca9de22a914419cec25bcd68e6fe01483045022100d22e473e19fda86e31314fedde03e1710f5de93efa284dab5f86817c99c9417602200bc43a59bee8a46bbc813ce52cdc76066903820af43d4caf173000543f672c6d014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d000000005efd020000000000fd440147304402205b7ef22035cfb0b11b62354d91f97910937de864369708e3e35376d4f620a1780220496aa95cdab061367e571568269afdc2d0a8fbb83b1bfd08c062d057041fada001483045022100db48444eda15deaab63bc6f3f5f31546d3b44a5a9412323445eb3e0853b440c80220201d7c95c47b5beed4a1139c27a79dbcd30f288ac106a208f43c61a0989f3e0801473044022040693ca2c95a33d5e8e7218b99a6df8507e9b8bf72014d19cae77d489b57b76102201883ef3c9df0b017e8fcf5b0af1bfbd61556d5bf347d77544e3bd263641fcd1c014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d0000000046fb020000000000fd4301473044022005b50050f39f996b5f91e8e2c297e66521d5f72f2f4bec9993dbc44908f662be022001734f6df9a192f00e131fd8627b37b2afdbac8afafc38513b02c52ff305efad014730440220749ef2b72f235127bcc7c949f171ccfcc1ee87a9979543df9b568b323d9707260220440ae76846f8691bc471aa479e876a5fe01ce0e1f8311045cd8de1e7e58e4f890147304402201f5d4ea7f8fe9f08dac2020f4a2242645b27541b3cc591235fe927bfeed375a8022077627f400a799de27063ca0f2ea2d3ba5b8398bbac368a0501066097ad649e3a014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000009a09030000000000fd4501483045022100b83b84be0a0e613dd5e9dd7c6bec573a81bf95f83b546a4a717e3b708cc18bc802204bf97f877e03608103e30aeb9aab39c8f8d6e22cd9e89e66e7be74277bd7b7e201483045022100a9fe153e507bdebaf820f73e016ca8c7c61e3a07cfe7c79d74d674219c3aeb94022030abb047356650b8bb79d9eee45a9030c5cc55466568285e6d6f97cd6be577830147304402203da91297cb8e456b0089bbae43ad02d636f3f3777017c5b0224da4cf31ac5e5c022002a0ab0167395ee04f8e0f37fa261a80bff532c118a6f9fef229c5a9315115bb014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000cd0e030000000000fd4401473044022002012e7841bfd2dca62a5667f9bda8cc9b9e4ef86f8d0d6cca322b5bdb06a9b702206d5428e45ed0e18cb980b385cebc86eb6dcac59ee19f84afdc0c95ef0e782bfd01473044022073c34e5025fda812d8990f1f8cb16fbd4665554e8c467527b2c5c21132fbdf0b02206c22e854f2b704932e8134c46c40c738fc65939b2a516cceeafadd0c80f85efe01483045022100d808f0812a4a124c074166d87084bb3a38a6c632846a8ab4be7c69bda49b880702201a3625f5641c6a3a414196dc3b356f59b9bb8a44cd7623d601f28cb03691cd39014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d0000000007fb020000000000fd4401483045022100e5357e2b20252b028d10d746c386959ba296630f08d94906a36251bf331073b102202c55e9e3a482e27326731821d25fa4c09103ec60c4cdced3f6774e6f1bc929970147304402202e58674ad455a4172f87439beaee82f59842d0c4565a88a358ebe8db35e2204702203cbffea9df59094f823f598cdb252927b1af451f522c8ca24d52274baa2c5f440147304402201a078f0959625258d4ef1bf7918b852bcf1629f8e79e2a95c1e6ffca017b7417022071dfe182e18f1debf0163e85ece438f1f3326e2eae39eab8d9c7a6cd8f179bd6014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d0000000043fc020000000000fd450147304402201d697bdcd56006044872b398bac35b2c736f6bc22080ba7c81f5038de6a87a3702204c832224547a5bd89dbc5639e763dba74e3b35e77234078b425b7157b67f401e01483045022100bd54f0d2fdb584b15215e1eb8af08a2094f9ebabe0db8b01e107d0d6ca7c55f402204b1c9e9d368361903fe3cc99e48d045672818ae5ee15b3fc46e1c84049ed1c7a01483045022100e62ff90682934ec550ea89646de3a8d8bad4919bfd7d04a343aa490ca380d49d022046b3c4d8354661d6061798201cdec35744471b61bc55d83fa403d1aa6aa3b2b0014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d000000000cf6020000000000fd450147304402202d47018ec27c8d18a170cf22fa9f16df5da26c9ec85b5e7ab1220d7619d3bfb80220391bce1206a19b54496101317aa853f59fe8685f4ef1080525ec13149bfbe0e801483045022100ebab59d9714232e70788b14713364d8fa9c6284e0c2f173a3376521fffcdc80e0220624b5b801a7127e41c4378582026262e917a35c69ddb6fdf0de7ecaa26017904014830450221008905e07026703b5c1f6793fa9d749981369235d540fe0127be7b5d8cd18e401f022017b7e658adf3ad47487dc49c6aa8e88cc4d3b97f87ed0771299ef4026a8d8995014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453aea4a2d10a00000000c506030000000000fd4401483045022100c73924d67aaa9977d5b85fbad560b5315d36a657a402913be2aa90a1d12300e2022048b79577559462b4fd8c348a0b4d98caa20cff2c8a0363eda46037fd11782432014730440220345499c9d88b6989f158f7f980fa6f78f0a4b57d70f159739bf631b788fdbd3702207340e0fb636061cd9b7de0723d196b5f406d24120cb84f1236e3873f6e2fd6540147304402203332474e7a96938334a32052a802abb131d7a5000fb8fe1b903ca2474217d514022022533f3d58829d55689671efa27901878cfb75b20f5c696bb00ef4fcabde125f014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d000000002afd020000000000fd4601483045022100e7e10b3fa44e3bac1a8a5baa89ee3f34f437a37572a111d75ebc323007220956022007332c4fa0a81b99711a87342f7e13e720d09122f6f8d91ba093346d17cacbbf01483045022100d8f075435a1f1e6b3352beb482e899b95ee611551a499539c0004d703588a4cc02201b339915bf5cc5b1f4ca95d507576e58dfe20b2a2a3f9e97adc37c8f1f2921b301483045022100a25df71a3f33e602652db2a3ea88a65522edaf1e05c0900c87ef7149dafa9ed80220300d23d4abf09c979ad36916da78de09656f4c38a4fdac72454a888babc3f22b014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000b90f030000000000fd4501483045022100b6240b6c0f35b38bfc074939789eb53550f6c570487245666cdb825c13b95fe002200789f35de73db6342d1a3fd381ae55f5e801e1d170e7c9672c8179ddb7c9738101483045022100fb1a47917fef805908d2e02ff317a685a9550e5edc0aa8ef8568282575d4f6c802204a6b7a54338332ccff52ba21310cb0dca6a6b97370f1a621566c9214e03b49d20147304402203ef5647f608b1e921ed139dc54bfaf5e5ac3d959b88f3dc7a2ade0729f62818002205df3b44fab36a105bcecbe1f6b2794f692e0fe65eaa6d78126279c52db2a438e014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000004b10030000000000fd450147304402204cdd0d63816bd37ceaf959d323788b35a629d6b167cb2337ac81c0adae1366450220271435beb70cd8a18ddbcf98356de296ec16847a7a3e1a7c36d400f332374af601483045022100842dbb08884f9834eae867feedfa0ed158175348ee671aca1b470a9c5a723ee202201b9c8ffb52dc70fde054f18ab5a0419b603880bba4c9dec47d46bafb25c061dc01483045022100848c18295767444c5e0670930a0e0436fad251964bd4884ff5671db1a3f19d76022016edbdb3e65f99cdede5e957a941f3f35889342818f6805e0126e715a335aefe014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000001402030000000000fd430147304402202b7fe153e0a3f19123f677cfde86578aa546f8a46550806758b053d0b45b89710220792803175b29dab2c6e8c751436b30213a3b409c8d7cb0299f29a69522b120880147304402204e67807d8a30c8358cec44173c7a0727f542b4dc131f9701f2555a27cc17b628022044487b404d9edc2e2e8f553ac874c5dc549d9b261694752759d101ec00cc44c10147304402206d537d0aa88752db936ee48e986afd68338411ff68797ee2f80ce537bbf41d9002201d276c24365b68d18ce4020792c5d9558c7134495af96bcc55721d795c7662c2014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453aee854ed0a00000000f1fe020000000000fd4501483045022100a53176fb86d2190592abe80725917bfd5ab910b942d6f9648510e91730f3986b02205db19b272d2a2be3e315f2c9526a02c23f043c7b643128284faf734ce1d8930401483045022100be116b856b1f0ecac3c621c21a09d484a4bb86468a93e37f7c6d684c74c9031202205bcb65f89495e4575a1e5babb08cbd2aa21b200bbb9af1bd789b2a5b68c804f50147304402202a0dffdd955e6a5764e06113b5b712e789e956e7b6bcfaa225da8ef66e446c1b0220455f54d546976dd492b94f1693aa9d7e76dfffe3a7e861cec5f809fd5ac18caa014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000b305030000000000fd450148304502210098e4071de0540dd5d502e71a962803452695d3033ae1df83855e238197e2073e02202b825fb2190c784c050c375e1f520c0a2a85f9925fb43ffe58cdd25708e2877701483045022100892cb91af82982c870671e956805fa7aec721b82962311f4c51f959889ca8efc022051766e50a95d2ac480851b98f129889a4dd566c69b6ecda9654b3d4064aa40760147304402206ad1b9cd9af3c1e69ce32f42f1eb9ceab84e99b9f04cd14ab8842ad065a5589e022020b98e515e17d59e415d11b1be3e4fc34783d547200960ec96a4f67b6741aa58014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d0000000018f8020000000000fd4501483045022100e500b89edaca4c2408069dd40b9645eec796f536ed10811016aceaaeba48b9b102201bc364c56b9647a7c6c53b235418a78c8d8faddf793bf3ffdbba41818b9a401601483045022100a9695d1776c81442dfc4931a960188be256f58c46ff546d1e872015c8ddf56a2022012443c230d3257b64bc8ee05d18269c211becf4b9ed3a5c7a3b63e2e216dabd8014730440220073a21f37e0d3cf9d706dde6e4fc2232395f4bf1982785ed04c61b1144f7c00f02202c7b18f4893413590bb4fb139896826bba6fc3e1205fa43fae30d8e7cce48edc014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000fe08030000000000fd4401483045022100ed3f9d7fedec8c9f8bbf1afb2b7b1edb3e4e8b9dfaf789f1effe19a32dea4728022046cba3fe18f0c1107d3fe2436d037aa8fee47e830cef788fa86541c84ac02a490147304402207326ffc63de54f4554f56a7da2072cb4bf89479bbdcf22d00169f4c3d7054a5c0220717c3c86a5470ad7f7a4900cc13e05a0a929ecc00e3ad58ac5850508ebcf7a6a01473044022052cfcc5fcd981d38c150af8897bbad4541a8aa2742d31369bf0c37c4670ec5eb02206031643bea000d5d33e180a75627cfa7bacd9eedc0926eaec773e529255c6262014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453aea4a2d10a00000000e001030000000000fd450147304402206c7e38bf498a7ff831513413e5bf283b93fa456993162fb698a88933e1451fa60220669d5f75d9817f3ec08607f4b3b0ffc3f4190b5f7cbfa3336f1b64dac28178f001483045022100d8a58946dc73974ead5766e023a11eb2f32d3b7d7e482ff92255137fa6aede21022040c02e902a208a25b10296ee0a5466c6a8ce211ae2a6e2b7a541d2ea69fa4fbb014830450221009bafaf344ef873797281daf907d4e1171d8220e47bac5888e5cc72f3e219ef85022029773c52b7785abb77d72c22fbda1f9cc2a8536ccca43ec756bc9655ce6a9a84014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000980a030000000000fd45014830450221009be858cd5d4a8bce15d433d040be529a38cf38d9358919a9c04a1ca26127e3e402203de44aed9159f37e4b04ca449621d82040eab2528e2cdb7539708574899175c80147304402207271dd94d087a7b2174f3c3ccea7b92e29c84c6471224269f30faea34f2b77bb022000c9e94e92ea9f311d7a6260a2283f879115eb84d319d0da3cdb724b2b66da890148304502210093397c395481625411641fec29b5f8c37b4163e6bf886843080082f14dc716c402202f1b776d07f69ac148ec36a257ed43a2a016cc3257b091f1180bdffe9fb8fd39014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453aee854ed0a0000000047f3020000000000fd4401483045022100e59a2bba52457cd3a884568aefb50a2500309e0262243553b31da735cd281d1402201c238950f19cff6cecb3e75a7308c6a0e9addb39001b36e12454575dd695ef07014730440220679cb79f57fdabea76ea42e3f145aea59f3cfd4401c4c5b1693b2ba03a2054b202205e3e2accd4d889e6fe4ce0a4ee8d6618dc79aa1f3b2d3bfb664d83d25d6562b501473044022043b80b0e55ea34ff22377a57c4633c1c5fdb57d53d04176c1673cc67e56d63a802207081bacf923edaa05c4848a11fbac160eaf3a33bb495c26361f85f3ff1fc482b014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000be08030000000000fd4601483045022100ebac21191cfac6123e0a66e7c6af7febc1a1ce2e63c4e6fa1e4f75d6d2f39dab02203d592a16f40f8c8c88817d0788457d66bdb35dde14b02b90c7c353d040d4af9101483045022100827b7e2ef669a5d1407b98562a4cd45f302f6e2489c1bef3b8bdc6a0592bd922022036fd1961511848f84c9e8c633044033501091c5e756e28a4787846156cb00f9201483045022100e330508c7b1072b3644bdaab4a6219a7cd7ddd364ec0729534385e2e6e7fdf5502200dfa2bc091014c8cc134728c60c40f21f737203e5c5c04740fbea54bba8eed04014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d00000000f5f2020000000000fd45014830450221009db0475dc62ee80b8b49bac4d0138de52f985642f5ac40b75f46b643e4115767022042a464c53ebf57bfcefa05634ceb14e7669b86e94bea517c68e2264d676c70f80147304402205e563709bdcb24975892a67eddf3958a31d3a58471c6c0e0cb6891be80b9eeb802203c69bdf9042af7429f1555cba2180108834b3d3b139514274fe5c30aeb9f054901483045022100f792db494bef64ca96ec49891434bd33f511db09d214a3ac323343d758e2d3c702203a86fd817a81cb84610fb948d6b3ec7f4d4fed24da15ae9ee245606c4f5c42ab014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d00000000bef8020000000000fd4501483045022100ca7a5b358614ba7615381667ed1d6ee7b2332d520caa6c5c6c1b4aab12fc4bd9022062990a8aef2fa44dc073cafaa2f3e95c3534ee075ba998beb716756f985b8f4601483045022100eb982763c3fdacf7bb59642df124f090cc5e55287b28c206a47c8a3ec8f08add0220668510362e0da663f117235f3aacdfa7fce13abfdd2c54425cf63d1b32c0b56d014730440220447bb198dc7466bfcf815e6b91e2431b970f6eba34a02260c224e503622e126902207c8fd1e1bdd32def46f7442df011f58a561b04477b372da26888c2a38d2bbb53014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000580a030000000000fd45014730440220702dd862dda92c7b3b214909a1f9dab7653a2f9103b7a62d6646d02c651b34e7022022e3c90cbf41c1fa2a5aa89ee139eee2e656a640947e8431c63c54e1e944763501483045022100f0781151a884d97b3de74df629265914f8d0253581e789a2eb511ef76568a4d602200f33782718c74ed75c25d66426f2037690d0ef3734fd06017bbd65d992b68bbe014830450221009d56003be4df82e009e4584088807d5f4a4322151865681dd04645c63b7a5a010220584ade2f5b18756f6c3cec7dd391cd174fa9103c747c8ea0d0fdf6877a4fc882014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000006407030000000000fd440147304402205d00ab5aa7656681bcde46fb484802c2a304249dddee6555e680067577805f2b02207541b235dbef5e123e7b392c63497ea074c26f08d004e766a7711dca4e2696ec01483045022100fed3c2fa5de22702bfb31075897e03b433fa593ae0fb80794103566c490a595102203f5b01c8e7296be4e2f1a836b9be4d073bd2378816ed09baf416188d9b25c3b00147304402202cc6e2988cf32e02b25b2a2d853a507857ff6eac50427c4def421f20aa36e9cc02201313060f0fedb86d1dc00b41b437705fae3e5e3df23b254a2343afde89e17ee9014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d0000000074f3020000000000fd44014730440220681a9e9bcbffa35a8328fbbdb173d803042ab1a858c4ca9ed0e4f5a67d453c8e02205820f9fcbb4414d41c28e3509806443a869168cd1e17b428549ec2495161f5180147304402201339021529c4f6eb6dd22b56752ad5b2df7e1e8d978439c9578f0e907974711002202c63c6b1386bea4536364610c38ac0994ae863f9f35bef25850d6173901f794701483045022100bb021e7846352c38f3fd4fd21179b448a8d34295de73fa41c57a5f972e91c355022008f06f8bd66571e4027556cfa9124b4e1e518a9e82470261db3f0a3972efbcb6014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d00000000e1f8020000000000fd4601483045022100f30681d06bbe18241bfeeb7cdd484bfb44efcd579f2c2e2ae53cdb68fa5032e202200d96812f571f9d8e8fa0756e351c7a779c46cf4ac62a6825f14a5020b771988c01483045022100996344d3a16c60b94789cd5ae4d3cfd8f0b660520c8e7602e0f8a7aae705b127022008d6d5577a2b90e2462bbccb88c79cfa2936d001e1b14ea530261235460c0778014830450221009a64402bdfdaaa64d429576b0c77601e8da643dab7437e8cfd27db5a56c05d2002202d263058b96116381e1879ad483c664341174f341537665c1ba7b8a33e378e75014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d0000000086f9020000000000fd46014830450221009b8535b0fbf8f854787cd30b5109010183dae5807fa34e66e15cd6066dcb6b2502200783da464daec7780b546c0b6a4c274afe5f4698987820d36d6f9d5798ba2b7b01483045022100ccf647bcc6a89c6cca668aa5d4cb8577b8b1ebde8caf476c4270d96c631f6b8b022072e9d434ae2130352841477494a39168fda21ba51af04f372416a12b2a3eeb3601483045022100b71cf0b31f05baf22586a01f0e1869e8a37c9fb50e1470c6d82f0e8c7e709bff022050bb9d7638620264be1f8d69a477be454dd753beaf0ad6dd92f3d996f62910ac014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000007e08030000000000fd44014730440220563b7ed04dfec4aa05efd0911b384ae4995b1ec21be2572013f924268db89c9902205b3c939ecf522cfcd9d4678bcbfe23a31a3fab94043725be1d1e0c2a1ac6faf001483045022100bcfa16f8de773f97dbf9dcab27ead17ac1b3bfaeb16733d1bc355380595730a7022000d0125f418f48606a41c8b6f3e7dbcc21fd45f8c64be25513d58f56a0cbb0bc01473044022038b52dabadc8e617c7efaea42019fb8732a1bec5fa7a696c4c050b36968b637f02205b0bb3befba6a9fad35b34b99280523ebc37c20ba2eb9996d91c3f25a8d2a933014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000001c0b030000000000fd4601483045022100df6c07633b6669c8a73e33a004924e1a1e488329a165bf73871a6153cd222b9b0220240131a2687dcb6ce091ddb241d9e533362b29e351a7e181180b09a6c395a3e301483045022100884e519da7405180a348e67a6f9065d6a28520168924cebdc291f00aa28901e402204ff72a4d9bdb0f4fe667eeb0ef658a0414fe978c71193649235251ec99e0ea1d01483045022100c54d7fc08cca52150fe97c943e8d174306f125a459f3e71b489e7d497cea63270220101d71cd023d9131e98a1630a1566ba445b8e006aed4171d09f859aedbfb010a014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d00000000befa020000000000fd4401483045022100e1c1a88390bc698025e6e40d1005a028e02f48f4708a2d8adb6b388e8ff83c33022013afc0b581e7b70d7f515d32bb1c7da68ff84dd741dbfb35855213467fc04cd30147304402205775454f05bf5fdd98df0d27b91eeb68955477768b9f50015f41a79b6f55b67002206861d59d11023c98d3a8df4edbc30a6008f615624fb18bc7d09c76d91f3abace01473044022055e4148ace2edcef6fd14e2aa7524ba7cdc397eaa025d2decfe8dff9ef93cfd402203cbdf55e08018990bcea1255149f31661fd568f1542c3c34ad9865161382a845014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000005507030000000000fd4501483045022100db1d65c4c10c62a9a727e8702730347528a810c18734666efbb8a9fb372d553c02205e3c8dee1c43ada5aab36e5e91291129dc06bca5dbcb2f72b143e98bbf8b506a01483045022100c824496528cf45264250c975ad4926e216c51a757aafe4d374b43d20fc3f108802205f3555d6c1c819be780e0fdb0b73e90727a9ffd86620c2eae6e71dba4bbb696001473044022045e218224cb0e51b36a8fedba5309d4bd0e0f3b3c89eaca58c1100a658f5370702202aefbb0c45f6044af9e8f873909e122f317c0d70872374308b6a4506ca4918fe014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000ba10030000000000fd4501483045022100a5ad7fa4026ee61e4c1e390a9d7cad33e7a23c8e84eac552ed5bd226350f2cec0220053a68add02401a90cbe70dd3ca95e02f7f3fa9c7554c9b85eb2ef9dbd7570d3014730440220458d2a918740dd329e7d3cfdb2035251503a472138b9ab19f18361ba1c05c40e0220523a8a265bbab021a019d54934bbccf0d7070342acf3ddbfb4c4d85671b34fcb01483045022100f8a7da4ff094abe375185b727847cbcf4dfb9edc7aa2c7d067153c6e4f59a479022001e0b4d4b71c818e3790accac1fcc7ab94c7949c9942224ab8146f31fe5b1fd8014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000003d0b030000000000fd44014830450221009ff8642e68b10e870a62eef426786fd90385f27ad7aeb2ed86313ef5572cf69202206ae5e31a87ee7537329c5a791ad06666797542d0d53e5e803565c46e850fdbe10147304402206477af187868ba99a2fd16ef32c5718e0710e497cf3b63c8d0451fc91aa2973e0220756a79e9d3c7ab5478caaa194c620ef6c5cb051105cd8d5906d2234226bf17420147304402200b6bec9b2956c32bdc2d39dd77790ee8469253cbed7ae4b1006eea6786bff7ab02207fde3b16eb595c5cbe2c022907f157a64a5d8dde2ce2a354228f6bf447a7b874014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453aea4a2d10a00000000f301030000000000fd4601483045022100b927e3f030945624fb57a1c78083dd5ecbd16bee095f1427fee2dcd8fe3571b4022059fae4cbe0bea4848e4d1e398f4d2aa4b2a17614fdbad4f1448a920cf73e189001483045022100f7fff756ed604f5239b0312d195e67880242c4090d92df66c2ee925c88acad9e02201aa1785336c8bdb7c604ba39809d889fcf5ee8eb63c90f4a04fe2726c58418fa01483045022100bda45c1641278939fa116163fbefbe1977628506882f873768a3c478739727d802200498f9e44d1e820ebc8e5d77e961aaf889bb72935b9274085fed3fa15f77e2f2014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d0000000078f7020000000000fd440147304402207d4a786eaf1b2a169916850e5452c4e220b790fb3f2ad669a75aa54aed1a469c02205bce95b79ea705713d6c78fed676d2f0a0af31e4716b3d91f4f3722ac571357a01483045022100e5aa71c4430cc8acbec03d7a666c90e675df226bfd9e64f36e72da3fa3615a1c022038b8e99f6a16de52780723ee3f2b72ecd193002222df75db1035629ecce2a03b014730440220097f37a7c2996aa2e49aa2f36dc1669912a4cf2e5dd092751ed9df53188e078c0220676faaa01133f821bb044cf2d6f50a459c25c4b19eaf0145b4430967db73b01d014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453aee854ed0a00000000dcfd020000000000fd4501483045022100e60da48ef5ba5b29ab98cbe2ef99ff0a2bc92cd85024e49e5ca3597f12bcf300022048e6b0090e5c8057477dd7eb3789ae0b8fbdf5362421eda08c76d859ad7b544b01483045022100b4cdbbd212bbda1f70d6793d9956039d7edaa8fd70bfea7fb6a04bed7319e3780220425f48e5b29e7452107e19fddaec28e5846e04a2df14b80fc143bfd71e6266df014730440220279c65bad108d0007d821385aaad55ecad775a436de2b4e32988815020764847022067a86c7c33ece430d743102f84a9c48b29b9de9da821b6666929b13fb34e96e0014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d0000000000f8020000000000fd4501483045022100e0d21364935dc638b62cc87e9a198a47afaa348143c28c35e3c1d4424bdf4121022008bd790132b5f6192ea6187f5cb5a9ffc6435eff720357382739d1a961fd9d890147304402203aab999b99e7753f39e2ef8d450241b911f6ffc4d9e858ca6743b2a5b7ff236802206344c728587b60b56672c4ada3fa58778cf4905697d46d026e1019eba70d1e3d014830450221009525cca77d25075ea465237b5259c3227c2924507e74851db33a71d6434a90fa02207fad277b64c89ade6a42a682f049b462e8257be13ee27cd16145b52bf60847ec014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d000000004ef5020000000000fd430147304402205879477cf645049300fbcb532853fd3672c4f00ebe8866df4479feec600e4217022021e95feaf3015d9d03fe78b3a0b5b61003e4182709aa7db198a050d9ca6d54be0147304402202df5b7711a3ca99433ca9a6bc6894e95ee4f1c5c94811f771e22fc7eba8514ed02206a2763d0ccd7a641d2bbca36110a4d0972bf5ab2e4660306bf8af866117759670147304402202a22e0d36d9f55d479414abfdba71a933083f44704997d0eeafca51a3dd8d37802201a4ec8031ee9325834f31805fa8bd50e5f9fa165b965f2027500ef0ee0b8138d014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453aea4a2d10a000000004412030000000000fd43014730440220221ca9f2149986b521ded423d8bf044b33502c128d5820c7ef6ea240a5bac8cb0220567cfd17e603a28a961f2a2ee88443ae709f5fab0d3cea9aa6232f5ea2570e000147304402202e38267764d91a348d25b328c11ad05323228bb3769334527418cc83df6815b7022072d856c6d2d45b1947f99e9c8e695da78c97e956eec9d75e2ac2f7cb450ae4240147304402202baa2f128838ad113ebdd95bd16db144ccd1f29be98fe435f145e7ca954c44b40220279934a60ff066f77c05031d6624cd1c7de4e120835162a2d43021526ad84bd1014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000006c0a030000000000fd4601483045022100c858877b7ebab9df2f7b0681239c92e6c03e95d963e42a075fad8c452e045b3a02202e04bbef330e7fbec49a7ba9859a6cadfd61830ab858362a2a695ad4db84ec8c014830450221009139aef771bb21f6ccd0b357d5e62f0991f98e67039b4ef146ca74c7a95883a00220268ea8e98573e4199ddaa75d2bb08f6b694af8bd383614f59e8699eacd7850be014830450221009694018de0f453d6732941e22309064ef42127d412ad135808acd9031e058fbd02202b4d893c63a553fe2401c983d4ab5a2f1ae9d411c195470be7d895ea4284b86f014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000ed10030000000000fd450147304402204a295e4d135f4f6421bea46bdd97d452b23b262408d77fe38c1f090f5f88651f02206f79e3a47f198091c92cf5733f9ab0acb3347e21f1d66ebc53e01db3dbd6845701483045022100a606efb31d0eb4cc4112721878cc3bf2fd0fa2b2cd3337a98cd3304e0cd2e38c02204b6117547daae39c06d7477c8f5e9e0e0d767007326df7b027cf80ec36282af1014830450221009d3a3360ead284b47ccc8a13eb1ad8de55563dbc5ff0a98744fde8947ff5484202203c350ab88bd4650aaa762bb1379022abedfd9316e9771e3c516190d07fce0349014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000be09030000000000fd4501483045022100bc76c0450c83c1a704cebf734d36f64e1ecdc76fdc1cd6e5f7986caab2d1dea902206bd1907f48bde52c8761bea4b7cbb848b2331ea58e6fbe683ecf2d60990001400147304402203287582617de76c70e8f73fba20100471cd40b4d6cff4b883a9ed88922c96dde02206e36f90628e7822206d93fb668e759ed62d6b73d3ecde935187d239c84d296a401483045022100957d7302576e215c6e97eeab33854a139f88839377eaf10edd1f80d7567ed5e102204452ec2dd7f273d586d7ca83f80c554c73531ec689bd961b524c2d0f2b16049e014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000fa10030000000000fd4501483045022100abeb8758b4ccf148e91c24c43b46c34330210bfa56eda2afa91c64f496215b21022046c5ac2cdb04ff964369cc6137b8c6b1133422640769d9f7bcd66cc45bea71b501483045022100901da0b92045f0c0195447fd2ef83b9cd6944e75e685e38a6ebafb16a03087a0022031f2261fa0f6486d000daa590875596ddd40fe99e943ee9d6bb8bd9129b0f90801473044022021e942e7c2e562631492f4c7bdab659af69efec054e5cf8432b9cca6e2b35579022051ce1c6da198abca7414783ef73e9119d6a345a0f0f989c53d74fb506c5c8fc8014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000850a030000000000fd44014730440220132a4fcc7f1a8f6f3fe4cd9ccb32fe3433a4e450f8594424e2389368f6a7203b0220075d01f8b9ed12b416d1d04cb9e95ceccfeeb420fb49720b4a3f0d1404be2f390147304402203707b8551104cac7c862aab1a2f730208f8ecee7180ac474b409be4c6af73fe0022023e293d0368a43397a93928d61586bc41c6c7bb1793b2bd2639ba8520014783a01483045022100d4504304bfa64c675045ffedf26e9b85a3ab839df273d93e2b1b9ff12338c7c50220080f395e7663fb9539181eee186a6960d69319333cbeb4fd5d596226c7cafa34014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d0000000066f7020000000000fd44014730440220048efe6d5dd87a48a1deba890723e0e568ba8fe0112d29537237e0a1ea1c38070220197fda66031d9df627b79538eb4de824b9b49d94fab8aed185674ea4beac7bb901473044022006bc3ef529905db1a6729c0c8755267f63b3de05a0e1df68f9a2a983596e780e0220017582ffba0935ae9c8739bd6be3d21f9aec531ebe36e12073a5ee985df0110a01483045022100ef338afebdcddc9f46ac98ae9d9f936e44241cc46584096980690174b223da3b022062e0cbe00bc6ee9588ddf92e3c9c74f55632743d3d43dba4e43747fb380a4727014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000003901030000000000fd4601483045022100b21b940e774245ff2cbd5e797973a36ae61bd59c5a24081e73894f5823150d4202207c90190110b9607b151db47b81e7008b3fbf18ab952f83cae3189e4324a21709014830450221008949ea570a61d78294fbe8c2453a211e152b0b2190078b3cb085ef58fa2d47de02206dcede7043213254f01ed0e4b73d1f5d4550ac5fdcb815972b788edd1dc626b901483045022100f8b59f01836c28cbde52114bc8bebf8ece08f45ffe1660266e0dcdc187687bed02200b59ef8ca9b9a4d8d9c937014ac9bf66b7638101c89f10549cb28ee2bd7ce63f014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000004313030000000000fd440147304402205cfc98a5c55837d45207a22a7e20b646d0805a4d35e4bd10b2bbf3fff6ec0f1502207df92aa9d79c5eca866ddc95c446c774947a824e0901361dd42073f277212b66014830450221008845063e4b5c6387f1333d76010493b23d79d47f19b227b659daf8c12369e87a02203b7002cdd2ebf3974be41a5c0dd6ed267cad19b2fdd0526260e52a738bba2de4014730440220575a271b955e464d335bb32cece0813fc730be1c98f3b41d70739e9457c8b6d602206dba0e5fb0f0b3465736cfed2bab04e8f7defbb9f11c35cf1601b95fdaaa8829014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d00000000a8f6020000000000fd45014830450221009cb6793416713945a3b6b08e10139d5c58f3ad21ba52f45913bbeb33d8ce1f5d02202e550c9d430adfaa81b4c9f6f27c2de234dfdf3936c5ad8a3beead34a8a62fde01483045022100807dfe6e8df9e514b6850f94c04efae0e927466c88bae4985d1f5a8014a5504302205265e75bb3d7b2ecbed322b35e998d904a2e4f2a44d5906807ed06566dbf14320147304402204a629c423c8ddb65ebfd05dccc9510aa3e8119b02d73e5997d559b7f9ad6a87d022029190b7200278ad005bf2f1a7aed9c864f9733ac3ec5bd7102ab18de6f44cd17014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d00000000a6f5020000000000fd450148304502210094ef0e131bead508301ecf03a7ffa18ec9263bc3666450d2bddcfa752107310002207b8cac555f7a132aa98e41d2feff833fed68752601d0f84031eb870307630a480147304402203dffac6f1e5b22325cf2ff59a98665a827852a36225bb7db58c013022ce037cf0220502c495cfae8edbd53ca9e8b6b9bb4efbd1278966fd9156297959696d445c06f01483045022100f9d9f9b2058abc9aeb02bcebf6f5b22faaa6356ca640550b3c20744cbdee77fb022051c28736be4150081d5aef3e2253a5ce9d3ab9c4578beb398561029be530ebf3014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000003307030000000000fd44014730440220521bdce46b83ae123bcc4f0a008d2bd5cf76e76e0f98f21e029cdb2d0a4f868d02201d3abecb1216d4b41e6c6b23ad87feb8f7ba7735508a4f33d701289f736f366d0147304402203d15fd7c4c578a8acc93a1ec867199efec7f3cd532adf75e9a689af0a2b9399d0220598e77fbdb195843a2699c3464bbb5ccc55e608ec06fb2723c449469766d212c01483045022100e82cc5d9dde9a9086518ec2c18fa867ebb46112e37d65d9f34d88ac741996c95022053e900ac59bb0a391677ea209611b858a89540e59d66056852f8bf23fe5670d6014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d000000007eff020000000000fd4401483045022100d71d8a50ea69c55f7fd08defa76bf1b4da053e3575544b0471c461bf5aef137902207fd9f81b4a551bb7afa8dd1b69a0f6b1f2c4e24aa93c992fa82f82471aa8f72701473044022047ab50ee3683939bfef7410135d6b8de00f9405ca5f2faf22979df74bd4ce974022077f23743ab8ae449862ffd48caf40cbac62fdad49e005b7212852d085e82ee020147304402202e98296f1568f3b1fae805d2d6bc6fccd59bf4c5d6f1565b644d142297d7c40902207abe8a1988115e0ab88180cf90821005e645d97ce360d372f2f329fe2a284f76014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000008604030000000000fd4601483045022100d0befa3dba35057e2ef9b8b6d873dbe983166816ceb84eb875b346ce720a6b33022018d3acee74afd13496e6f1c06e7802d7813ad42a890be8a83280dc06ea23941c01483045022100822d27a60f0e4a8c37acfaadbb0be6d49c0981613610fa63c1f162d24e79e4500220316448804078b2df0d126fb9ec97dc1584ca84567332aa3dc2acab6f573856b0014830450221008fd2b5a6421611baaa3deb3739720dfec37f5cf95f93aff572dd92dca8925fa202205d2b99181fc69d7a46c7c58367a3927b1f6fdcf136142cf85f250837fe643454014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000180c030000000000fd44014830450221009c3ccf4b91b6e425a70216bafbcd277682da8bdbdff336b6f58cb97dfc3204cb022058f650ea3ad9d26b2c66f17cacdd10bee5446caa1ee34145061c227a56620225014730440220092afde83e1995e9964b85224dfc4a3782df00a0f982eb4ad3b38d083428149b02207669684a16f7af5563fe061874c80d9e35e745abbaf7396c7f71267f50fe52010147304402202858c626b1245cdfceefa6440e0c0ca838c10d6114098fca6df76559577de29302203fac70696457e9bfec335fa3a892ec3a2161a34c5bdec4a375d63f76a8d51fbe014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d0000000066f4020000000000fd440147304402202397ebef3e1c8008050009f306560d15c5395fa07fae571fb55910749c3fb321022044acc8eab9dc7e1a9b4ab2cb167d0f944398a0b5e2c4d6e007f6f64779ab011301483045022100f4da2295f9558216c77cd9a0c56e0afc84e3ff1e6ec6b286ea5d7ab5a9f0b4b9022047d7353598ee12ea23234fa4fcdc05d7f9930f276cf4ecee76d128fe148596700147304402205216b5502fa0f62c6d5c9844f7b29ada8cda0fdce7d4dbacf8466adffb0eb6680220735d293adb02fb781f1cc02f9d1ef5a64c9436a95b4fc111dc0d69525ebadb03014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000004e09030000000000fd4501483045022100972f0d3af3ad98263fb8f500d6dc9bc75a589148b712ac0c7f95c78feb5a516102207316e12601bfb099b54075e67563a09df9e023094411ad19cbb5850a3778f067014830450221008ef3b3fc80b147b0ec47663d8756ee4d59e6ebbfd53a6d8629d1f30e9d17b70c02206583b2dd5b4f25d219e05da7fc34203ef667e0d49530e6211827f9f3041d3092014730440220088d12eb6a4424bb67b1aa85b8854cec0a959a62ee26e825a64bdc69c5e1219602206912f9adc20c5fe9f46ec852a6f433f276d1480f6a495a7984cf676a925a4f02014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000d80b030000000000fd4401473044022061236f509bf2232223af7219d64a2064dc4c12de828d46a1313b8f97b8a1b73b022043e93a6c2884668dc499ef67e370a6d736318ad39708183d2a702945a53e7cb2014830450221008e6deec7ff876824ee0f5a61f874eb5c303edd2717f5ca866afac208d591cb1502202fef21def83459e46dcb60387fa6ecac65adaf2ebec8d1c4bad92d1b0a928dda014730440220298c9412d02c1c39acfcb9dffa66cb5745904dae9d5f619b29d909cb9d6538ea02201dd6ca43c5fbe2038b6c347ce4e6a35e6d3e6f9703647661f0aa941cfd6136bc014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000b70c030000000000fd4501483045022100ed44d291e5e7c67d7817a0c1efead142048af4b2925df521f5ee011a6bbb797c0220268bc28e0b7f3cefd25b765801d25bc6de760361d5efc4ff4cc37721f191770c0147304402203425355cf89de0872aac696e9a54e1eb47d71b67a878b4291e505f5358b4c8f102205b7bf0aecb2c022fb93d72512fe820b1f9c0f396a80a75dbc72517d41006e12001483045022100b73867e6de73cf880d7eaa7a70f74685284ea52f3fae71eca4e8905d88367248022033f60a882ec544e5607201602229ddc7508c39ec25de2ee9e18e0bffc8f1130f014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d00000000dcfe020000000000fd4501483045022100e565de2989fb12d59dceb8717fa7efe1d430031701a178e93a860b6e7c593b5302207a2c8ee53cc8deceb79e959fdbe72f7fc30e97e51652ee6043687a9f68e24eee01473044022035da650da8f643511b343b3314aab45635f5c7a70d09a34eccf208ee8c0285a602206d3125eeb0ba309c14dbac2a67fc807f8e805d210e8b4d36966ca67e80e8c5a001483045022100d2336814da44438d4e6792dec2ed9017ffe295dff7877a326eda47e76bfa587302200e5ddfdf57537fb32b0ff333744c4a426488b8199923de93691e138e7a00928a014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000ca0e030000000000fd440148304502210085f57e21fb1cd388db4e5c62353dc7f520eab422f3d7ef8624552d1385199ce502206565aa1221fc512ae6236bafc08cb8157d774e1d499ebbbe712c10032f5aaf1601473044022047a029d05cfc8da77b76625abb93ee65fa4ffd23672a7d0348e45c145cba13050220740e4bb703957e56da185bfcaece5e4d3cc602271201dadb2d5afb5475c96283014730440220573c5fd3b203915a057765b361f08082e2d891e57bcd010ecaf6e8d307358b54022018848d5a770f33d667e792853f454359d1bf1c1c846dd00ee3cb3296602dd5b8014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d000000000bf8020000000000fd450147304402203b89df3d311981d4918681f0ee17a629ea632592342085cf1c1794f75626b7d00220141f2bb0d18b5f07d5549d279437c82319ba23b5e23d8b37ee217150331fe05f01483045022100a5b0d516a0457646836b850c195c8389b2747abbf747a557e96059190ad1e38302202ab7e8d5001290350544299dc3556e9abb9da2e8f91dd2ce3b00fa0c718cdec601483045022100f7f5b03dd0f3d6a7edf18847427ac60fb49cb626b074cae1ea95f233960a0729022000aff8e788a856b194effca3a08594ce28d97138143f0b205556886b4a098fec014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000008705030000000000fd4501483045022100c9728ad82c64ab5d548752adf590654a58eb4bfaba85f1f504b57708abc3eb5902204c36886103e1aa4da4c96bb52182710806b25b9b18310d4b9eb574027eddb3100147304402205017577d2e107371b7c8bd17bc15e128e4e1186cef93ed260d6f54947e94382602200ef247802da72844a33163e6d12136027538c6855ff5761aa5ffc65fda7c810a01483045022100b56e938da3ea2ae0248afa7f6be5e8f7ddb81cd3c82e16a41919864482c28ca102202eeb3e20e95448e46c340736d980fc1b75d860264edb814f01e0e430521f51d4014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000004203030000000000fd4501473044022032a1358398cad98c16a8829ffc75fc7b44f77b93d5627dc717b66a44b59dff7102207b0472f44654abdfe1a24eda879f28838bd5184dfba238fb1b3d4ed0adba15a7014830450221008cbaf2f1616afd756d773443a52e55acafdf5202c7cecc5d0775d681de0e903902201218f989b0300a0d75672676a20c3136ef671f5a4c52ea34213eed22b3ee382401483045022100bb7ccc2f7822a511aac2104ef57e34a04c37f3e09bcff1bc779df446a0840d020220789dece4f3172564a56b6001dfddfc1b79e41ab6d156a40f020bb5dde18877a6014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d0000000054fc020000000000fd4401473044022021c6612e0d9d3a57628d54fdfb7ee9756d41ad3247c8c460c499164b6ced3fb302206cb072bf1b753b8ff407b767160acf074f6f34286f4caf3ab5061fb4c980fd270147304402203b4f06ae4d5314e5dd95341c9668b16bc4a71efa1ea4bda2403d2be25e9baf8e02200f09352867d755d614bdb6af4cf22211c93c420fec4fa6fcdacae32b11d1036a01483045022100efd849b2c87782427ce6241c9cb87c60eb0202c12d1ce5f2306b25e857aa8f8d02202eac2b493b0be06093bd4c35d111fb5bdcf24d5795449ebdcbbf234237ecb837014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d00000000c2f3020000000000fd450147304402202649f1955b9a482cab0eef5bde264adf912f5c9351c5d9c10ebd74a7b41dda4602205675c9cfb36ad8ed29e7d431bb7b362e001e999b52d10939636147d19d8de00a01483045022100cbe00b8a033296b9b9e269388a63fb96c4a8f75085c941fa32b037a5991932cb0220020788969972594ccac489afad39bcad1534628f6a649ad5b34f14e5e9421d8401483045022100b7160b1edb5919751ecf6d18c98cceeac9f5941c1854af8560432b34b77dd74b02207105457d94cc4839df8af02f9abc34302eca1b061666e6516d859ec73d89a748014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000009209030000000000fd4401483045022100a54e526956343cfc84ce3e428c138d40381003386375d4ebf9d246101ff678e402201c80e61034511ae79e486380e3a652af58ad5b489aa15f29ec56fb84864e768f0147304402203bdeb20123223d56f13e68817d4a29c87e690540019813b2cdcb4fecbab7044b0220396a1d6971b69b4ef3e63e8727f093b3d7bface1d677a798b4a2d5ece218e8fb0147304402203ff11e576e45e7254fa5959c93956a97c09bb123e95da708001f2ede5f9ba8c602200f9f36ba15933a54a4758d97b7842776bd9706c6a8fab6a58649b9040824634f014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000670a030000000000fd4301473044022029bb920d11e2bf9201d18e7730f3bc5f6553e62bc8314336ae9c8a5859914c1502203bdacff928d4d666507dd2583b9442959c88726a817c67348817cd65e6c3606601473044022077a8ad215d7005f651f3b73a4f5a2e33e98dd2168268e04eb41af2ed6435ce2d02200af0d91cd2880f4158d175e28bce4ddc3fe50ad78b87f969c3662ae242930d980147304402205479fac1941e63c1de3cb25c4760b13f6b62ca59cf7942fb3170fd2d195678f9022040e827f224ea5551a4dad03daaf0ad63ea470b4fceffa8e4bd495e7560f32289014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000fc11030000000000fd440147304402205c09825c601853704b1b0231fbee7591c79b6cbaf30e2e955a0b6a72793b370502203fa13d433613f7e6e63419d5db0ade84cb18d699da64a2138fc086afb6066e8301483045022100eafd46546faf8c4e1152145d0a5c30ef070d5e455b6b3b685e1cb8f47cc2a0030220452568d3b52d7a6f7b1f30f321cb4481aaf8af3d7223d5e3de2d6612fa2c41bc01473044022012fc1168c457070445b883dfbbad6996a9dca5eb006b3755daeee5908918a6bc022063b589fae666c446199742cd78eb1843385660f2a962492476c6cacf3997c9eb014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000a60f030000000000fd4501483045022100872b40bd06e8bcf66cbc8ce478d9ccb62972670682146d19b06e63b919a86da0022071cf9163b60e61078f4a5be7a46cee4978585f7eb27387c0b27ae696c3d79f4701483045022100848eb32ab0284db06df29338a34ec5d63660d8ff8838501acc00694b203a346b02203f67e1f2a8d05894f14e965748ef9391675c263afc356519f3516df5adbc87ff0147304402201a20d9f8b3e236b0807d84a7d7e041d77ee26f002d2b77c695fecca316c01b5e022035edbd8bbd6917b892166fcf4b8202b93609e04440ef7b6d850c12409cb3c1e5014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000008409030000000000fd4401473044022009153c7b1bfdfe8ac504213c3ba3321ede43e2dc89261d803601ed6e87cace55022051969259b11cacb80d06ca68563ebdbf8a6e85fa88e9c14afc5797dc82f0fdca01483045022100951209e2d941dd5ba148ef2a0d4a0eaf09c9e0c22051719cb5f3a762517964ab02204acdcfddb8b8aa6a1f61b5126dfb607a472b22d5f731e1318f2405732fc54e750147304402200cd5be575d4b681975316726c211db5fbbc3037d29acdeb06bb7c72119fce5db0220514ea54faba32014d3422ca09c2ebcd332888370249af76809a9f5e4c380dfe6014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000e600030000000000fd45014830450221008d99ed1beda44a35e04ed4b6a20a9335c29d6fa974011c06f7a4467420b7ea39022041faf1da827bf32bc43e56a3de62512491209b1175c8779afe3e07731db7620001483045022100f38d3d3adec74d05204c0c9f0b79521abdc57f23d9599a0423d0227294a0ae3e02204ffe4c18ccf208ce95ade49bb78cfdd86aded1071e1fcede37e19252ee0b7882014730440220477a3fa0d716f8ca73d0f5cd55508231dc05d90d14ee670527f30c7f68406e4302201ee6504b744a53375afb2e84fab902ff8d299d6d897bed9db8dcbd85fd890bad014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000ed13030000000000fd4301473044022075d9d2d1d73ff65f1c3cb5fc705aa3f117b866901a527607c81807408fc924180220062031fca37eed36da2f119ad7f5018f8fdd6ca01f42c4bfebbe8550c17e8d690147304402202897a5b6ecb4426de79bc5be348c4b359c7a9adfec0c152345538bfd5279a3e8022053992fd5f382089e1f41e0c47a1ecc11cdd604dfc46210e6053b7f690e7ec0bb01473044022031a31eeaac96cce93cd3a5fe3d75e7faf99f17a5bba04a6a8387057815663ced0220266867c47ad462ab2e5a794b5db1325e0dd75588aa45e10dfb9c219918eb7af3014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae \ No newline at end of file diff --git a/txscript/data/script_tests.json b/txscript/data/script_tests.json index 5c054ed3e8..bd3b4e3125 100644 --- a/txscript/data/script_tests.json +++ b/txscript/data/script_tests.json @@ -666,7 +666,7 @@ ["0 0x02 0x0000 0", "CHECKMULTISIGVERIFY 1", "", "OK"], ["While not really correctly DER encoded, the empty signature is allowed by"], -["STRICTENC to provide a compact way to provide a delibrately invalid signature."], +["STRICTENC to provide a compact way to provide a deliberately invalid signature."], ["0", "0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 CHECKSIG NOT", "STRICTENC", "OK"], ["0 0", "1 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 1 CHECKMULTISIG NOT", "STRICTENC", "OK"], diff --git a/txscript/data/taproot-ref/003af31dd0b5a50c2723531e8ca22ae8ca6e7089 b/txscript/data/taproot-ref/003af31dd0b5a50c2723531e8ca22ae8ca6e7089 new file mode 100644 index 0000000000..eaf08ab3d2 --- /dev/null +++ b/txscript/data/taproot-ref/003af31dd0b5a50c2723531e8ca22ae8ca6e7089 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/005e61a50014d33f7309097490534db3c0dc65fe b/txscript/data/taproot-ref/005e61a50014d33f7309097490534db3c0dc65fe new file mode 100644 index 0000000000..8fcc5b4a8f --- /dev/null +++ b/txscript/data/taproot-ref/005e61a50014d33f7309097490534db3c0dc65fe @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/007f313a1a53428b7fc9eaf54c5d51be20e10567 b/txscript/data/taproot-ref/007f313a1a53428b7fc9eaf54c5d51be20e10567 new file mode 100644 index 0000000000..450f5ca486 --- /dev/null +++ b/txscript/data/taproot-ref/007f313a1a53428b7fc9eaf54c5d51be20e10567 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/00850c1cc564bd0dcbb02c3398f9fc8e0219a317 b/txscript/data/taproot-ref/00850c1cc564bd0dcbb02c3398f9fc8e0219a317 new file mode 100644 index 0000000000..4bd862308b --- /dev/null +++ b/txscript/data/taproot-ref/00850c1cc564bd0dcbb02c3398f9fc8e0219a317 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0089a0f18b0647cf2bfae0c93e9ae39b345d1611 b/txscript/data/taproot-ref/0089a0f18b0647cf2bfae0c93e9ae39b345d1611 new file mode 100644 index 0000000000..15ad8f6e7c --- /dev/null +++ b/txscript/data/taproot-ref/0089a0f18b0647cf2bfae0c93e9ae39b345d1611 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/00b6fe5a14ee4fb3bb65e0aa28e70cb57f0cd0b0 b/txscript/data/taproot-ref/00b6fe5a14ee4fb3bb65e0aa28e70cb57f0cd0b0 new file mode 100644 index 0000000000..38da643ee8 --- /dev/null +++ b/txscript/data/taproot-ref/00b6fe5a14ee4fb3bb65e0aa28e70cb57f0cd0b0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/00cd1f1ac746e81ae27bfe1e9a383975d0bba949 b/txscript/data/taproot-ref/00cd1f1ac746e81ae27bfe1e9a383975d0bba949 new file mode 100644 index 0000000000..11e29497db --- /dev/null +++ b/txscript/data/taproot-ref/00cd1f1ac746e81ae27bfe1e9a383975d0bba949 @@ -0,0 +1 @@ +{"tx": "01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4eb01000000db6b973760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706401000000f98306f1010fe10c000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a648000000", "prevouts": ["3f4243000000000017a91448274ba0d73ec00ce63e7922c9d87a48fd0c670f87", "04e712000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "2251202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "witness": ["151ed1a80e83ef2261d0a7c9cf17ed67c9b014c7f910704afdb6093f8b026fb75e65866fd39c79345c43e8ad7b7e53a111c9dd225afc4285c89b88021c930daf"]}}, diff --git a/txscript/data/taproot-ref/00d07d91c86c11dbbd14f4edf55c1f496ffaf010 b/txscript/data/taproot-ref/00d07d91c86c11dbbd14f4edf55c1f496ffaf010 new file mode 100644 index 0000000000..0ff6096c63 --- /dev/null +++ b/txscript/data/taproot-ref/00d07d91c86c11dbbd14f4edf55c1f496ffaf010 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/00dc037c98e799a31facfab68fce3187ad7a0f68 b/txscript/data/taproot-ref/00dc037c98e799a31facfab68fce3187ad7a0f68 new file mode 100644 index 0000000000..aec63fb04c --- /dev/null +++ b/txscript/data/taproot-ref/00dc037c98e799a31facfab68fce3187ad7a0f68 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/00e2723c3cce5d6fa2b7db987e5fbc1d75297650 b/txscript/data/taproot-ref/00e2723c3cce5d6fa2b7db987e5fbc1d75297650 new file mode 100644 index 0000000000..82055ad5cf --- /dev/null +++ b/txscript/data/taproot-ref/00e2723c3cce5d6fa2b7db987e5fbc1d75297650 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/00eb1a2b8aed4a406ee59371fa0a50e6679857c1 b/txscript/data/taproot-ref/00eb1a2b8aed4a406ee59371fa0a50e6679857c1 new file mode 100644 index 0000000000..234afd5dc5 --- /dev/null +++ b/txscript/data/taproot-ref/00eb1a2b8aed4a406ee59371fa0a50e6679857c1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0108a92da87f766ee005ac0bb220f78b50d04101 b/txscript/data/taproot-ref/0108a92da87f766ee005ac0bb220f78b50d04101 new file mode 100644 index 0000000000..e64a0e24e8 --- /dev/null +++ b/txscript/data/taproot-ref/0108a92da87f766ee005ac0bb220f78b50d04101 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/010cc78772e75503cf488b6267f5891e1495c962 b/txscript/data/taproot-ref/010cc78772e75503cf488b6267f5891e1495c962 new file mode 100644 index 0000000000..362af976ba --- /dev/null +++ b/txscript/data/taproot-ref/010cc78772e75503cf488b6267f5891e1495c962 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/014aca010656e76077fe517e999ea589e88307d7 b/txscript/data/taproot-ref/014aca010656e76077fe517e999ea589e88307d7 new file mode 100644 index 0000000000..93180f93c1 --- /dev/null +++ b/txscript/data/taproot-ref/014aca010656e76077fe517e999ea589e88307d7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/01686c55b9d9f3d0c2d9dc8c0911de32df21a864 b/txscript/data/taproot-ref/01686c55b9d9f3d0c2d9dc8c0911de32df21a864 new file mode 100644 index 0000000000..73f11b2c0f --- /dev/null +++ b/txscript/data/taproot-ref/01686c55b9d9f3d0c2d9dc8c0911de32df21a864 @@ -0,0 +1 @@ +{"tx": "0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b990000000015e6e6d3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3c010000008991028ddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6901000000414a92e6031b996c00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acd3000000", "prevouts": ["7bf1270000000000225f202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "1007280000000000225120e98e4d1ca072b074e8ce62a41eedb6ab06e3f93fe902ed968335e3f5f426ca3f", "867e1e0000000000225120469b0d5af3b652b8630a1c8a749c6ca969e84c67dc08b1fae26a9cf0bb3b6587"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["4339b5a2bb43edb5ec6015e78422673e93a5f940eb73c4bbc50742946ab32e5eed427b14f6d879458116ab1efc635aea8826b9cc83bdff544ff6844fcdf7a496"]}}, diff --git a/txscript/data/taproot-ref/016e25aa492396c1f2937c07dac87f3bce812041 b/txscript/data/taproot-ref/016e25aa492396c1f2937c07dac87f3bce812041 new file mode 100644 index 0000000000..6b0171f499 --- /dev/null +++ b/txscript/data/taproot-ref/016e25aa492396c1f2937c07dac87f3bce812041 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/017f425514c38506670a6136985cf2f693c1851b b/txscript/data/taproot-ref/017f425514c38506670a6136985cf2f693c1851b new file mode 100644 index 0000000000..494859bfb4 --- /dev/null +++ b/txscript/data/taproot-ref/017f425514c38506670a6136985cf2f693c1851b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0181b63b032265ff6a54d3acaf33d2efc67028ca b/txscript/data/taproot-ref/0181b63b032265ff6a54d3acaf33d2efc67028ca new file mode 100644 index 0000000000..21fac55f4a --- /dev/null +++ b/txscript/data/taproot-ref/0181b63b032265ff6a54d3acaf33d2efc67028ca @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/018284c1e780a7aacea0d945603d5f06254c5cfe b/txscript/data/taproot-ref/018284c1e780a7aacea0d945603d5f06254c5cfe new file mode 100644 index 0000000000..7c47ababc1 --- /dev/null +++ b/txscript/data/taproot-ref/018284c1e780a7aacea0d945603d5f06254c5cfe @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/01ca217ccf1ea0e39003e90d0d3573454b370bd0 b/txscript/data/taproot-ref/01ca217ccf1ea0e39003e90d0d3573454b370bd0 new file mode 100644 index 0000000000..6ecf0f0f58 --- /dev/null +++ b/txscript/data/taproot-ref/01ca217ccf1ea0e39003e90d0d3573454b370bd0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/01cc26fa177761f2440d4f78790adfdcb27c9321 b/txscript/data/taproot-ref/01cc26fa177761f2440d4f78790adfdcb27c9321 new file mode 100644 index 0000000000..97800509c7 --- /dev/null +++ b/txscript/data/taproot-ref/01cc26fa177761f2440d4f78790adfdcb27c9321 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0224ee3efd6d6c2e6024db65267c008a3786f0b2 b/txscript/data/taproot-ref/0224ee3efd6d6c2e6024db65267c008a3786f0b2 new file mode 100644 index 0000000000..62d981e46c --- /dev/null +++ b/txscript/data/taproot-ref/0224ee3efd6d6c2e6024db65267c008a3786f0b2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0234f23ded5600eb13895b83e3d3208daa621654 b/txscript/data/taproot-ref/0234f23ded5600eb13895b83e3d3208daa621654 new file mode 100644 index 0000000000..1ef4cf7df4 --- /dev/null +++ b/txscript/data/taproot-ref/0234f23ded5600eb13895b83e3d3208daa621654 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/026745c2e6a71ca361cb3f37fe3f4e9c3029688e b/txscript/data/taproot-ref/026745c2e6a71ca361cb3f37fe3f4e9c3029688e new file mode 100644 index 0000000000..e9ec465dea --- /dev/null +++ b/txscript/data/taproot-ref/026745c2e6a71ca361cb3f37fe3f4e9c3029688e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/026f12b427239f4351f951644afdf9e483ddc4bd b/txscript/data/taproot-ref/026f12b427239f4351f951644afdf9e483ddc4bd new file mode 100644 index 0000000000..272ffdd8c3 --- /dev/null +++ b/txscript/data/taproot-ref/026f12b427239f4351f951644afdf9e483ddc4bd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0274119160b74eb12e8b0ea869012528e5c8c64a b/txscript/data/taproot-ref/0274119160b74eb12e8b0ea869012528e5c8c64a new file mode 100644 index 0000000000..b302485b25 --- /dev/null +++ b/txscript/data/taproot-ref/0274119160b74eb12e8b0ea869012528e5c8c64a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/02a2d45e622dec5a4342e4be185659da883e8d6d b/txscript/data/taproot-ref/02a2d45e622dec5a4342e4be185659da883e8d6d new file mode 100644 index 0000000000..dba669f6ba --- /dev/null +++ b/txscript/data/taproot-ref/02a2d45e622dec5a4342e4be185659da883e8d6d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/02bb3113c2f000ec71e0cac539468d820cfa2df6 b/txscript/data/taproot-ref/02bb3113c2f000ec71e0cac539468d820cfa2df6 new file mode 100644 index 0000000000..2d3e48e4b6 --- /dev/null +++ b/txscript/data/taproot-ref/02bb3113c2f000ec71e0cac539468d820cfa2df6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/02c77525ae2279633746cc24153272f0cbebb2cf b/txscript/data/taproot-ref/02c77525ae2279633746cc24153272f0cbebb2cf new file mode 100644 index 0000000000..1c7f7e01ac --- /dev/null +++ b/txscript/data/taproot-ref/02c77525ae2279633746cc24153272f0cbebb2cf @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/02d1c1fa4446780154693993cbb3b3357d7dc38f b/txscript/data/taproot-ref/02d1c1fa4446780154693993cbb3b3357d7dc38f new file mode 100644 index 0000000000..ab23669fe3 --- /dev/null +++ b/txscript/data/taproot-ref/02d1c1fa4446780154693993cbb3b3357d7dc38f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/02f4d455a5e5230510c642f46a00e2819cbd49fa b/txscript/data/taproot-ref/02f4d455a5e5230510c642f46a00e2819cbd49fa new file mode 100644 index 0000000000..56995d0123 --- /dev/null +++ b/txscript/data/taproot-ref/02f4d455a5e5230510c642f46a00e2819cbd49fa @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/02fcf2313f765802ff09c238af833842580fe461 b/txscript/data/taproot-ref/02fcf2313f765802ff09c238af833842580fe461 new file mode 100644 index 0000000000..6102e8de21 --- /dev/null +++ b/txscript/data/taproot-ref/02fcf2313f765802ff09c238af833842580fe461 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0313e7c2127076391d6fd9696d30081eb2c9bfb5 b/txscript/data/taproot-ref/0313e7c2127076391d6fd9696d30081eb2c9bfb5 new file mode 100644 index 0000000000..cc4d082743 --- /dev/null +++ b/txscript/data/taproot-ref/0313e7c2127076391d6fd9696d30081eb2c9bfb5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0325cc06523d6b80529e7b67ea669a8cacc195a1 b/txscript/data/taproot-ref/0325cc06523d6b80529e7b67ea669a8cacc195a1 new file mode 100644 index 0000000000..61ee6af9e1 --- /dev/null +++ b/txscript/data/taproot-ref/0325cc06523d6b80529e7b67ea669a8cacc195a1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/032b54a2e80454a2b7039f32a4974095c2f018b0 b/txscript/data/taproot-ref/032b54a2e80454a2b7039f32a4974095c2f018b0 new file mode 100644 index 0000000000..ad357c0be3 --- /dev/null +++ b/txscript/data/taproot-ref/032b54a2e80454a2b7039f32a4974095c2f018b0 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/035336c778f096bfe56ccd9c44ca36a275649299 b/txscript/data/taproot-ref/035336c778f096bfe56ccd9c44ca36a275649299 new file mode 100644 index 0000000000..2cdcfe037c --- /dev/null +++ b/txscript/data/taproot-ref/035336c778f096bfe56ccd9c44ca36a275649299 @@ -0,0 +1 @@ +{"tx": "e2951d0503dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2900000000faacbcb9dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1601000000b69418878bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4eb000000002de75a95023fb57d000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914719f78084af863e000acd618ba76df9797223689870b6d6e3c", "prevouts": ["4a82260000000000225120eec26bd33d4c7b88cfedb1ec4d1edaf2070bd273924a77ba1006105de9dd5258", "6f1924000000000022512009aaafe5c25742bc31707a3d3e67825093b9287fcffecedf6a81328faea09126", "0ab0340000000000225b202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89"], "index": 2, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["c65f891f63a4162edc2f85da4a692c563eee896098c5d267f1e194a520bc037cd66194e6887748b9e1e8fa07d0598fbf835e584ebf9a684f336d03b628e6e3a7"]}}, diff --git a/txscript/data/taproot-ref/038d58e7a5bd8cd3c42dbd68c099f5900b90ceef b/txscript/data/taproot-ref/038d58e7a5bd8cd3c42dbd68c099f5900b90ceef new file mode 100644 index 0000000000..6872d0160a --- /dev/null +++ b/txscript/data/taproot-ref/038d58e7a5bd8cd3c42dbd68c099f5900b90ceef @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/03ac2fb4ae30f213cec9edbaf2796b086134d050 b/txscript/data/taproot-ref/03ac2fb4ae30f213cec9edbaf2796b086134d050 new file mode 100644 index 0000000000..05750fd724 --- /dev/null +++ b/txscript/data/taproot-ref/03ac2fb4ae30f213cec9edbaf2796b086134d050 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/03b65143f1009a2a8a2f6b758fd8559f040d207c b/txscript/data/taproot-ref/03b65143f1009a2a8a2f6b758fd8559f040d207c new file mode 100644 index 0000000000..09028f3668 --- /dev/null +++ b/txscript/data/taproot-ref/03b65143f1009a2a8a2f6b758fd8559f040d207c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/03bc1ab1714e0ffffffd3593268beb217c603b54 b/txscript/data/taproot-ref/03bc1ab1714e0ffffffd3593268beb217c603b54 new file mode 100644 index 0000000000..5de4da5cc7 --- /dev/null +++ b/txscript/data/taproot-ref/03bc1ab1714e0ffffffd3593268beb217c603b54 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/03bf93a96878a9f8ab6cdeabb7da6656971299e2 b/txscript/data/taproot-ref/03bf93a96878a9f8ab6cdeabb7da6656971299e2 new file mode 100644 index 0000000000..dcf4d9ae01 --- /dev/null +++ b/txscript/data/taproot-ref/03bf93a96878a9f8ab6cdeabb7da6656971299e2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/03ec899fb91c58bbb5676ebce177b0b63fa704a1 b/txscript/data/taproot-ref/03ec899fb91c58bbb5676ebce177b0b63fa704a1 new file mode 100644 index 0000000000..ac493c1f1d --- /dev/null +++ b/txscript/data/taproot-ref/03ec899fb91c58bbb5676ebce177b0b63fa704a1 @@ -0,0 +1 @@ +{"tx": "fb2bc47d028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43301000000be89569360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b101000000f904b380013e3908000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8790010000", "prevouts": ["4291310000000000225120cc81d141bd4bdeba62b4e9a08040837dfb25b01ce96f0a5c25fe4ac81b625b74", "39b01100000000002360212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["0c77e9f90c808108c29bf4f0eee7fe28be0cf50bb14d1f2d61baf0ea4772c38e7db30e1b807fd143bd3ee6cdbe06c2af20de4ad634330073b3d1149b4aaea84d", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/03edb43f652ba7e0ad56e117bab26ed1b3cc0b66 b/txscript/data/taproot-ref/03edb43f652ba7e0ad56e117bab26ed1b3cc0b66 new file mode 100644 index 0000000000..7e2a16594d --- /dev/null +++ b/txscript/data/taproot-ref/03edb43f652ba7e0ad56e117bab26ed1b3cc0b66 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0401cdbd85422acd1857a2cf6024ba4b7b5d909e b/txscript/data/taproot-ref/0401cdbd85422acd1857a2cf6024ba4b7b5d909e new file mode 100644 index 0000000000..6f80ba9dfb --- /dev/null +++ b/txscript/data/taproot-ref/0401cdbd85422acd1857a2cf6024ba4b7b5d909e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/040d05cbd66190be71c513b0ebd00bbc34debe8b b/txscript/data/taproot-ref/040d05cbd66190be71c513b0ebd00bbc34debe8b new file mode 100644 index 0000000000..64a3bf86df --- /dev/null +++ b/txscript/data/taproot-ref/040d05cbd66190be71c513b0ebd00bbc34debe8b @@ -0,0 +1 @@ +{"tx": "0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4d0100000097b2f1d4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff300000000335a90e48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43900000000f069d69701a1ee2600000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88aceb020000", "prevouts": ["98775d0000000000225120860c89f9477f4b6d0745b3db3a3158e326aac77c9b39db987890c5dea40689bf", "e37b73000000000017a9148462ed29696925d7688e1db8e76ef9e6667f05b287", "74ed3100000000002251207492be7c38200a6f417f2df61c3857d7747fae6fd7807509c1951e5f14ba63da"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "21551f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b", "witness": ["599545692eed16acc6ed23622eadfbf98699e55a84d0ec9431e80c8c0c234e9837aae449445814abe7cd48a61719937fb7c323ee98203f0e903c941edc17b58e"]}}, diff --git a/txscript/data/taproot-ref/04369027c0cf8f61083f8faeaf5d15a4bba2cb26 b/txscript/data/taproot-ref/04369027c0cf8f61083f8faeaf5d15a4bba2cb26 new file mode 100644 index 0000000000..265febe0c9 --- /dev/null +++ b/txscript/data/taproot-ref/04369027c0cf8f61083f8faeaf5d15a4bba2cb26 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/043ee2fa352668d08af2912ea4c7dc868039dd7c b/txscript/data/taproot-ref/043ee2fa352668d08af2912ea4c7dc868039dd7c new file mode 100644 index 0000000000..2bf293fde0 --- /dev/null +++ b/txscript/data/taproot-ref/043ee2fa352668d08af2912ea4c7dc868039dd7c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/046dee126274f9efbec0b1803cf0483b40e0bc0a b/txscript/data/taproot-ref/046dee126274f9efbec0b1803cf0483b40e0bc0a new file mode 100644 index 0000000000..ee85517757 --- /dev/null +++ b/txscript/data/taproot-ref/046dee126274f9efbec0b1803cf0483b40e0bc0a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/047736248915b6ec7bb882618f4c6428dc10bc32 b/txscript/data/taproot-ref/047736248915b6ec7bb882618f4c6428dc10bc32 new file mode 100644 index 0000000000..3588f604aa --- /dev/null +++ b/txscript/data/taproot-ref/047736248915b6ec7bb882618f4c6428dc10bc32 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0496f56b7283138d77bd26aa97936a80588bc908 b/txscript/data/taproot-ref/0496f56b7283138d77bd26aa97936a80588bc908 new file mode 100644 index 0000000000..c5a2a858b2 --- /dev/null +++ b/txscript/data/taproot-ref/0496f56b7283138d77bd26aa97936a80588bc908 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/04a0415662e8fe755a1cad7e31e996b0f9553a15 b/txscript/data/taproot-ref/04a0415662e8fe755a1cad7e31e996b0f9553a15 new file mode 100644 index 0000000000..cf0b4cf93d --- /dev/null +++ b/txscript/data/taproot-ref/04a0415662e8fe755a1cad7e31e996b0f9553a15 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/04a9e5bdcdafa1f723281d72593020692f3b5004 b/txscript/data/taproot-ref/04a9e5bdcdafa1f723281d72593020692f3b5004 new file mode 100644 index 0000000000..8cc7a9f11a --- /dev/null +++ b/txscript/data/taproot-ref/04a9e5bdcdafa1f723281d72593020692f3b5004 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/04bb5c8ad218b2ea6cbabde04b776a727cb804d3 b/txscript/data/taproot-ref/04bb5c8ad218b2ea6cbabde04b776a727cb804d3 new file mode 100644 index 0000000000..8396e69665 --- /dev/null +++ b/txscript/data/taproot-ref/04bb5c8ad218b2ea6cbabde04b776a727cb804d3 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/04c14170bf3650e0dee112ba4b888f2e76fc3b69 b/txscript/data/taproot-ref/04c14170bf3650e0dee112ba4b888f2e76fc3b69 new file mode 100644 index 0000000000..9aba5801b7 --- /dev/null +++ b/txscript/data/taproot-ref/04c14170bf3650e0dee112ba4b888f2e76fc3b69 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/04f498a7f3cfb530edcae02afc0d1476b8fbcd8a b/txscript/data/taproot-ref/04f498a7f3cfb530edcae02afc0d1476b8fbcd8a new file mode 100644 index 0000000000..585ac71e87 --- /dev/null +++ b/txscript/data/taproot-ref/04f498a7f3cfb530edcae02afc0d1476b8fbcd8a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0526255fad6bcad83e0f38f3e175d8b55d0113d3 b/txscript/data/taproot-ref/0526255fad6bcad83e0f38f3e175d8b55d0113d3 new file mode 100644 index 0000000000..9d246ed0d2 --- /dev/null +++ b/txscript/data/taproot-ref/0526255fad6bcad83e0f38f3e175d8b55d0113d3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0530510aa69fa36a6377468b144a6daefe9e0779 b/txscript/data/taproot-ref/0530510aa69fa36a6377468b144a6daefe9e0779 new file mode 100644 index 0000000000..d2c1de4e1e --- /dev/null +++ b/txscript/data/taproot-ref/0530510aa69fa36a6377468b144a6daefe9e0779 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/05645a121a9dee2f1e618d22d9c0e11f1729c008 b/txscript/data/taproot-ref/05645a121a9dee2f1e618d22d9c0e11f1729c008 new file mode 100644 index 0000000000..f1f41ef7d3 --- /dev/null +++ b/txscript/data/taproot-ref/05645a121a9dee2f1e618d22d9c0e11f1729c008 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/05723fdb3ecd4a3d4acc01d8ce541e74f11ba38f b/txscript/data/taproot-ref/05723fdb3ecd4a3d4acc01d8ce541e74f11ba38f new file mode 100644 index 0000000000..4ec79bdfbb --- /dev/null +++ b/txscript/data/taproot-ref/05723fdb3ecd4a3d4acc01d8ce541e74f11ba38f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0576b0175f23da9546b0ed7d213c1bdf55941dcd b/txscript/data/taproot-ref/0576b0175f23da9546b0ed7d213c1bdf55941dcd new file mode 100644 index 0000000000..0956dd6b79 --- /dev/null +++ b/txscript/data/taproot-ref/0576b0175f23da9546b0ed7d213c1bdf55941dcd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/05a7b91a73da2203e485ff51426532165c688040 b/txscript/data/taproot-ref/05a7b91a73da2203e485ff51426532165c688040 new file mode 100644 index 0000000000..6a991f080c --- /dev/null +++ b/txscript/data/taproot-ref/05a7b91a73da2203e485ff51426532165c688040 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/05d3a449ff645092d95ff6fa07d433d341861837 b/txscript/data/taproot-ref/05d3a449ff645092d95ff6fa07d433d341861837 new file mode 100644 index 0000000000..f123133d0a --- /dev/null +++ b/txscript/data/taproot-ref/05d3a449ff645092d95ff6fa07d433d341861837 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/05e7d1f74a0f0d69935dcee5b60fd0b08ff396cf b/txscript/data/taproot-ref/05e7d1f74a0f0d69935dcee5b60fd0b08ff396cf new file mode 100644 index 0000000000..507d1510b3 --- /dev/null +++ b/txscript/data/taproot-ref/05e7d1f74a0f0d69935dcee5b60fd0b08ff396cf @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/05f2dfea38b07d623e2947cc2c7963f25a45e24e b/txscript/data/taproot-ref/05f2dfea38b07d623e2947cc2c7963f25a45e24e new file mode 100644 index 0000000000..6d58ff300c --- /dev/null +++ b/txscript/data/taproot-ref/05f2dfea38b07d623e2947cc2c7963f25a45e24e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/05ff688173b90131ed218e693cd3e0735c88955a b/txscript/data/taproot-ref/05ff688173b90131ed218e693cd3e0735c88955a new file mode 100644 index 0000000000..dfffe09aff --- /dev/null +++ b/txscript/data/taproot-ref/05ff688173b90131ed218e693cd3e0735c88955a @@ -0,0 +1 @@ +{"tx": "0200000001a86a862f8a1bc1808f7ba2abcc71e2c0ff30c2c698fc832f6545a8dcb978b6cb0100000000d612f0b5043c3da44010000000160014ca9858c362545bc83a3b93e73b12b27a9b3ca003580200000000000017a914ca5375a68588393c82c00f5d2ab21f91e99aa5ce8758020000000000001600143f886f8feaf75ad7bedd5713d4d148e7c97c11345802000000000000160014bf1a19526352877c6b170dd8786dc91b1610ae1ca7010000", "prevouts": ["bc9aa6401000000022512034153a16ef8458ec2412ba42dd5be0fabd8b4c2f532d179dc958fc1fca3cae43"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY", "comment": "inactive/scriptpath_invalidcb", "success": {"scriptSig": "", "witness": ["3450353dceeead4aeffc66c2623942031803cc26b4417f85fee94662355c0cc06ade70ade320622ef9465ab480f3fbe3614e16d5bcdf8e49a8dd4d2a6abbe867", "20cb0ba18c127bd01c824f94fd2578ac4109c167b40bd92fd4f8ede9600f7f41f3ac", "c0cb0ba18c127bd01c924f94fd2578ac4109c167b40bd92fd4f8ede9600f7f41f312f383ce02997bd7885b2023ff24b4d79c49e77348af650460f5903df7baafc9"]}}, diff --git a/txscript/data/taproot-ref/060f27e89600b0edaefb344b00420aa71360fd11 b/txscript/data/taproot-ref/060f27e89600b0edaefb344b00420aa71360fd11 new file mode 100644 index 0000000000..7a3ee038a4 --- /dev/null +++ b/txscript/data/taproot-ref/060f27e89600b0edaefb344b00420aa71360fd11 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0621f65ed4f98e0fc3ba2caa915de84ac2773b64 b/txscript/data/taproot-ref/0621f65ed4f98e0fc3ba2caa915de84ac2773b64 new file mode 100644 index 0000000000..691fa91c97 --- /dev/null +++ b/txscript/data/taproot-ref/0621f65ed4f98e0fc3ba2caa915de84ac2773b64 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/064cb40080f9955f34713af8c9ccd370c7ce8d39 b/txscript/data/taproot-ref/064cb40080f9955f34713af8c9ccd370c7ce8d39 new file mode 100644 index 0000000000..62a14bc6ef --- /dev/null +++ b/txscript/data/taproot-ref/064cb40080f9955f34713af8c9ccd370c7ce8d39 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/064f3862567d3645a67ad42e8f1234919491ef00 b/txscript/data/taproot-ref/064f3862567d3645a67ad42e8f1234919491ef00 new file mode 100644 index 0000000000..00a11318b0 --- /dev/null +++ b/txscript/data/taproot-ref/064f3862567d3645a67ad42e8f1234919491ef00 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/06689eea577fd577cf0ed48baa3396126bb6f1b5 b/txscript/data/taproot-ref/06689eea577fd577cf0ed48baa3396126bb6f1b5 new file mode 100644 index 0000000000..a7d59e0283 --- /dev/null +++ b/txscript/data/taproot-ref/06689eea577fd577cf0ed48baa3396126bb6f1b5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0672af82ea3c78b3ade4b7424ecf5c00466fba2e b/txscript/data/taproot-ref/0672af82ea3c78b3ade4b7424ecf5c00466fba2e new file mode 100644 index 0000000000..88b19804f0 --- /dev/null +++ b/txscript/data/taproot-ref/0672af82ea3c78b3ade4b7424ecf5c00466fba2e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/06882dd6d50dc8061c56b887fa16764a4db5cc51 b/txscript/data/taproot-ref/06882dd6d50dc8061c56b887fa16764a4db5cc51 new file mode 100644 index 0000000000..b7224ac412 --- /dev/null +++ b/txscript/data/taproot-ref/06882dd6d50dc8061c56b887fa16764a4db5cc51 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/06aa8b12e6ae5c391fb3d92c4050218d552b6923 b/txscript/data/taproot-ref/06aa8b12e6ae5c391fb3d92c4050218d552b6923 new file mode 100644 index 0000000000..9d86883916 --- /dev/null +++ b/txscript/data/taproot-ref/06aa8b12e6ae5c391fb3d92c4050218d552b6923 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/06b7ea9f43da11b479b267aca3bdd7cf6fb9cfa7 b/txscript/data/taproot-ref/06b7ea9f43da11b479b267aca3bdd7cf6fb9cfa7 new file mode 100644 index 0000000000..792330930d --- /dev/null +++ b/txscript/data/taproot-ref/06b7ea9f43da11b479b267aca3bdd7cf6fb9cfa7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/06e74af8b10a6ab9ce11036f2747f8034ec3febf b/txscript/data/taproot-ref/06e74af8b10a6ab9ce11036f2747f8034ec3febf new file mode 100644 index 0000000000..2ec861e71d --- /dev/null +++ b/txscript/data/taproot-ref/06e74af8b10a6ab9ce11036f2747f8034ec3febf @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/06f54531f7cc822f36462b303f5eed8313ca07f5 b/txscript/data/taproot-ref/06f54531f7cc822f36462b303f5eed8313ca07f5 new file mode 100644 index 0000000000..ab89b0da26 --- /dev/null +++ b/txscript/data/taproot-ref/06f54531f7cc822f36462b303f5eed8313ca07f5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/07249b6446b452a9005766194cb824b77c6ed600 b/txscript/data/taproot-ref/07249b6446b452a9005766194cb824b77c6ed600 new file mode 100644 index 0000000000..52abb33067 --- /dev/null +++ b/txscript/data/taproot-ref/07249b6446b452a9005766194cb824b77c6ed600 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0725dac7b6c36d404b706902e2a350065ba66fbd b/txscript/data/taproot-ref/0725dac7b6c36d404b706902e2a350065ba66fbd new file mode 100644 index 0000000000..d04851e82e --- /dev/null +++ b/txscript/data/taproot-ref/0725dac7b6c36d404b706902e2a350065ba66fbd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/073b21ccb622912fef49f0555d5ed7b6ea85ad7e b/txscript/data/taproot-ref/073b21ccb622912fef49f0555d5ed7b6ea85ad7e new file mode 100644 index 0000000000..3794884c29 --- /dev/null +++ b/txscript/data/taproot-ref/073b21ccb622912fef49f0555d5ed7b6ea85ad7e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/07904e76401a888153be57bdc173982a4396aea3 b/txscript/data/taproot-ref/07904e76401a888153be57bdc173982a4396aea3 new file mode 100644 index 0000000000..2eb4cf819b --- /dev/null +++ b/txscript/data/taproot-ref/07904e76401a888153be57bdc173982a4396aea3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/079662a69dfd16ca9215a4e0c822fc44641e72ed b/txscript/data/taproot-ref/079662a69dfd16ca9215a4e0c822fc44641e72ed new file mode 100644 index 0000000000..9571e14fdf --- /dev/null +++ b/txscript/data/taproot-ref/079662a69dfd16ca9215a4e0c822fc44641e72ed @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/07991f2bbd7bbe3fad499b0c428f795590321613 b/txscript/data/taproot-ref/07991f2bbd7bbe3fad499b0c428f795590321613 new file mode 100644 index 0000000000..fc283766f5 --- /dev/null +++ b/txscript/data/taproot-ref/07991f2bbd7bbe3fad499b0c428f795590321613 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/07a56716b603afd041d05639404b37744bc2b83c b/txscript/data/taproot-ref/07a56716b603afd041d05639404b37744bc2b83c new file mode 100644 index 0000000000..9009b5fc3a --- /dev/null +++ b/txscript/data/taproot-ref/07a56716b603afd041d05639404b37744bc2b83c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/07aa3010d9cc23f67f6962a7c18f7dedccd7855b b/txscript/data/taproot-ref/07aa3010d9cc23f67f6962a7c18f7dedccd7855b new file mode 100644 index 0000000000..f498a1cd93 --- /dev/null +++ b/txscript/data/taproot-ref/07aa3010d9cc23f67f6962a7c18f7dedccd7855b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/07ae5671fc31d245f515f5c967b4e7cfed38567b b/txscript/data/taproot-ref/07ae5671fc31d245f515f5c967b4e7cfed38567b new file mode 100644 index 0000000000..518c54a60a --- /dev/null +++ b/txscript/data/taproot-ref/07ae5671fc31d245f515f5c967b4e7cfed38567b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/07b8ee857d10f18474e7471c3c27d10be12c5f25 b/txscript/data/taproot-ref/07b8ee857d10f18474e7471c3c27d10be12c5f25 new file mode 100644 index 0000000000..3a26949920 --- /dev/null +++ b/txscript/data/taproot-ref/07b8ee857d10f18474e7471c3c27d10be12c5f25 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/07cbbc0e4129794730bb9bb49d334b497f11b422 b/txscript/data/taproot-ref/07cbbc0e4129794730bb9bb49d334b497f11b422 new file mode 100644 index 0000000000..aa5d85eff2 --- /dev/null +++ b/txscript/data/taproot-ref/07cbbc0e4129794730bb9bb49d334b497f11b422 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/07d68512aa206614c478ec869a8b7d4f7c32333b b/txscript/data/taproot-ref/07d68512aa206614c478ec869a8b7d4f7c32333b new file mode 100644 index 0000000000..b42fd97f50 --- /dev/null +++ b/txscript/data/taproot-ref/07d68512aa206614c478ec869a8b7d4f7c32333b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/07ff10e93b7bf06e8da854a647ad08d5bc902326 b/txscript/data/taproot-ref/07ff10e93b7bf06e8da854a647ad08d5bc902326 new file mode 100644 index 0000000000..ee691893a0 --- /dev/null +++ b/txscript/data/taproot-ref/07ff10e93b7bf06e8da854a647ad08d5bc902326 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/08106eb8543994958b201f3ce5f42dbbf19adf37 b/txscript/data/taproot-ref/08106eb8543994958b201f3ce5f42dbbf19adf37 new file mode 100644 index 0000000000..6b8508a59b --- /dev/null +++ b/txscript/data/taproot-ref/08106eb8543994958b201f3ce5f42dbbf19adf37 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/081a75fb52ef536975050ff3192f6c516b3b557a b/txscript/data/taproot-ref/081a75fb52ef536975050ff3192f6c516b3b557a new file mode 100644 index 0000000000..fccaca4682 --- /dev/null +++ b/txscript/data/taproot-ref/081a75fb52ef536975050ff3192f6c516b3b557a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/08421b069ef3b27abeb764e8412aa879c8bfb0cd b/txscript/data/taproot-ref/08421b069ef3b27abeb764e8412aa879c8bfb0cd new file mode 100644 index 0000000000..0c597ae556 --- /dev/null +++ b/txscript/data/taproot-ref/08421b069ef3b27abeb764e8412aa879c8bfb0cd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/08630f23c6a755790aea6ed91128183d6ddc8291 b/txscript/data/taproot-ref/08630f23c6a755790aea6ed91128183d6ddc8291 new file mode 100644 index 0000000000..1e7082bf95 --- /dev/null +++ b/txscript/data/taproot-ref/08630f23c6a755790aea6ed91128183d6ddc8291 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/086661b19fe6034d3748295413e2b4d4251157aa b/txscript/data/taproot-ref/086661b19fe6034d3748295413e2b4d4251157aa new file mode 100644 index 0000000000..076bd01525 --- /dev/null +++ b/txscript/data/taproot-ref/086661b19fe6034d3748295413e2b4d4251157aa @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/08a0635b26ef56d2f6ddd4c31295a8bbde840584 b/txscript/data/taproot-ref/08a0635b26ef56d2f6ddd4c31295a8bbde840584 new file mode 100644 index 0000000000..41b857f62a --- /dev/null +++ b/txscript/data/taproot-ref/08a0635b26ef56d2f6ddd4c31295a8bbde840584 @@ -0,0 +1 @@ +{"tx": "4cb277ca02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfbc01000000987c9ec48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48a00000000ab7f4a8301368b720000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7960c7c812e", "prevouts": ["9c487c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b", "7b65400000000000215a1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["f8715e58be64394a10159f3d1c9c715912297ee6d2210f80979aa46ef71fd8cbac68d41553095afec7b14a4e3f5cc081463aef8d2ce3d98c0e772eae2ab24088", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/08a19ba6422f65b65cacb3f20b5507bca39fffc3 b/txscript/data/taproot-ref/08a19ba6422f65b65cacb3f20b5507bca39fffc3 new file mode 100644 index 0000000000..8fbf37ea38 --- /dev/null +++ b/txscript/data/taproot-ref/08a19ba6422f65b65cacb3f20b5507bca39fffc3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/08b5c0ff184e15e9c21e4949e2382b9a71623d3c b/txscript/data/taproot-ref/08b5c0ff184e15e9c21e4949e2382b9a71623d3c new file mode 100644 index 0000000000..9f6d938400 --- /dev/null +++ b/txscript/data/taproot-ref/08b5c0ff184e15e9c21e4949e2382b9a71623d3c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/08b74fd5e5bdcfc0a22933abb14c20399138f612 b/txscript/data/taproot-ref/08b74fd5e5bdcfc0a22933abb14c20399138f612 new file mode 100644 index 0000000000..4c6a4e16da --- /dev/null +++ b/txscript/data/taproot-ref/08b74fd5e5bdcfc0a22933abb14c20399138f612 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/08cb0cb08cfb93d7ca744dbf018072b119fbc650 b/txscript/data/taproot-ref/08cb0cb08cfb93d7ca744dbf018072b119fbc650 new file mode 100644 index 0000000000..b5ed6a435f --- /dev/null +++ b/txscript/data/taproot-ref/08cb0cb08cfb93d7ca744dbf018072b119fbc650 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/08cefa50635850a5a6caa88ddae4d4e4c5178f8b b/txscript/data/taproot-ref/08cefa50635850a5a6caa88ddae4d4e4c5178f8b new file mode 100644 index 0000000000..eac052aee6 --- /dev/null +++ b/txscript/data/taproot-ref/08cefa50635850a5a6caa88ddae4d4e4c5178f8b @@ -0,0 +1 @@ +{"tx": "1b7091bf0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705001000000fb6c19bdbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf80010000000a4e7ece028b5f8400000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7e7000000", "prevouts": ["8822100000000000235f212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "1dd2760000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["57e0667e28ec049022631f787411974501133ec1fc2911cec719d1de6efc6db1783e2089ab96f7027a37435dd54893aec2a1ee758153f939cfc2a7f48b78fc99"]}}, diff --git a/txscript/data/taproot-ref/0918ed067691e99a0ac65b680c99b8a0bd6d2dc2 b/txscript/data/taproot-ref/0918ed067691e99a0ac65b680c99b8a0bd6d2dc2 new file mode 100644 index 0000000000..3216df945a --- /dev/null +++ b/txscript/data/taproot-ref/0918ed067691e99a0ac65b680c99b8a0bd6d2dc2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0920b0864e2f856ec01587533e768fdc9f982a59 b/txscript/data/taproot-ref/0920b0864e2f856ec01587533e768fdc9f982a59 new file mode 100644 index 0000000000..007405290b --- /dev/null +++ b/txscript/data/taproot-ref/0920b0864e2f856ec01587533e768fdc9f982a59 @@ -0,0 +1 @@ +{"tx": "02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e5010000000f6b49bbbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf66010000005e3d45c0020d06a1000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acc2a8f43a", "prevouts": ["777a3800000000002251200653636fe1575a3601b4d73c1ea9151f68d884d4a6f1db0400b56f492c494afc", "e9266a00000000001652142540f27e90740933c99d4f17ab2dfc6c82951cfb"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["2be378d8e07bb734176317b5e7115c5678dbc8a9b591e95bec222e3bd303eed6c64f6ca230a44c3e80ea20e10c772c1b3b65825a41f508baf4cad948bfee4af4"]}}, diff --git a/txscript/data/taproot-ref/092dfb3e8b68e6142fcb0a354c4d02c23428b870 b/txscript/data/taproot-ref/092dfb3e8b68e6142fcb0a354c4d02c23428b870 new file mode 100644 index 0000000000..c9932fc68e --- /dev/null +++ b/txscript/data/taproot-ref/092dfb3e8b68e6142fcb0a354c4d02c23428b870 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/09342cfa6e3461e698ef1f6aceb83fd4a3ccbf35 b/txscript/data/taproot-ref/09342cfa6e3461e698ef1f6aceb83fd4a3ccbf35 new file mode 100644 index 0000000000..97f9ffee2f --- /dev/null +++ b/txscript/data/taproot-ref/09342cfa6e3461e698ef1f6aceb83fd4a3ccbf35 @@ -0,0 +1 @@ +{"tx": "02000000012e09ffdbb2069feade9688806d408b21e4e24b0581b653f6a686a5bf690596fa0000000000436cd2f903305b7ed20f0000001600143f886f8feaf75ad7bedd5713d4d148e7c97c1134580200000000000017a914dfd1018683cfaa440400f061c02b281ec7e8e2d887580200000000000017a91402e53bc18808b3955166f5113b83b265fa421e998736050000", "prevouts": ["12fd7fd20f00000022512034153a16ef8458ec2412ba42dd5be0fabd8b4c2f532d179dc958fc1fca3cae43"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY", "comment": "inactive/keypath_valid", "success": {"scriptSig": "", "witness": ["8736d0e96fabfd24bd45fbc3771242ddb5fa61dc00c00bfac51f0a981912f1b36c103fd984b420028aae849ab44624cb8301d97984442513133cafef4151d6c5"]}}, diff --git a/txscript/data/taproot-ref/0942d800ed811d505130b0e5cca50e722fc4f19b b/txscript/data/taproot-ref/0942d800ed811d505130b0e5cca50e722fc4f19b new file mode 100644 index 0000000000..496e6fde2e --- /dev/null +++ b/txscript/data/taproot-ref/0942d800ed811d505130b0e5cca50e722fc4f19b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/095bca4fc65d75681b759e14d34e7a5987625ab4 b/txscript/data/taproot-ref/095bca4fc65d75681b759e14d34e7a5987625ab4 new file mode 100644 index 0000000000..3847ca753e --- /dev/null +++ b/txscript/data/taproot-ref/095bca4fc65d75681b759e14d34e7a5987625ab4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/097dbe987c217c3d9b230bc0e634a9e3f0bab2fd b/txscript/data/taproot-ref/097dbe987c217c3d9b230bc0e634a9e3f0bab2fd new file mode 100644 index 0000000000..562926b350 --- /dev/null +++ b/txscript/data/taproot-ref/097dbe987c217c3d9b230bc0e634a9e3f0bab2fd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/09b3e7123f40c4ddb240073a912a440a18168c13 b/txscript/data/taproot-ref/09b3e7123f40c4ddb240073a912a440a18168c13 new file mode 100644 index 0000000000..0926934e6e --- /dev/null +++ b/txscript/data/taproot-ref/09b3e7123f40c4ddb240073a912a440a18168c13 @@ -0,0 +1 @@ +{"tx": "0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1101000000a081b3de60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127053000000000c7b5fdbdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc5000000006f40e899046516ab000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796c6030000", "prevouts": ["bf8d4a000000000022512074a4c3567b4c4ece2d1ea256a6bf2f85bf4dc051497bd8ce7ed8816e2d4c108a", "befc0f0000000000225120d1600e1e076c2da8b455f76340d5258bf45fecd0d78155a447a8b04344f8ccd4", "19b35200000000001653142540f27e90740933c99d4f17ab2dfc6c82951cfb"], "index": 2, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["5dcfa6aa91ce6da49a5c1dc23d4fb246deb6a5a93a275f981169ecd31cdf0e4a4e034b8f7a5c641927ca17720284b3f5e34aea6d9c96f79c6745e63a6fc75369"]}}, diff --git a/txscript/data/taproot-ref/09c225b7d61512e189a466c46243a4511b6eae8d b/txscript/data/taproot-ref/09c225b7d61512e189a466c46243a4511b6eae8d new file mode 100644 index 0000000000..382e1c2c3f --- /dev/null +++ b/txscript/data/taproot-ref/09c225b7d61512e189a466c46243a4511b6eae8d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/09cd349f59ff286840fb04789da01062c5d83ba2 b/txscript/data/taproot-ref/09cd349f59ff286840fb04789da01062c5d83ba2 new file mode 100644 index 0000000000..a10c6ac99c --- /dev/null +++ b/txscript/data/taproot-ref/09cd349f59ff286840fb04789da01062c5d83ba2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/09d7f478f35e48679ca5a97a08febfa49d510081 b/txscript/data/taproot-ref/09d7f478f35e48679ca5a97a08febfa49d510081 new file mode 100644 index 0000000000..913235d8f5 --- /dev/null +++ b/txscript/data/taproot-ref/09d7f478f35e48679ca5a97a08febfa49d510081 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0a3e2dd5f11a2182d7b86b927a600bde565229a8 b/txscript/data/taproot-ref/0a3e2dd5f11a2182d7b86b927a600bde565229a8 new file mode 100644 index 0000000000..ee526003ae --- /dev/null +++ b/txscript/data/taproot-ref/0a3e2dd5f11a2182d7b86b927a600bde565229a8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0a9a9a6e04b0e55c5a90ca23c2586a07ae1fc542 b/txscript/data/taproot-ref/0a9a9a6e04b0e55c5a90ca23c2586a07ae1fc542 new file mode 100644 index 0000000000..30dd35e2bd --- /dev/null +++ b/txscript/data/taproot-ref/0a9a9a6e04b0e55c5a90ca23c2586a07ae1fc542 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0aaeeea67c9e79315c703c56429535fd670ef5aa b/txscript/data/taproot-ref/0aaeeea67c9e79315c703c56429535fd670ef5aa new file mode 100644 index 0000000000..8189e96bb6 --- /dev/null +++ b/txscript/data/taproot-ref/0aaeeea67c9e79315c703c56429535fd670ef5aa @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0abded429f191b0375a464688f06bd465af7c644 b/txscript/data/taproot-ref/0abded429f191b0375a464688f06bd465af7c644 new file mode 100644 index 0000000000..ef58b6d79b --- /dev/null +++ b/txscript/data/taproot-ref/0abded429f191b0375a464688f06bd465af7c644 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0abdf3a09f88ee47573f9509a323dfd8af89e021 b/txscript/data/taproot-ref/0abdf3a09f88ee47573f9509a323dfd8af89e021 new file mode 100644 index 0000000000..98eab7adea --- /dev/null +++ b/txscript/data/taproot-ref/0abdf3a09f88ee47573f9509a323dfd8af89e021 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0ad139668541c092541da58168e6488a1191ff58 b/txscript/data/taproot-ref/0ad139668541c092541da58168e6488a1191ff58 new file mode 100644 index 0000000000..bb511e42bf --- /dev/null +++ b/txscript/data/taproot-ref/0ad139668541c092541da58168e6488a1191ff58 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0b0a37b5c9ef3c034545cbefc3e8de97c8b5ea05 b/txscript/data/taproot-ref/0b0a37b5c9ef3c034545cbefc3e8de97c8b5ea05 new file mode 100644 index 0000000000..b22508b1d1 --- /dev/null +++ b/txscript/data/taproot-ref/0b0a37b5c9ef3c034545cbefc3e8de97c8b5ea05 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0b0f9ae5467a2c8d14e86527b264cacbf4871500 b/txscript/data/taproot-ref/0b0f9ae5467a2c8d14e86527b264cacbf4871500 new file mode 100644 index 0000000000..40c9dc4243 --- /dev/null +++ b/txscript/data/taproot-ref/0b0f9ae5467a2c8d14e86527b264cacbf4871500 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0b37dc29cfcef1377a94a17297a0525504b5a9d2 b/txscript/data/taproot-ref/0b37dc29cfcef1377a94a17297a0525504b5a9d2 new file mode 100644 index 0000000000..3d0eddfa12 --- /dev/null +++ b/txscript/data/taproot-ref/0b37dc29cfcef1377a94a17297a0525504b5a9d2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0b7236484ffa4dee58a006bc3b9e51c30e5cc903 b/txscript/data/taproot-ref/0b7236484ffa4dee58a006bc3b9e51c30e5cc903 new file mode 100644 index 0000000000..70cb074d96 --- /dev/null +++ b/txscript/data/taproot-ref/0b7236484ffa4dee58a006bc3b9e51c30e5cc903 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0b727481698d5b6e33b991da896215f0527335a6 b/txscript/data/taproot-ref/0b727481698d5b6e33b991da896215f0527335a6 new file mode 100644 index 0000000000..b8d96b9f42 --- /dev/null +++ b/txscript/data/taproot-ref/0b727481698d5b6e33b991da896215f0527335a6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0b931370dfff16b9e6d9a7a333e61cabe23290eb b/txscript/data/taproot-ref/0b931370dfff16b9e6d9a7a333e61cabe23290eb new file mode 100644 index 0000000000..271338e77b --- /dev/null +++ b/txscript/data/taproot-ref/0b931370dfff16b9e6d9a7a333e61cabe23290eb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0bc98deaaa9007629b3338d906d73f87abce0b62 b/txscript/data/taproot-ref/0bc98deaaa9007629b3338d906d73f87abce0b62 new file mode 100644 index 0000000000..7440b574ec --- /dev/null +++ b/txscript/data/taproot-ref/0bc98deaaa9007629b3338d906d73f87abce0b62 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0bf313616424ee4fc95cf71286563567fc87c472 b/txscript/data/taproot-ref/0bf313616424ee4fc95cf71286563567fc87c472 new file mode 100644 index 0000000000..787bbe2b0d --- /dev/null +++ b/txscript/data/taproot-ref/0bf313616424ee4fc95cf71286563567fc87c472 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0bfc8b69a3702ac6986ce61b00e837a148e7d0eb b/txscript/data/taproot-ref/0bfc8b69a3702ac6986ce61b00e837a148e7d0eb new file mode 100644 index 0000000000..29eecf9491 --- /dev/null +++ b/txscript/data/taproot-ref/0bfc8b69a3702ac6986ce61b00e837a148e7d0eb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0c00a8351b02f2185ea30aa4052174b38417e0ff b/txscript/data/taproot-ref/0c00a8351b02f2185ea30aa4052174b38417e0ff new file mode 100644 index 0000000000..763d275aa8 --- /dev/null +++ b/txscript/data/taproot-ref/0c00a8351b02f2185ea30aa4052174b38417e0ff @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0c02f78d8dd01b33e94abaa865ee6a9792f4ccfa b/txscript/data/taproot-ref/0c02f78d8dd01b33e94abaa865ee6a9792f4ccfa new file mode 100644 index 0000000000..780bd6066a --- /dev/null +++ b/txscript/data/taproot-ref/0c02f78d8dd01b33e94abaa865ee6a9792f4ccfa @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0c043c49e6d5aafcf072e6be1be89160111fcb16 b/txscript/data/taproot-ref/0c043c49e6d5aafcf072e6be1be89160111fcb16 new file mode 100644 index 0000000000..92a42f04c2 --- /dev/null +++ b/txscript/data/taproot-ref/0c043c49e6d5aafcf072e6be1be89160111fcb16 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0c10be31ac329baf66d4d083563e6a9c3ab9ee59 b/txscript/data/taproot-ref/0c10be31ac329baf66d4d083563e6a9c3ab9ee59 new file mode 100644 index 0000000000..074624754f --- /dev/null +++ b/txscript/data/taproot-ref/0c10be31ac329baf66d4d083563e6a9c3ab9ee59 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0c12817899b35dadda1aee2d0a376b1e6fca73d8 b/txscript/data/taproot-ref/0c12817899b35dadda1aee2d0a376b1e6fca73d8 new file mode 100644 index 0000000000..15ab7ad434 --- /dev/null +++ b/txscript/data/taproot-ref/0c12817899b35dadda1aee2d0a376b1e6fca73d8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0c2099a1366325dfb20d310e00b1c1554e93defd b/txscript/data/taproot-ref/0c2099a1366325dfb20d310e00b1c1554e93defd new file mode 100644 index 0000000000..864867d2c4 --- /dev/null +++ b/txscript/data/taproot-ref/0c2099a1366325dfb20d310e00b1c1554e93defd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0c4d9a60206c9ad9b61b6120b3b5495408989e96 b/txscript/data/taproot-ref/0c4d9a60206c9ad9b61b6120b3b5495408989e96 new file mode 100644 index 0000000000..7772d1dea4 --- /dev/null +++ b/txscript/data/taproot-ref/0c4d9a60206c9ad9b61b6120b3b5495408989e96 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0c6dc14de0b80f72306e015b7560fef8a12f722c b/txscript/data/taproot-ref/0c6dc14de0b80f72306e015b7560fef8a12f722c new file mode 100644 index 0000000000..ba1412348e --- /dev/null +++ b/txscript/data/taproot-ref/0c6dc14de0b80f72306e015b7560fef8a12f722c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0c860ba9e47e23ac7ceaaa948e710e0253317ad1 b/txscript/data/taproot-ref/0c860ba9e47e23ac7ceaaa948e710e0253317ad1 new file mode 100644 index 0000000000..f98ba148b8 --- /dev/null +++ b/txscript/data/taproot-ref/0c860ba9e47e23ac7ceaaa948e710e0253317ad1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0c90542e3f64cf4c09f66ad39471bbed839d46af b/txscript/data/taproot-ref/0c90542e3f64cf4c09f66ad39471bbed839d46af new file mode 100644 index 0000000000..fa9020fb16 --- /dev/null +++ b/txscript/data/taproot-ref/0c90542e3f64cf4c09f66ad39471bbed839d46af @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0c91906e6830ed3ad8eba843f2cd7c66205a7981 b/txscript/data/taproot-ref/0c91906e6830ed3ad8eba843f2cd7c66205a7981 new file mode 100644 index 0000000000..40e670861b --- /dev/null +++ b/txscript/data/taproot-ref/0c91906e6830ed3ad8eba843f2cd7c66205a7981 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0cbaaae8f169bef4c71cd090d475e96cc8277741 b/txscript/data/taproot-ref/0cbaaae8f169bef4c71cd090d475e96cc8277741 new file mode 100644 index 0000000000..b8ba35eb8d --- /dev/null +++ b/txscript/data/taproot-ref/0cbaaae8f169bef4c71cd090d475e96cc8277741 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0cfce5f569e35c19633d12676981cda0b47a34b9 b/txscript/data/taproot-ref/0cfce5f569e35c19633d12676981cda0b47a34b9 new file mode 100644 index 0000000000..b297114606 --- /dev/null +++ b/txscript/data/taproot-ref/0cfce5f569e35c19633d12676981cda0b47a34b9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0d1dfc0136b588b721884040ebf5911514ebb74f b/txscript/data/taproot-ref/0d1dfc0136b588b721884040ebf5911514ebb74f new file mode 100644 index 0000000000..2c8b7541f8 --- /dev/null +++ b/txscript/data/taproot-ref/0d1dfc0136b588b721884040ebf5911514ebb74f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0d25d4167a2171b28beda354bc7a6b814d718e10 b/txscript/data/taproot-ref/0d25d4167a2171b28beda354bc7a6b814d718e10 new file mode 100644 index 0000000000..2f008d6447 --- /dev/null +++ b/txscript/data/taproot-ref/0d25d4167a2171b28beda354bc7a6b814d718e10 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0d265e43ba90ce1827ee538563c6a293b0b03ff8 b/txscript/data/taproot-ref/0d265e43ba90ce1827ee538563c6a293b0b03ff8 new file mode 100644 index 0000000000..38276c6310 --- /dev/null +++ b/txscript/data/taproot-ref/0d265e43ba90ce1827ee538563c6a293b0b03ff8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0d3ce2afc206b93ee7c40177e168a295fc3e5ce0 b/txscript/data/taproot-ref/0d3ce2afc206b93ee7c40177e168a295fc3e5ce0 new file mode 100644 index 0000000000..8f9a68b225 --- /dev/null +++ b/txscript/data/taproot-ref/0d3ce2afc206b93ee7c40177e168a295fc3e5ce0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0d4d3db873cac71185de9e2fa4462b2f3ba96462 b/txscript/data/taproot-ref/0d4d3db873cac71185de9e2fa4462b2f3ba96462 new file mode 100644 index 0000000000..03f0df434c --- /dev/null +++ b/txscript/data/taproot-ref/0d4d3db873cac71185de9e2fa4462b2f3ba96462 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0d5ecc8d0c063c2641c3a8e7adff9ecb0323914a b/txscript/data/taproot-ref/0d5ecc8d0c063c2641c3a8e7adff9ecb0323914a new file mode 100644 index 0000000000..2deb0bdc81 --- /dev/null +++ b/txscript/data/taproot-ref/0d5ecc8d0c063c2641c3a8e7adff9ecb0323914a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0d65edb0c2f57a76df2b15cd2c722b18edffbacc b/txscript/data/taproot-ref/0d65edb0c2f57a76df2b15cd2c722b18edffbacc new file mode 100644 index 0000000000..d768c0c125 --- /dev/null +++ b/txscript/data/taproot-ref/0d65edb0c2f57a76df2b15cd2c722b18edffbacc @@ -0,0 +1 @@ +{"tx": "01000000012e09ffdbb2069feade9688806d408b21e4e24b0581b653f6a686a5bf690596fa01000000008f67898d033cb5fd8a1800000017a9143fd5279308772d81081a68d882f81a7ac08fe1d98758020000000000001976a914d2eef9cb56b74880f063df7305ec01f0b8fc540888ac580200000000000017a914dfd1018683cfaa440400f061c02b281ec7e8e2d88771c9694b", "prevouts": ["3083ff8a1800000022512034153a16ef8458ec2412ba42dd5be0fabd8b4c2f532d179dc958fc1fca3cae43"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY", "comment": "inactive/scriptpath_valid_unkleaf", "success": {"scriptSig": "", "witness": ["5685a450002b7722b67ce499747bfa853d11943563381312add9b974d99f5729b4e2bf51310826d839a461cf795eefc85bf51bec70a9d1e523ea6b733713db5e", "20cb0ba18c127bd01c824f94fd2578ac4109c167b40bd92fd4f8ede9600f7f41f3ac", "c2cb0ba18c127bd01c824f94fd2578ac4109c167b40bd92fd4f8ede9600f7f41f3cbfc5d7464d6f9932fdfbdb59ed04135d3da1fd24a1d97149f3f9fe8acd746e901c94ae67cd857f8f23543b618b38154b6c0432568bb8cf7638fb55d4cc0a24e"]}}, diff --git a/txscript/data/taproot-ref/0d687e26341ba489f3d7be5d0b46f4beacaf8358 b/txscript/data/taproot-ref/0d687e26341ba489f3d7be5d0b46f4beacaf8358 new file mode 100644 index 0000000000..0bef61a9c4 --- /dev/null +++ b/txscript/data/taproot-ref/0d687e26341ba489f3d7be5d0b46f4beacaf8358 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0d6ac2e508ad66fe5e2ceb784535d11ee75cbe2f b/txscript/data/taproot-ref/0d6ac2e508ad66fe5e2ceb784535d11ee75cbe2f new file mode 100644 index 0000000000..f609b11eb0 --- /dev/null +++ b/txscript/data/taproot-ref/0d6ac2e508ad66fe5e2ceb784535d11ee75cbe2f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0d75732bc24cbac5dc017bb967142c5648d55bfd b/txscript/data/taproot-ref/0d75732bc24cbac5dc017bb967142c5648d55bfd new file mode 100644 index 0000000000..2e9f2346e4 --- /dev/null +++ b/txscript/data/taproot-ref/0d75732bc24cbac5dc017bb967142c5648d55bfd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0d89c8dca6b7a1af5614348af7dd5ae2f65190bf b/txscript/data/taproot-ref/0d89c8dca6b7a1af5614348af7dd5ae2f65190bf new file mode 100644 index 0000000000..869f0699df --- /dev/null +++ b/txscript/data/taproot-ref/0d89c8dca6b7a1af5614348af7dd5ae2f65190bf @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0dd2ab05d7639afe71f965b79bd7092a935732e5 b/txscript/data/taproot-ref/0dd2ab05d7639afe71f965b79bd7092a935732e5 new file mode 100644 index 0000000000..7d5dabba42 --- /dev/null +++ b/txscript/data/taproot-ref/0dd2ab05d7639afe71f965b79bd7092a935732e5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0debebb3108bcd03c6d5ce9c5c2ce1a64f8da172 b/txscript/data/taproot-ref/0debebb3108bcd03c6d5ce9c5c2ce1a64f8da172 new file mode 100644 index 0000000000..e3a7e09f52 --- /dev/null +++ b/txscript/data/taproot-ref/0debebb3108bcd03c6d5ce9c5c2ce1a64f8da172 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0e03e6819458e3a55e6655f8ac2fb5cb9b28406b b/txscript/data/taproot-ref/0e03e6819458e3a55e6655f8ac2fb5cb9b28406b new file mode 100644 index 0000000000..f280959b03 --- /dev/null +++ b/txscript/data/taproot-ref/0e03e6819458e3a55e6655f8ac2fb5cb9b28406b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0e1d5cb6786009b8f3825aeb3f4c7eecc240bf0b b/txscript/data/taproot-ref/0e1d5cb6786009b8f3825aeb3f4c7eecc240bf0b new file mode 100644 index 0000000000..737110fbb3 --- /dev/null +++ b/txscript/data/taproot-ref/0e1d5cb6786009b8f3825aeb3f4c7eecc240bf0b @@ -0,0 +1 @@ +{"tx": "0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1e000000007f87f9d660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270bb01000000b381a6b20118072100000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac24010000", "prevouts": ["ef6d640000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b", "076c110000000000235a212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["43859efd869b15d8b33f3c634b4e96d875595f9690bd5803c48fae26bbf1f097fa69dd48f8f59d02a7e642043bbe44a539d068d0e3f79843bd4aa4ac91433b86", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/0e1f79030f3681187ce4b16bf43133d56c470a63 b/txscript/data/taproot-ref/0e1f79030f3681187ce4b16bf43133d56c470a63 new file mode 100644 index 0000000000..eb5a1edf0c --- /dev/null +++ b/txscript/data/taproot-ref/0e1f79030f3681187ce4b16bf43133d56c470a63 @@ -0,0 +1 @@ +{"tx": "6fe1dd5a02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c070000000006cfdada8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48600000000e8441bcf03113b90000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487cf000000", "prevouts": ["bdc05b000000000022512056830ed1745d06f5c865a011820a618c1aa3c70bd00028049bf30f33c5c664cc", "6a7436000000000017a91486e5fab3386e07350db4c59e442dbaac96c1816287"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "235a212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "witness": ["472e4d32f1c25c84db688dbda40fa933bf8472109f2303175068888ae7b2dbace4d10bc6468c490dc7c2935c1a01af39812db491416acc58a4809fc899dfa862"]}}, diff --git a/txscript/data/taproot-ref/0e229a80fe4e2619a4b272d19ce5815986d08fa2 b/txscript/data/taproot-ref/0e229a80fe4e2619a4b272d19ce5815986d08fa2 new file mode 100644 index 0000000000..a9dc66846c --- /dev/null +++ b/txscript/data/taproot-ref/0e229a80fe4e2619a4b272d19ce5815986d08fa2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0e27294bb1dafe333a689bcad39dff7fb6f9cddf b/txscript/data/taproot-ref/0e27294bb1dafe333a689bcad39dff7fb6f9cddf new file mode 100644 index 0000000000..5491b4cb65 --- /dev/null +++ b/txscript/data/taproot-ref/0e27294bb1dafe333a689bcad39dff7fb6f9cddf @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0e28329dee72cdf3ca474e54b4eae5fb8c42ce45 b/txscript/data/taproot-ref/0e28329dee72cdf3ca474e54b4eae5fb8c42ce45 new file mode 100644 index 0000000000..c4cbac2023 --- /dev/null +++ b/txscript/data/taproot-ref/0e28329dee72cdf3ca474e54b4eae5fb8c42ce45 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0e292d3b3af29268349fe695e0f7ad74c422612d b/txscript/data/taproot-ref/0e292d3b3af29268349fe695e0f7ad74c422612d new file mode 100644 index 0000000000..41c1c68e88 --- /dev/null +++ b/txscript/data/taproot-ref/0e292d3b3af29268349fe695e0f7ad74c422612d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0e41c7f53cff3726f8dbca36445f5bb99cc7515f b/txscript/data/taproot-ref/0e41c7f53cff3726f8dbca36445f5bb99cc7515f new file mode 100644 index 0000000000..70d1462b50 --- /dev/null +++ b/txscript/data/taproot-ref/0e41c7f53cff3726f8dbca36445f5bb99cc7515f @@ -0,0 +1 @@ +{"tx": "48b53c3102dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c390000000029ddda8dbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd6010000002acd50fb0243a8c5000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc70404943d", "prevouts": ["84ac53000000000022512027986c975f6014bd54fa55f3e483bd83d3384004828bdd3e489d9b175e79ead5", "ae1574000000000017a91498e55eac47e04767f832d50008ff18559102c9e787"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "21601f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b", "witness": ["516609a38ddfe1d98bbaad43bd619e65b73a163a7a9467bad83936a63ee4fc84d6d53ec50ce63dd171c906b33b9d4e41feea1e386ea2c3c1853f8f736bd03010"]}}, diff --git a/txscript/data/taproot-ref/0e73fd872d8f71896397723287ddf1497ea61297 b/txscript/data/taproot-ref/0e73fd872d8f71896397723287ddf1497ea61297 new file mode 100644 index 0000000000..09422c637d --- /dev/null +++ b/txscript/data/taproot-ref/0e73fd872d8f71896397723287ddf1497ea61297 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0ea17004d718ec4b5b84011a18828cf136f86973 b/txscript/data/taproot-ref/0ea17004d718ec4b5b84011a18828cf136f86973 new file mode 100644 index 0000000000..571ee5df22 --- /dev/null +++ b/txscript/data/taproot-ref/0ea17004d718ec4b5b84011a18828cf136f86973 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0ea4e4491ee2abc4ea52e48ba33eeccf62d5f85d b/txscript/data/taproot-ref/0ea4e4491ee2abc4ea52e48ba33eeccf62d5f85d new file mode 100644 index 0000000000..b3795a1179 --- /dev/null +++ b/txscript/data/taproot-ref/0ea4e4491ee2abc4ea52e48ba33eeccf62d5f85d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0ea84a4a5eee9c0cfe8bd52347d11c08b97d6640 b/txscript/data/taproot-ref/0ea84a4a5eee9c0cfe8bd52347d11c08b97d6640 new file mode 100644 index 0000000000..0c6787580e --- /dev/null +++ b/txscript/data/taproot-ref/0ea84a4a5eee9c0cfe8bd52347d11c08b97d6640 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/0eb26606cb3895e3e7c3160a2acb1dd55cfde903 b/txscript/data/taproot-ref/0eb26606cb3895e3e7c3160a2acb1dd55cfde903 new file mode 100644 index 0000000000..34fccaf088 --- /dev/null +++ b/txscript/data/taproot-ref/0eb26606cb3895e3e7c3160a2acb1dd55cfde903 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0ec71de4446b68520af7b2f5cb5495f2f7d56bbc b/txscript/data/taproot-ref/0ec71de4446b68520af7b2f5cb5495f2f7d56bbc new file mode 100644 index 0000000000..bb81e5e3d6 --- /dev/null +++ b/txscript/data/taproot-ref/0ec71de4446b68520af7b2f5cb5495f2f7d56bbc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0ecc927da181cd3e4cf9d00b158c6acd0700b7c0 b/txscript/data/taproot-ref/0ecc927da181cd3e4cf9d00b158c6acd0700b7c0 new file mode 100644 index 0000000000..430c29484b --- /dev/null +++ b/txscript/data/taproot-ref/0ecc927da181cd3e4cf9d00b158c6acd0700b7c0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0ef9e684b87a52e1d2ec2b274d91ca104093f268 b/txscript/data/taproot-ref/0ef9e684b87a52e1d2ec2b274d91ca104093f268 new file mode 100644 index 0000000000..dcd4e9ebd5 --- /dev/null +++ b/txscript/data/taproot-ref/0ef9e684b87a52e1d2ec2b274d91ca104093f268 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0f0de5c345a12934d91427634192d4040e5bd1fe b/txscript/data/taproot-ref/0f0de5c345a12934d91427634192d4040e5bd1fe new file mode 100644 index 0000000000..69572735c6 --- /dev/null +++ b/txscript/data/taproot-ref/0f0de5c345a12934d91427634192d4040e5bd1fe @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0f1aee7720bb0ab848210f3e547b18c4431e3651 b/txscript/data/taproot-ref/0f1aee7720bb0ab848210f3e547b18c4431e3651 new file mode 100644 index 0000000000..99741e9791 --- /dev/null +++ b/txscript/data/taproot-ref/0f1aee7720bb0ab848210f3e547b18c4431e3651 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0f2ec0ef703ae34c9801d778277b221e6ec19ba7 b/txscript/data/taproot-ref/0f2ec0ef703ae34c9801d778277b221e6ec19ba7 new file mode 100644 index 0000000000..be7db07bff --- /dev/null +++ b/txscript/data/taproot-ref/0f2ec0ef703ae34c9801d778277b221e6ec19ba7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0f51e2a5ab57413a930a436edf258d17d6ae7de2 b/txscript/data/taproot-ref/0f51e2a5ab57413a930a436edf258d17d6ae7de2 new file mode 100644 index 0000000000..6e9ffe8b4b --- /dev/null +++ b/txscript/data/taproot-ref/0f51e2a5ab57413a930a436edf258d17d6ae7de2 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/0f7b105b71e9cb68726584b4fa24c0ebd801c4ca b/txscript/data/taproot-ref/0f7b105b71e9cb68726584b4fa24c0ebd801c4ca new file mode 100644 index 0000000000..7fbafa06ab --- /dev/null +++ b/txscript/data/taproot-ref/0f7b105b71e9cb68726584b4fa24c0ebd801c4ca @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0fa616a640ec4b881c4c4ea08e1a39f481403fe6 b/txscript/data/taproot-ref/0fa616a640ec4b881c4c4ea08e1a39f481403fe6 new file mode 100644 index 0000000000..90edea9fc4 --- /dev/null +++ b/txscript/data/taproot-ref/0fa616a640ec4b881c4c4ea08e1a39f481403fe6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/0fabe142a692b593ed073f5db1ef2aca01dbd689 b/txscript/data/taproot-ref/0fabe142a692b593ed073f5db1ef2aca01dbd689 new file mode 100644 index 0000000000..3b94f71d52 --- /dev/null +++ b/txscript/data/taproot-ref/0fabe142a692b593ed073f5db1ef2aca01dbd689 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1000a469dfca1be2144a6563e3bc8e3f5ceb2448 b/txscript/data/taproot-ref/1000a469dfca1be2144a6563e3bc8e3f5ceb2448 new file mode 100644 index 0000000000..f7a957ef64 --- /dev/null +++ b/txscript/data/taproot-ref/1000a469dfca1be2144a6563e3bc8e3f5ceb2448 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1007d21149445ee61da9ad4413d7acefa9ede7e3 b/txscript/data/taproot-ref/1007d21149445ee61da9ad4413d7acefa9ede7e3 new file mode 100644 index 0000000000..7e31154211 --- /dev/null +++ b/txscript/data/taproot-ref/1007d21149445ee61da9ad4413d7acefa9ede7e3 @@ -0,0 +1 @@ +{"tx": "7cd259480160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ca00000000e0fec3de04d7741000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87aa000000", "prevouts": ["722c13000000000017a91448964eab407ad5d6e123f59d9280ca7998f71bce87"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "2351212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "witness": ["9c54e3358dc40fff5b6eaab0a7356c6e097a91d7d87aadd4a30d61eb9667964d011eafb4a8a5867f537a947468abeb8c238a1a7c6b9953215dcf3ff5b714520d", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/100be162498b413ca391dea2387d07097432e64b b/txscript/data/taproot-ref/100be162498b413ca391dea2387d07097432e64b new file mode 100644 index 0000000000..8a672d5931 --- /dev/null +++ b/txscript/data/taproot-ref/100be162498b413ca391dea2387d07097432e64b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/101afec325ccd0ecfd32b22bcb5ddb64cbc1c497 b/txscript/data/taproot-ref/101afec325ccd0ecfd32b22bcb5ddb64cbc1c497 new file mode 100644 index 0000000000..4154debf42 --- /dev/null +++ b/txscript/data/taproot-ref/101afec325ccd0ecfd32b22bcb5ddb64cbc1c497 @@ -0,0 +1 @@ +{"tx": "0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf070000000062aabd978bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f10000000022d1bc9003560c960000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acb3c81660", "prevouts": ["78b26200000000002251203dc2472455090bb3a6b10d2b5a6f86a9b76268c5f2a3511c1c846486e45d4259", "1625360000000000235d212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["e92d8101c980eff4377e6d8955a6be6eb9c513a73b76b0c2865d9217ecc002952e790d9c1b6d4873f01b62966c2e29a6c5c67d56950c0adb21878e7ce72b19ad", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/102f84dec76aa32c7c32a67b8398d3433fd9c124 b/txscript/data/taproot-ref/102f84dec76aa32c7c32a67b8398d3433fd9c124 new file mode 100644 index 0000000000..f53c7f0056 --- /dev/null +++ b/txscript/data/taproot-ref/102f84dec76aa32c7c32a67b8398d3433fd9c124 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/10549677366e93a6b247cf85ef6b109794e927a0 b/txscript/data/taproot-ref/10549677366e93a6b247cf85ef6b109794e927a0 new file mode 100644 index 0000000000..630d8b7620 --- /dev/null +++ b/txscript/data/taproot-ref/10549677366e93a6b247cf85ef6b109794e927a0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/10624dd984bc11b57e154d0125049824624ef4b9 b/txscript/data/taproot-ref/10624dd984bc11b57e154d0125049824624ef4b9 new file mode 100644 index 0000000000..0e0b8dcc6f --- /dev/null +++ b/txscript/data/taproot-ref/10624dd984bc11b57e154d0125049824624ef4b9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/106f9a1f4925d539eab0171af97bfe996099ad01 b/txscript/data/taproot-ref/106f9a1f4925d539eab0171af97bfe996099ad01 new file mode 100644 index 0000000000..35f6b5b8c0 --- /dev/null +++ b/txscript/data/taproot-ref/106f9a1f4925d539eab0171af97bfe996099ad01 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/107e2cdcdfabb3aca2ab5aa2fd3c97288ca30c94 b/txscript/data/taproot-ref/107e2cdcdfabb3aca2ab5aa2fd3c97288ca30c94 new file mode 100644 index 0000000000..e6a4cd767a --- /dev/null +++ b/txscript/data/taproot-ref/107e2cdcdfabb3aca2ab5aa2fd3c97288ca30c94 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/109b57979771e9a623eab0dbd365a6eb604e4d39 b/txscript/data/taproot-ref/109b57979771e9a623eab0dbd365a6eb604e4d39 new file mode 100644 index 0000000000..0f768930ac --- /dev/null +++ b/txscript/data/taproot-ref/109b57979771e9a623eab0dbd365a6eb604e4d39 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/10a884685231a301c2628f0607b449081b250ab5 b/txscript/data/taproot-ref/10a884685231a301c2628f0607b449081b250ab5 new file mode 100644 index 0000000000..d1305a389a --- /dev/null +++ b/txscript/data/taproot-ref/10a884685231a301c2628f0607b449081b250ab5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/10e147455c54d7bb8f4395e8f52666ee498a10a3 b/txscript/data/taproot-ref/10e147455c54d7bb8f4395e8f52666ee498a10a3 new file mode 100644 index 0000000000..0af3879521 --- /dev/null +++ b/txscript/data/taproot-ref/10e147455c54d7bb8f4395e8f52666ee498a10a3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/10e2ba2a40c7f4b5bbe26a0ae7a814ef9883672e b/txscript/data/taproot-ref/10e2ba2a40c7f4b5bbe26a0ae7a814ef9883672e new file mode 100644 index 0000000000..c45e5dbb12 --- /dev/null +++ b/txscript/data/taproot-ref/10e2ba2a40c7f4b5bbe26a0ae7a814ef9883672e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/10fefd7899096dc27cf05039ac9a172231d52173 b/txscript/data/taproot-ref/10fefd7899096dc27cf05039ac9a172231d52173 new file mode 100644 index 0000000000..4d4058831f --- /dev/null +++ b/txscript/data/taproot-ref/10fefd7899096dc27cf05039ac9a172231d52173 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1113b16ac0b3e4b76353eb896e7272061f03ff8c b/txscript/data/taproot-ref/1113b16ac0b3e4b76353eb896e7272061f03ff8c new file mode 100644 index 0000000000..d263ca3a1a --- /dev/null +++ b/txscript/data/taproot-ref/1113b16ac0b3e4b76353eb896e7272061f03ff8c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1131434b4bb6f2acbd59abb881c239975a1116af b/txscript/data/taproot-ref/1131434b4bb6f2acbd59abb881c239975a1116af new file mode 100644 index 0000000000..4d01af4871 --- /dev/null +++ b/txscript/data/taproot-ref/1131434b4bb6f2acbd59abb881c239975a1116af @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/117e130d533574c601aab37e70b93bae134a6527 b/txscript/data/taproot-ref/117e130d533574c601aab37e70b93bae134a6527 new file mode 100644 index 0000000000..4e7e796fb8 --- /dev/null +++ b/txscript/data/taproot-ref/117e130d533574c601aab37e70b93bae134a6527 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1184f4a41ef45af98fbb77736bcca10e157c347c b/txscript/data/taproot-ref/1184f4a41ef45af98fbb77736bcca10e157c347c new file mode 100644 index 0000000000..9348b20f38 --- /dev/null +++ b/txscript/data/taproot-ref/1184f4a41ef45af98fbb77736bcca10e157c347c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/118b63929e90757c8ca1ec818ecf53f8b71c70fb b/txscript/data/taproot-ref/118b63929e90757c8ca1ec818ecf53f8b71c70fb new file mode 100644 index 0000000000..514932c227 --- /dev/null +++ b/txscript/data/taproot-ref/118b63929e90757c8ca1ec818ecf53f8b71c70fb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/11b1f9db49bba588d8f418e89843ef901274fe93 b/txscript/data/taproot-ref/11b1f9db49bba588d8f418e89843ef901274fe93 new file mode 100644 index 0000000000..e4388e0a64 --- /dev/null +++ b/txscript/data/taproot-ref/11b1f9db49bba588d8f418e89843ef901274fe93 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/11e26aa15592a14b6f7dc59ed4225b0ceeca2418 b/txscript/data/taproot-ref/11e26aa15592a14b6f7dc59ed4225b0ceeca2418 new file mode 100644 index 0000000000..bff3ac7f39 --- /dev/null +++ b/txscript/data/taproot-ref/11e26aa15592a14b6f7dc59ed4225b0ceeca2418 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/11ef5be6a614ca068f2c89bc602378f8ce71d763 b/txscript/data/taproot-ref/11ef5be6a614ca068f2c89bc602378f8ce71d763 new file mode 100644 index 0000000000..0d47ab71ce --- /dev/null +++ b/txscript/data/taproot-ref/11ef5be6a614ca068f2c89bc602378f8ce71d763 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/121e9e0d61998a2f829c791e9f23a065b8ce683d b/txscript/data/taproot-ref/121e9e0d61998a2f829c791e9f23a065b8ce683d new file mode 100644 index 0000000000..70294a0dfd --- /dev/null +++ b/txscript/data/taproot-ref/121e9e0d61998a2f829c791e9f23a065b8ce683d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/122e57288341172f17f63e1689fc9a205e9e5905 b/txscript/data/taproot-ref/122e57288341172f17f63e1689fc9a205e9e5905 new file mode 100644 index 0000000000..0c9c9bf972 --- /dev/null +++ b/txscript/data/taproot-ref/122e57288341172f17f63e1689fc9a205e9e5905 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1260bed4953f82e80f379c79bc4484db28c58d8a b/txscript/data/taproot-ref/1260bed4953f82e80f379c79bc4484db28c58d8a new file mode 100644 index 0000000000..5b1effd2dc --- /dev/null +++ b/txscript/data/taproot-ref/1260bed4953f82e80f379c79bc4484db28c58d8a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/126e5c88c57ce073bc1e63e4306d21823db4b99a b/txscript/data/taproot-ref/126e5c88c57ce073bc1e63e4306d21823db4b99a new file mode 100644 index 0000000000..231b157283 --- /dev/null +++ b/txscript/data/taproot-ref/126e5c88c57ce073bc1e63e4306d21823db4b99a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/12bcaf48556b4780abcb73c4f32bd274ea7861bb b/txscript/data/taproot-ref/12bcaf48556b4780abcb73c4f32bd274ea7861bb new file mode 100644 index 0000000000..39b891d115 --- /dev/null +++ b/txscript/data/taproot-ref/12bcaf48556b4780abcb73c4f32bd274ea7861bb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/12e033c1a8f3298a775b13078a77bc8befe4567c b/txscript/data/taproot-ref/12e033c1a8f3298a775b13078a77bc8befe4567c new file mode 100644 index 0000000000..0b54fc4f66 --- /dev/null +++ b/txscript/data/taproot-ref/12e033c1a8f3298a775b13078a77bc8befe4567c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/12e5f4d526a722bc9b8f2af83ae028c8ee6b9027 b/txscript/data/taproot-ref/12e5f4d526a722bc9b8f2af83ae028c8ee6b9027 new file mode 100644 index 0000000000..f8d73c4a94 --- /dev/null +++ b/txscript/data/taproot-ref/12e5f4d526a722bc9b8f2af83ae028c8ee6b9027 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/12fada550b4d90c67f307a0d563ae38283c008fa b/txscript/data/taproot-ref/12fada550b4d90c67f307a0d563ae38283c008fa new file mode 100644 index 0000000000..b786902562 --- /dev/null +++ b/txscript/data/taproot-ref/12fada550b4d90c67f307a0d563ae38283c008fa @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/13080e256b05f38789902f0dbbc437401d15a3f2 b/txscript/data/taproot-ref/13080e256b05f38789902f0dbbc437401d15a3f2 new file mode 100644 index 0000000000..85c78d6751 --- /dev/null +++ b/txscript/data/taproot-ref/13080e256b05f38789902f0dbbc437401d15a3f2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1318e44a20cde77432578f5126e255855a0f8104 b/txscript/data/taproot-ref/1318e44a20cde77432578f5126e255855a0f8104 new file mode 100644 index 0000000000..2f1f78b2c3 --- /dev/null +++ b/txscript/data/taproot-ref/1318e44a20cde77432578f5126e255855a0f8104 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/131ec09b5ca700e6a035eb50138f6a7f62fe3f91 b/txscript/data/taproot-ref/131ec09b5ca700e6a035eb50138f6a7f62fe3f91 new file mode 100644 index 0000000000..0052738dff --- /dev/null +++ b/txscript/data/taproot-ref/131ec09b5ca700e6a035eb50138f6a7f62fe3f91 @@ -0,0 +1 @@ +{"tx": "0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc101000000c198db84bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfcb0000000017fde2f5039f7f8c00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8716010000", "prevouts": ["56ff250000000000225120d822e1bd1f5ea10d0aa44b8067d00045600d13617c1c35db91f3c0990a68d49e", "2f89680000000000165a142540f27e90740933c99d4f17ab2dfc6c82951cfb"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["22fd611b311bceb680b02d3c506b7a6490d3073e0978b21351e00df8c57b607f8ce0221a5601fa732041c9a4b1b47ca62499157edd71151ba4088699092959b6"]}}, diff --git a/txscript/data/taproot-ref/1337852e30e2d514c14e8123b84fadb9d4aa882f b/txscript/data/taproot-ref/1337852e30e2d514c14e8123b84fadb9d4aa882f new file mode 100644 index 0000000000..053bef4cb7 --- /dev/null +++ b/txscript/data/taproot-ref/1337852e30e2d514c14e8123b84fadb9d4aa882f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/136bc03e80bca2dc5f71c4fdf91e7d690eac78e2 b/txscript/data/taproot-ref/136bc03e80bca2dc5f71c4fdf91e7d690eac78e2 new file mode 100644 index 0000000000..f75db0e5fc --- /dev/null +++ b/txscript/data/taproot-ref/136bc03e80bca2dc5f71c4fdf91e7d690eac78e2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1390c111cc1ca46caab6bdee16d74dd49519fb4f b/txscript/data/taproot-ref/1390c111cc1ca46caab6bdee16d74dd49519fb4f new file mode 100644 index 0000000000..8607105458 --- /dev/null +++ b/txscript/data/taproot-ref/1390c111cc1ca46caab6bdee16d74dd49519fb4f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1395575564b7da66e3b458131eaed79bc605b605 b/txscript/data/taproot-ref/1395575564b7da66e3b458131eaed79bc605b605 new file mode 100644 index 0000000000..2eb50cd182 --- /dev/null +++ b/txscript/data/taproot-ref/1395575564b7da66e3b458131eaed79bc605b605 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/13c9792e4f626e8f900acfa50cf122a5f5f15030 b/txscript/data/taproot-ref/13c9792e4f626e8f900acfa50cf122a5f5f15030 new file mode 100644 index 0000000000..738fc02e48 --- /dev/null +++ b/txscript/data/taproot-ref/13c9792e4f626e8f900acfa50cf122a5f5f15030 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/13d37de420974d4290a6029f20175feb02e1106e b/txscript/data/taproot-ref/13d37de420974d4290a6029f20175feb02e1106e new file mode 100644 index 0000000000..a9c1730f7c --- /dev/null +++ b/txscript/data/taproot-ref/13d37de420974d4290a6029f20175feb02e1106e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/13d9b1cfc7b7864ec3f85c71a1046df30cc17b62 b/txscript/data/taproot-ref/13d9b1cfc7b7864ec3f85c71a1046df30cc17b62 new file mode 100644 index 0000000000..008fb53104 --- /dev/null +++ b/txscript/data/taproot-ref/13d9b1cfc7b7864ec3f85c71a1046df30cc17b62 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/13ecc0464cacec7245082422e8f3212d959e0fa9 b/txscript/data/taproot-ref/13ecc0464cacec7245082422e8f3212d959e0fa9 new file mode 100644 index 0000000000..b014c5e6c6 --- /dev/null +++ b/txscript/data/taproot-ref/13ecc0464cacec7245082422e8f3212d959e0fa9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/14450718a3a9e2266004b863df27746606f071ae b/txscript/data/taproot-ref/14450718a3a9e2266004b863df27746606f071ae new file mode 100644 index 0000000000..009937b569 --- /dev/null +++ b/txscript/data/taproot-ref/14450718a3a9e2266004b863df27746606f071ae @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/146b0be5a219a70b803fc5f82ded6f34e4cf7a6e b/txscript/data/taproot-ref/146b0be5a219a70b803fc5f82ded6f34e4cf7a6e new file mode 100644 index 0000000000..a5ebe4e192 --- /dev/null +++ b/txscript/data/taproot-ref/146b0be5a219a70b803fc5f82ded6f34e4cf7a6e @@ -0,0 +1 @@ +{"tx": "f66b5ce4038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c465000000005be9d6eedceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc300000000394663ffdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c08020000000e1b4af6047d16af000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a62067231f", "prevouts": ["3e80410000000000225120783dfb3310d474c767ef9239befe26bff1665135289516e5417abb1737338f98", "172323000000000022512056830ed1745d06f5c865a011820a618c1aa3c70bd00028049bf30f33c5c664cc", "8d5d4c000000000017a9141757f4686f091b43a46fa47e92d07c87fc7a205e87"], "index": 2, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "165f142540f27e90740933c99d4f17ab2dfc6c82951cfb", "witness": ["63b2ebbc764413c404afcf95e5f700ede4e39144ace8feaf943a413b057ec4448b8eb76fd6be2329a202b567268662569010b636e4fef4c7429523b227dbb93b"]}}, diff --git a/txscript/data/taproot-ref/1477a76ad0e64b74908b0f8a89549c7cf7190288 b/txscript/data/taproot-ref/1477a76ad0e64b74908b0f8a89549c7cf7190288 new file mode 100644 index 0000000000..7486404c5c --- /dev/null +++ b/txscript/data/taproot-ref/1477a76ad0e64b74908b0f8a89549c7cf7190288 @@ -0,0 +1 @@ +{"tx": "0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c130200000021444841dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3a0100000069712e0e01f62b6b000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787a59c0849", "prevouts": ["bf775c00000000002251203dc36bb5a2188e61583976906c69e4e1213b5b3aef7eaef25acff80132ded84f", "e8922000000000002260202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["3a3c590ec08cdb332be8e81f48a4b67e15e9fa330c9c6e57183c9027fa4272edc0c23e4668924216c7e09268bbbdc2dcf74344cc96681f2268e9affdffe701a0"]}}, diff --git a/txscript/data/taproot-ref/1493716a3ca7c3194959cd177b8dd531b04b0b9f b/txscript/data/taproot-ref/1493716a3ca7c3194959cd177b8dd531b04b0b9f new file mode 100644 index 0000000000..4dde4a4337 --- /dev/null +++ b/txscript/data/taproot-ref/1493716a3ca7c3194959cd177b8dd531b04b0b9f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/149679a6778ca49110eaeac21b33cd449242eb91 b/txscript/data/taproot-ref/149679a6778ca49110eaeac21b33cd449242eb91 new file mode 100644 index 0000000000..328132de03 --- /dev/null +++ b/txscript/data/taproot-ref/149679a6778ca49110eaeac21b33cd449242eb91 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/149bceae555709818ddc8eb34d3cf4b508780b88 b/txscript/data/taproot-ref/149bceae555709818ddc8eb34d3cf4b508780b88 new file mode 100644 index 0000000000..c45245eb7f --- /dev/null +++ b/txscript/data/taproot-ref/149bceae555709818ddc8eb34d3cf4b508780b88 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/14a9e9b7200758410bd419f2b0954ec253e17889 b/txscript/data/taproot-ref/14a9e9b7200758410bd419f2b0954ec253e17889 new file mode 100644 index 0000000000..f6b3df58c0 --- /dev/null +++ b/txscript/data/taproot-ref/14a9e9b7200758410bd419f2b0954ec253e17889 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/14b46e9b808aa20b426e21803aebd6efffef133f b/txscript/data/taproot-ref/14b46e9b808aa20b426e21803aebd6efffef133f new file mode 100644 index 0000000000..2761fc6d4a --- /dev/null +++ b/txscript/data/taproot-ref/14b46e9b808aa20b426e21803aebd6efffef133f @@ -0,0 +1 @@ +{"tx": "0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8100000000cd228e8dbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa4000000004c9db3ce04ea51bf000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a60d000000", "prevouts": ["11384c0000000000225120da5b2ed68dc062d9fd59cecba48d2679c72738370140766f8e961cb8717de4a7", "6aa37400000000001659142540f27e90740933c99d4f17ab2dfc6c82951cfb"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["9a1626105ce106bafb1b13e47bcbc07de6a37e6f07b467c39d053d20253c064f39d7f135eaeb21eb50f1b7ae032cd0a1a96a4593bcba4e4f277fe871479c0a10"]}}, diff --git a/txscript/data/taproot-ref/14b583f6a2bb67ac548a6daf674748880c14916c b/txscript/data/taproot-ref/14b583f6a2bb67ac548a6daf674748880c14916c new file mode 100644 index 0000000000..a79f5974d6 --- /dev/null +++ b/txscript/data/taproot-ref/14b583f6a2bb67ac548a6daf674748880c14916c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/14bac90ea6a6692cf7202b96a1c18e47f81a055a b/txscript/data/taproot-ref/14bac90ea6a6692cf7202b96a1c18e47f81a055a new file mode 100644 index 0000000000..d64044cbaf --- /dev/null +++ b/txscript/data/taproot-ref/14bac90ea6a6692cf7202b96a1c18e47f81a055a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/14d0d7bc3443d31977bc6035b1a9bce2c6dc9114 b/txscript/data/taproot-ref/14d0d7bc3443d31977bc6035b1a9bce2c6dc9114 new file mode 100644 index 0000000000..449e3c23fe --- /dev/null +++ b/txscript/data/taproot-ref/14d0d7bc3443d31977bc6035b1a9bce2c6dc9114 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/14d9a8a4291206e2c4d73120dc485bd077e5f66d b/txscript/data/taproot-ref/14d9a8a4291206e2c4d73120dc485bd077e5f66d new file mode 100644 index 0000000000..fcb097f6e1 --- /dev/null +++ b/txscript/data/taproot-ref/14d9a8a4291206e2c4d73120dc485bd077e5f66d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/14ffecf99f50d1adde6ff14120965c878f744781 b/txscript/data/taproot-ref/14ffecf99f50d1adde6ff14120965c878f744781 new file mode 100644 index 0000000000..c80be6fb54 --- /dev/null +++ b/txscript/data/taproot-ref/14ffecf99f50d1adde6ff14120965c878f744781 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/15032320c16e26b0069cf1571846247d073f2efe b/txscript/data/taproot-ref/15032320c16e26b0069cf1571846247d073f2efe new file mode 100644 index 0000000000..5f94bd2804 --- /dev/null +++ b/txscript/data/taproot-ref/15032320c16e26b0069cf1571846247d073f2efe @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/150b2d12becd542c0352fdc80bbd85c2901d8228 b/txscript/data/taproot-ref/150b2d12becd542c0352fdc80bbd85c2901d8228 new file mode 100644 index 0000000000..9394805535 --- /dev/null +++ b/txscript/data/taproot-ref/150b2d12becd542c0352fdc80bbd85c2901d8228 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/152491c8478252c98640ae41d5813cd6cc4800a4 b/txscript/data/taproot-ref/152491c8478252c98640ae41d5813cd6cc4800a4 new file mode 100644 index 0000000000..626399597a --- /dev/null +++ b/txscript/data/taproot-ref/152491c8478252c98640ae41d5813cd6cc4800a4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1532d9cb1517dd25a5c8a93eb64d3962a52cf4cd b/txscript/data/taproot-ref/1532d9cb1517dd25a5c8a93eb64d3962a52cf4cd new file mode 100644 index 0000000000..4248146231 --- /dev/null +++ b/txscript/data/taproot-ref/1532d9cb1517dd25a5c8a93eb64d3962a52cf4cd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/154147c0c82e41a7cfdb7b8295df125020cd7113 b/txscript/data/taproot-ref/154147c0c82e41a7cfdb7b8295df125020cd7113 new file mode 100644 index 0000000000..8a37e0a942 --- /dev/null +++ b/txscript/data/taproot-ref/154147c0c82e41a7cfdb7b8295df125020cd7113 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/154b30ae55351cbd129d9b1b6a6311572840bb26 b/txscript/data/taproot-ref/154b30ae55351cbd129d9b1b6a6311572840bb26 new file mode 100644 index 0000000000..2f5aee4c43 --- /dev/null +++ b/txscript/data/taproot-ref/154b30ae55351cbd129d9b1b6a6311572840bb26 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/15541041a721e558c8cfa7f4ee5f4d09fa6c9065 b/txscript/data/taproot-ref/15541041a721e558c8cfa7f4ee5f4d09fa6c9065 new file mode 100644 index 0000000000..370a64de46 --- /dev/null +++ b/txscript/data/taproot-ref/15541041a721e558c8cfa7f4ee5f4d09fa6c9065 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/157183c1796c9575b6c576a29c98f58fbd42356c b/txscript/data/taproot-ref/157183c1796c9575b6c576a29c98f58fbd42356c new file mode 100644 index 0000000000..80171c7c0d --- /dev/null +++ b/txscript/data/taproot-ref/157183c1796c9575b6c576a29c98f58fbd42356c @@ -0,0 +1 @@ +{"tx": "0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc900000000f2275ef2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565caf01000000fc57e8f90367dc99000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acba7c1440", "prevouts": ["6647510000000000225120398f9b6183163c03ad23a14c61a29f1667ce990766f9351cc380767011c973dd", "52934b000000000017a91418261fd2fa0b0480c86b918607add1dde9f7026a87"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "2255202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "witness": ["759bd5b16f8435ff1e784f79b0f1bd4de1590a1e54f0536d6d84bab4e8c903d81915781366fe51dfe410e656b2d5f3f89e7374de4e49700275cd296eadcc2b08"]}}, diff --git a/txscript/data/taproot-ref/1571fe984911dc73398ce28defbf71e715958a81 b/txscript/data/taproot-ref/1571fe984911dc73398ce28defbf71e715958a81 new file mode 100644 index 0000000000..f60986cd7f --- /dev/null +++ b/txscript/data/taproot-ref/1571fe984911dc73398ce28defbf71e715958a81 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/157aebc161b66c638243c0a814262c48979b21de b/txscript/data/taproot-ref/157aebc161b66c638243c0a814262c48979b21de new file mode 100644 index 0000000000..e2249034f9 --- /dev/null +++ b/txscript/data/taproot-ref/157aebc161b66c638243c0a814262c48979b21de @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/15b38d795c9bb9ef573b4d2b1ec4af8fc0cd8fb6 b/txscript/data/taproot-ref/15b38d795c9bb9ef573b4d2b1ec4af8fc0cd8fb6 new file mode 100644 index 0000000000..1dede99c1b --- /dev/null +++ b/txscript/data/taproot-ref/15b38d795c9bb9ef573b4d2b1ec4af8fc0cd8fb6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/15bed2762ca16694fce3754fdcb0fe404484b18c b/txscript/data/taproot-ref/15bed2762ca16694fce3754fdcb0fe404484b18c new file mode 100644 index 0000000000..2bc9b9f928 --- /dev/null +++ b/txscript/data/taproot-ref/15bed2762ca16694fce3754fdcb0fe404484b18c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/15d389f49e1f412ed725252d3ee81230a2e81cd0 b/txscript/data/taproot-ref/15d389f49e1f412ed725252d3ee81230a2e81cd0 new file mode 100644 index 0000000000..ee828641b2 --- /dev/null +++ b/txscript/data/taproot-ref/15d389f49e1f412ed725252d3ee81230a2e81cd0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/15fcafcc7469d59709774013df0fd9633e820008 b/txscript/data/taproot-ref/15fcafcc7469d59709774013df0fd9633e820008 new file mode 100644 index 0000000000..fb5d98321d --- /dev/null +++ b/txscript/data/taproot-ref/15fcafcc7469d59709774013df0fd9633e820008 @@ -0,0 +1 @@ +{"tx": "02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47d01000000bf12ba80dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0e020000007eaf3ef5041e8d5500000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79693000000", "prevouts": ["fd043300000000002251207ecf5669449c43a088571b8452d22be90b9f1c03aea1b9900f46f7b654cd7ae5", "0f3225000000000017a914a5f28fe5532719f979169bfa3a31d5746f69452187"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "2357212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "witness": ["b8be758fe2d28e7fbfa6f2359efe0fbfe093c11e11aa89a0f25e978fccaabc764e37fb378db09249e7a5fd824831cb3af1a1074bb5d25e5c7d8aa5c537fe4a1a"]}}, diff --git a/txscript/data/taproot-ref/16128f27ae921b87284e0eab75845884e009c865 b/txscript/data/taproot-ref/16128f27ae921b87284e0eab75845884e009c865 new file mode 100644 index 0000000000..a23292e43b --- /dev/null +++ b/txscript/data/taproot-ref/16128f27ae921b87284e0eab75845884e009c865 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1630122f5bef1592ca6b6280297bd620d8ce0ab9 b/txscript/data/taproot-ref/1630122f5bef1592ca6b6280297bd620d8ce0ab9 new file mode 100644 index 0000000000..494eb3382d --- /dev/null +++ b/txscript/data/taproot-ref/1630122f5bef1592ca6b6280297bd620d8ce0ab9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/164113b42e586e2e8ce7bb6fccef9f52a5136708 b/txscript/data/taproot-ref/164113b42e586e2e8ce7bb6fccef9f52a5136708 new file mode 100644 index 0000000000..048b62ee11 --- /dev/null +++ b/txscript/data/taproot-ref/164113b42e586e2e8ce7bb6fccef9f52a5136708 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/164178c636e1e1ccfbe67f53e9209ff1c0e8584a b/txscript/data/taproot-ref/164178c636e1e1ccfbe67f53e9209ff1c0e8584a new file mode 100644 index 0000000000..c631010b0a --- /dev/null +++ b/txscript/data/taproot-ref/164178c636e1e1ccfbe67f53e9209ff1c0e8584a @@ -0,0 +1 @@ +{"tx": "02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ed01000000980d4ec98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40a02000000fb01bfe604d937760000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48738fdec36", "prevouts": ["e7e9370000000000225120fa8a9eda5cf5b8cdf600ff6d95d78a3e3ba730f4e5093bedd0b749c08f958e88", "685f4000000000002354212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["3d601f5f6580ecb01eec7c5ead52441fe44b531ab6ae99d3e697404822425e8759146b1c6992eab52d5279feeba4f7cfe79e2d5a51c026de49302c2f6e01d653", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/16431b60ce2185dc8a3e19f1b9325a1078131515 b/txscript/data/taproot-ref/16431b60ce2185dc8a3e19f1b9325a1078131515 new file mode 100644 index 0000000000..c21cfe87ee --- /dev/null +++ b/txscript/data/taproot-ref/16431b60ce2185dc8a3e19f1b9325a1078131515 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1658b5c8f7c6d3672d694462a7f53ad3f3596d38 b/txscript/data/taproot-ref/1658b5c8f7c6d3672d694462a7f53ad3f3596d38 new file mode 100644 index 0000000000..759d76b03d --- /dev/null +++ b/txscript/data/taproot-ref/1658b5c8f7c6d3672d694462a7f53ad3f3596d38 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/166cd55c33178000f9e3e3b366ace5266964a5c3 b/txscript/data/taproot-ref/166cd55c33178000f9e3e3b366ace5266964a5c3 new file mode 100644 index 0000000000..1db82cae40 --- /dev/null +++ b/txscript/data/taproot-ref/166cd55c33178000f9e3e3b366ace5266964a5c3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/167a4033a1f4c30b87898758c3868c1025df1694 b/txscript/data/taproot-ref/167a4033a1f4c30b87898758c3868c1025df1694 new file mode 100644 index 0000000000..f5a51116dc --- /dev/null +++ b/txscript/data/taproot-ref/167a4033a1f4c30b87898758c3868c1025df1694 @@ -0,0 +1 @@ +{"tx": "7b13900c02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b76010000009ad734fedff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4b01000000c5b820b103cef56b000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e745000000", "prevouts": ["0177270000000000225120c4289f295f2323e1a679e2ac23fa4ce9cef8c78af5f55473b4c272e984282d2e", "43f5460000000000165e142540f27e90740933c99d4f17ab2dfc6c82951cfb"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["205b562ceece4892dab2aaa5b4dd4c3220d2e3d2ed8890be47773502094f216601464380447c2983866fc6c4301cef32ad64a9c377f25b1fcd583377c253b449"]}}, diff --git a/txscript/data/taproot-ref/167fe32905b764460a1199e4a4ab3d84ef186e2e b/txscript/data/taproot-ref/167fe32905b764460a1199e4a4ab3d84ef186e2e new file mode 100644 index 0000000000..668df5ea03 --- /dev/null +++ b/txscript/data/taproot-ref/167fe32905b764460a1199e4a4ab3d84ef186e2e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1680d648bb0d496b0b5cdc71bd31f42d092b5e31 b/txscript/data/taproot-ref/1680d648bb0d496b0b5cdc71bd31f42d092b5e31 new file mode 100644 index 0000000000..34e7274011 --- /dev/null +++ b/txscript/data/taproot-ref/1680d648bb0d496b0b5cdc71bd31f42d092b5e31 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/168c2988106ea01a8121eba649b024715de5122f b/txscript/data/taproot-ref/168c2988106ea01a8121eba649b024715de5122f new file mode 100644 index 0000000000..e9333099c0 --- /dev/null +++ b/txscript/data/taproot-ref/168c2988106ea01a8121eba649b024715de5122f @@ -0,0 +1 @@ +{"tx": "ab01e604018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49e000000002f2cd5fb03a4a13a00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796a481275b", "prevouts": ["f5363d000000000017a914f7f3eae48087a4952a984cf9c1f2f12f8785754687"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "2253202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "witness": ["c2cd116515da87b99de2601d6f479891cd5d8247cff7df2366f63237c6a7fe39aec53d853fdcde99e72311c5be6ba75778f6e11065c44bce3ac9a74220eb997b"]}}, diff --git a/txscript/data/taproot-ref/16acfa58909fa72c2eecfaacc8866e7dd1f42fda b/txscript/data/taproot-ref/16acfa58909fa72c2eecfaacc8866e7dd1f42fda new file mode 100644 index 0000000000..23278d20aa --- /dev/null +++ b/txscript/data/taproot-ref/16acfa58909fa72c2eecfaacc8866e7dd1f42fda @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/16b2bf568fa5aa6e4b5de39fd290f6de49b091ec b/txscript/data/taproot-ref/16b2bf568fa5aa6e4b5de39fd290f6de49b091ec new file mode 100644 index 0000000000..ea0bdc6896 --- /dev/null +++ b/txscript/data/taproot-ref/16b2bf568fa5aa6e4b5de39fd290f6de49b091ec @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/16c6bf5c5a6caf8746580f9e01ec4e218a4c0e39 b/txscript/data/taproot-ref/16c6bf5c5a6caf8746580f9e01ec4e218a4c0e39 new file mode 100644 index 0000000000..ad0d94abf8 --- /dev/null +++ b/txscript/data/taproot-ref/16c6bf5c5a6caf8746580f9e01ec4e218a4c0e39 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/16ecdda3d618db946d6033f96c780764642e0471 b/txscript/data/taproot-ref/16ecdda3d618db946d6033f96c780764642e0471 new file mode 100644 index 0000000000..2aed1c5ac8 --- /dev/null +++ b/txscript/data/taproot-ref/16ecdda3d618db946d6033f96c780764642e0471 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/16f6f25ce07eadca0f3c82818b8910b5006b6aa5 b/txscript/data/taproot-ref/16f6f25ce07eadca0f3c82818b8910b5006b6aa5 new file mode 100644 index 0000000000..5fac9b9aca --- /dev/null +++ b/txscript/data/taproot-ref/16f6f25ce07eadca0f3c82818b8910b5006b6aa5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1715e26f824103c322e360c6d3c237781724ca4e b/txscript/data/taproot-ref/1715e26f824103c322e360c6d3c237781724ca4e new file mode 100644 index 0000000000..65c29eb0d7 --- /dev/null +++ b/txscript/data/taproot-ref/1715e26f824103c322e360c6d3c237781724ca4e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/172062063b7ae63dcffacdd6b98414054d06633e b/txscript/data/taproot-ref/172062063b7ae63dcffacdd6b98414054d06633e new file mode 100644 index 0000000000..bccb6f98ee --- /dev/null +++ b/txscript/data/taproot-ref/172062063b7ae63dcffacdd6b98414054d06633e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/172b85f2524cbd3f0ca1a41380566b1648c8c405 b/txscript/data/taproot-ref/172b85f2524cbd3f0ca1a41380566b1648c8c405 new file mode 100644 index 0000000000..3d9005f03d --- /dev/null +++ b/txscript/data/taproot-ref/172b85f2524cbd3f0ca1a41380566b1648c8c405 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/172ff5cf4d0d01f9ac160be767a1b233dea05ffa b/txscript/data/taproot-ref/172ff5cf4d0d01f9ac160be767a1b233dea05ffa new file mode 100644 index 0000000000..9a0c0e1d10 --- /dev/null +++ b/txscript/data/taproot-ref/172ff5cf4d0d01f9ac160be767a1b233dea05ffa @@ -0,0 +1 @@ +{"tx": "01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4660000000079caaceddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9400000000319a8008014ac71c000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a631000000", "prevouts": ["e90e370000000000225e202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "72f2250000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["f0cef00457cf698bf2d34dd5b5a0ded84464a8bcf9886cccb35a292ef580e492c3abd449cb085d9914f672edae5d0c926025942789a99731e7c216170ad41de7"]}}, diff --git a/txscript/data/taproot-ref/17405fca2ae8f08cec8849c6a750217abef9ff89 b/txscript/data/taproot-ref/17405fca2ae8f08cec8849c6a750217abef9ff89 new file mode 100644 index 0000000000..374642adb8 --- /dev/null +++ b/txscript/data/taproot-ref/17405fca2ae8f08cec8849c6a750217abef9ff89 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/177f3355a5b98fe40607bd5da8383d7129c515d5 b/txscript/data/taproot-ref/177f3355a5b98fe40607bd5da8383d7129c515d5 new file mode 100644 index 0000000000..7bff305791 --- /dev/null +++ b/txscript/data/taproot-ref/177f3355a5b98fe40607bd5da8383d7129c515d5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/177f56a1fdc5cc3198a785f6f5e7a55d8c324f16 b/txscript/data/taproot-ref/177f56a1fdc5cc3198a785f6f5e7a55d8c324f16 new file mode 100644 index 0000000000..50ab04dcae --- /dev/null +++ b/txscript/data/taproot-ref/177f56a1fdc5cc3198a785f6f5e7a55d8c324f16 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/179b29b5e6ade731ba119866f25b6743232bd3ec b/txscript/data/taproot-ref/179b29b5e6ade731ba119866f25b6743232bd3ec new file mode 100644 index 0000000000..4ea5a07259 --- /dev/null +++ b/txscript/data/taproot-ref/179b29b5e6ade731ba119866f25b6743232bd3ec @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/17b2c3c5c8f5c6d4e3b517021c8e26c982fc552f b/txscript/data/taproot-ref/17b2c3c5c8f5c6d4e3b517021c8e26c982fc552f new file mode 100644 index 0000000000..1074793d49 --- /dev/null +++ b/txscript/data/taproot-ref/17b2c3c5c8f5c6d4e3b517021c8e26c982fc552f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/17cd80eebaac8182716c6996ad037efac35af699 b/txscript/data/taproot-ref/17cd80eebaac8182716c6996ad037efac35af699 new file mode 100644 index 0000000000..9180d55bed --- /dev/null +++ b/txscript/data/taproot-ref/17cd80eebaac8182716c6996ad037efac35af699 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/17fccd13627419da75dd075f405d0c40a09c652d b/txscript/data/taproot-ref/17fccd13627419da75dd075f405d0c40a09c652d new file mode 100644 index 0000000000..7c99074b2a --- /dev/null +++ b/txscript/data/taproot-ref/17fccd13627419da75dd075f405d0c40a09c652d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/184dbb048070da2a1db945f29853600246189da2 b/txscript/data/taproot-ref/184dbb048070da2a1db945f29853600246189da2 new file mode 100644 index 0000000000..c0f14f40ce --- /dev/null +++ b/txscript/data/taproot-ref/184dbb048070da2a1db945f29853600246189da2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/186d4e3b056dbde38d01af9a2095f2b550b930bb b/txscript/data/taproot-ref/186d4e3b056dbde38d01af9a2095f2b550b930bb new file mode 100644 index 0000000000..31ac84481f --- /dev/null +++ b/txscript/data/taproot-ref/186d4e3b056dbde38d01af9a2095f2b550b930bb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1870a7b0cbdbdbcb7e9f1d248928fe0dca885fbe b/txscript/data/taproot-ref/1870a7b0cbdbdbcb7e9f1d248928fe0dca885fbe new file mode 100644 index 0000000000..b868a45959 --- /dev/null +++ b/txscript/data/taproot-ref/1870a7b0cbdbdbcb7e9f1d248928fe0dca885fbe @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1878d0c6c90056867949699c2702dab1671a5739 b/txscript/data/taproot-ref/1878d0c6c90056867949699c2702dab1671a5739 new file mode 100644 index 0000000000..7ce1093e34 --- /dev/null +++ b/txscript/data/taproot-ref/1878d0c6c90056867949699c2702dab1671a5739 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/187dc420ad18b5fb75f0f40dcfa22e824b23bbd4 b/txscript/data/taproot-ref/187dc420ad18b5fb75f0f40dcfa22e824b23bbd4 new file mode 100644 index 0000000000..7b405070ad --- /dev/null +++ b/txscript/data/taproot-ref/187dc420ad18b5fb75f0f40dcfa22e824b23bbd4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/18822bf70764f3c01f808cd81031bdaa811edcaa b/txscript/data/taproot-ref/18822bf70764f3c01f808cd81031bdaa811edcaa new file mode 100644 index 0000000000..3a2cba2fbd --- /dev/null +++ b/txscript/data/taproot-ref/18822bf70764f3c01f808cd81031bdaa811edcaa @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/189034044dacfcbaac5a98bbd0a33a369683d2d8 b/txscript/data/taproot-ref/189034044dacfcbaac5a98bbd0a33a369683d2d8 new file mode 100644 index 0000000000..3830f52e2b --- /dev/null +++ b/txscript/data/taproot-ref/189034044dacfcbaac5a98bbd0a33a369683d2d8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1891c772f3ce8c760b0cf1b52164fe1d2e4ce605 b/txscript/data/taproot-ref/1891c772f3ce8c760b0cf1b52164fe1d2e4ce605 new file mode 100644 index 0000000000..a1dadfd94e --- /dev/null +++ b/txscript/data/taproot-ref/1891c772f3ce8c760b0cf1b52164fe1d2e4ce605 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1894c4ad4a51725e14a4b3ca4124be935f442f98 b/txscript/data/taproot-ref/1894c4ad4a51725e14a4b3ca4124be935f442f98 new file mode 100644 index 0000000000..1624b4f5e3 --- /dev/null +++ b/txscript/data/taproot-ref/1894c4ad4a51725e14a4b3ca4124be935f442f98 @@ -0,0 +1 @@ +{"tx": "861c712d018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4fc000000005f5df3da046a193e000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acb2ca1426", "prevouts": ["23a04000000000001660142540f27e90740933c99d4f17ab2dfc6c82951cfb"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["782efbd86b045ff3423e869c9ff729134d2e2d6d42e34893fc9b54481a272a287e205fb3b5b7bb34ba9e49ffb3340109bc34e99ed3b092d8aecdf643e6de7a31"]}}, diff --git a/txscript/data/taproot-ref/1899c6c029807a2b6fb9c8709343768c03f3405b b/txscript/data/taproot-ref/1899c6c029807a2b6fb9c8709343768c03f3405b new file mode 100644 index 0000000000..4b343aed22 --- /dev/null +++ b/txscript/data/taproot-ref/1899c6c029807a2b6fb9c8709343768c03f3405b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/18ae04d1c49da35415f8e30e1757321ada62e83c b/txscript/data/taproot-ref/18ae04d1c49da35415f8e30e1757321ada62e83c new file mode 100644 index 0000000000..c5e1dc4929 --- /dev/null +++ b/txscript/data/taproot-ref/18ae04d1c49da35415f8e30e1757321ada62e83c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/18cd769c18f505e8bc05856ed71e114b5bd9a022 b/txscript/data/taproot-ref/18cd769c18f505e8bc05856ed71e114b5bd9a022 new file mode 100644 index 0000000000..77e100191b --- /dev/null +++ b/txscript/data/taproot-ref/18cd769c18f505e8bc05856ed71e114b5bd9a022 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/19056ae532d1819a4355eff6310ab655a5030df5 b/txscript/data/taproot-ref/19056ae532d1819a4355eff6310ab655a5030df5 new file mode 100644 index 0000000000..3ffb9d5167 --- /dev/null +++ b/txscript/data/taproot-ref/19056ae532d1819a4355eff6310ab655a5030df5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/190cfc23dd00d10a83315e6bc368d40445cd322f b/txscript/data/taproot-ref/190cfc23dd00d10a83315e6bc368d40445cd322f new file mode 100644 index 0000000000..e531d9ae9d --- /dev/null +++ b/txscript/data/taproot-ref/190cfc23dd00d10a83315e6bc368d40445cd322f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/190dca39f195f8973c60e414fa6fa6aacd3d9290 b/txscript/data/taproot-ref/190dca39f195f8973c60e414fa6fa6aacd3d9290 new file mode 100644 index 0000000000..cde8bd0028 --- /dev/null +++ b/txscript/data/taproot-ref/190dca39f195f8973c60e414fa6fa6aacd3d9290 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/191602968fa2af7edef6e40a0c4e4b9e4ef4cd75 b/txscript/data/taproot-ref/191602968fa2af7edef6e40a0c4e4b9e4ef4cd75 new file mode 100644 index 0000000000..80c4c5afdf --- /dev/null +++ b/txscript/data/taproot-ref/191602968fa2af7edef6e40a0c4e4b9e4ef4cd75 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/194da7e8add6b9a1ecf41a75f040b4611f016a09 b/txscript/data/taproot-ref/194da7e8add6b9a1ecf41a75f040b4611f016a09 new file mode 100644 index 0000000000..d2153823b7 --- /dev/null +++ b/txscript/data/taproot-ref/194da7e8add6b9a1ecf41a75f040b4611f016a09 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1969e36c75fe223b6de50a2e92c6ce56dd4915a3 b/txscript/data/taproot-ref/1969e36c75fe223b6de50a2e92c6ce56dd4915a3 new file mode 100644 index 0000000000..fb87e2a509 --- /dev/null +++ b/txscript/data/taproot-ref/1969e36c75fe223b6de50a2e92c6ce56dd4915a3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1970570c77db050bc51d853165e59487dd05c1a7 b/txscript/data/taproot-ref/1970570c77db050bc51d853165e59487dd05c1a7 new file mode 100644 index 0000000000..1a466951ab --- /dev/null +++ b/txscript/data/taproot-ref/1970570c77db050bc51d853165e59487dd05c1a7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/197071c336e5f96eeccaa2d253d5c00e0ac7febc b/txscript/data/taproot-ref/197071c336e5f96eeccaa2d253d5c00e0ac7febc new file mode 100644 index 0000000000..a4849b2ca5 --- /dev/null +++ b/txscript/data/taproot-ref/197071c336e5f96eeccaa2d253d5c00e0ac7febc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/197a3fa4a03436efcb2a86e1f8cbb45de1371615 b/txscript/data/taproot-ref/197a3fa4a03436efcb2a86e1f8cbb45de1371615 new file mode 100644 index 0000000000..041446560b --- /dev/null +++ b/txscript/data/taproot-ref/197a3fa4a03436efcb2a86e1f8cbb45de1371615 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/19928329d12601dfd9c4a12541e9799fefb5439e b/txscript/data/taproot-ref/19928329d12601dfd9c4a12541e9799fefb5439e new file mode 100644 index 0000000000..29eb76aa9f --- /dev/null +++ b/txscript/data/taproot-ref/19928329d12601dfd9c4a12541e9799fefb5439e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/19a982b7ff350572fab07d8c7397bd3e8f2cc04b b/txscript/data/taproot-ref/19a982b7ff350572fab07d8c7397bd3e8f2cc04b new file mode 100644 index 0000000000..395d25b59b --- /dev/null +++ b/txscript/data/taproot-ref/19a982b7ff350572fab07d8c7397bd3e8f2cc04b @@ -0,0 +1 @@ +{"tx": "0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1f0100000024be6dac60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708101000000ce3435b90165bf2400000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac4f45d043", "prevouts": ["f8be21000000000017a9141582f8bc3490e924b143f387e99eced40303eaed87", "53cf10000000000022512081fe6bd81c93a76bc00ce825f56a69a98e925b76c72731e1070d37ac4d963490"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "2355212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "witness": ["39c95c28eef2d86ff7f805a2e33b30e4b9f33c8c4109928d9a3ac762aad41698a79804c1f7bf30b80dea6d323e1a673df445e3797ec0186de2c1c550eef58e3d"]}}, diff --git a/txscript/data/taproot-ref/19b94494f911d6c8dffa42a0570e686d8d385d0e b/txscript/data/taproot-ref/19b94494f911d6c8dffa42a0570e686d8d385d0e new file mode 100644 index 0000000000..d25218a771 --- /dev/null +++ b/txscript/data/taproot-ref/19b94494f911d6c8dffa42a0570e686d8d385d0e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/19ce749d29e4620af1b8364a70b233842f7e9d56 b/txscript/data/taproot-ref/19ce749d29e4620af1b8364a70b233842f7e9d56 new file mode 100644 index 0000000000..6851ae6d5a --- /dev/null +++ b/txscript/data/taproot-ref/19ce749d29e4620af1b8364a70b233842f7e9d56 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1a199a3cd2f3a67e25e36bd4711b535ae3d24e31 b/txscript/data/taproot-ref/1a199a3cd2f3a67e25e36bd4711b535ae3d24e31 new file mode 100644 index 0000000000..32bf96a299 --- /dev/null +++ b/txscript/data/taproot-ref/1a199a3cd2f3a67e25e36bd4711b535ae3d24e31 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1a3a8c18a8e82421d33989ed4d05f5485999b0db b/txscript/data/taproot-ref/1a3a8c18a8e82421d33989ed4d05f5485999b0db new file mode 100644 index 0000000000..afb3cd14d2 --- /dev/null +++ b/txscript/data/taproot-ref/1a3a8c18a8e82421d33989ed4d05f5485999b0db @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1a83bda864530d8086caf59fe1272ad5768d34c7 b/txscript/data/taproot-ref/1a83bda864530d8086caf59fe1272ad5768d34c7 new file mode 100644 index 0000000000..10f6c6c24c --- /dev/null +++ b/txscript/data/taproot-ref/1a83bda864530d8086caf59fe1272ad5768d34c7 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/1a9368b5d21e42219df4751485b7f522507fdefa b/txscript/data/taproot-ref/1a9368b5d21e42219df4751485b7f522507fdefa new file mode 100644 index 0000000000..b4e7b51baa --- /dev/null +++ b/txscript/data/taproot-ref/1a9368b5d21e42219df4751485b7f522507fdefa @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1ab6d3c20509931b1abf61a6b45d8069679b66fe b/txscript/data/taproot-ref/1ab6d3c20509931b1abf61a6b45d8069679b66fe new file mode 100644 index 0000000000..1c3208db6d --- /dev/null +++ b/txscript/data/taproot-ref/1ab6d3c20509931b1abf61a6b45d8069679b66fe @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1af45f5f9b4d38fa9b4e939f3e3622bcdf2d29d6 b/txscript/data/taproot-ref/1af45f5f9b4d38fa9b4e939f3e3622bcdf2d29d6 new file mode 100644 index 0000000000..cabb17b0cc --- /dev/null +++ b/txscript/data/taproot-ref/1af45f5f9b4d38fa9b4e939f3e3622bcdf2d29d6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1afbe3f769c38b8e8b6210ef4c1e57bc6cfd7f8d b/txscript/data/taproot-ref/1afbe3f769c38b8e8b6210ef4c1e57bc6cfd7f8d new file mode 100644 index 0000000000..5af698c92a --- /dev/null +++ b/txscript/data/taproot-ref/1afbe3f769c38b8e8b6210ef4c1e57bc6cfd7f8d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1b13c8bd9a345bdcf71eaa1078ef4cb752b3da96 b/txscript/data/taproot-ref/1b13c8bd9a345bdcf71eaa1078ef4cb752b3da96 new file mode 100644 index 0000000000..73287f07aa --- /dev/null +++ b/txscript/data/taproot-ref/1b13c8bd9a345bdcf71eaa1078ef4cb752b3da96 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1b2543854748d5b37077ed3e53a36309f5330a50 b/txscript/data/taproot-ref/1b2543854748d5b37077ed3e53a36309f5330a50 new file mode 100644 index 0000000000..db350c295b --- /dev/null +++ b/txscript/data/taproot-ref/1b2543854748d5b37077ed3e53a36309f5330a50 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1b3c874362224cdb658666354aa6fb9efff9b371 b/txscript/data/taproot-ref/1b3c874362224cdb658666354aa6fb9efff9b371 new file mode 100644 index 0000000000..b868ee7a8b --- /dev/null +++ b/txscript/data/taproot-ref/1b3c874362224cdb658666354aa6fb9efff9b371 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1b4bc136aef0b80666d85ce3d93b7996d0ce7ab5 b/txscript/data/taproot-ref/1b4bc136aef0b80666d85ce3d93b7996d0ce7ab5 new file mode 100644 index 0000000000..3e241af168 --- /dev/null +++ b/txscript/data/taproot-ref/1b4bc136aef0b80666d85ce3d93b7996d0ce7ab5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1b5a41cda693f9d63f77b9b053dbac3106aea789 b/txscript/data/taproot-ref/1b5a41cda693f9d63f77b9b053dbac3106aea789 new file mode 100644 index 0000000000..053549e43f --- /dev/null +++ b/txscript/data/taproot-ref/1b5a41cda693f9d63f77b9b053dbac3106aea789 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1b68c33f2aa26138257e984d7c57524a609332e4 b/txscript/data/taproot-ref/1b68c33f2aa26138257e984d7c57524a609332e4 new file mode 100644 index 0000000000..b87afbcd3b --- /dev/null +++ b/txscript/data/taproot-ref/1b68c33f2aa26138257e984d7c57524a609332e4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1b79cd4b2e7a4b311359e56e468853036d3681d5 b/txscript/data/taproot-ref/1b79cd4b2e7a4b311359e56e468853036d3681d5 new file mode 100644 index 0000000000..c2c0f4f6ac --- /dev/null +++ b/txscript/data/taproot-ref/1b79cd4b2e7a4b311359e56e468853036d3681d5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1b8f51ede6850bb667b5fd80d78e02cd4832d753 b/txscript/data/taproot-ref/1b8f51ede6850bb667b5fd80d78e02cd4832d753 new file mode 100644 index 0000000000..5bebc8d355 --- /dev/null +++ b/txscript/data/taproot-ref/1b8f51ede6850bb667b5fd80d78e02cd4832d753 @@ -0,0 +1 @@ +{"tx": "020000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701f010000008a70cce402a20b0e000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc11e4753b", "prevouts": ["b2a6100000000000165c142540f27e90740933c99d4f17ab2dfc6c82951cfb"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["cfc26d33c3f5da3eceabd09c022c5e779e8b65893679a04f00096c9348e616a10ce548f5d5717b699b60e94ae7675c4d43a7be8f45ccddc700a88556b6026cea", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/1bbde099bad78eb5021b57eaf4e9fecec63162ce b/txscript/data/taproot-ref/1bbde099bad78eb5021b57eaf4e9fecec63162ce new file mode 100644 index 0000000000..ed5f465430 --- /dev/null +++ b/txscript/data/taproot-ref/1bbde099bad78eb5021b57eaf4e9fecec63162ce @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1bc3e95ef1ef57164dee0340314916513b071491 b/txscript/data/taproot-ref/1bc3e95ef1ef57164dee0340314916513b071491 new file mode 100644 index 0000000000..00e84e6d1a --- /dev/null +++ b/txscript/data/taproot-ref/1bc3e95ef1ef57164dee0340314916513b071491 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1bc5747eb674dd470ce9e8f236e8c461bd9f5491 b/txscript/data/taproot-ref/1bc5747eb674dd470ce9e8f236e8c461bd9f5491 new file mode 100644 index 0000000000..3bce49e476 --- /dev/null +++ b/txscript/data/taproot-ref/1bc5747eb674dd470ce9e8f236e8c461bd9f5491 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1bc76532e1949261ee2079d9ce81e5bd2ee2c56a b/txscript/data/taproot-ref/1bc76532e1949261ee2079d9ce81e5bd2ee2c56a new file mode 100644 index 0000000000..0bbffe8138 --- /dev/null +++ b/txscript/data/taproot-ref/1bc76532e1949261ee2079d9ce81e5bd2ee2c56a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1bfe6046e6cdc344b877ad37196692f2724dfb96 b/txscript/data/taproot-ref/1bfe6046e6cdc344b877ad37196692f2724dfb96 new file mode 100644 index 0000000000..dc67403009 --- /dev/null +++ b/txscript/data/taproot-ref/1bfe6046e6cdc344b877ad37196692f2724dfb96 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1c0b90070d5af0e0da662d27418affd7255bb328 b/txscript/data/taproot-ref/1c0b90070d5af0e0da662d27418affd7255bb328 new file mode 100644 index 0000000000..eb5ea2e6dc --- /dev/null +++ b/txscript/data/taproot-ref/1c0b90070d5af0e0da662d27418affd7255bb328 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1c1b10df48009861e679c78f57233fcbab1c9c74 b/txscript/data/taproot-ref/1c1b10df48009861e679c78f57233fcbab1c9c74 new file mode 100644 index 0000000000..4e9462c12b --- /dev/null +++ b/txscript/data/taproot-ref/1c1b10df48009861e679c78f57233fcbab1c9c74 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1c1c68f02884233862b5ace3f063b648ef1a8f5b b/txscript/data/taproot-ref/1c1c68f02884233862b5ace3f063b648ef1a8f5b new file mode 100644 index 0000000000..6a30370636 --- /dev/null +++ b/txscript/data/taproot-ref/1c1c68f02884233862b5ace3f063b648ef1a8f5b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1c2a334bb5693def73177ba056d467309d1a592a b/txscript/data/taproot-ref/1c2a334bb5693def73177ba056d467309d1a592a new file mode 100644 index 0000000000..0ea800b7f3 --- /dev/null +++ b/txscript/data/taproot-ref/1c2a334bb5693def73177ba056d467309d1a592a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1c34962adc291e2c8bf6dae66b8fb9c765b86439 b/txscript/data/taproot-ref/1c34962adc291e2c8bf6dae66b8fb9c765b86439 new file mode 100644 index 0000000000..5c7a1f8153 --- /dev/null +++ b/txscript/data/taproot-ref/1c34962adc291e2c8bf6dae66b8fb9c765b86439 @@ -0,0 +1 @@ +{"tx": "010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270dd0100000032bd211460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ae01000000ce12f710049bb81c00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac34000000", "prevouts": ["bfb20e000000000022512026e2288702160262aebf9b5500cc105d511ee57f41882217b8afa588f3f75fde", "9019100000000000165b142540f27e90740933c99d4f17ab2dfc6c82951cfb"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["b0a0c8f5ff054a8c0b66272c21f09d79645ec52eba52e10be1a70c9dce1379227bf4a7668378a0efe2e4ca5c312fb651a52cedfa4773ff4ab97e186205b0a85b", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/1c385e281c4e1f86fe4c3b41f133fe0f1ad20791 b/txscript/data/taproot-ref/1c385e281c4e1f86fe4c3b41f133fe0f1ad20791 new file mode 100644 index 0000000000..2dbcc4f58a --- /dev/null +++ b/txscript/data/taproot-ref/1c385e281c4e1f86fe4c3b41f133fe0f1ad20791 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1c561097325c97828153532b8c7b95b14e46dff4 b/txscript/data/taproot-ref/1c561097325c97828153532b8c7b95b14e46dff4 new file mode 100644 index 0000000000..a3ea13d95b --- /dev/null +++ b/txscript/data/taproot-ref/1c561097325c97828153532b8c7b95b14e46dff4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1c7cf3e3c8d41ca4743e00d88ec0434c6f31d4c9 b/txscript/data/taproot-ref/1c7cf3e3c8d41ca4743e00d88ec0434c6f31d4c9 new file mode 100644 index 0000000000..cdfbda7df1 --- /dev/null +++ b/txscript/data/taproot-ref/1c7cf3e3c8d41ca4743e00d88ec0434c6f31d4c9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1c903f96be3cd8956476fb915624fb89666a187c b/txscript/data/taproot-ref/1c903f96be3cd8956476fb915624fb89666a187c new file mode 100644 index 0000000000..ff2891fc54 --- /dev/null +++ b/txscript/data/taproot-ref/1c903f96be3cd8956476fb915624fb89666a187c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1c929a0b875b383b7f3db0d168424cf2ba6d3cd5 b/txscript/data/taproot-ref/1c929a0b875b383b7f3db0d168424cf2ba6d3cd5 new file mode 100644 index 0000000000..fff0191bec --- /dev/null +++ b/txscript/data/taproot-ref/1c929a0b875b383b7f3db0d168424cf2ba6d3cd5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1c974326af0bc49a9f389a9c91eda58bdb47ef17 b/txscript/data/taproot-ref/1c974326af0bc49a9f389a9c91eda58bdb47ef17 new file mode 100644 index 0000000000..b63ae9d4b5 --- /dev/null +++ b/txscript/data/taproot-ref/1c974326af0bc49a9f389a9c91eda58bdb47ef17 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1caae5c5cd8d5b5cbaed34c3bffbfa19df6aa109 b/txscript/data/taproot-ref/1caae5c5cd8d5b5cbaed34c3bffbfa19df6aa109 new file mode 100644 index 0000000000..260ddd1de8 --- /dev/null +++ b/txscript/data/taproot-ref/1caae5c5cd8d5b5cbaed34c3bffbfa19df6aa109 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1cb39f47f10b248d485afd4c83fa450fe4dcf928 b/txscript/data/taproot-ref/1cb39f47f10b248d485afd4c83fa450fe4dcf928 new file mode 100644 index 0000000000..6364359fd1 --- /dev/null +++ b/txscript/data/taproot-ref/1cb39f47f10b248d485afd4c83fa450fe4dcf928 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1cc704edb370c2b52aa731bd30ea881ee0b2eb53 b/txscript/data/taproot-ref/1cc704edb370c2b52aa731bd30ea881ee0b2eb53 new file mode 100644 index 0000000000..30a44c6ddf --- /dev/null +++ b/txscript/data/taproot-ref/1cc704edb370c2b52aa731bd30ea881ee0b2eb53 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1cf397672140f803d1c48c64b7a9b55ed395d983 b/txscript/data/taproot-ref/1cf397672140f803d1c48c64b7a9b55ed395d983 new file mode 100644 index 0000000000..02ddacd6eb --- /dev/null +++ b/txscript/data/taproot-ref/1cf397672140f803d1c48c64b7a9b55ed395d983 @@ -0,0 +1 @@ +{"tx": "01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4680100000014cd4d66dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5b01000000d231e7ff03efb58d0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc27030000", "prevouts": ["9db93700000000001654142540f27e90740933c99d4f17ab2dfc6c82951cfb", "7b045800000000002358212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["11f1c55903856f2490e230698c97a7170a192ec750008f08d002d35e89a335566076759e504b9c5780d7077cd426e1639c3e0d113dec6a9a678118987f1e4af0", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/1d396736b3bc9203fa55467a0775f7a058a44b05 b/txscript/data/taproot-ref/1d396736b3bc9203fa55467a0775f7a058a44b05 new file mode 100644 index 0000000000..4dc763423c --- /dev/null +++ b/txscript/data/taproot-ref/1d396736b3bc9203fa55467a0775f7a058a44b05 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1d4be0ac5b202d439cadb143602ea3459a3eea33 b/txscript/data/taproot-ref/1d4be0ac5b202d439cadb143602ea3459a3eea33 new file mode 100644 index 0000000000..ddf70daa85 --- /dev/null +++ b/txscript/data/taproot-ref/1d4be0ac5b202d439cadb143602ea3459a3eea33 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1d66bb4f8ee00895bb9533eb0329de6d26b4e395 b/txscript/data/taproot-ref/1d66bb4f8ee00895bb9533eb0329de6d26b4e395 new file mode 100644 index 0000000000..b08117d061 --- /dev/null +++ b/txscript/data/taproot-ref/1d66bb4f8ee00895bb9533eb0329de6d26b4e395 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1d6b45d432e1a9f7bcf2692c87fd3865d9e96451 b/txscript/data/taproot-ref/1d6b45d432e1a9f7bcf2692c87fd3865d9e96451 new file mode 100644 index 0000000000..68c145e6cb --- /dev/null +++ b/txscript/data/taproot-ref/1d6b45d432e1a9f7bcf2692c87fd3865d9e96451 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1d6c3731bc1125e0c52a0356e80d994f891c5e9c b/txscript/data/taproot-ref/1d6c3731bc1125e0c52a0356e80d994f891c5e9c new file mode 100644 index 0000000000..15552ad006 --- /dev/null +++ b/txscript/data/taproot-ref/1d6c3731bc1125e0c52a0356e80d994f891c5e9c @@ -0,0 +1 @@ +{"tx": "0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c730000000007e7cb39bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4a000000006802958d0482acd60000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac15766851", "prevouts": ["4500580000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b", "c9af80000000000017a914b0b53ba433a336ced94ed75e23248458a1c69fab87"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "2252202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "witness": ["5d0bd60061e5efbf062c0c572eb308a43704db88b96943fbda77dd4f9d1d97cd33c696ac36c089951dd2bd32b0933da4706cec06b97a5a9a290e728b1afd0703"]}}, diff --git a/txscript/data/taproot-ref/1d83703eed5baa3599b3562c9ea6f395f0ecacbd b/txscript/data/taproot-ref/1d83703eed5baa3599b3562c9ea6f395f0ecacbd new file mode 100644 index 0000000000..3f81e4f9c0 --- /dev/null +++ b/txscript/data/taproot-ref/1d83703eed5baa3599b3562c9ea6f395f0ecacbd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1da56d6e6d60e92c14472e47b665a85be68598f1 b/txscript/data/taproot-ref/1da56d6e6d60e92c14472e47b665a85be68598f1 new file mode 100644 index 0000000000..4a9e24b7d9 --- /dev/null +++ b/txscript/data/taproot-ref/1da56d6e6d60e92c14472e47b665a85be68598f1 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/1dd5926d9df81e85da3075d37f0702718c88900e b/txscript/data/taproot-ref/1dd5926d9df81e85da3075d37f0702718c88900e new file mode 100644 index 0000000000..43be68e12c --- /dev/null +++ b/txscript/data/taproot-ref/1dd5926d9df81e85da3075d37f0702718c88900e @@ -0,0 +1 @@ +{"tx": "0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bba01000000a2f78b97dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b82000000003a48009dbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5301000000e7fb77e004cb3fcd00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7f2000000", "prevouts": ["d4b42600000000002251205e6805afb6d033a5c8eef8d51c29124f559c62b172323155929ced7c3b8e8a62", "69c2270000000000225120679c204dddfbbd298129e4670a621c532ae6353c600a37c86662e442bb91ded5", "926981000000000017a914971b3e5f9ac480bdcebf6ea71a9fc7de0ab164e287"], "index": 2, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "21541f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b", "witness": ["4292cca86b1b659a1536c0809dbe9ee735a3f3c75c7923f1b1fd213cb26875c533456f950943e6d6c95370ff3a62d8986998da89659d83be93e072de654bc626"]}}, diff --git a/txscript/data/taproot-ref/1ddf875ca22b308639d7b1cab6ee74ea77bc6bce b/txscript/data/taproot-ref/1ddf875ca22b308639d7b1cab6ee74ea77bc6bce new file mode 100644 index 0000000000..9ea6467c2e --- /dev/null +++ b/txscript/data/taproot-ref/1ddf875ca22b308639d7b1cab6ee74ea77bc6bce @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1de45c6257377171ec1383ff685db7ce8e13d8c4 b/txscript/data/taproot-ref/1de45c6257377171ec1383ff685db7ce8e13d8c4 new file mode 100644 index 0000000000..f1a04212b2 --- /dev/null +++ b/txscript/data/taproot-ref/1de45c6257377171ec1383ff685db7ce8e13d8c4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1de7bbede303fc60efdde225de97fe6e4cfb88ef b/txscript/data/taproot-ref/1de7bbede303fc60efdde225de97fe6e4cfb88ef new file mode 100644 index 0000000000..b184d42bcd --- /dev/null +++ b/txscript/data/taproot-ref/1de7bbede303fc60efdde225de97fe6e4cfb88ef @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1df8c615c5b7d5080d1019801137bdc97c72d639 b/txscript/data/taproot-ref/1df8c615c5b7d5080d1019801137bdc97c72d639 new file mode 100644 index 0000000000..2e44f05393 --- /dev/null +++ b/txscript/data/taproot-ref/1df8c615c5b7d5080d1019801137bdc97c72d639 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/1e2b8ba68f2655f0f5159ba8ee446f920bd6f384 b/txscript/data/taproot-ref/1e2b8ba68f2655f0f5159ba8ee446f920bd6f384 new file mode 100644 index 0000000000..ab0d401bca --- /dev/null +++ b/txscript/data/taproot-ref/1e2b8ba68f2655f0f5159ba8ee446f920bd6f384 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1e2f14f392e271b5a594679f83b4847d83b8109a b/txscript/data/taproot-ref/1e2f14f392e271b5a594679f83b4847d83b8109a new file mode 100644 index 0000000000..d6c765871f --- /dev/null +++ b/txscript/data/taproot-ref/1e2f14f392e271b5a594679f83b4847d83b8109a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1e2fa5e498506cf0c5adee563fba8cdb0900cb86 b/txscript/data/taproot-ref/1e2fa5e498506cf0c5adee563fba8cdb0900cb86 new file mode 100644 index 0000000000..197f029eff --- /dev/null +++ b/txscript/data/taproot-ref/1e2fa5e498506cf0c5adee563fba8cdb0900cb86 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1e32a9cc12b73e8a61aaf4c846d1cd0ffa78bf93 b/txscript/data/taproot-ref/1e32a9cc12b73e8a61aaf4c846d1cd0ffa78bf93 new file mode 100644 index 0000000000..ec0507ef06 --- /dev/null +++ b/txscript/data/taproot-ref/1e32a9cc12b73e8a61aaf4c846d1cd0ffa78bf93 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1e5a2d83584c4f1ccd8746aa4cc87f3b5c520e63 b/txscript/data/taproot-ref/1e5a2d83584c4f1ccd8746aa4cc87f3b5c520e63 new file mode 100644 index 0000000000..36fb354dcd --- /dev/null +++ b/txscript/data/taproot-ref/1e5a2d83584c4f1ccd8746aa4cc87f3b5c520e63 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1e754a40c050fe3c356b0e253ed22633f2c5edb5 b/txscript/data/taproot-ref/1e754a40c050fe3c356b0e253ed22633f2c5edb5 new file mode 100644 index 0000000000..f34de6f459 --- /dev/null +++ b/txscript/data/taproot-ref/1e754a40c050fe3c356b0e253ed22633f2c5edb5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1e841722ec03b5be4c1001e90d8019bf9e01d892 b/txscript/data/taproot-ref/1e841722ec03b5be4c1001e90d8019bf9e01d892 new file mode 100644 index 0000000000..5e8df13016 --- /dev/null +++ b/txscript/data/taproot-ref/1e841722ec03b5be4c1001e90d8019bf9e01d892 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1ea62bf92cf8078007e5cd279d0ac921980c1395 b/txscript/data/taproot-ref/1ea62bf92cf8078007e5cd279d0ac921980c1395 new file mode 100644 index 0000000000..dd0138915a --- /dev/null +++ b/txscript/data/taproot-ref/1ea62bf92cf8078007e5cd279d0ac921980c1395 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1ec26ee9e524029b8cf64e318125007a12c085d1 b/txscript/data/taproot-ref/1ec26ee9e524029b8cf64e318125007a12c085d1 new file mode 100644 index 0000000000..8d4839b481 --- /dev/null +++ b/txscript/data/taproot-ref/1ec26ee9e524029b8cf64e318125007a12c085d1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1eed48f62357914c0650cba567a06e37071db51e b/txscript/data/taproot-ref/1eed48f62357914c0650cba567a06e37071db51e new file mode 100644 index 0000000000..81afb50d68 --- /dev/null +++ b/txscript/data/taproot-ref/1eed48f62357914c0650cba567a06e37071db51e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1f06a021e51a7104e4b8be0ce9c51232c8fd6c77 b/txscript/data/taproot-ref/1f06a021e51a7104e4b8be0ce9c51232c8fd6c77 new file mode 100644 index 0000000000..e95663aaf2 --- /dev/null +++ b/txscript/data/taproot-ref/1f06a021e51a7104e4b8be0ce9c51232c8fd6c77 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1f21715d338b4550c3e7e74321d26de8853626f0 b/txscript/data/taproot-ref/1f21715d338b4550c3e7e74321d26de8853626f0 new file mode 100644 index 0000000000..4b688fcf3d --- /dev/null +++ b/txscript/data/taproot-ref/1f21715d338b4550c3e7e74321d26de8853626f0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1f33b328ec921a865dddc299139161f27b477147 b/txscript/data/taproot-ref/1f33b328ec921a865dddc299139161f27b477147 new file mode 100644 index 0000000000..037da6c355 --- /dev/null +++ b/txscript/data/taproot-ref/1f33b328ec921a865dddc299139161f27b477147 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1f59389661d72064b929ee2bac0a3f2782c99fb1 b/txscript/data/taproot-ref/1f59389661d72064b929ee2bac0a3f2782c99fb1 new file mode 100644 index 0000000000..7ff86cc2ef --- /dev/null +++ b/txscript/data/taproot-ref/1f59389661d72064b929ee2bac0a3f2782c99fb1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1f7d7d9cf1ac6252c762a06bdb35e619ce77741d b/txscript/data/taproot-ref/1f7d7d9cf1ac6252c762a06bdb35e619ce77741d new file mode 100644 index 0000000000..99468b392d --- /dev/null +++ b/txscript/data/taproot-ref/1f7d7d9cf1ac6252c762a06bdb35e619ce77741d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1fa141a9352d1d89d10a4d09abf044c9506a4bac b/txscript/data/taproot-ref/1fa141a9352d1d89d10a4d09abf044c9506a4bac new file mode 100644 index 0000000000..931559227a --- /dev/null +++ b/txscript/data/taproot-ref/1fa141a9352d1d89d10a4d09abf044c9506a4bac @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1fa4445b8704e72f4df267622d688919d1c6a44e b/txscript/data/taproot-ref/1fa4445b8704e72f4df267622d688919d1c6a44e new file mode 100644 index 0000000000..e11461913f --- /dev/null +++ b/txscript/data/taproot-ref/1fa4445b8704e72f4df267622d688919d1c6a44e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1fbfc728d51680fcfeadde2a9e6fa7d1ac3996ec b/txscript/data/taproot-ref/1fbfc728d51680fcfeadde2a9e6fa7d1ac3996ec new file mode 100644 index 0000000000..58200b24c3 --- /dev/null +++ b/txscript/data/taproot-ref/1fbfc728d51680fcfeadde2a9e6fa7d1ac3996ec @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1fcd778862db2069278171a2ee940bf756a2bdab b/txscript/data/taproot-ref/1fcd778862db2069278171a2ee940bf756a2bdab new file mode 100644 index 0000000000..96c4534cc7 --- /dev/null +++ b/txscript/data/taproot-ref/1fcd778862db2069278171a2ee940bf756a2bdab @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1fcd7eddbae73818ef08042df1c443c53fab0c49 b/txscript/data/taproot-ref/1fcd7eddbae73818ef08042df1c443c53fab0c49 new file mode 100644 index 0000000000..58f72ae674 --- /dev/null +++ b/txscript/data/taproot-ref/1fcd7eddbae73818ef08042df1c443c53fab0c49 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1fd0cbef8f091c8edefa214a32625302e2f3a6d8 b/txscript/data/taproot-ref/1fd0cbef8f091c8edefa214a32625302e2f3a6d8 new file mode 100644 index 0000000000..833a3659c9 --- /dev/null +++ b/txscript/data/taproot-ref/1fd0cbef8f091c8edefa214a32625302e2f3a6d8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1fe16cf825c0f639b3abd120fa85f9a344d3e514 b/txscript/data/taproot-ref/1fe16cf825c0f639b3abd120fa85f9a344d3e514 new file mode 100644 index 0000000000..6f776356b2 --- /dev/null +++ b/txscript/data/taproot-ref/1fe16cf825c0f639b3abd120fa85f9a344d3e514 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1fe6f643a391a7f73e3577d1f4e57935064e1c84 b/txscript/data/taproot-ref/1fe6f643a391a7f73e3577d1f4e57935064e1c84 new file mode 100644 index 0000000000..54e363d3cd --- /dev/null +++ b/txscript/data/taproot-ref/1fe6f643a391a7f73e3577d1f4e57935064e1c84 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1fe7d8f0f7839c475eb9dbd113d0ac120b1301fa b/txscript/data/taproot-ref/1fe7d8f0f7839c475eb9dbd113d0ac120b1301fa new file mode 100644 index 0000000000..c86dfc2c47 --- /dev/null +++ b/txscript/data/taproot-ref/1fe7d8f0f7839c475eb9dbd113d0ac120b1301fa @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/1ff8cc1006122254a00dc42299f828366e65b691 b/txscript/data/taproot-ref/1ff8cc1006122254a00dc42299f828366e65b691 new file mode 100644 index 0000000000..123d9fb491 --- /dev/null +++ b/txscript/data/taproot-ref/1ff8cc1006122254a00dc42299f828366e65b691 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/202c9cc0aac7d6c5172f0818c8d0d3405649d29b b/txscript/data/taproot-ref/202c9cc0aac7d6c5172f0818c8d0d3405649d29b new file mode 100644 index 0000000000..1d8138be85 --- /dev/null +++ b/txscript/data/taproot-ref/202c9cc0aac7d6c5172f0818c8d0d3405649d29b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/20372276860410d8622c60d5ec72e5716e313dfc b/txscript/data/taproot-ref/20372276860410d8622c60d5ec72e5716e313dfc new file mode 100644 index 0000000000..f8a58979d4 --- /dev/null +++ b/txscript/data/taproot-ref/20372276860410d8622c60d5ec72e5716e313dfc @@ -0,0 +1 @@ +{"tx": "01000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c493000000004619122f60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705600000000f0a051aedceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bdb000000009966758c01ba080700000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac63030000", "prevouts": ["901e38000000000022512049309db7adc24e71859de9f715c32a97834a8db8d4836c0bee01675ed84352f5", "2cff0f00000000002251203dc36bb5a2188e61583976906c69e4e1213b5b3aef7eaef25acff80132ded84f", "676a26000000000017a9144c4b1fc943f04d775886b4f6d3c3c73bf7d3118c87"], "index": 2, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "21511f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b", "witness": ["9c977cda999fb777401bb707089a400841e57a42d76a033be16e75d27051f5c0063eb91f26417ebbd83af79a57d1d2b8494303e3208c77ad3e4964f1472679cc"]}}, diff --git a/txscript/data/taproot-ref/203cda36559f2e342d3921d1f1f5ab05e330fe7f b/txscript/data/taproot-ref/203cda36559f2e342d3921d1f1f5ab05e330fe7f new file mode 100644 index 0000000000..a37d295b54 --- /dev/null +++ b/txscript/data/taproot-ref/203cda36559f2e342d3921d1f1f5ab05e330fe7f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2068fcad81b42ac14a337456c1c0e850bc5567e8 b/txscript/data/taproot-ref/2068fcad81b42ac14a337456c1c0e850bc5567e8 new file mode 100644 index 0000000000..15fabae3ae --- /dev/null +++ b/txscript/data/taproot-ref/2068fcad81b42ac14a337456c1c0e850bc5567e8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2071f151f52b689e1e3c9f2b0372a3c1ca4c6dc9 b/txscript/data/taproot-ref/2071f151f52b689e1e3c9f2b0372a3c1ca4c6dc9 new file mode 100644 index 0000000000..79fc6cbeeb --- /dev/null +++ b/txscript/data/taproot-ref/2071f151f52b689e1e3c9f2b0372a3c1ca4c6dc9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2089f610f91855cc26e8760f3910284181dc1b86 b/txscript/data/taproot-ref/2089f610f91855cc26e8760f3910284181dc1b86 new file mode 100644 index 0000000000..73089eb69c --- /dev/null +++ b/txscript/data/taproot-ref/2089f610f91855cc26e8760f3910284181dc1b86 @@ -0,0 +1 @@ +{"tx": "0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bec010000001d0a2dc2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf00100000010fb28d503d0fc6b000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac4d020000", "prevouts": ["5d3d220000000000225120c117fdddb90a3f1a4803136a1531a36879999867f6c1969f4ff0fed79ac77cc2", "c7244c00000000002252202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["5a7d220a2162de9dd36b932eec5d84328f53e5a1c5d11922d11565b47cf408654d661e58f11589da695ccac5165f97e5a2cbf83dcedf2fc5f6b321061f22fdd2", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/209d75465a4314536f2bbabf6ada3622bec989d5 b/txscript/data/taproot-ref/209d75465a4314536f2bbabf6ada3622bec989d5 new file mode 100644 index 0000000000..3e4ad6f66f --- /dev/null +++ b/txscript/data/taproot-ref/209d75465a4314536f2bbabf6ada3622bec989d5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/20cd1af7438c223f49d33ed3693631c63f6c3234 b/txscript/data/taproot-ref/20cd1af7438c223f49d33ed3693631c63f6c3234 new file mode 100644 index 0000000000..c69ca4201e --- /dev/null +++ b/txscript/data/taproot-ref/20cd1af7438c223f49d33ed3693631c63f6c3234 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/21227867cfe4806f692be272ca5b865dcecc1894 b/txscript/data/taproot-ref/21227867cfe4806f692be272ca5b865dcecc1894 new file mode 100644 index 0000000000..4093df4333 --- /dev/null +++ b/txscript/data/taproot-ref/21227867cfe4806f692be272ca5b865dcecc1894 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/213cd49c2b13fe3ee6d2220f5f96b63c748d1add b/txscript/data/taproot-ref/213cd49c2b13fe3ee6d2220f5f96b63c748d1add new file mode 100644 index 0000000000..8fdaab8ee3 --- /dev/null +++ b/txscript/data/taproot-ref/213cd49c2b13fe3ee6d2220f5f96b63c748d1add @@ -0,0 +1 @@ +{"tx": "7f672b810260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704600000000d96525f6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce000000000157fcba20390206e0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a66a020000", "prevouts": ["5d7811000000000017a914b0716f1bec91d4758ee97d9063c9da884dd2ba5287", "32655f0000000000225120ac005ce4773d3aee0620b129ba36f72cd2ee645537f63f3488482809f788413d"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "165a142540f27e90740933c99d4f17ab2dfc6c82951cfb", "witness": ["ba35ab6dc7bb7f42a551063c6f63d18d00b0b1d45576ad66786938447dd71941b9813b8443228b535069a06c4cfdc57a0feba8067a80f5fe7fe50c644e535d95"]}}, diff --git a/txscript/data/taproot-ref/2152488b729a3937e9f4e83bbefbb36d961013ca b/txscript/data/taproot-ref/2152488b729a3937e9f4e83bbefbb36d961013ca new file mode 100644 index 0000000000..1e43c5bc85 --- /dev/null +++ b/txscript/data/taproot-ref/2152488b729a3937e9f4e83bbefbb36d961013ca @@ -0,0 +1 @@ +{"tx": "359093cd0160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ec010000002e50bda803557e0e0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac8e757553", "prevouts": ["12bf10000000000017a914b403773244c403f76163005c780d53872622b52c87"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "1659142540f27e90740933c99d4f17ab2dfc6c82951cfb", "witness": ["c5792a58b67d9ab4f85de726ace781508f45a14949e4f0df33d83e835148398cdc86083f6b2c243dda9b6806313f8618e121ee99d8ee5211a7eebd12017dc9ee"]}}, diff --git a/txscript/data/taproot-ref/215ddb94c508c11099b9268dbf4ce0d7f7d18977 b/txscript/data/taproot-ref/215ddb94c508c11099b9268dbf4ce0d7f7d18977 new file mode 100644 index 0000000000..b5aed78888 --- /dev/null +++ b/txscript/data/taproot-ref/215ddb94c508c11099b9268dbf4ce0d7f7d18977 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/21a38194825eb39a4a0ae99128be4409c90d420d b/txscript/data/taproot-ref/21a38194825eb39a4a0ae99128be4409c90d420d new file mode 100644 index 0000000000..da4b788125 --- /dev/null +++ b/txscript/data/taproot-ref/21a38194825eb39a4a0ae99128be4409c90d420d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/21a967d5a754fe4909db382de1d7debbb040d069 b/txscript/data/taproot-ref/21a967d5a754fe4909db382de1d7debbb040d069 new file mode 100644 index 0000000000..9b53093709 --- /dev/null +++ b/txscript/data/taproot-ref/21a967d5a754fe4909db382de1d7debbb040d069 @@ -0,0 +1 @@ +{"tx": "020000000206f5bd527bde63f7c45daff54c390a64a59dabeafc8078a9bd0a050f54db6b44000000000096e4218fd15657a619affff084fc6b1bc2cdf5e85e399bb207d84ace710aa8effb82232f0100000000d0187eb30492422a51220000001600146d764276c66fec1127e5074db5bff3aa6c5255335802000000000000160014a4c1279efe108bfac1a01a2fe5d5c45b8fa18363580200000000000017a9143f5d8a006e43f5509420a4ea1e0b36ae11579f4487580200000000000017a9143f5d8a006e43f5509420a4ea1e0b36ae11579f4487a529293a", "prevouts": ["22cbf72c10000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664", "ddc7342412000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY", "comment": "inactive/scriptpath_invalidsig", "success": {"scriptSig": "", "witness": ["5e6cd8509542b63d2537a5bac669c0e311e78bff90c017c9c820e0c8da249779835917527ca01331a4054ec1b7b321c9234dfc8ce009f572033573a3c0091b52", "20159f9373f8b28a67627a464ae370e1e712479726144a1a48958863033f16f717ac", "c0159f9373f8b28a67627a464ae370e1e712479726144a1a48958863033f16f717a00074c7e8df7fd91f9df9f350398e675f9ead7758f02aef75359e3279a8e0e7"]}}, diff --git a/txscript/data/taproot-ref/21b086a0fcb5394bca5e13730e9801a167031fd3 b/txscript/data/taproot-ref/21b086a0fcb5394bca5e13730e9801a167031fd3 new file mode 100644 index 0000000000..80609d3d7c --- /dev/null +++ b/txscript/data/taproot-ref/21b086a0fcb5394bca5e13730e9801a167031fd3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/21b915be35d2383f8baacd2d513b5cdd06836ebd b/txscript/data/taproot-ref/21b915be35d2383f8baacd2d513b5cdd06836ebd new file mode 100644 index 0000000000..77c5881552 --- /dev/null +++ b/txscript/data/taproot-ref/21b915be35d2383f8baacd2d513b5cdd06836ebd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/21c64c51dc34976712f8356ed25d28cb2506a3bd b/txscript/data/taproot-ref/21c64c51dc34976712f8356ed25d28cb2506a3bd new file mode 100644 index 0000000000..b6b5f3f6a5 --- /dev/null +++ b/txscript/data/taproot-ref/21c64c51dc34976712f8356ed25d28cb2506a3bd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/21cd99bcb03828e0395286a09e866684d6c569f0 b/txscript/data/taproot-ref/21cd99bcb03828e0395286a09e866684d6c569f0 new file mode 100644 index 0000000000..8646650ab3 --- /dev/null +++ b/txscript/data/taproot-ref/21cd99bcb03828e0395286a09e866684d6c569f0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/21f06e9520e734ab7974353357c55b81e5ee87a9 b/txscript/data/taproot-ref/21f06e9520e734ab7974353357c55b81e5ee87a9 new file mode 100644 index 0000000000..73071f9a8f --- /dev/null +++ b/txscript/data/taproot-ref/21f06e9520e734ab7974353357c55b81e5ee87a9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/22089449f264bdccac5901669554a20c01c7632d b/txscript/data/taproot-ref/22089449f264bdccac5901669554a20c01c7632d new file mode 100644 index 0000000000..a35414d8bb --- /dev/null +++ b/txscript/data/taproot-ref/22089449f264bdccac5901669554a20c01c7632d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/223d492bc034d65fae5c76008697dc6455711a0b b/txscript/data/taproot-ref/223d492bc034d65fae5c76008697dc6455711a0b new file mode 100644 index 0000000000..212942e1c8 --- /dev/null +++ b/txscript/data/taproot-ref/223d492bc034d65fae5c76008697dc6455711a0b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/227dc7dc4b5fedba0f90b82d69d0f8f6785c49f3 b/txscript/data/taproot-ref/227dc7dc4b5fedba0f90b82d69d0f8f6785c49f3 new file mode 100644 index 0000000000..0e0d7231ed --- /dev/null +++ b/txscript/data/taproot-ref/227dc7dc4b5fedba0f90b82d69d0f8f6785c49f3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/228fadb4fab77130e6a42578be8c100758962a74 b/txscript/data/taproot-ref/228fadb4fab77130e6a42578be8c100758962a74 new file mode 100644 index 0000000000..3ce1537232 --- /dev/null +++ b/txscript/data/taproot-ref/228fadb4fab77130e6a42578be8c100758962a74 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/229254c58edf03c88b0434f339de04542e82f168 b/txscript/data/taproot-ref/229254c58edf03c88b0434f339de04542e82f168 new file mode 100644 index 0000000000..00b0996cf4 --- /dev/null +++ b/txscript/data/taproot-ref/229254c58edf03c88b0434f339de04542e82f168 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/229a032ed00e20e08e27892cc81b53b28e1d245d b/txscript/data/taproot-ref/229a032ed00e20e08e27892cc81b53b28e1d245d new file mode 100644 index 0000000000..f7b973b7db --- /dev/null +++ b/txscript/data/taproot-ref/229a032ed00e20e08e27892cc81b53b28e1d245d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/22a01d7a209edd8694bd9edb1c95de74dbed6fc4 b/txscript/data/taproot-ref/22a01d7a209edd8694bd9edb1c95de74dbed6fc4 new file mode 100644 index 0000000000..d35b577ae8 --- /dev/null +++ b/txscript/data/taproot-ref/22a01d7a209edd8694bd9edb1c95de74dbed6fc4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/22b9de25667093d760c9e17c5477dead3043b33e b/txscript/data/taproot-ref/22b9de25667093d760c9e17c5477dead3043b33e new file mode 100644 index 0000000000..ee62b083fc --- /dev/null +++ b/txscript/data/taproot-ref/22b9de25667093d760c9e17c5477dead3043b33e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/23157f2fc305799762478817c79fe62d896edd22 b/txscript/data/taproot-ref/23157f2fc305799762478817c79fe62d896edd22 new file mode 100644 index 0000000000..c212d60d5e --- /dev/null +++ b/txscript/data/taproot-ref/23157f2fc305799762478817c79fe62d896edd22 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2334138f3c633d853dbab847307d9950c227ac09 b/txscript/data/taproot-ref/2334138f3c633d853dbab847307d9950c227ac09 new file mode 100644 index 0000000000..ba5f4405c8 --- /dev/null +++ b/txscript/data/taproot-ref/2334138f3c633d853dbab847307d9950c227ac09 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2341c37b333e27f887345a539b3a46aa15fe6738 b/txscript/data/taproot-ref/2341c37b333e27f887345a539b3a46aa15fe6738 new file mode 100644 index 0000000000..1ab8045a19 --- /dev/null +++ b/txscript/data/taproot-ref/2341c37b333e27f887345a539b3a46aa15fe6738 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/234eb0340c07ea7d86dcfac62e971eae6dbc359d b/txscript/data/taproot-ref/234eb0340c07ea7d86dcfac62e971eae6dbc359d new file mode 100644 index 0000000000..8942582b03 --- /dev/null +++ b/txscript/data/taproot-ref/234eb0340c07ea7d86dcfac62e971eae6dbc359d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2363727c5d55ff4d6eaaf41f33d420d94aa0259e b/txscript/data/taproot-ref/2363727c5d55ff4d6eaaf41f33d420d94aa0259e new file mode 100644 index 0000000000..73b3a87eba --- /dev/null +++ b/txscript/data/taproot-ref/2363727c5d55ff4d6eaaf41f33d420d94aa0259e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2364ebc1025f0c764130435a3da1d5febf1ac0a5 b/txscript/data/taproot-ref/2364ebc1025f0c764130435a3da1d5febf1ac0a5 new file mode 100644 index 0000000000..31a232032f --- /dev/null +++ b/txscript/data/taproot-ref/2364ebc1025f0c764130435a3da1d5febf1ac0a5 @@ -0,0 +1 @@ +{"tx": "1440bee6028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44000000000a895e88fbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf52000000000366cbad01bc8c1b00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac83030000", "prevouts": ["a0853e00000000002252202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "44c57f0000000000225120325bb8bd692aa21257fa568f0567c628c6e8ab7924eed74b5d76df030defb001"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["9bde27e94522f6809244df9ebd77fd059392ef6e9929729db2a23e7f354cec06728b50c787bb54d821f0f6b64f38a80b0d65b35c5124dc4dc8d03381ba66de4e"]}}, diff --git a/txscript/data/taproot-ref/23873275d271cfb7c8271e4058054ab8102b18bd b/txscript/data/taproot-ref/23873275d271cfb7c8271e4058054ab8102b18bd new file mode 100644 index 0000000000..732a4424d5 --- /dev/null +++ b/txscript/data/taproot-ref/23873275d271cfb7c8271e4058054ab8102b18bd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/23ce0a835c3fef13acabbe51379451af1bad4377 b/txscript/data/taproot-ref/23ce0a835c3fef13acabbe51379451af1bad4377 new file mode 100644 index 0000000000..9848cc7afa --- /dev/null +++ b/txscript/data/taproot-ref/23ce0a835c3fef13acabbe51379451af1bad4377 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/23ee2abacaf9004b59fb4b0c0bf4fb0518c0b719 b/txscript/data/taproot-ref/23ee2abacaf9004b59fb4b0c0bf4fb0518c0b719 new file mode 100644 index 0000000000..c7400ea1c9 --- /dev/null +++ b/txscript/data/taproot-ref/23ee2abacaf9004b59fb4b0c0bf4fb0518c0b719 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/24189b1ed398f5834d414ec0517d0e4ec49e5123 b/txscript/data/taproot-ref/24189b1ed398f5834d414ec0517d0e4ec49e5123 new file mode 100644 index 0000000000..ae0404cd4a --- /dev/null +++ b/txscript/data/taproot-ref/24189b1ed398f5834d414ec0517d0e4ec49e5123 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2447d402d9160d103faa8fce8f16b8201a516a4c b/txscript/data/taproot-ref/2447d402d9160d103faa8fce8f16b8201a516a4c new file mode 100644 index 0000000000..cb47cbe4ac --- /dev/null +++ b/txscript/data/taproot-ref/2447d402d9160d103faa8fce8f16b8201a516a4c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/244d1fe0151e8979539727b36d9efd4236889b85 b/txscript/data/taproot-ref/244d1fe0151e8979539727b36d9efd4236889b85 new file mode 100644 index 0000000000..13dae4f720 --- /dev/null +++ b/txscript/data/taproot-ref/244d1fe0151e8979539727b36d9efd4236889b85 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/24b9d083b99a1fda505df14b9b98cadbf34618a3 b/txscript/data/taproot-ref/24b9d083b99a1fda505df14b9b98cadbf34618a3 new file mode 100644 index 0000000000..be23af65df --- /dev/null +++ b/txscript/data/taproot-ref/24b9d083b99a1fda505df14b9b98cadbf34618a3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/24bbb3bb32575090a29c31c6d367e46898dc602a b/txscript/data/taproot-ref/24bbb3bb32575090a29c31c6d367e46898dc602a new file mode 100644 index 0000000000..0394110baa --- /dev/null +++ b/txscript/data/taproot-ref/24bbb3bb32575090a29c31c6d367e46898dc602a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/24d0fbfa8bd2c68fd6ee1e4839bb0d5bb73ef21a b/txscript/data/taproot-ref/24d0fbfa8bd2c68fd6ee1e4839bb0d5bb73ef21a new file mode 100644 index 0000000000..14b2198114 --- /dev/null +++ b/txscript/data/taproot-ref/24d0fbfa8bd2c68fd6ee1e4839bb0d5bb73ef21a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/24e2153d05b71ded99689e64661aa90af06300e2 b/txscript/data/taproot-ref/24e2153d05b71ded99689e64661aa90af06300e2 new file mode 100644 index 0000000000..45d78cfb92 --- /dev/null +++ b/txscript/data/taproot-ref/24e2153d05b71ded99689e64661aa90af06300e2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/24f5f696fe56cb9b25c9d12a9606b6d6f531d6db b/txscript/data/taproot-ref/24f5f696fe56cb9b25c9d12a9606b6d6f531d6db new file mode 100644 index 0000000000..5344352c0e --- /dev/null +++ b/txscript/data/taproot-ref/24f5f696fe56cb9b25c9d12a9606b6d6f531d6db @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/24f8bbbbf4e945080301e930844b08d263783100 b/txscript/data/taproot-ref/24f8bbbbf4e945080301e930844b08d263783100 new file mode 100644 index 0000000000..e95f60e31b --- /dev/null +++ b/txscript/data/taproot-ref/24f8bbbbf4e945080301e930844b08d263783100 @@ -0,0 +1 @@ +{"tx": "edcfcdd702d9befb1e9c529d7d9073823d42f590d5d83a9ae9e8205a58b2deac400aa179de0000000000aed2b9bbd9befb1e9c529d7d9073823d42f590d5d83a9ae9e8205a58b2deac400aa179de0100000000c9ef9ecf037bb08b0f2100000017a91417076ced824a76f7f00aa0b9ce412f8713d9a8a68758020000000000001976a914798a0f34de6d8f95c4b7ca7c79a0cd208c63fb0888ac580200000000000017a9146e2b0fcc2c4086d85becf46dae6d7af8c0bb07518738d6ea54", "prevouts": ["d453c1ad13000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664", "8032cc610d000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY", "comment": "inactive/keypath_valid", "success": {"scriptSig": "", "witness": ["b0e70b088525ec9342c39ffbeda6de86c95b6f4e996aa4d1877d6528a735d6f56f6c5047e4ad727e6c8147f22df9423a81218a920b673bdb6b66ee9f457dcac4"]}}, diff --git a/txscript/data/taproot-ref/250db3e160a3b1e5fb27d5880463b82d2da450a9 b/txscript/data/taproot-ref/250db3e160a3b1e5fb27d5880463b82d2da450a9 new file mode 100644 index 0000000000..817a031b56 --- /dev/null +++ b/txscript/data/taproot-ref/250db3e160a3b1e5fb27d5880463b82d2da450a9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/253542d32b85965ac57232e3741542be2aa8d091 b/txscript/data/taproot-ref/253542d32b85965ac57232e3741542be2aa8d091 new file mode 100644 index 0000000000..67ec90cfd9 --- /dev/null +++ b/txscript/data/taproot-ref/253542d32b85965ac57232e3741542be2aa8d091 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/25452194c45988fdb9442f977481e8fb95b4ad75 b/txscript/data/taproot-ref/25452194c45988fdb9442f977481e8fb95b4ad75 new file mode 100644 index 0000000000..5990ece591 --- /dev/null +++ b/txscript/data/taproot-ref/25452194c45988fdb9442f977481e8fb95b4ad75 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2546c1139a14d6b2b3d6b9918c96de6e589fbf07 b/txscript/data/taproot-ref/2546c1139a14d6b2b3d6b9918c96de6e589fbf07 new file mode 100644 index 0000000000..1506c6a40e --- /dev/null +++ b/txscript/data/taproot-ref/2546c1139a14d6b2b3d6b9918c96de6e589fbf07 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/255e0819d8c9639459a4e49579fbd923cdf9240e b/txscript/data/taproot-ref/255e0819d8c9639459a4e49579fbd923cdf9240e new file mode 100644 index 0000000000..30f8010742 --- /dev/null +++ b/txscript/data/taproot-ref/255e0819d8c9639459a4e49579fbd923cdf9240e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/25608654bdece6361519480d9115afff3312cb31 b/txscript/data/taproot-ref/25608654bdece6361519480d9115afff3312cb31 new file mode 100644 index 0000000000..bf4780184b --- /dev/null +++ b/txscript/data/taproot-ref/25608654bdece6361519480d9115afff3312cb31 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/25bdf9d085288589dbb23f1fc7d98f7783cb09fe b/txscript/data/taproot-ref/25bdf9d085288589dbb23f1fc7d98f7783cb09fe new file mode 100644 index 0000000000..3b442d6db1 --- /dev/null +++ b/txscript/data/taproot-ref/25bdf9d085288589dbb23f1fc7d98f7783cb09fe @@ -0,0 +1 @@ +{"tx": "82e7331e018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f6000000005e138bb703b93e37000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487db020000", "prevouts": ["49d039000000000017a91482be44661ef9d172a86ea47619409ff206130f7487"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "2256202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "witness": ["6ddce3068c94bded449e8fc546ab815d4baf7ae5981f67b59a6a85fc59ba731d1e5f4c659e5d88afefc4bc08228f2f291644dfd3a99a48b60452f4416eedf576"]}}, diff --git a/txscript/data/taproot-ref/25e7910e53d821321fab3c8bb9db847f37fff616 b/txscript/data/taproot-ref/25e7910e53d821321fab3c8bb9db847f37fff616 new file mode 100644 index 0000000000..23a6ca6a7d --- /dev/null +++ b/txscript/data/taproot-ref/25e7910e53d821321fab3c8bb9db847f37fff616 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/25f13dc685e40d3fb22819356cbba4a5a6789e15 b/txscript/data/taproot-ref/25f13dc685e40d3fb22819356cbba4a5a6789e15 new file mode 100644 index 0000000000..b23e75abfd --- /dev/null +++ b/txscript/data/taproot-ref/25f13dc685e40d3fb22819356cbba4a5a6789e15 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/25fd25289846f102771af05c1445e63acb583b93 b/txscript/data/taproot-ref/25fd25289846f102771af05c1445e63acb583b93 new file mode 100644 index 0000000000..7db41a27f9 --- /dev/null +++ b/txscript/data/taproot-ref/25fd25289846f102771af05c1445e63acb583b93 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2619632226257817c56eb288a9d2075e56dd0e34 b/txscript/data/taproot-ref/2619632226257817c56eb288a9d2075e56dd0e34 new file mode 100644 index 0000000000..85608e340d --- /dev/null +++ b/txscript/data/taproot-ref/2619632226257817c56eb288a9d2075e56dd0e34 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/26300a1704f502625832730a36d0088f21a46e2f b/txscript/data/taproot-ref/26300a1704f502625832730a36d0088f21a46e2f new file mode 100644 index 0000000000..cc845a15a8 --- /dev/null +++ b/txscript/data/taproot-ref/26300a1704f502625832730a36d0088f21a46e2f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/265d0640e2752abb03fbe0a1b150f575f8469aa5 b/txscript/data/taproot-ref/265d0640e2752abb03fbe0a1b150f575f8469aa5 new file mode 100644 index 0000000000..3dc46a2320 --- /dev/null +++ b/txscript/data/taproot-ref/265d0640e2752abb03fbe0a1b150f575f8469aa5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2669c9c65bf3af74d4482204c70ea69545d8babf b/txscript/data/taproot-ref/2669c9c65bf3af74d4482204c70ea69545d8babf new file mode 100644 index 0000000000..ae60c4eafc --- /dev/null +++ b/txscript/data/taproot-ref/2669c9c65bf3af74d4482204c70ea69545d8babf @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/266c1691a90b2a342849d25e3704659308c45951 b/txscript/data/taproot-ref/266c1691a90b2a342849d25e3704659308c45951 new file mode 100644 index 0000000000..b432d29dc6 --- /dev/null +++ b/txscript/data/taproot-ref/266c1691a90b2a342849d25e3704659308c45951 @@ -0,0 +1 @@ +{"tx": "020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706a010000003d8886bbbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf770000000088db63dd03e1877e00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478742010000", "prevouts": ["ee0f13000000000022512026e2288702160262aebf9b5500cc105d511ee57f41882217b8afa588f3f75fde", "54426d000000000017a914f5a65ca4534ef3ca5833434c0dd44a3e128f499587"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "2259202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "witness": ["427dc8da4ffa5ecc822b1cf3bae38ff8a32e3788355b9ea21ba5f58b5e2eb6f6a70fdb814bdc4801d45574dfc9679198c5d5228957fe3481a577a9cd3a280d28"]}}, diff --git a/txscript/data/taproot-ref/2670c894e879a8499f50e08ae018e501b6693152 b/txscript/data/taproot-ref/2670c894e879a8499f50e08ae018e501b6693152 new file mode 100644 index 0000000000..4e8725e3ad --- /dev/null +++ b/txscript/data/taproot-ref/2670c894e879a8499f50e08ae018e501b6693152 @@ -0,0 +1 @@ +{"tx": "0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5500000000e17386c6bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfbf01000000655e64b60215bcbb000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48731792f38", "prevouts": ["e16e49000000000017a914e18c03fb168c1c1b3408ffb477de8ff77b0fbd9587", "c198740000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "235c212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "witness": ["32ff6e2411fdf496fa6bfc80d7fdcd16b6c28f11fd1090550cd0f96c6c0ae439a7569296b8018165923a6c60a08873efaa1e0d3579a9e43aaa530e4da034901d"]}}, diff --git a/txscript/data/taproot-ref/2692015cba943bdfa1b324204d53284234754d15 b/txscript/data/taproot-ref/2692015cba943bdfa1b324204d53284234754d15 new file mode 100644 index 0000000000..eb55c85f58 --- /dev/null +++ b/txscript/data/taproot-ref/2692015cba943bdfa1b324204d53284234754d15 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/26fbe1c5bd294a3fc35af2e36f46c951b25e5cc3 b/txscript/data/taproot-ref/26fbe1c5bd294a3fc35af2e36f46c951b25e5cc3 new file mode 100644 index 0000000000..7723b42208 --- /dev/null +++ b/txscript/data/taproot-ref/26fbe1c5bd294a3fc35af2e36f46c951b25e5cc3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2721ca2fc08ca7ae38cc809a3799bf618ce5a75d b/txscript/data/taproot-ref/2721ca2fc08ca7ae38cc809a3799bf618ce5a75d new file mode 100644 index 0000000000..f37d736596 --- /dev/null +++ b/txscript/data/taproot-ref/2721ca2fc08ca7ae38cc809a3799bf618ce5a75d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2756fd453011fa7471613114061631b066029dc5 b/txscript/data/taproot-ref/2756fd453011fa7471613114061631b066029dc5 new file mode 100644 index 0000000000..5b123f1ec9 --- /dev/null +++ b/txscript/data/taproot-ref/2756fd453011fa7471613114061631b066029dc5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/278eb959a30cf3ec8163a007eb3f89ef107765ea b/txscript/data/taproot-ref/278eb959a30cf3ec8163a007eb3f89ef107765ea new file mode 100644 index 0000000000..2b0a707660 --- /dev/null +++ b/txscript/data/taproot-ref/278eb959a30cf3ec8163a007eb3f89ef107765ea @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/27ab4c447f840d27a13d145eb27c80db511a400a b/txscript/data/taproot-ref/27ab4c447f840d27a13d145eb27c80db511a400a new file mode 100644 index 0000000000..9ffd8dd8fe --- /dev/null +++ b/txscript/data/taproot-ref/27ab4c447f840d27a13d145eb27c80db511a400a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/27aff0ad61d128505e22df766c0492e316fbd9a9 b/txscript/data/taproot-ref/27aff0ad61d128505e22df766c0492e316fbd9a9 new file mode 100644 index 0000000000..4870a8b4d7 --- /dev/null +++ b/txscript/data/taproot-ref/27aff0ad61d128505e22df766c0492e316fbd9a9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/27b9b3e3bde2958e048cee68f2493d41648987d3 b/txscript/data/taproot-ref/27b9b3e3bde2958e048cee68f2493d41648987d3 new file mode 100644 index 0000000000..a837dc5f23 --- /dev/null +++ b/txscript/data/taproot-ref/27b9b3e3bde2958e048cee68f2493d41648987d3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/27be24f0f9eb749b51dc6e83c6ab5c8637349a25 b/txscript/data/taproot-ref/27be24f0f9eb749b51dc6e83c6ab5c8637349a25 new file mode 100644 index 0000000000..48c4f9bc07 --- /dev/null +++ b/txscript/data/taproot-ref/27be24f0f9eb749b51dc6e83c6ab5c8637349a25 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/27d37797fa4bb9c3bba68f9967eab892fec70642 b/txscript/data/taproot-ref/27d37797fa4bb9c3bba68f9967eab892fec70642 new file mode 100644 index 0000000000..752c5b79c6 --- /dev/null +++ b/txscript/data/taproot-ref/27d37797fa4bb9c3bba68f9967eab892fec70642 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/27f1dbe3a65014c59ae266af3346177a5a57d4e5 b/txscript/data/taproot-ref/27f1dbe3a65014c59ae266af3346177a5a57d4e5 new file mode 100644 index 0000000000..e8f9b5a3b2 --- /dev/null +++ b/txscript/data/taproot-ref/27f1dbe3a65014c59ae266af3346177a5a57d4e5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2807a46ba9b453c2f9e4af2406b26ed38137b216 b/txscript/data/taproot-ref/2807a46ba9b453c2f9e4af2406b26ed38137b216 new file mode 100644 index 0000000000..d265fdb633 --- /dev/null +++ b/txscript/data/taproot-ref/2807a46ba9b453c2f9e4af2406b26ed38137b216 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/280d6a9607ad78d3eb40f04e5b5a76c6f8eb4c02 b/txscript/data/taproot-ref/280d6a9607ad78d3eb40f04e5b5a76c6f8eb4c02 new file mode 100644 index 0000000000..9d36b79afd --- /dev/null +++ b/txscript/data/taproot-ref/280d6a9607ad78d3eb40f04e5b5a76c6f8eb4c02 @@ -0,0 +1 @@ +{"tx": "0affb4e102bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb601000000148475f38bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42101000000c9d6518c023f499c0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcf4e9e538", "prevouts": ["110a680000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b", "5f3e3700000000002358212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["e4fd4aa8ed373d196ab6e9a0ba8935c0d889eadfc5126511718e0b222975eb97e2f882010153a250c4f4b2ac4fd2d10797cfae46c68a67bcccc6a7fa91e2636c"]}}, diff --git a/txscript/data/taproot-ref/28259bbbf78c881c7400ac4602722df51776ffe0 b/txscript/data/taproot-ref/28259bbbf78c881c7400ac4602722df51776ffe0 new file mode 100644 index 0000000000..b4dceadcd7 --- /dev/null +++ b/txscript/data/taproot-ref/28259bbbf78c881c7400ac4602722df51776ffe0 @@ -0,0 +1 @@ +{"tx": "0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c57000000006bfe37f5dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd9000000002b9ed0c5018f7108000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478720040000", "prevouts": ["571d530000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b", "a4e51e0000000000215c1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["dbb4ed59e14362647749d55139746050f452d9ecc6c022c09328971453f73ac09c4dcc8d420a62aaf6b133b2cdf953aa3df1b048687bbad72fa841068b20765c"]}}, diff --git a/txscript/data/taproot-ref/284cac89d0553dfdc596ce4bfc4251fd2115cb15 b/txscript/data/taproot-ref/284cac89d0553dfdc596ce4bfc4251fd2115cb15 new file mode 100644 index 0000000000..a35278c2f7 --- /dev/null +++ b/txscript/data/taproot-ref/284cac89d0553dfdc596ce4bfc4251fd2115cb15 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2872201824aca727042b22cae049102582283dd9 b/txscript/data/taproot-ref/2872201824aca727042b22cae049102582283dd9 new file mode 100644 index 0000000000..80388620a3 --- /dev/null +++ b/txscript/data/taproot-ref/2872201824aca727042b22cae049102582283dd9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/288e61a59fe0099d03730d5c9d59712f743123a2 b/txscript/data/taproot-ref/288e61a59fe0099d03730d5c9d59712f743123a2 new file mode 100644 index 0000000000..03a751dda7 --- /dev/null +++ b/txscript/data/taproot-ref/288e61a59fe0099d03730d5c9d59712f743123a2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/28a21b4f4afeb9c978b1290c620548f1f33e127e b/txscript/data/taproot-ref/28a21b4f4afeb9c978b1290c620548f1f33e127e new file mode 100644 index 0000000000..2a92a95b29 --- /dev/null +++ b/txscript/data/taproot-ref/28a21b4f4afeb9c978b1290c620548f1f33e127e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/28b1a2ce5cf374a3ce64a6c7853fdbb6a15d1e25 b/txscript/data/taproot-ref/28b1a2ce5cf374a3ce64a6c7853fdbb6a15d1e25 new file mode 100644 index 0000000000..5da1ca6b7d --- /dev/null +++ b/txscript/data/taproot-ref/28b1a2ce5cf374a3ce64a6c7853fdbb6a15d1e25 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/28f223ee6f9c2562b1e382ea899bc7f88e63490e b/txscript/data/taproot-ref/28f223ee6f9c2562b1e382ea899bc7f88e63490e new file mode 100644 index 0000000000..80f0489777 --- /dev/null +++ b/txscript/data/taproot-ref/28f223ee6f9c2562b1e382ea899bc7f88e63490e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/28f4e044d59009036250527f061daea52c6b5917 b/txscript/data/taproot-ref/28f4e044d59009036250527f061daea52c6b5917 new file mode 100644 index 0000000000..a42de1a793 --- /dev/null +++ b/txscript/data/taproot-ref/28f4e044d59009036250527f061daea52c6b5917 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/290325a794a4307e35ab570d847c9854f6d63001 b/txscript/data/taproot-ref/290325a794a4307e35ab570d847c9854f6d63001 new file mode 100644 index 0000000000..52ca5a6a7e --- /dev/null +++ b/txscript/data/taproot-ref/290325a794a4307e35ab570d847c9854f6d63001 @@ -0,0 +1 @@ +{"tx": "01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4da000000006af8c3e060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270870100000017873a89035f27450000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcfe030000", "prevouts": ["2887390000000000225120f31e3a320eea15b969f8b18ed69a6dfb33cc054a2307ba2bd3877db1ef9fdc39", "a9700e000000000017a914381003aa1ce42a7df73f2dd1e6e78ae0a36c6b1c87"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "1654142540f27e90740933c99d4f17ab2dfc6c82951cfb", "witness": ["8df426347ce7aa183839cbace2dc0aa6559f8e0884b104badaa8f337f90ca4beec5468c71dac3655f4facf4e9a257dfd14f021ca3a5866be730454807685f9a7"]}}, diff --git a/txscript/data/taproot-ref/290a1cf15d24d80b8dba0ba4397f5a7eb13382d0 b/txscript/data/taproot-ref/290a1cf15d24d80b8dba0ba4397f5a7eb13382d0 new file mode 100644 index 0000000000..8aa08cd2a8 --- /dev/null +++ b/txscript/data/taproot-ref/290a1cf15d24d80b8dba0ba4397f5a7eb13382d0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/29186f53cff8c33b62ccd1cec92b4c6b02c8c2c8 b/txscript/data/taproot-ref/29186f53cff8c33b62ccd1cec92b4c6b02c8c2c8 new file mode 100644 index 0000000000..07e8bfa0c3 --- /dev/null +++ b/txscript/data/taproot-ref/29186f53cff8c33b62ccd1cec92b4c6b02c8c2c8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/29306f00a438f213a01ebd7a7b0d04ae25d239ad b/txscript/data/taproot-ref/29306f00a438f213a01ebd7a7b0d04ae25d239ad new file mode 100644 index 0000000000..f6ae4c2184 --- /dev/null +++ b/txscript/data/taproot-ref/29306f00a438f213a01ebd7a7b0d04ae25d239ad @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/297a3281b6d5be24c14d7ff51f2fbfe46ed86f1a b/txscript/data/taproot-ref/297a3281b6d5be24c14d7ff51f2fbfe46ed86f1a new file mode 100644 index 0000000000..8bd660aefb --- /dev/null +++ b/txscript/data/taproot-ref/297a3281b6d5be24c14d7ff51f2fbfe46ed86f1a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/297a666c7fc982a83775114d7c6821fb42031e06 b/txscript/data/taproot-ref/297a666c7fc982a83775114d7c6821fb42031e06 new file mode 100644 index 0000000000..1175057818 --- /dev/null +++ b/txscript/data/taproot-ref/297a666c7fc982a83775114d7c6821fb42031e06 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/299581f978295f5b97afd9102abe9746f3633e76 b/txscript/data/taproot-ref/299581f978295f5b97afd9102abe9746f3633e76 new file mode 100644 index 0000000000..68ce7e99e3 --- /dev/null +++ b/txscript/data/taproot-ref/299581f978295f5b97afd9102abe9746f3633e76 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/29cceb8deed87738d060e1bd5338ab0536f8d2a6 b/txscript/data/taproot-ref/29cceb8deed87738d060e1bd5338ab0536f8d2a6 new file mode 100644 index 0000000000..4e74847390 --- /dev/null +++ b/txscript/data/taproot-ref/29cceb8deed87738d060e1bd5338ab0536f8d2a6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/29ce41699e783cf1ab6b5b84bcc1f8da679ce8cd b/txscript/data/taproot-ref/29ce41699e783cf1ab6b5b84bcc1f8da679ce8cd new file mode 100644 index 0000000000..b596df54d9 --- /dev/null +++ b/txscript/data/taproot-ref/29ce41699e783cf1ab6b5b84bcc1f8da679ce8cd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/29d289d23bf6e34dbfac501041222a1978cc95d2 b/txscript/data/taproot-ref/29d289d23bf6e34dbfac501041222a1978cc95d2 new file mode 100644 index 0000000000..8cc5ec0c62 --- /dev/null +++ b/txscript/data/taproot-ref/29d289d23bf6e34dbfac501041222a1978cc95d2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/29dc54df002663eb3874c3fb7d3952e70b1d1779 b/txscript/data/taproot-ref/29dc54df002663eb3874c3fb7d3952e70b1d1779 new file mode 100644 index 0000000000..42b46b7c1f --- /dev/null +++ b/txscript/data/taproot-ref/29dc54df002663eb3874c3fb7d3952e70b1d1779 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/29dd1cab8fbe87bf2eba3c671a6054c32e47ee9f b/txscript/data/taproot-ref/29dd1cab8fbe87bf2eba3c671a6054c32e47ee9f new file mode 100644 index 0000000000..a6d0f7c78f --- /dev/null +++ b/txscript/data/taproot-ref/29dd1cab8fbe87bf2eba3c671a6054c32e47ee9f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/29ec9ea0cab2025b952a31c864a85546c8a8f032 b/txscript/data/taproot-ref/29ec9ea0cab2025b952a31c864a85546c8a8f032 new file mode 100644 index 0000000000..2ee60e2e69 --- /dev/null +++ b/txscript/data/taproot-ref/29ec9ea0cab2025b952a31c864a85546c8a8f032 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/29ef22549cd23bb217da411a3ca72d83c71150d6 b/txscript/data/taproot-ref/29ef22549cd23bb217da411a3ca72d83c71150d6 new file mode 100644 index 0000000000..7a18f810d9 --- /dev/null +++ b/txscript/data/taproot-ref/29ef22549cd23bb217da411a3ca72d83c71150d6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/29f6acfc391f9db2fecb96ea0a708da396ed202e b/txscript/data/taproot-ref/29f6acfc391f9db2fecb96ea0a708da396ed202e new file mode 100644 index 0000000000..233061cf01 --- /dev/null +++ b/txscript/data/taproot-ref/29f6acfc391f9db2fecb96ea0a708da396ed202e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2a46178ff8d5794433a794e9fe86b9b5fc268cc7 b/txscript/data/taproot-ref/2a46178ff8d5794433a794e9fe86b9b5fc268cc7 new file mode 100644 index 0000000000..f70fa1228e --- /dev/null +++ b/txscript/data/taproot-ref/2a46178ff8d5794433a794e9fe86b9b5fc268cc7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2a479685fd7da722bb6722ebc37d68cccb881ee6 b/txscript/data/taproot-ref/2a479685fd7da722bb6722ebc37d68cccb881ee6 new file mode 100644 index 0000000000..c8451400b8 --- /dev/null +++ b/txscript/data/taproot-ref/2a479685fd7da722bb6722ebc37d68cccb881ee6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2a4e458a761d418129aa4d22bbbd076927fcef77 b/txscript/data/taproot-ref/2a4e458a761d418129aa4d22bbbd076927fcef77 new file mode 100644 index 0000000000..675eeb107f --- /dev/null +++ b/txscript/data/taproot-ref/2a4e458a761d418129aa4d22bbbd076927fcef77 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2a4e61567a20b2e90af1a0fb476b1ba0154b0a8c b/txscript/data/taproot-ref/2a4e61567a20b2e90af1a0fb476b1ba0154b0a8c new file mode 100644 index 0000000000..c39491fc74 --- /dev/null +++ b/txscript/data/taproot-ref/2a4e61567a20b2e90af1a0fb476b1ba0154b0a8c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2a7da9157e1527a2190bce26d0a1303d7f239f9f b/txscript/data/taproot-ref/2a7da9157e1527a2190bce26d0a1303d7f239f9f new file mode 100644 index 0000000000..0e1076cc3b --- /dev/null +++ b/txscript/data/taproot-ref/2a7da9157e1527a2190bce26d0a1303d7f239f9f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2aa0596f17f2698bdfd51894a7dc1e1241cd3ae9 b/txscript/data/taproot-ref/2aa0596f17f2698bdfd51894a7dc1e1241cd3ae9 new file mode 100644 index 0000000000..da1a1f5ea0 --- /dev/null +++ b/txscript/data/taproot-ref/2aa0596f17f2698bdfd51894a7dc1e1241cd3ae9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2aa48f72c81f73267919baef97d2c186ffc36882 b/txscript/data/taproot-ref/2aa48f72c81f73267919baef97d2c186ffc36882 new file mode 100644 index 0000000000..c817c695cf --- /dev/null +++ b/txscript/data/taproot-ref/2aa48f72c81f73267919baef97d2c186ffc36882 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2aa72eaeb2dee91742e3412f9e1ec464ecc22161 b/txscript/data/taproot-ref/2aa72eaeb2dee91742e3412f9e1ec464ecc22161 new file mode 100644 index 0000000000..ccc1614482 --- /dev/null +++ b/txscript/data/taproot-ref/2aa72eaeb2dee91742e3412f9e1ec464ecc22161 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2ab67ca0e8401c63810a011ea1b9b40ef8573922 b/txscript/data/taproot-ref/2ab67ca0e8401c63810a011ea1b9b40ef8573922 new file mode 100644 index 0000000000..6f368cdd67 --- /dev/null +++ b/txscript/data/taproot-ref/2ab67ca0e8401c63810a011ea1b9b40ef8573922 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2ae84cabbb3a18b00167af69886696809a07a86a b/txscript/data/taproot-ref/2ae84cabbb3a18b00167af69886696809a07a86a new file mode 100644 index 0000000000..94d27922a3 --- /dev/null +++ b/txscript/data/taproot-ref/2ae84cabbb3a18b00167af69886696809a07a86a @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/2aef8c06dd7c0aa09e6494194a3b812e4b7b2221 b/txscript/data/taproot-ref/2aef8c06dd7c0aa09e6494194a3b812e4b7b2221 new file mode 100644 index 0000000000..d85f5bad47 --- /dev/null +++ b/txscript/data/taproot-ref/2aef8c06dd7c0aa09e6494194a3b812e4b7b2221 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2b1075a4c09b4d3aa3be48cb1ce2571ab06a86a7 b/txscript/data/taproot-ref/2b1075a4c09b4d3aa3be48cb1ce2571ab06a86a7 new file mode 100644 index 0000000000..29ba3bec72 --- /dev/null +++ b/txscript/data/taproot-ref/2b1075a4c09b4d3aa3be48cb1ce2571ab06a86a7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2b168b93f7f916976567d85cf8e7ca0d6dbbf32e b/txscript/data/taproot-ref/2b168b93f7f916976567d85cf8e7ca0d6dbbf32e new file mode 100644 index 0000000000..d6df95f8b1 --- /dev/null +++ b/txscript/data/taproot-ref/2b168b93f7f916976567d85cf8e7ca0d6dbbf32e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2b229e9febea1749971fa08007b52b574b3046fb b/txscript/data/taproot-ref/2b229e9febea1749971fa08007b52b574b3046fb new file mode 100644 index 0000000000..d1840f1a19 --- /dev/null +++ b/txscript/data/taproot-ref/2b229e9febea1749971fa08007b52b574b3046fb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2b4be33fed42ff17f8c6910629b0e2183d109eb9 b/txscript/data/taproot-ref/2b4be33fed42ff17f8c6910629b0e2183d109eb9 new file mode 100644 index 0000000000..4f3d1e8146 --- /dev/null +++ b/txscript/data/taproot-ref/2b4be33fed42ff17f8c6910629b0e2183d109eb9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2b609a197a87b5e2d1507c9acbaf2e2ab79ce53a b/txscript/data/taproot-ref/2b609a197a87b5e2d1507c9acbaf2e2ab79ce53a new file mode 100644 index 0000000000..d7284a7544 --- /dev/null +++ b/txscript/data/taproot-ref/2b609a197a87b5e2d1507c9acbaf2e2ab79ce53a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2b9f2b2856d6b4e70d3b3d8e2d4ffcc6048847d9 b/txscript/data/taproot-ref/2b9f2b2856d6b4e70d3b3d8e2d4ffcc6048847d9 new file mode 100644 index 0000000000..26fc1b507d --- /dev/null +++ b/txscript/data/taproot-ref/2b9f2b2856d6b4e70d3b3d8e2d4ffcc6048847d9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2ba9b396adf10109648ab2f9856ca66b6fc5b688 b/txscript/data/taproot-ref/2ba9b396adf10109648ab2f9856ca66b6fc5b688 new file mode 100644 index 0000000000..73c1fafb9b --- /dev/null +++ b/txscript/data/taproot-ref/2ba9b396adf10109648ab2f9856ca66b6fc5b688 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2baded8ac492d5bbd1dcece9f3d4a2f0458c778d b/txscript/data/taproot-ref/2baded8ac492d5bbd1dcece9f3d4a2f0458c778d new file mode 100644 index 0000000000..1028e0f060 --- /dev/null +++ b/txscript/data/taproot-ref/2baded8ac492d5bbd1dcece9f3d4a2f0458c778d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2bde7ad09804a986048db6aa7983bf552f327e9d b/txscript/data/taproot-ref/2bde7ad09804a986048db6aa7983bf552f327e9d new file mode 100644 index 0000000000..a48387adeb --- /dev/null +++ b/txscript/data/taproot-ref/2bde7ad09804a986048db6aa7983bf552f327e9d @@ -0,0 +1 @@ +{"tx": "90a986b40260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127057010000006a8f8b938bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e400000000e9d5c1d403674e480000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7e6010000", "prevouts": ["90c70e000000000017a914aa4a4e70b11f4eec4760f77206dc93b02350fcff87", "88c33b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "1656142540f27e90740933c99d4f17ab2dfc6c82951cfb", "witness": ["57e53e386b4787443e31509bfee6c0b1bb2cdecda0239fc8d71217960b529cb82c40e0e35928e60c70c32e01eb2177e27f526e4e86f94bffea45ea362be4c589"]}}, diff --git a/txscript/data/taproot-ref/2be1d596003c42e91c2a03626c93ce8259dc64ad b/txscript/data/taproot-ref/2be1d596003c42e91c2a03626c93ce8259dc64ad new file mode 100644 index 0000000000..ef15331e03 --- /dev/null +++ b/txscript/data/taproot-ref/2be1d596003c42e91c2a03626c93ce8259dc64ad @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2bed09f85647ccc7b26bbdedb9cbf18167240799 b/txscript/data/taproot-ref/2bed09f85647ccc7b26bbdedb9cbf18167240799 new file mode 100644 index 0000000000..e183e25b46 --- /dev/null +++ b/txscript/data/taproot-ref/2bed09f85647ccc7b26bbdedb9cbf18167240799 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2c2132ba18413a6ac05a486fd72669aa4293e784 b/txscript/data/taproot-ref/2c2132ba18413a6ac05a486fd72669aa4293e784 new file mode 100644 index 0000000000..4f47b8deb9 --- /dev/null +++ b/txscript/data/taproot-ref/2c2132ba18413a6ac05a486fd72669aa4293e784 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2c24b83fa75f9fc91269d9be43a5c14f9a0c8adb b/txscript/data/taproot-ref/2c24b83fa75f9fc91269d9be43a5c14f9a0c8adb new file mode 100644 index 0000000000..9342ddadb4 --- /dev/null +++ b/txscript/data/taproot-ref/2c24b83fa75f9fc91269d9be43a5c14f9a0c8adb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2c2615f5ff25527bb1609bacc940eda0c32b8d28 b/txscript/data/taproot-ref/2c2615f5ff25527bb1609bacc940eda0c32b8d28 new file mode 100644 index 0000000000..558c40c7dd --- /dev/null +++ b/txscript/data/taproot-ref/2c2615f5ff25527bb1609bacc940eda0c32b8d28 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2c2686017a35729961e5b4064e6ea9b58c073505 b/txscript/data/taproot-ref/2c2686017a35729961e5b4064e6ea9b58c073505 new file mode 100644 index 0000000000..ecd5c5b2b9 --- /dev/null +++ b/txscript/data/taproot-ref/2c2686017a35729961e5b4064e6ea9b58c073505 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2c28303252e327e51e1e99036e9c4fcc97b10d8e b/txscript/data/taproot-ref/2c28303252e327e51e1e99036e9c4fcc97b10d8e new file mode 100644 index 0000000000..1d0201bee4 --- /dev/null +++ b/txscript/data/taproot-ref/2c28303252e327e51e1e99036e9c4fcc97b10d8e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2c3a119d1d9da7d4fe68883d95e8f11060a9def5 b/txscript/data/taproot-ref/2c3a119d1d9da7d4fe68883d95e8f11060a9def5 new file mode 100644 index 0000000000..668f392e6e --- /dev/null +++ b/txscript/data/taproot-ref/2c3a119d1d9da7d4fe68883d95e8f11060a9def5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2c3a775a5deae4555f3af3537c8a4195c6e5354f b/txscript/data/taproot-ref/2c3a775a5deae4555f3af3537c8a4195c6e5354f new file mode 100644 index 0000000000..257a136d12 --- /dev/null +++ b/txscript/data/taproot-ref/2c3a775a5deae4555f3af3537c8a4195c6e5354f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2c62f7a3d90b30d6f1b1804f6bf0a916d3305efc b/txscript/data/taproot-ref/2c62f7a3d90b30d6f1b1804f6bf0a916d3305efc new file mode 100644 index 0000000000..c23dfa5770 --- /dev/null +++ b/txscript/data/taproot-ref/2c62f7a3d90b30d6f1b1804f6bf0a916d3305efc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2c67e0be52a7389f103f44944fe8d8913c973b48 b/txscript/data/taproot-ref/2c67e0be52a7389f103f44944fe8d8913c973b48 new file mode 100644 index 0000000000..e6b4b6cd47 --- /dev/null +++ b/txscript/data/taproot-ref/2c67e0be52a7389f103f44944fe8d8913c973b48 @@ -0,0 +1 @@ +{"tx": "020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708300000000a2259fc7bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8100000000c6f72fe102884f91000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87c8010000", "prevouts": ["1fea110000000000225120e9a13f65c3f3d085beb38984e1c9fb296d2b0d4cc9211abac3477617752bcef6", "6e5c82000000000017a914927d550e2674fb9e1f6ae1260d00989fc596dd7f87"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "2254202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "witness": ["aea28210ccbc6063f5354013cd50857fba6fd49a8749ad2a4148746ed6bdc422ec0cce14f7f2b83e3d27a6a13354cc60d006a9039e074d670657ae6edb93d62f"]}}, diff --git a/txscript/data/taproot-ref/2c7c5497a7e7f81979773204f099b9f23323698e b/txscript/data/taproot-ref/2c7c5497a7e7f81979773204f099b9f23323698e new file mode 100644 index 0000000000..9270b63c9d --- /dev/null +++ b/txscript/data/taproot-ref/2c7c5497a7e7f81979773204f099b9f23323698e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2cc2506d179d284634729bf9fbd8c05239f90ca9 b/txscript/data/taproot-ref/2cc2506d179d284634729bf9fbd8c05239f90ca9 new file mode 100644 index 0000000000..26492ea6b4 --- /dev/null +++ b/txscript/data/taproot-ref/2cc2506d179d284634729bf9fbd8c05239f90ca9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2ccd61243d6bba96a68b774617b9d76c97662ff0 b/txscript/data/taproot-ref/2ccd61243d6bba96a68b774617b9d76c97662ff0 new file mode 100644 index 0000000000..67575aaa40 --- /dev/null +++ b/txscript/data/taproot-ref/2ccd61243d6bba96a68b774617b9d76c97662ff0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2cd0311c121154bc8385767e5893c92ee5aa2c05 b/txscript/data/taproot-ref/2cd0311c121154bc8385767e5893c92ee5aa2c05 new file mode 100644 index 0000000000..9f86b197bd --- /dev/null +++ b/txscript/data/taproot-ref/2cd0311c121154bc8385767e5893c92ee5aa2c05 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2d240420d7f8e429cb31120c7bf532805423084e b/txscript/data/taproot-ref/2d240420d7f8e429cb31120c7bf532805423084e new file mode 100644 index 0000000000..b61b027911 --- /dev/null +++ b/txscript/data/taproot-ref/2d240420d7f8e429cb31120c7bf532805423084e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2d2a878308fd10775f477107b478ca6993799763 b/txscript/data/taproot-ref/2d2a878308fd10775f477107b478ca6993799763 new file mode 100644 index 0000000000..b00755ae9a --- /dev/null +++ b/txscript/data/taproot-ref/2d2a878308fd10775f477107b478ca6993799763 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2d50c7d765d0137b5bc9bd78ac8e39437d22fc0f b/txscript/data/taproot-ref/2d50c7d765d0137b5bc9bd78ac8e39437d22fc0f new file mode 100644 index 0000000000..f7d123ca18 --- /dev/null +++ b/txscript/data/taproot-ref/2d50c7d765d0137b5bc9bd78ac8e39437d22fc0f @@ -0,0 +1 @@ +{"tx": "0100000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bbd00000000d61de46603ff1b2000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc754000000", "prevouts": ["31c0210000000000225b202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["74d06513e254771c994c8eff3a704430ab64d6b1094937fe3e9f90083eb5ef5c0cbbfd8214affb01532e5b00db6afc887d4f96e2c8d8ab269cd12eac425d2b8a", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/2d562228e60c1a1e62b21379cc97a7cf96852b48 b/txscript/data/taproot-ref/2d562228e60c1a1e62b21379cc97a7cf96852b48 new file mode 100644 index 0000000000..06fd0e1d6b --- /dev/null +++ b/txscript/data/taproot-ref/2d562228e60c1a1e62b21379cc97a7cf96852b48 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2dafca8d1802bbb6ce3ae1196aa647ee3c9e418e b/txscript/data/taproot-ref/2dafca8d1802bbb6ce3ae1196aa647ee3c9e418e new file mode 100644 index 0000000000..5f2635c88c --- /dev/null +++ b/txscript/data/taproot-ref/2dafca8d1802bbb6ce3ae1196aa647ee3c9e418e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2db945824c150b91aa78265f9e3701bd991fcf10 b/txscript/data/taproot-ref/2db945824c150b91aa78265f9e3701bd991fcf10 new file mode 100644 index 0000000000..9a24cebf0f --- /dev/null +++ b/txscript/data/taproot-ref/2db945824c150b91aa78265f9e3701bd991fcf10 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2dc10a9c76952430b8601993c330b88bd0e19cb0 b/txscript/data/taproot-ref/2dc10a9c76952430b8601993c330b88bd0e19cb0 new file mode 100644 index 0000000000..82cc79da4e --- /dev/null +++ b/txscript/data/taproot-ref/2dc10a9c76952430b8601993c330b88bd0e19cb0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2dc5b1536be7b443c27e763739595c42dc34998e b/txscript/data/taproot-ref/2dc5b1536be7b443c27e763739595c42dc34998e new file mode 100644 index 0000000000..9f9cf3127c --- /dev/null +++ b/txscript/data/taproot-ref/2dc5b1536be7b443c27e763739595c42dc34998e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2dc9f8f8cf217ccac41228917cb739aee23f3b55 b/txscript/data/taproot-ref/2dc9f8f8cf217ccac41228917cb739aee23f3b55 new file mode 100644 index 0000000000..20a3ad0318 --- /dev/null +++ b/txscript/data/taproot-ref/2dc9f8f8cf217ccac41228917cb739aee23f3b55 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2dcae1af8317442bc492bd0899984f32bf30396d b/txscript/data/taproot-ref/2dcae1af8317442bc492bd0899984f32bf30396d new file mode 100644 index 0000000000..ebd72fa4d9 --- /dev/null +++ b/txscript/data/taproot-ref/2dcae1af8317442bc492bd0899984f32bf30396d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2dd9b9584d97aeda14030c0cb94034e5a64e1e33 b/txscript/data/taproot-ref/2dd9b9584d97aeda14030c0cb94034e5a64e1e33 new file mode 100644 index 0000000000..e497a8c7b1 --- /dev/null +++ b/txscript/data/taproot-ref/2dd9b9584d97aeda14030c0cb94034e5a64e1e33 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2de7782cb97bcd10b69053268684420a0022efd6 b/txscript/data/taproot-ref/2de7782cb97bcd10b69053268684420a0022efd6 new file mode 100644 index 0000000000..c737c19443 --- /dev/null +++ b/txscript/data/taproot-ref/2de7782cb97bcd10b69053268684420a0022efd6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2df7793cf7520895ea4121850c34c16bd1874c22 b/txscript/data/taproot-ref/2df7793cf7520895ea4121850c34c16bd1874c22 new file mode 100644 index 0000000000..a87a7c0c9d --- /dev/null +++ b/txscript/data/taproot-ref/2df7793cf7520895ea4121850c34c16bd1874c22 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2e15993224f1d73378824cbd1780f6d25e85740a b/txscript/data/taproot-ref/2e15993224f1d73378824cbd1780f6d25e85740a new file mode 100644 index 0000000000..a859b7f136 --- /dev/null +++ b/txscript/data/taproot-ref/2e15993224f1d73378824cbd1780f6d25e85740a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2e2b8acfc93c65c04508d0730229d6beb1760346 b/txscript/data/taproot-ref/2e2b8acfc93c65c04508d0730229d6beb1760346 new file mode 100644 index 0000000000..7a2d7e9804 --- /dev/null +++ b/txscript/data/taproot-ref/2e2b8acfc93c65c04508d0730229d6beb1760346 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2e4630df1ac360494322a4300b3a916bf4a7aa42 b/txscript/data/taproot-ref/2e4630df1ac360494322a4300b3a916bf4a7aa42 new file mode 100644 index 0000000000..6f9444ca20 --- /dev/null +++ b/txscript/data/taproot-ref/2e4630df1ac360494322a4300b3a916bf4a7aa42 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2e9a37abf29713e5bf564831df0206b134ed9e23 b/txscript/data/taproot-ref/2e9a37abf29713e5bf564831df0206b134ed9e23 new file mode 100644 index 0000000000..14a284e595 --- /dev/null +++ b/txscript/data/taproot-ref/2e9a37abf29713e5bf564831df0206b134ed9e23 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2ecab25cfb72ae137a881589719a53343a030263 b/txscript/data/taproot-ref/2ecab25cfb72ae137a881589719a53343a030263 new file mode 100644 index 0000000000..22b20c5053 --- /dev/null +++ b/txscript/data/taproot-ref/2ecab25cfb72ae137a881589719a53343a030263 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2eccff6ea763376046948b3876b0d9b3e8b28c87 b/txscript/data/taproot-ref/2eccff6ea763376046948b3876b0d9b3e8b28c87 new file mode 100644 index 0000000000..b81150e70d --- /dev/null +++ b/txscript/data/taproot-ref/2eccff6ea763376046948b3876b0d9b3e8b28c87 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2ef7e082ae22ffb03fec01772b442b4b8d19cf06 b/txscript/data/taproot-ref/2ef7e082ae22ffb03fec01772b442b4b8d19cf06 new file mode 100644 index 0000000000..9b1c2870af --- /dev/null +++ b/txscript/data/taproot-ref/2ef7e082ae22ffb03fec01772b442b4b8d19cf06 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2f1b30aed18276568d11bfeb997aac3246d57017 b/txscript/data/taproot-ref/2f1b30aed18276568d11bfeb997aac3246d57017 new file mode 100644 index 0000000000..805e36395b --- /dev/null +++ b/txscript/data/taproot-ref/2f1b30aed18276568d11bfeb997aac3246d57017 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2f63727a65eb7f7437ab5c39d3f16671518719e6 b/txscript/data/taproot-ref/2f63727a65eb7f7437ab5c39d3f16671518719e6 new file mode 100644 index 0000000000..8bdc5b930d --- /dev/null +++ b/txscript/data/taproot-ref/2f63727a65eb7f7437ab5c39d3f16671518719e6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2f6a3e29b8be29ea5949fb1b5a71679b5cadc8d8 b/txscript/data/taproot-ref/2f6a3e29b8be29ea5949fb1b5a71679b5cadc8d8 new file mode 100644 index 0000000000..e74fc756e9 --- /dev/null +++ b/txscript/data/taproot-ref/2f6a3e29b8be29ea5949fb1b5a71679b5cadc8d8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2f718ebe5d9460ba98f7815e59bfffe1cd1f3bc6 b/txscript/data/taproot-ref/2f718ebe5d9460ba98f7815e59bfffe1cd1f3bc6 new file mode 100644 index 0000000000..feae496f4d --- /dev/null +++ b/txscript/data/taproot-ref/2f718ebe5d9460ba98f7815e59bfffe1cd1f3bc6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2f92c5daf5b1fc8c65563916bd77ad58dc8ffdab b/txscript/data/taproot-ref/2f92c5daf5b1fc8c65563916bd77ad58dc8ffdab new file mode 100644 index 0000000000..60379ef0fb --- /dev/null +++ b/txscript/data/taproot-ref/2f92c5daf5b1fc8c65563916bd77ad58dc8ffdab @@ -0,0 +1 @@ +{"tx": "0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cea00000000937427d7dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5000000000476245d802ecc273000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914719f78084af863e000acd618ba76df9797223689870d97cc2d", "prevouts": ["dbfa5400000000002251207ecf5669449c43a088571b8452d22be90b9f1c03aea1b9900f46f7b654cd7ae5", "704f21000000000021601f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["b70ef45802c64d612d4f6b57535e50f9dace6e6750abf4373a4664a19d391d8100d29199118100e3759d96e740f519cfa6949b6b04e1bcc8910c672cb0c9dae9", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/2fc6756b64916b520df4a5d7eed9bc7c1ee85753 b/txscript/data/taproot-ref/2fc6756b64916b520df4a5d7eed9bc7c1ee85753 new file mode 100644 index 0000000000..5bca4401bd --- /dev/null +++ b/txscript/data/taproot-ref/2fc6756b64916b520df4a5d7eed9bc7c1ee85753 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/2fe9ee314e024619b228c81cae27f4bd50141a36 b/txscript/data/taproot-ref/2fe9ee314e024619b228c81cae27f4bd50141a36 new file mode 100644 index 0000000000..65bd8737d1 --- /dev/null +++ b/txscript/data/taproot-ref/2fe9ee314e024619b228c81cae27f4bd50141a36 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/30060e7ffc388552b8bae73eb28705b637f7685a b/txscript/data/taproot-ref/30060e7ffc388552b8bae73eb28705b637f7685a new file mode 100644 index 0000000000..b30890200c --- /dev/null +++ b/txscript/data/taproot-ref/30060e7ffc388552b8bae73eb28705b637f7685a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3012845a3aa7dc757cc4778e5334769c9239ab60 b/txscript/data/taproot-ref/3012845a3aa7dc757cc4778e5334769c9239ab60 new file mode 100644 index 0000000000..0beaa68704 --- /dev/null +++ b/txscript/data/taproot-ref/3012845a3aa7dc757cc4778e5334769c9239ab60 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3015e994a3e16567397bea00a92ff97eb53971e6 b/txscript/data/taproot-ref/3015e994a3e16567397bea00a92ff97eb53971e6 new file mode 100644 index 0000000000..b1eae3b0e6 --- /dev/null +++ b/txscript/data/taproot-ref/3015e994a3e16567397bea00a92ff97eb53971e6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3031aef9ccb0cb566246e72e7f976a7cf00b9898 b/txscript/data/taproot-ref/3031aef9ccb0cb566246e72e7f976a7cf00b9898 new file mode 100644 index 0000000000..7d73329764 --- /dev/null +++ b/txscript/data/taproot-ref/3031aef9ccb0cb566246e72e7f976a7cf00b9898 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/305b7d52e8b2e5b62f366d1fe9aca1b4c31a2e51 b/txscript/data/taproot-ref/305b7d52e8b2e5b62f366d1fe9aca1b4c31a2e51 new file mode 100644 index 0000000000..f85b1bdac5 --- /dev/null +++ b/txscript/data/taproot-ref/305b7d52e8b2e5b62f366d1fe9aca1b4c31a2e51 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/30733f314d77a04fcfb55b009f72a5a1a94cc1e5 b/txscript/data/taproot-ref/30733f314d77a04fcfb55b009f72a5a1a94cc1e5 new file mode 100644 index 0000000000..bd15176363 --- /dev/null +++ b/txscript/data/taproot-ref/30733f314d77a04fcfb55b009f72a5a1a94cc1e5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/312a2eaf5a3bbccf69b97e292f665b53846038f5 b/txscript/data/taproot-ref/312a2eaf5a3bbccf69b97e292f665b53846038f5 new file mode 100644 index 0000000000..25701c4baa --- /dev/null +++ b/txscript/data/taproot-ref/312a2eaf5a3bbccf69b97e292f665b53846038f5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3177278ccbc91f49567f80c0b575882edaf4556b b/txscript/data/taproot-ref/3177278ccbc91f49567f80c0b575882edaf4556b new file mode 100644 index 0000000000..4fff2660b4 --- /dev/null +++ b/txscript/data/taproot-ref/3177278ccbc91f49567f80c0b575882edaf4556b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/31a7241822ef819833b51d86a78d83bbb4d58136 b/txscript/data/taproot-ref/31a7241822ef819833b51d86a78d83bbb4d58136 new file mode 100644 index 0000000000..9e62c70afc --- /dev/null +++ b/txscript/data/taproot-ref/31a7241822ef819833b51d86a78d83bbb4d58136 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/31b4933ee39bc4133c6a36b1e309775c87a96c23 b/txscript/data/taproot-ref/31b4933ee39bc4133c6a36b1e309775c87a96c23 new file mode 100644 index 0000000000..d501475d3e --- /dev/null +++ b/txscript/data/taproot-ref/31b4933ee39bc4133c6a36b1e309775c87a96c23 @@ -0,0 +1 @@ +{"tx": "020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707800000000d472c2ff8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47e00000000b22608f6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cbb000000007c5fb0ca0254669200000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc8e01af3b", "prevouts": ["ab600e0000000000225120a2c28b736583e5896e4a53bfde129100bff930ada42454ee2f7bef5a60a371d8", "deef37000000000017a914c7d65cb5025eac8b5bf295baac9287994ab34b9b87", "28374e00000000002251202cb475dcea7fe75e0d25a92a7081f6c5af7d6f4e70a5adbeeb9514e98fbe57b4"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "225b202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "witness": ["c16d2e3e06340d2f877b0eab8731a0be75cd78a304909212b58f76d0de579180d29fc64d6e108c74bbbb3f670903bc091152728424957cc505fd618c0e673814"]}}, diff --git a/txscript/data/taproot-ref/31bf684d25c7125e85ce524a607eb2a52cb7bdca b/txscript/data/taproot-ref/31bf684d25c7125e85ce524a607eb2a52cb7bdca new file mode 100644 index 0000000000..9cc0e3fd89 --- /dev/null +++ b/txscript/data/taproot-ref/31bf684d25c7125e85ce524a607eb2a52cb7bdca @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/31c15818563bf9247178dcf6aa28b033af2bb447 b/txscript/data/taproot-ref/31c15818563bf9247178dcf6aa28b033af2bb447 new file mode 100644 index 0000000000..c2daef5041 --- /dev/null +++ b/txscript/data/taproot-ref/31c15818563bf9247178dcf6aa28b033af2bb447 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/31c6f3973f706c7761a06718934fbee33a007e9d b/txscript/data/taproot-ref/31c6f3973f706c7761a06718934fbee33a007e9d new file mode 100644 index 0000000000..b23f74107f --- /dev/null +++ b/txscript/data/taproot-ref/31c6f3973f706c7761a06718934fbee33a007e9d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/31c88595514658ef1b8ff73277244b8f007c505d b/txscript/data/taproot-ref/31c88595514658ef1b8ff73277244b8f007c505d new file mode 100644 index 0000000000..8b9b85c412 --- /dev/null +++ b/txscript/data/taproot-ref/31c88595514658ef1b8ff73277244b8f007c505d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/31d4c861644fc9edae1f7e2e4f31aa06c7517889 b/txscript/data/taproot-ref/31d4c861644fc9edae1f7e2e4f31aa06c7517889 new file mode 100644 index 0000000000..e17f2aa5cf --- /dev/null +++ b/txscript/data/taproot-ref/31d4c861644fc9edae1f7e2e4f31aa06c7517889 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/31f076334b0a05c6d42d3ee64880af4288a1a071 b/txscript/data/taproot-ref/31f076334b0a05c6d42d3ee64880af4288a1a071 new file mode 100644 index 0000000000..99e139be80 --- /dev/null +++ b/txscript/data/taproot-ref/31f076334b0a05c6d42d3ee64880af4288a1a071 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/31f2c4c02978ae42e16425ad8313162bbbba6fc1 b/txscript/data/taproot-ref/31f2c4c02978ae42e16425ad8313162bbbba6fc1 new file mode 100644 index 0000000000..540cdd4834 --- /dev/null +++ b/txscript/data/taproot-ref/31f2c4c02978ae42e16425ad8313162bbbba6fc1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/322e55f03866ad2580881660af953e8169abf66a b/txscript/data/taproot-ref/322e55f03866ad2580881660af953e8169abf66a new file mode 100644 index 0000000000..d0234e0b2f --- /dev/null +++ b/txscript/data/taproot-ref/322e55f03866ad2580881660af953e8169abf66a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/32465695f8a85d30402f9b194bdf25dd6e21729d b/txscript/data/taproot-ref/32465695f8a85d30402f9b194bdf25dd6e21729d new file mode 100644 index 0000000000..0711e49f54 --- /dev/null +++ b/txscript/data/taproot-ref/32465695f8a85d30402f9b194bdf25dd6e21729d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3296dbebd697c68468c1215ff252b1da046d3d4c b/txscript/data/taproot-ref/3296dbebd697c68468c1215ff252b1da046d3d4c new file mode 100644 index 0000000000..32d72891b7 --- /dev/null +++ b/txscript/data/taproot-ref/3296dbebd697c68468c1215ff252b1da046d3d4c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/32aba46093e0c1405d3a8229f68cefd6de6d9767 b/txscript/data/taproot-ref/32aba46093e0c1405d3a8229f68cefd6de6d9767 new file mode 100644 index 0000000000..42b9887ae1 --- /dev/null +++ b/txscript/data/taproot-ref/32aba46093e0c1405d3a8229f68cefd6de6d9767 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/32abfd2efb454436ddc75cd07a406d88aabceb2a b/txscript/data/taproot-ref/32abfd2efb454436ddc75cd07a406d88aabceb2a new file mode 100644 index 0000000000..f44dc6ef3d --- /dev/null +++ b/txscript/data/taproot-ref/32abfd2efb454436ddc75cd07a406d88aabceb2a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/32ba176293211377a9ca30f7b1742a3102758b7a b/txscript/data/taproot-ref/32ba176293211377a9ca30f7b1742a3102758b7a new file mode 100644 index 0000000000..bb158831a1 --- /dev/null +++ b/txscript/data/taproot-ref/32ba176293211377a9ca30f7b1742a3102758b7a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/32bcf37b6b3d15680600c81db467e1dfff6ce375 b/txscript/data/taproot-ref/32bcf37b6b3d15680600c81db467e1dfff6ce375 new file mode 100644 index 0000000000..7719391b27 --- /dev/null +++ b/txscript/data/taproot-ref/32bcf37b6b3d15680600c81db467e1dfff6ce375 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/333dafc1d96971e2ccab51c8ee0d9e479decf78b b/txscript/data/taproot-ref/333dafc1d96971e2ccab51c8ee0d9e479decf78b new file mode 100644 index 0000000000..b2096c853d --- /dev/null +++ b/txscript/data/taproot-ref/333dafc1d96971e2ccab51c8ee0d9e479decf78b @@ -0,0 +1 @@ +{"tx": "0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1102000000ac4cac65dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b710100000030a16be304f0b149000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374871ce85d41", "prevouts": ["40ac2300000000002251200330f6e5108e4b6ba1453dcbe3913edfcf5a50e8c8a7a117f516f4d28e4936cb", "0f2a280000000000225d202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["e7e1aae90aceb2e99a7b56eacd7f6d43c8002a6ca89f9e3208f45316cc2cb09dfd5df45bcde2574b895b928b7d66d079e6641938e46fd0b8a63fb5163ce25e4c"]}}, diff --git a/txscript/data/taproot-ref/334e3a237339fce576119749a9aa81f3d65211cd b/txscript/data/taproot-ref/334e3a237339fce576119749a9aa81f3d65211cd new file mode 100644 index 0000000000..76de4ebba0 --- /dev/null +++ b/txscript/data/taproot-ref/334e3a237339fce576119749a9aa81f3d65211cd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3352986afb9bc33fc67eaf72f47be64e3c6ccba3 b/txscript/data/taproot-ref/3352986afb9bc33fc67eaf72f47be64e3c6ccba3 new file mode 100644 index 0000000000..7852e9bba2 --- /dev/null +++ b/txscript/data/taproot-ref/3352986afb9bc33fc67eaf72f47be64e3c6ccba3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/335b7a860725ca4f2c467a8b034060d0ce6b3bb4 b/txscript/data/taproot-ref/335b7a860725ca4f2c467a8b034060d0ce6b3bb4 new file mode 100644 index 0000000000..f76e5c642b --- /dev/null +++ b/txscript/data/taproot-ref/335b7a860725ca4f2c467a8b034060d0ce6b3bb4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/33848da9a02cc62be9f5a84c5ce6e33bb6aa8a29 b/txscript/data/taproot-ref/33848da9a02cc62be9f5a84c5ce6e33bb6aa8a29 new file mode 100644 index 0000000000..b0c8739451 --- /dev/null +++ b/txscript/data/taproot-ref/33848da9a02cc62be9f5a84c5ce6e33bb6aa8a29 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/33aa1588445e9cbbedd1d4a629780bcc8b4a8e9d b/txscript/data/taproot-ref/33aa1588445e9cbbedd1d4a629780bcc8b4a8e9d new file mode 100644 index 0000000000..e618184668 --- /dev/null +++ b/txscript/data/taproot-ref/33aa1588445e9cbbedd1d4a629780bcc8b4a8e9d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/33aa91e75b0cc39daae8eb7a1f0889075a667617 b/txscript/data/taproot-ref/33aa91e75b0cc39daae8eb7a1f0889075a667617 new file mode 100644 index 0000000000..cac670e260 --- /dev/null +++ b/txscript/data/taproot-ref/33aa91e75b0cc39daae8eb7a1f0889075a667617 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/33d0d39d6ce6ced2a0a8dc5d8c47e5f5098d7aaf b/txscript/data/taproot-ref/33d0d39d6ce6ced2a0a8dc5d8c47e5f5098d7aaf new file mode 100644 index 0000000000..e0f5963cf7 --- /dev/null +++ b/txscript/data/taproot-ref/33d0d39d6ce6ced2a0a8dc5d8c47e5f5098d7aaf @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/33efade4e6970da9cea78a726935e5443e0d1ba3 b/txscript/data/taproot-ref/33efade4e6970da9cea78a726935e5443e0d1ba3 new file mode 100644 index 0000000000..96ad668194 --- /dev/null +++ b/txscript/data/taproot-ref/33efade4e6970da9cea78a726935e5443e0d1ba3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/33fe1028443f16cce6d9858c8501dfb0a7ae5816 b/txscript/data/taproot-ref/33fe1028443f16cce6d9858c8501dfb0a7ae5816 new file mode 100644 index 0000000000..9724e40c82 --- /dev/null +++ b/txscript/data/taproot-ref/33fe1028443f16cce6d9858c8501dfb0a7ae5816 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/33ff2ff9d9aabf2865009fc3701058f954184c4a b/txscript/data/taproot-ref/33ff2ff9d9aabf2865009fc3701058f954184c4a new file mode 100644 index 0000000000..75468e408d --- /dev/null +++ b/txscript/data/taproot-ref/33ff2ff9d9aabf2865009fc3701058f954184c4a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3400d35bd94547fb613f1aa5cd2073fdca146533 b/txscript/data/taproot-ref/3400d35bd94547fb613f1aa5cd2073fdca146533 new file mode 100644 index 0000000000..23af9070bd --- /dev/null +++ b/txscript/data/taproot-ref/3400d35bd94547fb613f1aa5cd2073fdca146533 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/34038f296d87d228ac46a39bb072cc03e4e585bb b/txscript/data/taproot-ref/34038f296d87d228ac46a39bb072cc03e4e585bb new file mode 100644 index 0000000000..0b1480f4e5 --- /dev/null +++ b/txscript/data/taproot-ref/34038f296d87d228ac46a39bb072cc03e4e585bb @@ -0,0 +1 @@ +{"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", ""]}}, diff --git a/txscript/data/taproot-ref/34264b99b16c56793e013d7d2ac3dc83c0c07da6 b/txscript/data/taproot-ref/34264b99b16c56793e013d7d2ac3dc83c0c07da6 new file mode 100644 index 0000000000..9ee263c252 --- /dev/null +++ b/txscript/data/taproot-ref/34264b99b16c56793e013d7d2ac3dc83c0c07da6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/342a92cea02c320154d0894d36811870581b660e b/txscript/data/taproot-ref/342a92cea02c320154d0894d36811870581b660e new file mode 100644 index 0000000000..7b629c51e0 --- /dev/null +++ b/txscript/data/taproot-ref/342a92cea02c320154d0894d36811870581b660e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/346b40c03454e4740323b5b0422908722f9a4ed8 b/txscript/data/taproot-ref/346b40c03454e4740323b5b0422908722f9a4ed8 new file mode 100644 index 0000000000..6b364e1e90 --- /dev/null +++ b/txscript/data/taproot-ref/346b40c03454e4740323b5b0422908722f9a4ed8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/348d5c1f7c9f5084425a506f649c65b2f31946a0 b/txscript/data/taproot-ref/348d5c1f7c9f5084425a506f649c65b2f31946a0 new file mode 100644 index 0000000000..eb6f95fb83 --- /dev/null +++ b/txscript/data/taproot-ref/348d5c1f7c9f5084425a506f649c65b2f31946a0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/349341420dbe9b22120760aa5b91a9099c7cdcea b/txscript/data/taproot-ref/349341420dbe9b22120760aa5b91a9099c7cdcea new file mode 100644 index 0000000000..8844ff3ce1 --- /dev/null +++ b/txscript/data/taproot-ref/349341420dbe9b22120760aa5b91a9099c7cdcea @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/349bf68e15d8f14b4a471b7ab402784c1077db21 b/txscript/data/taproot-ref/349bf68e15d8f14b4a471b7ab402784c1077db21 new file mode 100644 index 0000000000..5911f4a461 --- /dev/null +++ b/txscript/data/taproot-ref/349bf68e15d8f14b4a471b7ab402784c1077db21 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/349dc9e7f879b45a530ea9ac4a5ee92a83b80b64 b/txscript/data/taproot-ref/349dc9e7f879b45a530ea9ac4a5ee92a83b80b64 new file mode 100644 index 0000000000..91adde0e48 --- /dev/null +++ b/txscript/data/taproot-ref/349dc9e7f879b45a530ea9ac4a5ee92a83b80b64 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/34dee51305402e7e6b502025f00f29abbde3cb18 b/txscript/data/taproot-ref/34dee51305402e7e6b502025f00f29abbde3cb18 new file mode 100644 index 0000000000..de99f8861d --- /dev/null +++ b/txscript/data/taproot-ref/34dee51305402e7e6b502025f00f29abbde3cb18 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/34e0f433a921b809a71c9924e9c0956dc34bc220 b/txscript/data/taproot-ref/34e0f433a921b809a71c9924e9c0956dc34bc220 new file mode 100644 index 0000000000..c77a992921 --- /dev/null +++ b/txscript/data/taproot-ref/34e0f433a921b809a71c9924e9c0956dc34bc220 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/34ebf584d708a418710a1466a3dbc67b82146196 b/txscript/data/taproot-ref/34ebf584d708a418710a1466a3dbc67b82146196 new file mode 100644 index 0000000000..9a55c5f761 --- /dev/null +++ b/txscript/data/taproot-ref/34ebf584d708a418710a1466a3dbc67b82146196 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/34ed3c4ed5af89953d2e81d21f7c1e45d2c7dc87 b/txscript/data/taproot-ref/34ed3c4ed5af89953d2e81d21f7c1e45d2c7dc87 new file mode 100644 index 0000000000..99738d0603 --- /dev/null +++ b/txscript/data/taproot-ref/34ed3c4ed5af89953d2e81d21f7c1e45d2c7dc87 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/34fe51570c93ab7b56e8955a00795a7af3eb88c3 b/txscript/data/taproot-ref/34fe51570c93ab7b56e8955a00795a7af3eb88c3 new file mode 100644 index 0000000000..7ebc19955f --- /dev/null +++ b/txscript/data/taproot-ref/34fe51570c93ab7b56e8955a00795a7af3eb88c3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/350219ab2d9d1993c2e0ad903f92eaaf6318f133 b/txscript/data/taproot-ref/350219ab2d9d1993c2e0ad903f92eaaf6318f133 new file mode 100644 index 0000000000..b00ce11752 --- /dev/null +++ b/txscript/data/taproot-ref/350219ab2d9d1993c2e0ad903f92eaaf6318f133 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/351979da8be9a1fded3861db5068a083d50516e7 b/txscript/data/taproot-ref/351979da8be9a1fded3861db5068a083d50516e7 new file mode 100644 index 0000000000..020198bceb --- /dev/null +++ b/txscript/data/taproot-ref/351979da8be9a1fded3861db5068a083d50516e7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/35210e4f9eb6f063e680746037b199244fe0997c b/txscript/data/taproot-ref/35210e4f9eb6f063e680746037b199244fe0997c new file mode 100644 index 0000000000..2b863dc5fb --- /dev/null +++ b/txscript/data/taproot-ref/35210e4f9eb6f063e680746037b199244fe0997c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3569acb6b68f7aed0054e44b1fa854e2ef33b96d b/txscript/data/taproot-ref/3569acb6b68f7aed0054e44b1fa854e2ef33b96d new file mode 100644 index 0000000000..a0746f4585 --- /dev/null +++ b/txscript/data/taproot-ref/3569acb6b68f7aed0054e44b1fa854e2ef33b96d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3572c1cebe263656185dea9403422e9884954499 b/txscript/data/taproot-ref/3572c1cebe263656185dea9403422e9884954499 new file mode 100644 index 0000000000..85998c60a0 --- /dev/null +++ b/txscript/data/taproot-ref/3572c1cebe263656185dea9403422e9884954499 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3574aa7865915325c364ab1364ae532d35ec2952 b/txscript/data/taproot-ref/3574aa7865915325c364ab1364ae532d35ec2952 new file mode 100644 index 0000000000..43a5092d62 --- /dev/null +++ b/txscript/data/taproot-ref/3574aa7865915325c364ab1364ae532d35ec2952 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/357c3aca3897a104f6b209ff00a90eb8f93c11e9 b/txscript/data/taproot-ref/357c3aca3897a104f6b209ff00a90eb8f93c11e9 new file mode 100644 index 0000000000..abbc024db0 --- /dev/null +++ b/txscript/data/taproot-ref/357c3aca3897a104f6b209ff00a90eb8f93c11e9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/357f1e298d27372ed2fdb360e6ecf4b4f93bf38f b/txscript/data/taproot-ref/357f1e298d27372ed2fdb360e6ecf4b4f93bf38f new file mode 100644 index 0000000000..b40f9aa55d --- /dev/null +++ b/txscript/data/taproot-ref/357f1e298d27372ed2fdb360e6ecf4b4f93bf38f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3585f3da19dc73f07d513f4d5e06b3af35381aab b/txscript/data/taproot-ref/3585f3da19dc73f07d513f4d5e06b3af35381aab new file mode 100644 index 0000000000..f05923ee72 --- /dev/null +++ b/txscript/data/taproot-ref/3585f3da19dc73f07d513f4d5e06b3af35381aab @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/35995d78575bb81724c123126ae84f04c1ef1324 b/txscript/data/taproot-ref/35995d78575bb81724c123126ae84f04c1ef1324 new file mode 100644 index 0000000000..7af830af2f --- /dev/null +++ b/txscript/data/taproot-ref/35995d78575bb81724c123126ae84f04c1ef1324 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/36107f7e7692414cd4ae5e7ee06a1e46821b107a b/txscript/data/taproot-ref/36107f7e7692414cd4ae5e7ee06a1e46821b107a new file mode 100644 index 0000000000..e196f02b75 --- /dev/null +++ b/txscript/data/taproot-ref/36107f7e7692414cd4ae5e7ee06a1e46821b107a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/361314e0baab060ff8fb2888efad4f841ee2e65d b/txscript/data/taproot-ref/361314e0baab060ff8fb2888efad4f841ee2e65d new file mode 100644 index 0000000000..37a39c7ee1 --- /dev/null +++ b/txscript/data/taproot-ref/361314e0baab060ff8fb2888efad4f841ee2e65d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/361c2bf607441dd9ae1d9e592d08aff1c4423aec b/txscript/data/taproot-ref/361c2bf607441dd9ae1d9e592d08aff1c4423aec new file mode 100644 index 0000000000..2e28eeedfe --- /dev/null +++ b/txscript/data/taproot-ref/361c2bf607441dd9ae1d9e592d08aff1c4423aec @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/361e67ace54dd8058e82517e87d5a294ff0e2430 b/txscript/data/taproot-ref/361e67ace54dd8058e82517e87d5a294ff0e2430 new file mode 100644 index 0000000000..d5a9c31ad3 --- /dev/null +++ b/txscript/data/taproot-ref/361e67ace54dd8058e82517e87d5a294ff0e2430 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/36225523764ce0fcf4a54ecc157c7a9ee0ca5e1c b/txscript/data/taproot-ref/36225523764ce0fcf4a54ecc157c7a9ee0ca5e1c new file mode 100644 index 0000000000..d2802f6feb --- /dev/null +++ b/txscript/data/taproot-ref/36225523764ce0fcf4a54ecc157c7a9ee0ca5e1c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/363516e81c7327e6e8535e74da1cf78a4a939bf2 b/txscript/data/taproot-ref/363516e81c7327e6e8535e74da1cf78a4a939bf2 new file mode 100644 index 0000000000..7ca225962d --- /dev/null +++ b/txscript/data/taproot-ref/363516e81c7327e6e8535e74da1cf78a4a939bf2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/363d3439b183bb0f2c6a0d1238057e9beb398f18 b/txscript/data/taproot-ref/363d3439b183bb0f2c6a0d1238057e9beb398f18 new file mode 100644 index 0000000000..242632cee6 --- /dev/null +++ b/txscript/data/taproot-ref/363d3439b183bb0f2c6a0d1238057e9beb398f18 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/36415fab25c89139e82b030657b2f8d9f5d9bfc4 b/txscript/data/taproot-ref/36415fab25c89139e82b030657b2f8d9f5d9bfc4 new file mode 100644 index 0000000000..e972f9d8f8 --- /dev/null +++ b/txscript/data/taproot-ref/36415fab25c89139e82b030657b2f8d9f5d9bfc4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/36608fb81d55d07d46c2f7849cd926ee3b2544c0 b/txscript/data/taproot-ref/36608fb81d55d07d46c2f7849cd926ee3b2544c0 new file mode 100644 index 0000000000..91f52c327c --- /dev/null +++ b/txscript/data/taproot-ref/36608fb81d55d07d46c2f7849cd926ee3b2544c0 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/367c9b1f3074839cbe7794421f5a5a30b5392887 b/txscript/data/taproot-ref/367c9b1f3074839cbe7794421f5a5a30b5392887 new file mode 100644 index 0000000000..8f97f56573 --- /dev/null +++ b/txscript/data/taproot-ref/367c9b1f3074839cbe7794421f5a5a30b5392887 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/368c81b84650d4644c983e3209d93ebe140d375a b/txscript/data/taproot-ref/368c81b84650d4644c983e3209d93ebe140d375a new file mode 100644 index 0000000000..3b52341fa9 --- /dev/null +++ b/txscript/data/taproot-ref/368c81b84650d4644c983e3209d93ebe140d375a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/36918d3941b615417b367e0dda84482198335469 b/txscript/data/taproot-ref/36918d3941b615417b367e0dda84482198335469 new file mode 100644 index 0000000000..2f5e0f791c --- /dev/null +++ b/txscript/data/taproot-ref/36918d3941b615417b367e0dda84482198335469 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/36a94d7bc5dc9af664df029d9cacb70d1662178f b/txscript/data/taproot-ref/36a94d7bc5dc9af664df029d9cacb70d1662178f new file mode 100644 index 0000000000..d8a986b607 --- /dev/null +++ b/txscript/data/taproot-ref/36a94d7bc5dc9af664df029d9cacb70d1662178f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/36bc60267ff97612610797a43fa5e7b371687229 b/txscript/data/taproot-ref/36bc60267ff97612610797a43fa5e7b371687229 new file mode 100644 index 0000000000..bb1c215eda --- /dev/null +++ b/txscript/data/taproot-ref/36bc60267ff97612610797a43fa5e7b371687229 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/36bd6cf68074e03b5642284ce7d493af28e048a2 b/txscript/data/taproot-ref/36bd6cf68074e03b5642284ce7d493af28e048a2 new file mode 100644 index 0000000000..c966424c68 --- /dev/null +++ b/txscript/data/taproot-ref/36bd6cf68074e03b5642284ce7d493af28e048a2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/36c7fd31d411d45f3d03143f9a36158791a29660 b/txscript/data/taproot-ref/36c7fd31d411d45f3d03143f9a36158791a29660 new file mode 100644 index 0000000000..29aaaff465 --- /dev/null +++ b/txscript/data/taproot-ref/36c7fd31d411d45f3d03143f9a36158791a29660 @@ -0,0 +1 @@ +{"tx": "0200000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2c01000000a1ebc3e504f5da1e000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac66000000", "prevouts": ["3858210000000000225e202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["b118a16a7c37649018445f821f07443fcc9bed7e28a4df387e18cbfe4f1ec41ba81f27a4055bdc437628c8c6f9c25381e0f582bf5b351b1c66d6d310404a4c07", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/36cefffcad6493e933315f78db381ff7ecc43bfd b/txscript/data/taproot-ref/36cefffcad6493e933315f78db381ff7ecc43bfd new file mode 100644 index 0000000000..97c8f3e02d --- /dev/null +++ b/txscript/data/taproot-ref/36cefffcad6493e933315f78db381ff7ecc43bfd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/36db1eaf5e186f36042dd8afeeebfabe675c620a b/txscript/data/taproot-ref/36db1eaf5e186f36042dd8afeeebfabe675c620a new file mode 100644 index 0000000000..10b5c0eb08 --- /dev/null +++ b/txscript/data/taproot-ref/36db1eaf5e186f36042dd8afeeebfabe675c620a @@ -0,0 +1 @@ +{"tx": "0200000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5f00000000392891fa03dd4e1c000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48725e0654e", "prevouts": ["98d21e000000000021571f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["bc14b9cc54dcd0d113ada2eefbf6fabd4511fcba5923dff3c44b88c1b06bddf574cd80d1110e2cbd1bc459f4f3b0bf4b81ba3001b188d703c2400398343c347b"]}}, diff --git a/txscript/data/taproot-ref/36e7b1c9920f0e9a7c1c52c380c61f6b44246ce8 b/txscript/data/taproot-ref/36e7b1c9920f0e9a7c1c52c380c61f6b44246ce8 new file mode 100644 index 0000000000..5d71076be2 --- /dev/null +++ b/txscript/data/taproot-ref/36e7b1c9920f0e9a7c1c52c380c61f6b44246ce8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/370f93aec0042473af8eda625b8e55afa266cf0a b/txscript/data/taproot-ref/370f93aec0042473af8eda625b8e55afa266cf0a new file mode 100644 index 0000000000..94f421d402 --- /dev/null +++ b/txscript/data/taproot-ref/370f93aec0042473af8eda625b8e55afa266cf0a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3711e5aa1c94f1b0f835504e4dc9cfac933f247d b/txscript/data/taproot-ref/3711e5aa1c94f1b0f835504e4dc9cfac933f247d new file mode 100644 index 0000000000..f95ed901a0 --- /dev/null +++ b/txscript/data/taproot-ref/3711e5aa1c94f1b0f835504e4dc9cfac933f247d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/37178f03fde09a06a32ec4e778874ec6ff11c8c3 b/txscript/data/taproot-ref/37178f03fde09a06a32ec4e778874ec6ff11c8c3 new file mode 100644 index 0000000000..bd489d4d0c --- /dev/null +++ b/txscript/data/taproot-ref/37178f03fde09a06a32ec4e778874ec6ff11c8c3 @@ -0,0 +1 @@ +{"tx": "56711c2a02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b55010000007a913ec4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ccb01000000598666940321156700000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac6c010000", "prevouts": ["f4382000000000002251207b42365751b5fdb0753f79b4cadb5a33cc8ff9fcbce7e5edcb6c5338d7e5f81e", "6595480000000000235a212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["11a3d09719fcca2565f6327fcabf0ca212fe094dce436586689b4974f57f1617ccb5deae62d77f37fa23314a360daed67993799d4f7c07e68efe09d1c52fd2e1"]}}, diff --git a/txscript/data/taproot-ref/3722cdc62a8920daf88999d381d42a7424417843 b/txscript/data/taproot-ref/3722cdc62a8920daf88999d381d42a7424417843 new file mode 100644 index 0000000000..49207e2a8f --- /dev/null +++ b/txscript/data/taproot-ref/3722cdc62a8920daf88999d381d42a7424417843 @@ -0,0 +1 @@ +{"tx": "0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c98010000002f66bab2bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9901000000f66711d4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf84000000001a4b64da03373c3901000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac8e020000", "prevouts": ["d1295e000000000022512009ca3b7467d9dea91d906b1b0e7a427b6496d4aab6be2799f71c47ade6ce7f57", "7c9879000000000022512063372fcd34ad063156fb4dd322415aa59bbac8cc6a5a5ba702cef28a298d42aa", "e9a063000000000021541f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b"], "index": 2, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["8ebebe2a7fa1a40637b1d39a565324cbb6d10bee6139bb959795df334617057c6e72ecd601dc2b3ffb697171f3f7e380b907435292fd3efe07d08431bd0845e6"]}}, diff --git a/txscript/data/taproot-ref/3745a800a4b496404473a26dd593f84588194471 b/txscript/data/taproot-ref/3745a800a4b496404473a26dd593f84588194471 new file mode 100644 index 0000000000..2d944437c1 --- /dev/null +++ b/txscript/data/taproot-ref/3745a800a4b496404473a26dd593f84588194471 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/374e3814357798251b0430dc4cfb9f212c1dddd3 b/txscript/data/taproot-ref/374e3814357798251b0430dc4cfb9f212c1dddd3 new file mode 100644 index 0000000000..f78da89652 --- /dev/null +++ b/txscript/data/taproot-ref/374e3814357798251b0430dc4cfb9f212c1dddd3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/375599a0689231a316462d64f42ec6b33ccca33e b/txscript/data/taproot-ref/375599a0689231a316462d64f42ec6b33ccca33e new file mode 100644 index 0000000000..dec48caa1d --- /dev/null +++ b/txscript/data/taproot-ref/375599a0689231a316462d64f42ec6b33ccca33e @@ -0,0 +1 @@ +{"tx": "0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be50100000063a870e860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705a01000000ecf01f0a0126bd150000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796c32f391f", "prevouts": ["821b2600000000002355212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "050211000000000017a914a4e57198280c195671631f8b9014214c2f083b3c87"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "2260202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "witness": ["55db540a25196391be2d65ae0003c1f649c60f07711f400f13c53bae7ea5ef0981d564739cece5df3646e9f1aa33842655e984da96aac911801425ddaf0cec6b"]}}, diff --git a/txscript/data/taproot-ref/3771c3d9e542f846b3c206c6719246bde5cb472d b/txscript/data/taproot-ref/3771c3d9e542f846b3c206c6719246bde5cb472d new file mode 100644 index 0000000000..075a5ca9cd --- /dev/null +++ b/txscript/data/taproot-ref/3771c3d9e542f846b3c206c6719246bde5cb472d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3774905200290499adbbac9b674c43b82c3af04d b/txscript/data/taproot-ref/3774905200290499adbbac9b674c43b82c3af04d new file mode 100644 index 0000000000..0828d764d5 --- /dev/null +++ b/txscript/data/taproot-ref/3774905200290499adbbac9b674c43b82c3af04d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/379b89135a99972794096065de8e1072473b7cdf b/txscript/data/taproot-ref/379b89135a99972794096065de8e1072473b7cdf new file mode 100644 index 0000000000..a84e2012e2 --- /dev/null +++ b/txscript/data/taproot-ref/379b89135a99972794096065de8e1072473b7cdf @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/37a26cf98e0cb201f2e241d6a41e267821078fc2 b/txscript/data/taproot-ref/37a26cf98e0cb201f2e241d6a41e267821078fc2 new file mode 100644 index 0000000000..0693a054ca --- /dev/null +++ b/txscript/data/taproot-ref/37a26cf98e0cb201f2e241d6a41e267821078fc2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/37cfd491e753f20291c4606a4bb007cf1aa69eaa b/txscript/data/taproot-ref/37cfd491e753f20291c4606a4bb007cf1aa69eaa new file mode 100644 index 0000000000..d1ca25762b --- /dev/null +++ b/txscript/data/taproot-ref/37cfd491e753f20291c4606a4bb007cf1aa69eaa @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/37fdd34d221df947a4dc6a40f91fe044f88c8ca2 b/txscript/data/taproot-ref/37fdd34d221df947a4dc6a40f91fe044f88c8ca2 new file mode 100644 index 0000000000..5ec5b0a458 --- /dev/null +++ b/txscript/data/taproot-ref/37fdd34d221df947a4dc6a40f91fe044f88c8ca2 @@ -0,0 +1 @@ +{"tx": "01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c5000000006242d66edff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd601000000ddd1212b04e58899000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acb2000000", "prevouts": ["26f83d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b", "36595e000000000017a914856f7c6a5a6a1ac0e553b769a4c35bcb9fb6f50287"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "2353212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "witness": ["20b89804e90837e9dae02d7437fa3f983016fe8a2e1e34e1bf5c5f8b58315efec2c51214a9a3dd71eb0d1b24b1cbd3564045a6b128679dd391a8647ac3469548"]}}, diff --git a/txscript/data/taproot-ref/381cf7c5a9c44f989bb97ebca54137b24a0c5102 b/txscript/data/taproot-ref/381cf7c5a9c44f989bb97ebca54137b24a0c5102 new file mode 100644 index 0000000000..8edba384b4 --- /dev/null +++ b/txscript/data/taproot-ref/381cf7c5a9c44f989bb97ebca54137b24a0c5102 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/381d7b2c554124f48f833d5bb44cb65d6a4e69ae b/txscript/data/taproot-ref/381d7b2c554124f48f833d5bb44cb65d6a4e69ae new file mode 100644 index 0000000000..e27f0ff083 --- /dev/null +++ b/txscript/data/taproot-ref/381d7b2c554124f48f833d5bb44cb65d6a4e69ae @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3849d609dcd2299e85caef8d7aaf0dc4cbda60ea b/txscript/data/taproot-ref/3849d609dcd2299e85caef8d7aaf0dc4cbda60ea new file mode 100644 index 0000000000..20122c8f56 --- /dev/null +++ b/txscript/data/taproot-ref/3849d609dcd2299e85caef8d7aaf0dc4cbda60ea @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/385fb0d2eeda5f4790eeab09a29ec612150cd115 b/txscript/data/taproot-ref/385fb0d2eeda5f4790eeab09a29ec612150cd115 new file mode 100644 index 0000000000..b21488bc59 --- /dev/null +++ b/txscript/data/taproot-ref/385fb0d2eeda5f4790eeab09a29ec612150cd115 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3862864a68546884d4ae2ef7644d75b814fd279e b/txscript/data/taproot-ref/3862864a68546884d4ae2ef7644d75b814fd279e new file mode 100644 index 0000000000..e50cd5f941 --- /dev/null +++ b/txscript/data/taproot-ref/3862864a68546884d4ae2ef7644d75b814fd279e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/38633120561625bae7ecb1c951acd585717ee56e b/txscript/data/taproot-ref/38633120561625bae7ecb1c951acd585717ee56e new file mode 100644 index 0000000000..fb38df49b9 --- /dev/null +++ b/txscript/data/taproot-ref/38633120561625bae7ecb1c951acd585717ee56e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/387db60867784e48a23882557f34fd3e8df5fe60 b/txscript/data/taproot-ref/387db60867784e48a23882557f34fd3e8df5fe60 new file mode 100644 index 0000000000..7c63bc136c --- /dev/null +++ b/txscript/data/taproot-ref/387db60867784e48a23882557f34fd3e8df5fe60 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/38a77bbe28f3ce750b32c16df488eb5970d28d51 b/txscript/data/taproot-ref/38a77bbe28f3ce750b32c16df488eb5970d28d51 new file mode 100644 index 0000000000..9292e39dc9 --- /dev/null +++ b/txscript/data/taproot-ref/38a77bbe28f3ce750b32c16df488eb5970d28d51 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/38b2b86e0814487d32eb0a49aaa091c527c67a39 b/txscript/data/taproot-ref/38b2b86e0814487d32eb0a49aaa091c527c67a39 new file mode 100644 index 0000000000..1d26b0957c --- /dev/null +++ b/txscript/data/taproot-ref/38b2b86e0814487d32eb0a49aaa091c527c67a39 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/38b7d993272a54c03a7adb7a046e8485546ebd0a b/txscript/data/taproot-ref/38b7d993272a54c03a7adb7a046e8485546ebd0a new file mode 100644 index 0000000000..c82f36382e --- /dev/null +++ b/txscript/data/taproot-ref/38b7d993272a54c03a7adb7a046e8485546ebd0a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/38bce0395152e8d2a60a95b4642bf3700934e4e9 b/txscript/data/taproot-ref/38bce0395152e8d2a60a95b4642bf3700934e4e9 new file mode 100644 index 0000000000..5a34ec9f72 --- /dev/null +++ b/txscript/data/taproot-ref/38bce0395152e8d2a60a95b4642bf3700934e4e9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/38cd5b3045252d1ad4ff3cad40d838874891506c b/txscript/data/taproot-ref/38cd5b3045252d1ad4ff3cad40d838874891506c new file mode 100644 index 0000000000..09e7bbca09 --- /dev/null +++ b/txscript/data/taproot-ref/38cd5b3045252d1ad4ff3cad40d838874891506c @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/38cf290b09eac905ac4bdc5ffd7fbeb55b28d0b1 b/txscript/data/taproot-ref/38cf290b09eac905ac4bdc5ffd7fbeb55b28d0b1 new file mode 100644 index 0000000000..0944278103 --- /dev/null +++ b/txscript/data/taproot-ref/38cf290b09eac905ac4bdc5ffd7fbeb55b28d0b1 @@ -0,0 +1 @@ +{"tx": "a804d40e02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b96010000007c2543a7dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bfb00000000e7fe5fb603e9bb46000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79609000000", "prevouts": ["332f26000000000017a9144370350f30aa8f875e3d2a13be81f25f19bf1a6387", "6b2623000000000022512039db30de33ea15b8f8fd0a316b7175d66e0ba7a162f794600ae9aaebda3948b7"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "165b142540f27e90740933c99d4f17ab2dfc6c82951cfb", "witness": ["ec464e0adc042aec0c2faacbf02be14e36edde4da057690d617cb47dc12d8b7ba4531947887a1c1a8f04971eb2b5b269db89a657828cdc1823307d26652693f4"]}}, diff --git a/txscript/data/taproot-ref/38fa5cb2147069b9e33e21d621935d45486c5345 b/txscript/data/taproot-ref/38fa5cb2147069b9e33e21d621935d45486c5345 new file mode 100644 index 0000000000..bb86d6d625 --- /dev/null +++ b/txscript/data/taproot-ref/38fa5cb2147069b9e33e21d621935d45486c5345 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/39016f47ee6449811c8a18548ba14d36d60f1a15 b/txscript/data/taproot-ref/39016f47ee6449811c8a18548ba14d36d60f1a15 new file mode 100644 index 0000000000..52b537f7e7 --- /dev/null +++ b/txscript/data/taproot-ref/39016f47ee6449811c8a18548ba14d36d60f1a15 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/39095ad3e086951d38e9de71ed6390bf4a910ada b/txscript/data/taproot-ref/39095ad3e086951d38e9de71ed6390bf4a910ada new file mode 100644 index 0000000000..90b86a12c5 --- /dev/null +++ b/txscript/data/taproot-ref/39095ad3e086951d38e9de71ed6390bf4a910ada @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/391ae71a3b29dc703963bfe3a4d96555cac94848 b/txscript/data/taproot-ref/391ae71a3b29dc703963bfe3a4d96555cac94848 new file mode 100644 index 0000000000..d2706c775d --- /dev/null +++ b/txscript/data/taproot-ref/391ae71a3b29dc703963bfe3a4d96555cac94848 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/391b89f7a6069cedebf4da40cbd2e894c4e4e161 b/txscript/data/taproot-ref/391b89f7a6069cedebf4da40cbd2e894c4e4e161 new file mode 100644 index 0000000000..45e87bdb4f --- /dev/null +++ b/txscript/data/taproot-ref/391b89f7a6069cedebf4da40cbd2e894c4e4e161 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/39261d0b29bcefd21020cd2c24c872c070c66ae7 b/txscript/data/taproot-ref/39261d0b29bcefd21020cd2c24c872c070c66ae7 new file mode 100644 index 0000000000..9fa795266a --- /dev/null +++ b/txscript/data/taproot-ref/39261d0b29bcefd21020cd2c24c872c070c66ae7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/39427d9b3326e6d242f88c30c5337e28e60ba2cc b/txscript/data/taproot-ref/39427d9b3326e6d242f88c30c5337e28e60ba2cc new file mode 100644 index 0000000000..d15630d58f --- /dev/null +++ b/txscript/data/taproot-ref/39427d9b3326e6d242f88c30c5337e28e60ba2cc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/395284f8211e771929c6abd17a1e39b471bad2ac b/txscript/data/taproot-ref/395284f8211e771929c6abd17a1e39b471bad2ac new file mode 100644 index 0000000000..9d70f625e7 --- /dev/null +++ b/txscript/data/taproot-ref/395284f8211e771929c6abd17a1e39b471bad2ac @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/39702f9a29cc5985ccdbae18da3583e3a98271be b/txscript/data/taproot-ref/39702f9a29cc5985ccdbae18da3583e3a98271be new file mode 100644 index 0000000000..9c28e84b09 --- /dev/null +++ b/txscript/data/taproot-ref/39702f9a29cc5985ccdbae18da3583e3a98271be @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/39a530e81b2ae6640a22eade59df3f302ebb0806 b/txscript/data/taproot-ref/39a530e81b2ae6640a22eade59df3f302ebb0806 new file mode 100644 index 0000000000..b77f132f87 --- /dev/null +++ b/txscript/data/taproot-ref/39a530e81b2ae6640a22eade59df3f302ebb0806 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/39c2d78974b78a945ee5325ec03d2a9842678371 b/txscript/data/taproot-ref/39c2d78974b78a945ee5325ec03d2a9842678371 new file mode 100644 index 0000000000..d1c39e687f --- /dev/null +++ b/txscript/data/taproot-ref/39c2d78974b78a945ee5325ec03d2a9842678371 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/39c6fd26ec7474a9addfe549df2cb8ee610ecb51 b/txscript/data/taproot-ref/39c6fd26ec7474a9addfe549df2cb8ee610ecb51 new file mode 100644 index 0000000000..3c42d7ced6 --- /dev/null +++ b/txscript/data/taproot-ref/39c6fd26ec7474a9addfe549df2cb8ee610ecb51 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3a48de373b5922e0287dcbaa10361aa1464b3eff b/txscript/data/taproot-ref/3a48de373b5922e0287dcbaa10361aa1464b3eff new file mode 100644 index 0000000000..58f6b2c3dc --- /dev/null +++ b/txscript/data/taproot-ref/3a48de373b5922e0287dcbaa10361aa1464b3eff @@ -0,0 +1 @@ +{"tx": "0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c43010000003f472588bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4501000000d3e842e9032ea2ca000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac62000000", "prevouts": ["20175100000000001659142540f27e90740933c99d4f17ab2dfc6c82951cfb", "d2437c000000000022512077ac2a27a93614a377debb8ffed5c2ae54185f2c1c8dd8a23e6a2ab719a18bb4"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["91828a2f001425c1625387988a444090750bf791918c2207b1a3dea73b12df8da6bb09bc2dde7a967fde5f43a9deee757818cef0ebf7bcebdcb8a1fff3bcdb39", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/3a4b7a4a72ab611ede23f7e04e2c7e0300d1c7b6 b/txscript/data/taproot-ref/3a4b7a4a72ab611ede23f7e04e2c7e0300d1c7b6 new file mode 100644 index 0000000000..3918d4814d --- /dev/null +++ b/txscript/data/taproot-ref/3a4b7a4a72ab611ede23f7e04e2c7e0300d1c7b6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3a5d1711382ce031d27b85c9d0db96a8d322c0a5 b/txscript/data/taproot-ref/3a5d1711382ce031d27b85c9d0db96a8d322c0a5 new file mode 100644 index 0000000000..f575eb2b8e --- /dev/null +++ b/txscript/data/taproot-ref/3a5d1711382ce031d27b85c9d0db96a8d322c0a5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3a8258d488d60df9cd2d2e0f3fbfda5aa2916b1a b/txscript/data/taproot-ref/3a8258d488d60df9cd2d2e0f3fbfda5aa2916b1a new file mode 100644 index 0000000000..fc1733d229 --- /dev/null +++ b/txscript/data/taproot-ref/3a8258d488d60df9cd2d2e0f3fbfda5aa2916b1a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3ad5eb51c8c2ea66907d5c7b40ef6cccaee711ce b/txscript/data/taproot-ref/3ad5eb51c8c2ea66907d5c7b40ef6cccaee711ce new file mode 100644 index 0000000000..126238e9d5 --- /dev/null +++ b/txscript/data/taproot-ref/3ad5eb51c8c2ea66907d5c7b40ef6cccaee711ce @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3b055324162a840bb031e742e417383a3c2b9fff b/txscript/data/taproot-ref/3b055324162a840bb031e742e417383a3c2b9fff new file mode 100644 index 0000000000..93cdaa7eed --- /dev/null +++ b/txscript/data/taproot-ref/3b055324162a840bb031e742e417383a3c2b9fff @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3b6174c02c9421bd7512cb0b507ee81cbe621e8f b/txscript/data/taproot-ref/3b6174c02c9421bd7512cb0b507ee81cbe621e8f new file mode 100644 index 0000000000..2e1c5de204 --- /dev/null +++ b/txscript/data/taproot-ref/3b6174c02c9421bd7512cb0b507ee81cbe621e8f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3b756b29419004b37c85b3e93c13d3f231e1eb67 b/txscript/data/taproot-ref/3b756b29419004b37c85b3e93c13d3f231e1eb67 new file mode 100644 index 0000000000..b1825443a4 --- /dev/null +++ b/txscript/data/taproot-ref/3b756b29419004b37c85b3e93c13d3f231e1eb67 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3b7aa5f0f9d0fc31f7be3558e9eae22f13652d33 b/txscript/data/taproot-ref/3b7aa5f0f9d0fc31f7be3558e9eae22f13652d33 new file mode 100644 index 0000000000..ab7b2eb779 --- /dev/null +++ b/txscript/data/taproot-ref/3b7aa5f0f9d0fc31f7be3558e9eae22f13652d33 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3b964cb9d3464c3949a2e8a0f9edb54a4a9ce6c7 b/txscript/data/taproot-ref/3b964cb9d3464c3949a2e8a0f9edb54a4a9ce6c7 new file mode 100644 index 0000000000..1add070180 --- /dev/null +++ b/txscript/data/taproot-ref/3b964cb9d3464c3949a2e8a0f9edb54a4a9ce6c7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3ba14a20059a5c8f8e184fb6d08736296adf21fd b/txscript/data/taproot-ref/3ba14a20059a5c8f8e184fb6d08736296adf21fd new file mode 100644 index 0000000000..6066bc14a6 --- /dev/null +++ b/txscript/data/taproot-ref/3ba14a20059a5c8f8e184fb6d08736296adf21fd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3ba4a606e430170b23a098c2ac6ee7213be618ca b/txscript/data/taproot-ref/3ba4a606e430170b23a098c2ac6ee7213be618ca new file mode 100644 index 0000000000..5ba12bd382 --- /dev/null +++ b/txscript/data/taproot-ref/3ba4a606e430170b23a098c2ac6ee7213be618ca @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3baa61730ba406d7fad296d7df24a9629ae0240c b/txscript/data/taproot-ref/3baa61730ba406d7fad296d7df24a9629ae0240c new file mode 100644 index 0000000000..4c2f11a981 --- /dev/null +++ b/txscript/data/taproot-ref/3baa61730ba406d7fad296d7df24a9629ae0240c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3bacefe15c3e633f44d830137c6fe22c074b155d b/txscript/data/taproot-ref/3bacefe15c3e633f44d830137c6fe22c074b155d new file mode 100644 index 0000000000..54e819f0dc --- /dev/null +++ b/txscript/data/taproot-ref/3bacefe15c3e633f44d830137c6fe22c074b155d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3bc46b0f49e132b39a7468c0eeae4f18c15a9e46 b/txscript/data/taproot-ref/3bc46b0f49e132b39a7468c0eeae4f18c15a9e46 new file mode 100644 index 0000000000..a3dc70266f --- /dev/null +++ b/txscript/data/taproot-ref/3bc46b0f49e132b39a7468c0eeae4f18c15a9e46 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3bd1e196feb0c029ad908a2c989b46a4c75e87e4 b/txscript/data/taproot-ref/3bd1e196feb0c029ad908a2c989b46a4c75e87e4 new file mode 100644 index 0000000000..06fbebb7b7 --- /dev/null +++ b/txscript/data/taproot-ref/3bd1e196feb0c029ad908a2c989b46a4c75e87e4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3c0a722d83c61bffb4712e8bdb67f68d6757d30e b/txscript/data/taproot-ref/3c0a722d83c61bffb4712e8bdb67f68d6757d30e new file mode 100644 index 0000000000..abb9f1e1f6 --- /dev/null +++ b/txscript/data/taproot-ref/3c0a722d83c61bffb4712e8bdb67f68d6757d30e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3c11357c518486213b14a41e23ce85acfc7225b9 b/txscript/data/taproot-ref/3c11357c518486213b14a41e23ce85acfc7225b9 new file mode 100644 index 0000000000..e561ce8498 --- /dev/null +++ b/txscript/data/taproot-ref/3c11357c518486213b14a41e23ce85acfc7225b9 @@ -0,0 +1 @@ +{"tx": "010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a400000000bf14df5cdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0c000000002070b123bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd800000000fbff2f2002a8abd800000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac05ebd32a", "prevouts": ["79d30e00000000002253202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "5ed7480000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b", "853c8300000000002200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["c18461cc346aa094096b342c10a66208d719576ebcac841c65ce6ba4e93f60ab55a13d8fcaac985f6aa013828744cdde4f51fcfd86f8c5dd481210b20804d5e2"]}}, diff --git a/txscript/data/taproot-ref/3c20247465b4757bf0758627c8b5e4839dd819cc b/txscript/data/taproot-ref/3c20247465b4757bf0758627c8b5e4839dd819cc new file mode 100644 index 0000000000..8bfeffd16e --- /dev/null +++ b/txscript/data/taproot-ref/3c20247465b4757bf0758627c8b5e4839dd819cc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3c4f81b3cab5b54ca2ec122fa809fca650b47db6 b/txscript/data/taproot-ref/3c4f81b3cab5b54ca2ec122fa809fca650b47db6 new file mode 100644 index 0000000000..0c50b1adaf --- /dev/null +++ b/txscript/data/taproot-ref/3c4f81b3cab5b54ca2ec122fa809fca650b47db6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3c695558731a219357e99fced06f0c24b38b6c11 b/txscript/data/taproot-ref/3c695558731a219357e99fced06f0c24b38b6c11 new file mode 100644 index 0000000000..19d87aac45 --- /dev/null +++ b/txscript/data/taproot-ref/3c695558731a219357e99fced06f0c24b38b6c11 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3c6b79f35456c42d2578553948e940b494865ac5 b/txscript/data/taproot-ref/3c6b79f35456c42d2578553948e940b494865ac5 new file mode 100644 index 0000000000..a52847e944 --- /dev/null +++ b/txscript/data/taproot-ref/3c6b79f35456c42d2578553948e940b494865ac5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3c78b5bf3e8a594974afba095afac84660219f6c b/txscript/data/taproot-ref/3c78b5bf3e8a594974afba095afac84660219f6c new file mode 100644 index 0000000000..4b674f4acd --- /dev/null +++ b/txscript/data/taproot-ref/3c78b5bf3e8a594974afba095afac84660219f6c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3c986463576a17cc12996a738a2cc479d1198df8 b/txscript/data/taproot-ref/3c986463576a17cc12996a738a2cc479d1198df8 new file mode 100644 index 0000000000..1a78176a5c --- /dev/null +++ b/txscript/data/taproot-ref/3c986463576a17cc12996a738a2cc479d1198df8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3cb4479d7f4d2911b165d8e388cda3c7da36bd62 b/txscript/data/taproot-ref/3cb4479d7f4d2911b165d8e388cda3c7da36bd62 new file mode 100644 index 0000000000..f98d9831fa --- /dev/null +++ b/txscript/data/taproot-ref/3cb4479d7f4d2911b165d8e388cda3c7da36bd62 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3cb7605604a629153b71183c4083311f53f6fee1 b/txscript/data/taproot-ref/3cb7605604a629153b71183c4083311f53f6fee1 new file mode 100644 index 0000000000..cf45280cdb --- /dev/null +++ b/txscript/data/taproot-ref/3cb7605604a629153b71183c4083311f53f6fee1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3cd91b4c3a1d21d1c90b1e6542ae78fd35091778 b/txscript/data/taproot-ref/3cd91b4c3a1d21d1c90b1e6542ae78fd35091778 new file mode 100644 index 0000000000..e7cf511211 --- /dev/null +++ b/txscript/data/taproot-ref/3cd91b4c3a1d21d1c90b1e6542ae78fd35091778 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3d4082e12a369fee00a97f5ee6a3b72ea6f15238 b/txscript/data/taproot-ref/3d4082e12a369fee00a97f5ee6a3b72ea6f15238 new file mode 100644 index 0000000000..fb5ecb0d99 --- /dev/null +++ b/txscript/data/taproot-ref/3d4082e12a369fee00a97f5ee6a3b72ea6f15238 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3d4137ffad2b1c85003d032d19a2150f4b6517c9 b/txscript/data/taproot-ref/3d4137ffad2b1c85003d032d19a2150f4b6517c9 new file mode 100644 index 0000000000..308fb8c73a --- /dev/null +++ b/txscript/data/taproot-ref/3d4137ffad2b1c85003d032d19a2150f4b6517c9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3d65682b1f434030f11d6815360c3d269d231474 b/txscript/data/taproot-ref/3d65682b1f434030f11d6815360c3d269d231474 new file mode 100644 index 0000000000..08f6f6d62f --- /dev/null +++ b/txscript/data/taproot-ref/3d65682b1f434030f11d6815360c3d269d231474 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3d6fb8e46d4f9e03d6de0e295ec2e0e50df1aa5f b/txscript/data/taproot-ref/3d6fb8e46d4f9e03d6de0e295ec2e0e50df1aa5f new file mode 100644 index 0000000000..1df0cee865 --- /dev/null +++ b/txscript/data/taproot-ref/3d6fb8e46d4f9e03d6de0e295ec2e0e50df1aa5f @@ -0,0 +1 @@ +{"tx": "02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42d01000000bdb630c88bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4cd000000003ebb08c28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f400000000c26dee9901a9b60e000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374879a000000", "prevouts": ["804a37000000000021561f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b", "47ba3c0000000000225120d767e62fcc8e1bdc4b74e073e2be32f51425a180d82e9ffb428311c4083f028f", "dfe4400000000000225120d1600e1e076c2da8b455f76340d5258bf45fecd0d78155a447a8b04344f8ccd4"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["be422925792e3ada801d54172a3f99503d375b2a7cbec506e7880aeea8a8340bd54c174c2df59760be6047ed0571ab8346cc9029b75c8f79bf2766c41724817e"]}}, diff --git a/txscript/data/taproot-ref/3d75756c8dd79c4efe056dd5435cfb6a2457207c b/txscript/data/taproot-ref/3d75756c8dd79c4efe056dd5435cfb6a2457207c new file mode 100644 index 0000000000..40fd73ab84 --- /dev/null +++ b/txscript/data/taproot-ref/3d75756c8dd79c4efe056dd5435cfb6a2457207c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3da479f176b53c08e1248502a5bc75aed6c71746 b/txscript/data/taproot-ref/3da479f176b53c08e1248502a5bc75aed6c71746 new file mode 100644 index 0000000000..194bd264e6 --- /dev/null +++ b/txscript/data/taproot-ref/3da479f176b53c08e1248502a5bc75aed6c71746 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3db85c10d9886a1d664d6d3db26ae7961d66a4be b/txscript/data/taproot-ref/3db85c10d9886a1d664d6d3db26ae7961d66a4be new file mode 100644 index 0000000000..dea220436f --- /dev/null +++ b/txscript/data/taproot-ref/3db85c10d9886a1d664d6d3db26ae7961d66a4be @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3dc41a3a65eecfb088cf236466ab9fb737a19b57 b/txscript/data/taproot-ref/3dc41a3a65eecfb088cf236466ab9fb737a19b57 new file mode 100644 index 0000000000..6d3e2513a3 --- /dev/null +++ b/txscript/data/taproot-ref/3dc41a3a65eecfb088cf236466ab9fb737a19b57 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3dcd87542c1fe27ba922187001739130ac6c6c5c b/txscript/data/taproot-ref/3dcd87542c1fe27ba922187001739130ac6c6c5c new file mode 100644 index 0000000000..f4098da273 --- /dev/null +++ b/txscript/data/taproot-ref/3dcd87542c1fe27ba922187001739130ac6c6c5c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3dd2c473cd54ea601b15cc9840f01e6cec72fbd3 b/txscript/data/taproot-ref/3dd2c473cd54ea601b15cc9840f01e6cec72fbd3 new file mode 100644 index 0000000000..f9fee2ebf8 --- /dev/null +++ b/txscript/data/taproot-ref/3dd2c473cd54ea601b15cc9840f01e6cec72fbd3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3e0593c1054f6598bbf8297623874e58ed4f2f9e b/txscript/data/taproot-ref/3e0593c1054f6598bbf8297623874e58ed4f2f9e new file mode 100644 index 0000000000..1ab86aa7d2 --- /dev/null +++ b/txscript/data/taproot-ref/3e0593c1054f6598bbf8297623874e58ed4f2f9e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3e1e6aa2f96548cfbcb05311c5d24990bb96a8ef b/txscript/data/taproot-ref/3e1e6aa2f96548cfbcb05311c5d24990bb96a8ef new file mode 100644 index 0000000000..36c671927c --- /dev/null +++ b/txscript/data/taproot-ref/3e1e6aa2f96548cfbcb05311c5d24990bb96a8ef @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3e2370ff2103895a7c13f394468b1d7588a525a0 b/txscript/data/taproot-ref/3e2370ff2103895a7c13f394468b1d7588a525a0 new file mode 100644 index 0000000000..b374aa29a3 --- /dev/null +++ b/txscript/data/taproot-ref/3e2370ff2103895a7c13f394468b1d7588a525a0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3e30536558f547b9ad4f09f367634b969078f719 b/txscript/data/taproot-ref/3e30536558f547b9ad4f09f367634b969078f719 new file mode 100644 index 0000000000..470b674571 --- /dev/null +++ b/txscript/data/taproot-ref/3e30536558f547b9ad4f09f367634b969078f719 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3ea9b3574203d1cc954fbb5b93f7588b765a4d0f b/txscript/data/taproot-ref/3ea9b3574203d1cc954fbb5b93f7588b765a4d0f new file mode 100644 index 0000000000..f0543fbfdf --- /dev/null +++ b/txscript/data/taproot-ref/3ea9b3574203d1cc954fbb5b93f7588b765a4d0f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3eabc6ab34a7c9a974850c1dd22c428aa05b1b1a b/txscript/data/taproot-ref/3eabc6ab34a7c9a974850c1dd22c428aa05b1b1a new file mode 100644 index 0000000000..bdfbd4b9da --- /dev/null +++ b/txscript/data/taproot-ref/3eabc6ab34a7c9a974850c1dd22c428aa05b1b1a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3eb9a6cfe1aa2c1c02424702999504c5b096248f b/txscript/data/taproot-ref/3eb9a6cfe1aa2c1c02424702999504c5b096248f new file mode 100644 index 0000000000..b71c1b1198 --- /dev/null +++ b/txscript/data/taproot-ref/3eb9a6cfe1aa2c1c02424702999504c5b096248f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3ebde48f5439e084e28144fd489296408e0dac44 b/txscript/data/taproot-ref/3ebde48f5439e084e28144fd489296408e0dac44 new file mode 100644 index 0000000000..a3628f3d92 --- /dev/null +++ b/txscript/data/taproot-ref/3ebde48f5439e084e28144fd489296408e0dac44 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3ef5bed9863d50fbfa4dee5c776d36177e888adb b/txscript/data/taproot-ref/3ef5bed9863d50fbfa4dee5c776d36177e888adb new file mode 100644 index 0000000000..759cfffc22 --- /dev/null +++ b/txscript/data/taproot-ref/3ef5bed9863d50fbfa4dee5c776d36177e888adb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3efcb90f4a83944731d1cbf69fcde8147549f8ff b/txscript/data/taproot-ref/3efcb90f4a83944731d1cbf69fcde8147549f8ff new file mode 100644 index 0000000000..04972702d8 --- /dev/null +++ b/txscript/data/taproot-ref/3efcb90f4a83944731d1cbf69fcde8147549f8ff @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/3f08853267dab46c6370068cbb68b228923ff0b3 b/txscript/data/taproot-ref/3f08853267dab46c6370068cbb68b228923ff0b3 new file mode 100644 index 0000000000..966f7327fc --- /dev/null +++ b/txscript/data/taproot-ref/3f08853267dab46c6370068cbb68b228923ff0b3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3f1549e9384322e64380cd38621193a46900a116 b/txscript/data/taproot-ref/3f1549e9384322e64380cd38621193a46900a116 new file mode 100644 index 0000000000..33c2bfaff3 --- /dev/null +++ b/txscript/data/taproot-ref/3f1549e9384322e64380cd38621193a46900a116 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3f1d506b154892f06d439bb90ba5202e723507eb b/txscript/data/taproot-ref/3f1d506b154892f06d439bb90ba5202e723507eb new file mode 100644 index 0000000000..4998b86d0d --- /dev/null +++ b/txscript/data/taproot-ref/3f1d506b154892f06d439bb90ba5202e723507eb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3f512330103073dbd4f58e82fee2f316a4b0c171 b/txscript/data/taproot-ref/3f512330103073dbd4f58e82fee2f316a4b0c171 new file mode 100644 index 0000000000..cdcfa60652 --- /dev/null +++ b/txscript/data/taproot-ref/3f512330103073dbd4f58e82fee2f316a4b0c171 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3f513698f389965cd3f800cde5d06d6742166c96 b/txscript/data/taproot-ref/3f513698f389965cd3f800cde5d06d6742166c96 new file mode 100644 index 0000000000..9d168e517c --- /dev/null +++ b/txscript/data/taproot-ref/3f513698f389965cd3f800cde5d06d6742166c96 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3f6985d5b0c8658ee84900aef20ad6b450f6f3e9 b/txscript/data/taproot-ref/3f6985d5b0c8658ee84900aef20ad6b450f6f3e9 new file mode 100644 index 0000000000..f5ea419704 --- /dev/null +++ b/txscript/data/taproot-ref/3f6985d5b0c8658ee84900aef20ad6b450f6f3e9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3f6a1b44037f9a0ecf95cd3d23ce8bde0b02ff8e b/txscript/data/taproot-ref/3f6a1b44037f9a0ecf95cd3d23ce8bde0b02ff8e new file mode 100644 index 0000000000..b5ca9dc471 --- /dev/null +++ b/txscript/data/taproot-ref/3f6a1b44037f9a0ecf95cd3d23ce8bde0b02ff8e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3f6da0ebdeff4ba77b33c2c2d3b962e7dc353570 b/txscript/data/taproot-ref/3f6da0ebdeff4ba77b33c2c2d3b962e7dc353570 new file mode 100644 index 0000000000..87eb0841f9 --- /dev/null +++ b/txscript/data/taproot-ref/3f6da0ebdeff4ba77b33c2c2d3b962e7dc353570 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/3f7737e152b00480f6b1e13136938142db63c3bb b/txscript/data/taproot-ref/3f7737e152b00480f6b1e13136938142db63c3bb new file mode 100644 index 0000000000..e4cf9270ab --- /dev/null +++ b/txscript/data/taproot-ref/3f7737e152b00480f6b1e13136938142db63c3bb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3f7dd25efaad7cb28967f110fe74e5e38a763ca8 b/txscript/data/taproot-ref/3f7dd25efaad7cb28967f110fe74e5e38a763ca8 new file mode 100644 index 0000000000..be11bc8813 --- /dev/null +++ b/txscript/data/taproot-ref/3f7dd25efaad7cb28967f110fe74e5e38a763ca8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3f827b95772a69cca7924e0a2e6ed2cef8755536 b/txscript/data/taproot-ref/3f827b95772a69cca7924e0a2e6ed2cef8755536 new file mode 100644 index 0000000000..e04b1f74a1 --- /dev/null +++ b/txscript/data/taproot-ref/3f827b95772a69cca7924e0a2e6ed2cef8755536 @@ -0,0 +1 @@ +{"tx": "0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be50100000063a870e860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705a01000000ecf01f0a0126bd150000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796c32f391f", "prevouts": ["821b2600000000002355212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "050211000000000017a914a4e57198280c195671631f8b9014214c2f083b3c87"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["8f1ded8b1cd3477bc520967937fd94eb82f6b542ee85528386023e89fb107d527ab78a30ef63c3319ebabb576fd3449b575a4676437710f9914ebc505dc74930", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/3f86932b9bd5a8f673b4dd4243ebb78bef50c888 b/txscript/data/taproot-ref/3f86932b9bd5a8f673b4dd4243ebb78bef50c888 new file mode 100644 index 0000000000..bb7b44a992 --- /dev/null +++ b/txscript/data/taproot-ref/3f86932b9bd5a8f673b4dd4243ebb78bef50c888 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3f8e06a01cdada6071275fb451a2ba624eecf6b8 b/txscript/data/taproot-ref/3f8e06a01cdada6071275fb451a2ba624eecf6b8 new file mode 100644 index 0000000000..20023d86da --- /dev/null +++ b/txscript/data/taproot-ref/3f8e06a01cdada6071275fb451a2ba624eecf6b8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3f9e6c510733a54871b5b12db956530901898fe5 b/txscript/data/taproot-ref/3f9e6c510733a54871b5b12db956530901898fe5 new file mode 100644 index 0000000000..dae878e0dd --- /dev/null +++ b/txscript/data/taproot-ref/3f9e6c510733a54871b5b12db956530901898fe5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3faa53c6eda1becad9cec3442b7069bc2083f057 b/txscript/data/taproot-ref/3faa53c6eda1becad9cec3442b7069bc2083f057 new file mode 100644 index 0000000000..a3e9573439 --- /dev/null +++ b/txscript/data/taproot-ref/3faa53c6eda1becad9cec3442b7069bc2083f057 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/3fed18356adbd733c605b538f4fbe6434ecad6df b/txscript/data/taproot-ref/3fed18356adbd733c605b538f4fbe6434ecad6df new file mode 100644 index 0000000000..d084673be7 --- /dev/null +++ b/txscript/data/taproot-ref/3fed18356adbd733c605b538f4fbe6434ecad6df @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4017ac5f35612181926802d0cfd9e7f6a5aed8a7 b/txscript/data/taproot-ref/4017ac5f35612181926802d0cfd9e7f6a5aed8a7 new file mode 100644 index 0000000000..fbf4ce8806 --- /dev/null +++ b/txscript/data/taproot-ref/4017ac5f35612181926802d0cfd9e7f6a5aed8a7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/40198d56b45470dd3064ec201e05ca4e3cdca930 b/txscript/data/taproot-ref/40198d56b45470dd3064ec201e05ca4e3cdca930 new file mode 100644 index 0000000000..fc7ceb79bd --- /dev/null +++ b/txscript/data/taproot-ref/40198d56b45470dd3064ec201e05ca4e3cdca930 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/405cc03a69b95e49ca66bdd71055159a13f437eb b/txscript/data/taproot-ref/405cc03a69b95e49ca66bdd71055159a13f437eb new file mode 100644 index 0000000000..e1452dafba --- /dev/null +++ b/txscript/data/taproot-ref/405cc03a69b95e49ca66bdd71055159a13f437eb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/405ecda072acc56c38f0eae072ad858ec1097d36 b/txscript/data/taproot-ref/405ecda072acc56c38f0eae072ad858ec1097d36 new file mode 100644 index 0000000000..72dd93ba74 --- /dev/null +++ b/txscript/data/taproot-ref/405ecda072acc56c38f0eae072ad858ec1097d36 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/40637530cf642a13aaddd88b9e805ab9eed711f1 b/txscript/data/taproot-ref/40637530cf642a13aaddd88b9e805ab9eed711f1 new file mode 100644 index 0000000000..9acff81639 --- /dev/null +++ b/txscript/data/taproot-ref/40637530cf642a13aaddd88b9e805ab9eed711f1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/40815dacf70ec14f7b8a062c9faaf258058731fe b/txscript/data/taproot-ref/40815dacf70ec14f7b8a062c9faaf258058731fe new file mode 100644 index 0000000000..aac3f4487e --- /dev/null +++ b/txscript/data/taproot-ref/40815dacf70ec14f7b8a062c9faaf258058731fe @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4088fa75fe995a05522f18f9b0e6945552611611 b/txscript/data/taproot-ref/4088fa75fe995a05522f18f9b0e6945552611611 new file mode 100644 index 0000000000..14b733fbee --- /dev/null +++ b/txscript/data/taproot-ref/4088fa75fe995a05522f18f9b0e6945552611611 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/40c7820188392556b1df313d7fe8ad00eac4965f b/txscript/data/taproot-ref/40c7820188392556b1df313d7fe8ad00eac4965f new file mode 100644 index 0000000000..18d1c7f8d0 --- /dev/null +++ b/txscript/data/taproot-ref/40c7820188392556b1df313d7fe8ad00eac4965f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/40cdd6d34a71ec60c962c3ce8c6408731acebed3 b/txscript/data/taproot-ref/40cdd6d34a71ec60c962c3ce8c6408731acebed3 new file mode 100644 index 0000000000..97d5810e3b --- /dev/null +++ b/txscript/data/taproot-ref/40cdd6d34a71ec60c962c3ce8c6408731acebed3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/410f4c522606d7e3dd362eafa5a5ab9d9811a338 b/txscript/data/taproot-ref/410f4c522606d7e3dd362eafa5a5ab9d9811a338 new file mode 100644 index 0000000000..0755696578 --- /dev/null +++ b/txscript/data/taproot-ref/410f4c522606d7e3dd362eafa5a5ab9d9811a338 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/41114b51cf4fbb2b1beee4e0cc3047fcddd88c2e b/txscript/data/taproot-ref/41114b51cf4fbb2b1beee4e0cc3047fcddd88c2e new file mode 100644 index 0000000000..47376885c0 --- /dev/null +++ b/txscript/data/taproot-ref/41114b51cf4fbb2b1beee4e0cc3047fcddd88c2e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/416cc4828a6c9b5f1667ac7ad0d2684eb23cac38 b/txscript/data/taproot-ref/416cc4828a6c9b5f1667ac7ad0d2684eb23cac38 new file mode 100644 index 0000000000..979e43619b --- /dev/null +++ b/txscript/data/taproot-ref/416cc4828a6c9b5f1667ac7ad0d2684eb23cac38 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4184d22015b6c9b7656f411782a4484efd87060b b/txscript/data/taproot-ref/4184d22015b6c9b7656f411782a4484efd87060b new file mode 100644 index 0000000000..d32af2588b --- /dev/null +++ b/txscript/data/taproot-ref/4184d22015b6c9b7656f411782a4484efd87060b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4186f82b0ef77212271ae59a07d75a5f370f8add b/txscript/data/taproot-ref/4186f82b0ef77212271ae59a07d75a5f370f8add new file mode 100644 index 0000000000..e10973959e --- /dev/null +++ b/txscript/data/taproot-ref/4186f82b0ef77212271ae59a07d75a5f370f8add @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4194caf8692db4d7109076c5dece284d07e06cbf b/txscript/data/taproot-ref/4194caf8692db4d7109076c5dece284d07e06cbf new file mode 100644 index 0000000000..8cfe708bcb --- /dev/null +++ b/txscript/data/taproot-ref/4194caf8692db4d7109076c5dece284d07e06cbf @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/41a24f98a0882fe70484f5006c4b6b9a37bc85f0 b/txscript/data/taproot-ref/41a24f98a0882fe70484f5006c4b6b9a37bc85f0 new file mode 100644 index 0000000000..d7a8f4f5ec --- /dev/null +++ b/txscript/data/taproot-ref/41a24f98a0882fe70484f5006c4b6b9a37bc85f0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/41bb837acd47aa639c62f7986ff46af86a6c36d1 b/txscript/data/taproot-ref/41bb837acd47aa639c62f7986ff46af86a6c36d1 new file mode 100644 index 0000000000..b71e0d57a4 --- /dev/null +++ b/txscript/data/taproot-ref/41bb837acd47aa639c62f7986ff46af86a6c36d1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/420a24fcbd56a2a2791e7238666b8aa34e2ccf16 b/txscript/data/taproot-ref/420a24fcbd56a2a2791e7238666b8aa34e2ccf16 new file mode 100644 index 0000000000..88fac822b4 --- /dev/null +++ b/txscript/data/taproot-ref/420a24fcbd56a2a2791e7238666b8aa34e2ccf16 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/42c6d3a78f584cc355a0bac6f309e105089332b8 b/txscript/data/taproot-ref/42c6d3a78f584cc355a0bac6f309e105089332b8 new file mode 100644 index 0000000000..70fd9efec8 --- /dev/null +++ b/txscript/data/taproot-ref/42c6d3a78f584cc355a0bac6f309e105089332b8 @@ -0,0 +1 @@ +{"tx": "0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5400000000ddaec8968bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d5010000003ef568afdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4900000000daee1d6e0386b1db0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac56000000", "prevouts": ["92bf790000000000235b212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "309640000000000022512046885de037d9f439e247c936086c9c89d6da1bca43dc543d3e57bccc8a96eb66", "c96623000000000017a914124ce61ffefcd78a2e382c17cb257bb0bdd741e387"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["7c3697d5de3aa481d64fd5f75484d4994cbea6af6a5e3d8391bc5c52fb3307999ad91102540ca3f8757641bfc1d36dd8faf913d9874937fc17baf6ab4db99eba"]}}, diff --git a/txscript/data/taproot-ref/42da32b7dda49d356987402249a3bb67a0b53529 b/txscript/data/taproot-ref/42da32b7dda49d356987402249a3bb67a0b53529 new file mode 100644 index 0000000000..d7174ecceb --- /dev/null +++ b/txscript/data/taproot-ref/42da32b7dda49d356987402249a3bb67a0b53529 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/42e412a1e895536ef1264d7ee08902b8e37a53a0 b/txscript/data/taproot-ref/42e412a1e895536ef1264d7ee08902b8e37a53a0 new file mode 100644 index 0000000000..793ac24cd1 --- /dev/null +++ b/txscript/data/taproot-ref/42e412a1e895536ef1264d7ee08902b8e37a53a0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/42eddccf89cbef79a5adffb7eb5ea1523de5b3b7 b/txscript/data/taproot-ref/42eddccf89cbef79a5adffb7eb5ea1523de5b3b7 new file mode 100644 index 0000000000..6cef0448e5 --- /dev/null +++ b/txscript/data/taproot-ref/42eddccf89cbef79a5adffb7eb5ea1523de5b3b7 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/42f1cfaa89e0e558cc339a4adfc253b4108d5843 b/txscript/data/taproot-ref/42f1cfaa89e0e558cc339a4adfc253b4108d5843 new file mode 100644 index 0000000000..f0a74b0a54 --- /dev/null +++ b/txscript/data/taproot-ref/42f1cfaa89e0e558cc339a4adfc253b4108d5843 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/43532b914ad45faf56c91ef34b9b696012326b2d b/txscript/data/taproot-ref/43532b914ad45faf56c91ef34b9b696012326b2d new file mode 100644 index 0000000000..6f7a81536c --- /dev/null +++ b/txscript/data/taproot-ref/43532b914ad45faf56c91ef34b9b696012326b2d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/43a09bc93d6d45b6cef903b1341a287624b825ca b/txscript/data/taproot-ref/43a09bc93d6d45b6cef903b1341a287624b825ca new file mode 100644 index 0000000000..326f94ea60 --- /dev/null +++ b/txscript/data/taproot-ref/43a09bc93d6d45b6cef903b1341a287624b825ca @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/43a12820d4dfa937dfdbaa0843372e901ec73944 b/txscript/data/taproot-ref/43a12820d4dfa937dfdbaa0843372e901ec73944 new file mode 100644 index 0000000000..d0921be676 --- /dev/null +++ b/txscript/data/taproot-ref/43a12820d4dfa937dfdbaa0843372e901ec73944 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/43b19c13ed8e58e70071e063750e8fca7a9f05e0 b/txscript/data/taproot-ref/43b19c13ed8e58e70071e063750e8fca7a9f05e0 new file mode 100644 index 0000000000..0b9186989b --- /dev/null +++ b/txscript/data/taproot-ref/43b19c13ed8e58e70071e063750e8fca7a9f05e0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/43bfb11c19ea9173f4b0185fbc6a622fd0787c68 b/txscript/data/taproot-ref/43bfb11c19ea9173f4b0185fbc6a622fd0787c68 new file mode 100644 index 0000000000..4965614181 --- /dev/null +++ b/txscript/data/taproot-ref/43bfb11c19ea9173f4b0185fbc6a622fd0787c68 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/43d1fadc7620820efcc941a68f7696480649c13d b/txscript/data/taproot-ref/43d1fadc7620820efcc941a68f7696480649c13d new file mode 100644 index 0000000000..672d74c9f9 --- /dev/null +++ b/txscript/data/taproot-ref/43d1fadc7620820efcc941a68f7696480649c13d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/43dae97b688afba43b6d88389a78b979f1181c34 b/txscript/data/taproot-ref/43dae97b688afba43b6d88389a78b979f1181c34 new file mode 100644 index 0000000000..881c1c22c4 --- /dev/null +++ b/txscript/data/taproot-ref/43dae97b688afba43b6d88389a78b979f1181c34 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/43eea0f55cf11052527d14c3cf0f96e55882c4d5 b/txscript/data/taproot-ref/43eea0f55cf11052527d14c3cf0f96e55882c4d5 new file mode 100644 index 0000000000..931e6ff59b --- /dev/null +++ b/txscript/data/taproot-ref/43eea0f55cf11052527d14c3cf0f96e55882c4d5 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/43f8e70fd6ed448f6cd62609f6e4a9d03a0e083a b/txscript/data/taproot-ref/43f8e70fd6ed448f6cd62609f6e4a9d03a0e083a new file mode 100644 index 0000000000..c36f2aee1e --- /dev/null +++ b/txscript/data/taproot-ref/43f8e70fd6ed448f6cd62609f6e4a9d03a0e083a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4407ad4a37ac5667b725ef07db2b1b0ebbe6db1e b/txscript/data/taproot-ref/4407ad4a37ac5667b725ef07db2b1b0ebbe6db1e new file mode 100644 index 0000000000..7edd8ba2e7 --- /dev/null +++ b/txscript/data/taproot-ref/4407ad4a37ac5667b725ef07db2b1b0ebbe6db1e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4422ccfb3a652df26350f5fd43cab32b4a6db9bc b/txscript/data/taproot-ref/4422ccfb3a652df26350f5fd43cab32b4a6db9bc new file mode 100644 index 0000000000..e440c986c1 --- /dev/null +++ b/txscript/data/taproot-ref/4422ccfb3a652df26350f5fd43cab32b4a6db9bc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/443de93ae646f545525c4a8177964caee78a499e b/txscript/data/taproot-ref/443de93ae646f545525c4a8177964caee78a499e new file mode 100644 index 0000000000..ce9a947405 --- /dev/null +++ b/txscript/data/taproot-ref/443de93ae646f545525c4a8177964caee78a499e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/444bdbc8e2a3f36427b9ee3bb33b639f3d06010d b/txscript/data/taproot-ref/444bdbc8e2a3f36427b9ee3bb33b639f3d06010d new file mode 100644 index 0000000000..8cd0f9fa23 --- /dev/null +++ b/txscript/data/taproot-ref/444bdbc8e2a3f36427b9ee3bb33b639f3d06010d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/44513b5ccd5d2993d98b0f606e24c3363080118d b/txscript/data/taproot-ref/44513b5ccd5d2993d98b0f606e24c3363080118d new file mode 100644 index 0000000000..74f75afd57 --- /dev/null +++ b/txscript/data/taproot-ref/44513b5ccd5d2993d98b0f606e24c3363080118d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/447e0a4f2c9391201bd7abdb3935d959277ac93d b/txscript/data/taproot-ref/447e0a4f2c9391201bd7abdb3935d959277ac93d new file mode 100644 index 0000000000..d363e035e6 --- /dev/null +++ b/txscript/data/taproot-ref/447e0a4f2c9391201bd7abdb3935d959277ac93d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4493e5053e8c93d7133c12033db30ab0fad02eea b/txscript/data/taproot-ref/4493e5053e8c93d7133c12033db30ab0fad02eea new file mode 100644 index 0000000000..513ba502b5 --- /dev/null +++ b/txscript/data/taproot-ref/4493e5053e8c93d7133c12033db30ab0fad02eea @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/44b2a5681330965efa5dadccd65e4296cb9bb54c b/txscript/data/taproot-ref/44b2a5681330965efa5dadccd65e4296cb9bb54c new file mode 100644 index 0000000000..9c74042b93 --- /dev/null +++ b/txscript/data/taproot-ref/44b2a5681330965efa5dadccd65e4296cb9bb54c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/44bf61ffe86491dc47531baea9f4722fed205885 b/txscript/data/taproot-ref/44bf61ffe86491dc47531baea9f4722fed205885 new file mode 100644 index 0000000000..517d32b420 --- /dev/null +++ b/txscript/data/taproot-ref/44bf61ffe86491dc47531baea9f4722fed205885 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/44c41d5a9ee6d3836c4cd959feb9946950a93097 b/txscript/data/taproot-ref/44c41d5a9ee6d3836c4cd959feb9946950a93097 new file mode 100644 index 0000000000..8b550ad076 --- /dev/null +++ b/txscript/data/taproot-ref/44c41d5a9ee6d3836c4cd959feb9946950a93097 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/44d03ac572cc57f5a15470cd97f15bcb5b9aae1e b/txscript/data/taproot-ref/44d03ac572cc57f5a15470cd97f15bcb5b9aae1e new file mode 100644 index 0000000000..0c11333727 --- /dev/null +++ b/txscript/data/taproot-ref/44d03ac572cc57f5a15470cd97f15bcb5b9aae1e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/44d081e51884f8d702e4373433bcf56a8a7ad583 b/txscript/data/taproot-ref/44d081e51884f8d702e4373433bcf56a8a7ad583 new file mode 100644 index 0000000000..5f905c01d6 --- /dev/null +++ b/txscript/data/taproot-ref/44d081e51884f8d702e4373433bcf56a8a7ad583 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/44d277dff113e85feb1b0da733079ba007e9ce3c b/txscript/data/taproot-ref/44d277dff113e85feb1b0da733079ba007e9ce3c new file mode 100644 index 0000000000..1fa6a3904d --- /dev/null +++ b/txscript/data/taproot-ref/44d277dff113e85feb1b0da733079ba007e9ce3c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/44f204855343e69fdcf5529e0a6cb7ea5dee9741 b/txscript/data/taproot-ref/44f204855343e69fdcf5529e0a6cb7ea5dee9741 new file mode 100644 index 0000000000..aff72888e5 --- /dev/null +++ b/txscript/data/taproot-ref/44f204855343e69fdcf5529e0a6cb7ea5dee9741 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/452689d60be7f0c8bbd02b65a8c9841ac076b913 b/txscript/data/taproot-ref/452689d60be7f0c8bbd02b65a8c9841ac076b913 new file mode 100644 index 0000000000..aaf663ce09 --- /dev/null +++ b/txscript/data/taproot-ref/452689d60be7f0c8bbd02b65a8c9841ac076b913 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/456d04cce86b68e35302afe4c3345e7531aa7304 b/txscript/data/taproot-ref/456d04cce86b68e35302afe4c3345e7531aa7304 new file mode 100644 index 0000000000..8e34a756f4 --- /dev/null +++ b/txscript/data/taproot-ref/456d04cce86b68e35302afe4c3345e7531aa7304 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/457a9522f60a63cad613ce6f45ab52147b5a1871 b/txscript/data/taproot-ref/457a9522f60a63cad613ce6f45ab52147b5a1871 new file mode 100644 index 0000000000..1e69470fa1 --- /dev/null +++ b/txscript/data/taproot-ref/457a9522f60a63cad613ce6f45ab52147b5a1871 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/45afd60d642320c756621d0d193cd27de023f243 b/txscript/data/taproot-ref/45afd60d642320c756621d0d193cd27de023f243 new file mode 100644 index 0000000000..0896b460b5 --- /dev/null +++ b/txscript/data/taproot-ref/45afd60d642320c756621d0d193cd27de023f243 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/45b86557bbe4fb210901de818886b7536f396562 b/txscript/data/taproot-ref/45b86557bbe4fb210901de818886b7536f396562 new file mode 100644 index 0000000000..ede9019c39 --- /dev/null +++ b/txscript/data/taproot-ref/45b86557bbe4fb210901de818886b7536f396562 @@ -0,0 +1 @@ +{"tx": "0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cbf000000007c50ca91bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf94000000002da740f8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0101000000229667af01daee3f0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7963a040000", "prevouts": ["27a64c000000000017a9146db815d9819f256ca5d1e70b15558a98689cc52e87", "24147c000000000022512080bd047c4cf14a11f5476d57183f1020b00443da67a37d5b059d1b67b35ba9d4", "aff2740000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "1660142540f27e90740933c99d4f17ab2dfc6c82951cfb", "witness": ["cc47afc87fe7e8d7b05810557d398c7c6f0e422d590854faf4d3aea996538b47150c40e9edfa5851e1f642438811c8380333a2d98b1d78fa264d476dd3011794"]}}, diff --git a/txscript/data/taproot-ref/45babb1803fdc9834a37bce496e989425e2fe9b9 b/txscript/data/taproot-ref/45babb1803fdc9834a37bce496e989425e2fe9b9 new file mode 100644 index 0000000000..de0447226d --- /dev/null +++ b/txscript/data/taproot-ref/45babb1803fdc9834a37bce496e989425e2fe9b9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/45c14cf9149717468bed37e1e419020555c5f927 b/txscript/data/taproot-ref/45c14cf9149717468bed37e1e419020555c5f927 new file mode 100644 index 0000000000..f9d5f8b399 --- /dev/null +++ b/txscript/data/taproot-ref/45c14cf9149717468bed37e1e419020555c5f927 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/45c97ab53324162e66ed1d4c64371055d966b691 b/txscript/data/taproot-ref/45c97ab53324162e66ed1d4c64371055d966b691 new file mode 100644 index 0000000000..0b32c6da20 --- /dev/null +++ b/txscript/data/taproot-ref/45c97ab53324162e66ed1d4c64371055d966b691 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/461af17d337077781b7e49d203e17cf7cdd7781b b/txscript/data/taproot-ref/461af17d337077781b7e49d203e17cf7cdd7781b new file mode 100644 index 0000000000..3b973c0ee9 --- /dev/null +++ b/txscript/data/taproot-ref/461af17d337077781b7e49d203e17cf7cdd7781b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/464a9d31b63ef5f4fe0f193acff3f7a8251adb7f b/txscript/data/taproot-ref/464a9d31b63ef5f4fe0f193acff3f7a8251adb7f new file mode 100644 index 0000000000..29647b92c9 --- /dev/null +++ b/txscript/data/taproot-ref/464a9d31b63ef5f4fe0f193acff3f7a8251adb7f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4656d9b9e1003224e094622d9723247d8e53ca72 b/txscript/data/taproot-ref/4656d9b9e1003224e094622d9723247d8e53ca72 new file mode 100644 index 0000000000..07c24b4fa8 --- /dev/null +++ b/txscript/data/taproot-ref/4656d9b9e1003224e094622d9723247d8e53ca72 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/467ac05fa481edab9bf207738a0fdf308bb097c5 b/txscript/data/taproot-ref/467ac05fa481edab9bf207738a0fdf308bb097c5 new file mode 100644 index 0000000000..98cf273400 --- /dev/null +++ b/txscript/data/taproot-ref/467ac05fa481edab9bf207738a0fdf308bb097c5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/469213f3d0a4e2171977ef67184aa5af2a7d259a b/txscript/data/taproot-ref/469213f3d0a4e2171977ef67184aa5af2a7d259a new file mode 100644 index 0000000000..dd6f0e1fd0 --- /dev/null +++ b/txscript/data/taproot-ref/469213f3d0a4e2171977ef67184aa5af2a7d259a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/46a14a2d2ab594d5d1917b16120cf28258bcd02b b/txscript/data/taproot-ref/46a14a2d2ab594d5d1917b16120cf28258bcd02b new file mode 100644 index 0000000000..4febc8f985 --- /dev/null +++ b/txscript/data/taproot-ref/46a14a2d2ab594d5d1917b16120cf28258bcd02b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/46b30a46669909d38ddfd379180d9b9e4b032d30 b/txscript/data/taproot-ref/46b30a46669909d38ddfd379180d9b9e4b032d30 new file mode 100644 index 0000000000..9636a99fb3 --- /dev/null +++ b/txscript/data/taproot-ref/46b30a46669909d38ddfd379180d9b9e4b032d30 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/46bf3a742f868512007f33d6092b25ad9851abc5 b/txscript/data/taproot-ref/46bf3a742f868512007f33d6092b25ad9851abc5 new file mode 100644 index 0000000000..d38e69d741 --- /dev/null +++ b/txscript/data/taproot-ref/46bf3a742f868512007f33d6092b25ad9851abc5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/46faed608cd8553355e705736f5883a865bdd1c0 b/txscript/data/taproot-ref/46faed608cd8553355e705736f5883a865bdd1c0 new file mode 100644 index 0000000000..cfa591e1e1 --- /dev/null +++ b/txscript/data/taproot-ref/46faed608cd8553355e705736f5883a865bdd1c0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/476140a4869c363ff59de15ca0b3dddb33ee16ea b/txscript/data/taproot-ref/476140a4869c363ff59de15ca0b3dddb33ee16ea new file mode 100644 index 0000000000..43553778eb --- /dev/null +++ b/txscript/data/taproot-ref/476140a4869c363ff59de15ca0b3dddb33ee16ea @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/47678ed5dae9d91220f82b512192c03161458d96 b/txscript/data/taproot-ref/47678ed5dae9d91220f82b512192c03161458d96 new file mode 100644 index 0000000000..6b53460080 --- /dev/null +++ b/txscript/data/taproot-ref/47678ed5dae9d91220f82b512192c03161458d96 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/476e1eb3a45bcd3c87728f4a5f152341fc41c6d6 b/txscript/data/taproot-ref/476e1eb3a45bcd3c87728f4a5f152341fc41c6d6 new file mode 100644 index 0000000000..853e3d3b93 --- /dev/null +++ b/txscript/data/taproot-ref/476e1eb3a45bcd3c87728f4a5f152341fc41c6d6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4775847b1966e3acdf5bf21407d223d54512c0aa b/txscript/data/taproot-ref/4775847b1966e3acdf5bf21407d223d54512c0aa new file mode 100644 index 0000000000..4d2c63df87 --- /dev/null +++ b/txscript/data/taproot-ref/4775847b1966e3acdf5bf21407d223d54512c0aa @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/477812c3aa633968c3f508ea4a64f6240b7c1282 b/txscript/data/taproot-ref/477812c3aa633968c3f508ea4a64f6240b7c1282 new file mode 100644 index 0000000000..29034688fd --- /dev/null +++ b/txscript/data/taproot-ref/477812c3aa633968c3f508ea4a64f6240b7c1282 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4786bab5e3fdd53811fa094d64658a869323943d b/txscript/data/taproot-ref/4786bab5e3fdd53811fa094d64658a869323943d new file mode 100644 index 0000000000..cb78875080 --- /dev/null +++ b/txscript/data/taproot-ref/4786bab5e3fdd53811fa094d64658a869323943d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/47975b43d53b5ddfe8aebbb719cb70af90f9ca56 b/txscript/data/taproot-ref/47975b43d53b5ddfe8aebbb719cb70af90f9ca56 new file mode 100644 index 0000000000..4e8395b7bc --- /dev/null +++ b/txscript/data/taproot-ref/47975b43d53b5ddfe8aebbb719cb70af90f9ca56 @@ -0,0 +1 @@ +{"tx": "01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40300000000adc681c160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b301000000dee1962b01d87c34000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478764020000", "prevouts": ["f8753600000000001656142540f27e90740933c99d4f17ab2dfc6c82951cfb", "65390f00000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["7978dde698ec2ffcbe18d31e2b3e1930a62fb25b10c61fab7b5bcb7c9958caaf1005dae1442a6f45bfa98dbdd682397b3b8b78c167932e94f80d4e7c40292eaa"]}}, diff --git a/txscript/data/taproot-ref/479ddb4cda1c95a66132ba2891f8deed16e1e31a b/txscript/data/taproot-ref/479ddb4cda1c95a66132ba2891f8deed16e1e31a new file mode 100644 index 0000000000..2c614098d7 --- /dev/null +++ b/txscript/data/taproot-ref/479ddb4cda1c95a66132ba2891f8deed16e1e31a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/47c96a95d6bd928e3390068b3c94db28d219e9c7 b/txscript/data/taproot-ref/47c96a95d6bd928e3390068b3c94db28d219e9c7 new file mode 100644 index 0000000000..9802830672 --- /dev/null +++ b/txscript/data/taproot-ref/47c96a95d6bd928e3390068b3c94db28d219e9c7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/47d2125494edd0e8f737339160fc2c2bbff13239 b/txscript/data/taproot-ref/47d2125494edd0e8f737339160fc2c2bbff13239 new file mode 100644 index 0000000000..34b3c91a89 --- /dev/null +++ b/txscript/data/taproot-ref/47d2125494edd0e8f737339160fc2c2bbff13239 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/47d754aabbae7b0b019240479e872ec641a71606 b/txscript/data/taproot-ref/47d754aabbae7b0b019240479e872ec641a71606 new file mode 100644 index 0000000000..497b442656 --- /dev/null +++ b/txscript/data/taproot-ref/47d754aabbae7b0b019240479e872ec641a71606 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/47f82c71674923da07b7c082409faecaa9d932d1 b/txscript/data/taproot-ref/47f82c71674923da07b7c082409faecaa9d932d1 new file mode 100644 index 0000000000..475b9e4d36 --- /dev/null +++ b/txscript/data/taproot-ref/47f82c71674923da07b7c082409faecaa9d932d1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4849670c7437aabe38ac365b533b2cae10e1c316 b/txscript/data/taproot-ref/4849670c7437aabe38ac365b533b2cae10e1c316 new file mode 100644 index 0000000000..9558fdbf7c --- /dev/null +++ b/txscript/data/taproot-ref/4849670c7437aabe38ac365b533b2cae10e1c316 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4877a47b68dcd97455dcb8cd52e27309ec642b93 b/txscript/data/taproot-ref/4877a47b68dcd97455dcb8cd52e27309ec642b93 new file mode 100644 index 0000000000..412ddb3f9d --- /dev/null +++ b/txscript/data/taproot-ref/4877a47b68dcd97455dcb8cd52e27309ec642b93 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/487deb88a57dc3cabdf497fe30220136e593d23d b/txscript/data/taproot-ref/487deb88a57dc3cabdf497fe30220136e593d23d new file mode 100644 index 0000000000..fa349fe0ee --- /dev/null +++ b/txscript/data/taproot-ref/487deb88a57dc3cabdf497fe30220136e593d23d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/48a74bc4e405cef7fd774039eb79bdfaeafeea6b b/txscript/data/taproot-ref/48a74bc4e405cef7fd774039eb79bdfaeafeea6b new file mode 100644 index 0000000000..bd63f5364c --- /dev/null +++ b/txscript/data/taproot-ref/48a74bc4e405cef7fd774039eb79bdfaeafeea6b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/48aba9a0a8d38583f02db4ffbfe46b11affd2459 b/txscript/data/taproot-ref/48aba9a0a8d38583f02db4ffbfe46b11affd2459 new file mode 100644 index 0000000000..c9ad3fa116 --- /dev/null +++ b/txscript/data/taproot-ref/48aba9a0a8d38583f02db4ffbfe46b11affd2459 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/48ba4204d31335006c77c0a0c393c5424c5c89fd b/txscript/data/taproot-ref/48ba4204d31335006c77c0a0c393c5424c5c89fd new file mode 100644 index 0000000000..c9c9d9066f --- /dev/null +++ b/txscript/data/taproot-ref/48ba4204d31335006c77c0a0c393c5424c5c89fd @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/48bb02ef59af281b015aba26344a918d3e949c98 b/txscript/data/taproot-ref/48bb02ef59af281b015aba26344a918d3e949c98 new file mode 100644 index 0000000000..e4b70c3a1b --- /dev/null +++ b/txscript/data/taproot-ref/48bb02ef59af281b015aba26344a918d3e949c98 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/4907d4a7edab4d2d57ded00e95a654d47f9d823b b/txscript/data/taproot-ref/4907d4a7edab4d2d57ded00e95a654d47f9d823b new file mode 100644 index 0000000000..f258ac7b8e --- /dev/null +++ b/txscript/data/taproot-ref/4907d4a7edab4d2d57ded00e95a654d47f9d823b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/491492c2f48c07bca9ef88c9fd36bbd272563b73 b/txscript/data/taproot-ref/491492c2f48c07bca9ef88c9fd36bbd272563b73 new file mode 100644 index 0000000000..3d24de41cb --- /dev/null +++ b/txscript/data/taproot-ref/491492c2f48c07bca9ef88c9fd36bbd272563b73 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/494a7c765d815e6adc6d4e66a57225322bccde6b b/txscript/data/taproot-ref/494a7c765d815e6adc6d4e66a57225322bccde6b new file mode 100644 index 0000000000..b8281d9662 --- /dev/null +++ b/txscript/data/taproot-ref/494a7c765d815e6adc6d4e66a57225322bccde6b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/496ed2b73e932787fe91d418b240c466ab6a4075 b/txscript/data/taproot-ref/496ed2b73e932787fe91d418b240c466ab6a4075 new file mode 100644 index 0000000000..66c38cd5e8 --- /dev/null +++ b/txscript/data/taproot-ref/496ed2b73e932787fe91d418b240c466ab6a4075 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/496f687a93323cea34ef1249059c862f9397c645 b/txscript/data/taproot-ref/496f687a93323cea34ef1249059c862f9397c645 new file mode 100644 index 0000000000..30fa462a0a --- /dev/null +++ b/txscript/data/taproot-ref/496f687a93323cea34ef1249059c862f9397c645 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/499184ec78a677697ab3ce5b0a87dfbb5ecce65e b/txscript/data/taproot-ref/499184ec78a677697ab3ce5b0a87dfbb5ecce65e new file mode 100644 index 0000000000..6c60efcdef --- /dev/null +++ b/txscript/data/taproot-ref/499184ec78a677697ab3ce5b0a87dfbb5ecce65e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/499f8c99044f5a7eb9940853f276e5ed7a9894f3 b/txscript/data/taproot-ref/499f8c99044f5a7eb9940853f276e5ed7a9894f3 new file mode 100644 index 0000000000..8a99b6a902 --- /dev/null +++ b/txscript/data/taproot-ref/499f8c99044f5a7eb9940853f276e5ed7a9894f3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4a015d179a6415548a65aa75d68b1927fe2b0738 b/txscript/data/taproot-ref/4a015d179a6415548a65aa75d68b1927fe2b0738 new file mode 100644 index 0000000000..17a31f804a --- /dev/null +++ b/txscript/data/taproot-ref/4a015d179a6415548a65aa75d68b1927fe2b0738 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4a46cdc5c3a288a4eead1245fd3b0bfea974ea21 b/txscript/data/taproot-ref/4a46cdc5c3a288a4eead1245fd3b0bfea974ea21 new file mode 100644 index 0000000000..b8d72a7c64 --- /dev/null +++ b/txscript/data/taproot-ref/4a46cdc5c3a288a4eead1245fd3b0bfea974ea21 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4a729815cf7a0f3947cdf502e425da1b2392d6b8 b/txscript/data/taproot-ref/4a729815cf7a0f3947cdf502e425da1b2392d6b8 new file mode 100644 index 0000000000..4cf36facdc --- /dev/null +++ b/txscript/data/taproot-ref/4a729815cf7a0f3947cdf502e425da1b2392d6b8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4a7e2f54a225b7edfc7761d52940b39a3702b9d8 b/txscript/data/taproot-ref/4a7e2f54a225b7edfc7761d52940b39a3702b9d8 new file mode 100644 index 0000000000..4fadaf8d51 --- /dev/null +++ b/txscript/data/taproot-ref/4a7e2f54a225b7edfc7761d52940b39a3702b9d8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4a8d82dfb1750aa99deb48b58f8c91a30cc703b0 b/txscript/data/taproot-ref/4a8d82dfb1750aa99deb48b58f8c91a30cc703b0 new file mode 100644 index 0000000000..e4193f2e91 --- /dev/null +++ b/txscript/data/taproot-ref/4a8d82dfb1750aa99deb48b58f8c91a30cc703b0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4ab1d0f5d83d7343f225dc40c2a3a9940dbe3f7c b/txscript/data/taproot-ref/4ab1d0f5d83d7343f225dc40c2a3a9940dbe3f7c new file mode 100644 index 0000000000..78c166592f --- /dev/null +++ b/txscript/data/taproot-ref/4ab1d0f5d83d7343f225dc40c2a3a9940dbe3f7c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4ab5fb6756c937560dc91ad579231800bcb605f0 b/txscript/data/taproot-ref/4ab5fb6756c937560dc91ad579231800bcb605f0 new file mode 100644 index 0000000000..f87110beae --- /dev/null +++ b/txscript/data/taproot-ref/4ab5fb6756c937560dc91ad579231800bcb605f0 @@ -0,0 +1 @@ +{"tx": "0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4600000000ece899acdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6b00000000d1ceccb003347ea4000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e754000000", "prevouts": ["de454a00000000001655142540f27e90740933c99d4f17ab2dfc6c82951cfb", "7c0a5c0000000000225120eb71a13199b51ac9b0ace6bcee525494dad4a8780bc850f36224b177f5d9dc5a"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["5a0974d832729731c41798c33c7a1c0300be4dff93f440d652a3257fbb5da0e4e77fd5c4c8be4c487baeaf32f951980eb2ab4372177d3bd01d49de2560a2e8b7"]}}, diff --git a/txscript/data/taproot-ref/4ab75e6d0cbfec5617026ca0e5622cb4be8d69ea b/txscript/data/taproot-ref/4ab75e6d0cbfec5617026ca0e5622cb4be8d69ea new file mode 100644 index 0000000000..f1832e1f94 --- /dev/null +++ b/txscript/data/taproot-ref/4ab75e6d0cbfec5617026ca0e5622cb4be8d69ea @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4aef881f37b09a5f41876628452dac08c70a5c3e b/txscript/data/taproot-ref/4aef881f37b09a5f41876628452dac08c70a5c3e new file mode 100644 index 0000000000..c923fe2198 --- /dev/null +++ b/txscript/data/taproot-ref/4aef881f37b09a5f41876628452dac08c70a5c3e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4af1e59e48ecbb8bcf5f8c2a739ffe2d47054b4a b/txscript/data/taproot-ref/4af1e59e48ecbb8bcf5f8c2a739ffe2d47054b4a new file mode 100644 index 0000000000..4f74d2b5ff --- /dev/null +++ b/txscript/data/taproot-ref/4af1e59e48ecbb8bcf5f8c2a739ffe2d47054b4a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4b22e5ee8f595d1440ed41006d8e611da06d0c13 b/txscript/data/taproot-ref/4b22e5ee8f595d1440ed41006d8e611da06d0c13 new file mode 100644 index 0000000000..e53d188397 --- /dev/null +++ b/txscript/data/taproot-ref/4b22e5ee8f595d1440ed41006d8e611da06d0c13 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4b537d79f1a6255185126b99325e3917dfdc7885 b/txscript/data/taproot-ref/4b537d79f1a6255185126b99325e3917dfdc7885 new file mode 100644 index 0000000000..22dd3277fd --- /dev/null +++ b/txscript/data/taproot-ref/4b537d79f1a6255185126b99325e3917dfdc7885 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4b57985dbb3b797fd0788cfb9513abc07ddad003 b/txscript/data/taproot-ref/4b57985dbb3b797fd0788cfb9513abc07ddad003 new file mode 100644 index 0000000000..096d5f5f0e --- /dev/null +++ b/txscript/data/taproot-ref/4b57985dbb3b797fd0788cfb9513abc07ddad003 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4b72ce01f999a32aedc950dd1804a8795ff98723 b/txscript/data/taproot-ref/4b72ce01f999a32aedc950dd1804a8795ff98723 new file mode 100644 index 0000000000..39982e1a6c --- /dev/null +++ b/txscript/data/taproot-ref/4b72ce01f999a32aedc950dd1804a8795ff98723 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4b7e7a47d519d00fb5bb9332b6fb49586a4134f8 b/txscript/data/taproot-ref/4b7e7a47d519d00fb5bb9332b6fb49586a4134f8 new file mode 100644 index 0000000000..462f1a05c5 --- /dev/null +++ b/txscript/data/taproot-ref/4b7e7a47d519d00fb5bb9332b6fb49586a4134f8 @@ -0,0 +1 @@ +{"tx": "01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c452000000003b7dd6d08bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41501000000cf2ca79e04c0e7650000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e702dfca59", "prevouts": ["4fb5330000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b", "9b2335000000000017a914a7d99db8790799e567017bcc9951f7f968dba70f87"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "2356212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "witness": ["690731b1a0b6814b8fc7d32847d22e69a3fe5726ee1041af6d03555929f7f434924ac9287832f7b0151492da04fc8589593afba56b6c174e03cfc7bb8bb9d9a9"]}}, diff --git a/txscript/data/taproot-ref/4b8ea927af2611b4cf7fbab90c9f8ffb8bea3ab2 b/txscript/data/taproot-ref/4b8ea927af2611b4cf7fbab90c9f8ffb8bea3ab2 new file mode 100644 index 0000000000..3956ee7c2a --- /dev/null +++ b/txscript/data/taproot-ref/4b8ea927af2611b4cf7fbab90c9f8ffb8bea3ab2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4ba2921581f7a3560b6ec87297653fb165ccf969 b/txscript/data/taproot-ref/4ba2921581f7a3560b6ec87297653fb165ccf969 new file mode 100644 index 0000000000..b10866a716 --- /dev/null +++ b/txscript/data/taproot-ref/4ba2921581f7a3560b6ec87297653fb165ccf969 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4ba8a95b0f39aae1daf6e664542420657da72fa0 b/txscript/data/taproot-ref/4ba8a95b0f39aae1daf6e664542420657da72fa0 new file mode 100644 index 0000000000..4cc0bf36c1 --- /dev/null +++ b/txscript/data/taproot-ref/4ba8a95b0f39aae1daf6e664542420657da72fa0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4be8d76134fd3aa72fd3ecc702e88a4530fcab53 b/txscript/data/taproot-ref/4be8d76134fd3aa72fd3ecc702e88a4530fcab53 new file mode 100644 index 0000000000..385a6f3ba8 --- /dev/null +++ b/txscript/data/taproot-ref/4be8d76134fd3aa72fd3ecc702e88a4530fcab53 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4c0186fb62257335535a95ddfc34807b1f836154 b/txscript/data/taproot-ref/4c0186fb62257335535a95ddfc34807b1f836154 new file mode 100644 index 0000000000..1844d88e0d --- /dev/null +++ b/txscript/data/taproot-ref/4c0186fb62257335535a95ddfc34807b1f836154 @@ -0,0 +1 @@ +{"tx": "0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9f01000000d913cab760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127007010000005f0436fa04d7bb8800000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac46000000", "prevouts": ["c4ba7b00000000002251205fb82515a803bc66e22805d16c9967a9f99675502991462318dd4d89658b7382", "ef5f0f000000000017a914b1a54d09172ecbb89289f2a670acc3fe14ced9ee87"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "21531f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b", "witness": ["315c9a851d47e522491de1c1ba5d5322a5df750b02611d4cb50ed7000beb732301bc0bc1e59598d7fec28d19249cd55c8f6b8b2ee5a8a9abc8e53766e9e84962"]}}, diff --git a/txscript/data/taproot-ref/4c0a1b11b6e6b7691c115aa09cd92e8ee09a5076 b/txscript/data/taproot-ref/4c0a1b11b6e6b7691c115aa09cd92e8ee09a5076 new file mode 100644 index 0000000000..97921b1dc0 --- /dev/null +++ b/txscript/data/taproot-ref/4c0a1b11b6e6b7691c115aa09cd92e8ee09a5076 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4c117e356638d628e5b841bc413e67c8bbf10384 b/txscript/data/taproot-ref/4c117e356638d628e5b841bc413e67c8bbf10384 new file mode 100644 index 0000000000..06c16b9e20 --- /dev/null +++ b/txscript/data/taproot-ref/4c117e356638d628e5b841bc413e67c8bbf10384 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4c2d2d7bdc708a582093d11d189f7addae41c5b4 b/txscript/data/taproot-ref/4c2d2d7bdc708a582093d11d189f7addae41c5b4 new file mode 100644 index 0000000000..803f2fd44b --- /dev/null +++ b/txscript/data/taproot-ref/4c2d2d7bdc708a582093d11d189f7addae41c5b4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4c66ad58c30b6404b73490df6a7aabdb4eb995b2 b/txscript/data/taproot-ref/4c66ad58c30b6404b73490df6a7aabdb4eb995b2 new file mode 100644 index 0000000000..fa690cb3af --- /dev/null +++ b/txscript/data/taproot-ref/4c66ad58c30b6404b73490df6a7aabdb4eb995b2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4c749139f91d4268578b998b4fc4742cfa968495 b/txscript/data/taproot-ref/4c749139f91d4268578b998b4fc4742cfa968495 new file mode 100644 index 0000000000..6c9297402f --- /dev/null +++ b/txscript/data/taproot-ref/4c749139f91d4268578b998b4fc4742cfa968495 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4c9126df811790be522891686bd1fcd0a7fae560 b/txscript/data/taproot-ref/4c9126df811790be522891686bd1fcd0a7fae560 new file mode 100644 index 0000000000..bc673e28c5 --- /dev/null +++ b/txscript/data/taproot-ref/4c9126df811790be522891686bd1fcd0a7fae560 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4cafaf85ab316a592878f9e83a2be01cfcdf738f b/txscript/data/taproot-ref/4cafaf85ab316a592878f9e83a2be01cfcdf738f new file mode 100644 index 0000000000..84a80b3025 --- /dev/null +++ b/txscript/data/taproot-ref/4cafaf85ab316a592878f9e83a2be01cfcdf738f @@ -0,0 +1 @@ +{"tx": "0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1602000000242acf68dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be400000000ae8b607802db5a4a00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac46000000", "prevouts": ["b1e125000000000021591f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b", "55a626000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["2a8b80e8a4f54d2267cf3d402978e8bdf420668ca259624885a6428db47c5d9e5f34f52c8c25435eb0d65ca1a580061a460ead8a38f69365bc452750d37d7f62", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/4cb7d23ad1e01a5e42d3c8d927936db03801ab95 b/txscript/data/taproot-ref/4cb7d23ad1e01a5e42d3c8d927936db03801ab95 new file mode 100644 index 0000000000..e464d39cf4 --- /dev/null +++ b/txscript/data/taproot-ref/4cb7d23ad1e01a5e42d3c8d927936db03801ab95 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/4cff2a8e93a415e0cd8f16313427db2dceea582a b/txscript/data/taproot-ref/4cff2a8e93a415e0cd8f16313427db2dceea582a new file mode 100644 index 0000000000..93fd5161c9 --- /dev/null +++ b/txscript/data/taproot-ref/4cff2a8e93a415e0cd8f16313427db2dceea582a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4d21f89d57587583f18ad029ffd268e08c6deaed b/txscript/data/taproot-ref/4d21f89d57587583f18ad029ffd268e08c6deaed new file mode 100644 index 0000000000..b4c2bac9b5 --- /dev/null +++ b/txscript/data/taproot-ref/4d21f89d57587583f18ad029ffd268e08c6deaed @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4d2c30084bbdec620ff06379849a52ea2e10b97f b/txscript/data/taproot-ref/4d2c30084bbdec620ff06379849a52ea2e10b97f new file mode 100644 index 0000000000..44e6f05ce1 --- /dev/null +++ b/txscript/data/taproot-ref/4d2c30084bbdec620ff06379849a52ea2e10b97f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4d72ed31959a5c8b48c6c9de682cb5364bf0cafe b/txscript/data/taproot-ref/4d72ed31959a5c8b48c6c9de682cb5364bf0cafe new file mode 100644 index 0000000000..b22610d639 --- /dev/null +++ b/txscript/data/taproot-ref/4d72ed31959a5c8b48c6c9de682cb5364bf0cafe @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4d9a093d9de04fcd9c74eeb3fb252b4f762f048e b/txscript/data/taproot-ref/4d9a093d9de04fcd9c74eeb3fb252b4f762f048e new file mode 100644 index 0000000000..06233c8185 --- /dev/null +++ b/txscript/data/taproot-ref/4d9a093d9de04fcd9c74eeb3fb252b4f762f048e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4db56aa4ef26d2fbb9c74967c01012f86fb5c60e b/txscript/data/taproot-ref/4db56aa4ef26d2fbb9c74967c01012f86fb5c60e new file mode 100644 index 0000000000..2e6b189edc --- /dev/null +++ b/txscript/data/taproot-ref/4db56aa4ef26d2fbb9c74967c01012f86fb5c60e @@ -0,0 +1 @@ +{"tx": "20bdf86d02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5a01000000abe94496bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb8000000008c6483c501f95a620000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc21cc5822", "prevouts": ["e9f97b00000000001655142540f27e90740933c99d4f17ab2dfc6c82951cfb", "a723680000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["7dad6448b4411583ad8d2c2bf818b3c92438e9340c508ee2c4cae7d32a0e655689d8b77e92372bd5c63edbeb50f1ebe16a828c5f28f4cb0b53df526722b611b7", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/4dd64e2309c3e9efee2d5404d847b644329d1f7f b/txscript/data/taproot-ref/4dd64e2309c3e9efee2d5404d847b644329d1f7f new file mode 100644 index 0000000000..904770064d --- /dev/null +++ b/txscript/data/taproot-ref/4dd64e2309c3e9efee2d5404d847b644329d1f7f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4df3d74d147d4bb7144799be7f96196f44def06d b/txscript/data/taproot-ref/4df3d74d147d4bb7144799be7f96196f44def06d new file mode 100644 index 0000000000..70818cc375 --- /dev/null +++ b/txscript/data/taproot-ref/4df3d74d147d4bb7144799be7f96196f44def06d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4e1c650230dc5d5f622303dbdb697b39acc5953d b/txscript/data/taproot-ref/4e1c650230dc5d5f622303dbdb697b39acc5953d new file mode 100644 index 0000000000..c8bc483eaf --- /dev/null +++ b/txscript/data/taproot-ref/4e1c650230dc5d5f622303dbdb697b39acc5953d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4e27213b2fb3cbd2c324c9d967eb6837151c512b b/txscript/data/taproot-ref/4e27213b2fb3cbd2c324c9d967eb6837151c512b new file mode 100644 index 0000000000..9f69ce501b --- /dev/null +++ b/txscript/data/taproot-ref/4e27213b2fb3cbd2c324c9d967eb6837151c512b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4e442bf704b5166ed40da217a4f0a6103e117487 b/txscript/data/taproot-ref/4e442bf704b5166ed40da217a4f0a6103e117487 new file mode 100644 index 0000000000..72cea4bfce --- /dev/null +++ b/txscript/data/taproot-ref/4e442bf704b5166ed40da217a4f0a6103e117487 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4e6bb871c5b2e524530d3675221cf34b2e598538 b/txscript/data/taproot-ref/4e6bb871c5b2e524530d3675221cf34b2e598538 new file mode 100644 index 0000000000..425a343d13 --- /dev/null +++ b/txscript/data/taproot-ref/4e6bb871c5b2e524530d3675221cf34b2e598538 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4e7f6d1d5ff623f2b978feb61b0905320a14cea2 b/txscript/data/taproot-ref/4e7f6d1d5ff623f2b978feb61b0905320a14cea2 new file mode 100644 index 0000000000..b91cd108e5 --- /dev/null +++ b/txscript/data/taproot-ref/4e7f6d1d5ff623f2b978feb61b0905320a14cea2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4e8673f1a272e7a4846b2b13fd4d6d699de0dd4d b/txscript/data/taproot-ref/4e8673f1a272e7a4846b2b13fd4d6d699de0dd4d new file mode 100644 index 0000000000..c8ea1a7199 --- /dev/null +++ b/txscript/data/taproot-ref/4e8673f1a272e7a4846b2b13fd4d6d699de0dd4d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4e8dce29e5e8dce89954f8535e95a66c4dec52d0 b/txscript/data/taproot-ref/4e8dce29e5e8dce89954f8535e95a66c4dec52d0 new file mode 100644 index 0000000000..8c7c374a7a --- /dev/null +++ b/txscript/data/taproot-ref/4e8dce29e5e8dce89954f8535e95a66c4dec52d0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4e98f79b12c1bcc786816c990038e187b1881a2b b/txscript/data/taproot-ref/4e98f79b12c1bcc786816c990038e187b1881a2b new file mode 100644 index 0000000000..5d9fb5e50e --- /dev/null +++ b/txscript/data/taproot-ref/4e98f79b12c1bcc786816c990038e187b1881a2b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4ebc10c30a1a1250dc40fd49051eb8cadd3eb677 b/txscript/data/taproot-ref/4ebc10c30a1a1250dc40fd49051eb8cadd3eb677 new file mode 100644 index 0000000000..51745e8e2b --- /dev/null +++ b/txscript/data/taproot-ref/4ebc10c30a1a1250dc40fd49051eb8cadd3eb677 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4ed19b212daaac7d9ddf8fbed04bd645b3540c87 b/txscript/data/taproot-ref/4ed19b212daaac7d9ddf8fbed04bd645b3540c87 new file mode 100644 index 0000000000..d78c1439ca --- /dev/null +++ b/txscript/data/taproot-ref/4ed19b212daaac7d9ddf8fbed04bd645b3540c87 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4ed948d6df09636962a55dc16fa8141b57caf0a8 b/txscript/data/taproot-ref/4ed948d6df09636962a55dc16fa8141b57caf0a8 new file mode 100644 index 0000000000..66a58eead5 --- /dev/null +++ b/txscript/data/taproot-ref/4ed948d6df09636962a55dc16fa8141b57caf0a8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4f01eb0e5c5b453e93d7259acca78110e06e0cdc b/txscript/data/taproot-ref/4f01eb0e5c5b453e93d7259acca78110e06e0cdc new file mode 100644 index 0000000000..e66d3f60da --- /dev/null +++ b/txscript/data/taproot-ref/4f01eb0e5c5b453e93d7259acca78110e06e0cdc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4f043f492b006187a12d4a27a2fb711e089c21cb b/txscript/data/taproot-ref/4f043f492b006187a12d4a27a2fb711e089c21cb new file mode 100644 index 0000000000..a546c9dabc --- /dev/null +++ b/txscript/data/taproot-ref/4f043f492b006187a12d4a27a2fb711e089c21cb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4f31274445bc35aaf35c1fc3838142b83f4e4dbb b/txscript/data/taproot-ref/4f31274445bc35aaf35c1fc3838142b83f4e4dbb new file mode 100644 index 0000000000..8b695c0346 --- /dev/null +++ b/txscript/data/taproot-ref/4f31274445bc35aaf35c1fc3838142b83f4e4dbb @@ -0,0 +1 @@ +{"tx": "0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3800000000d4d32d95dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb4010000008376eebf04e5a4bd000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac14000000", "prevouts": ["7e08700000000000225120cc81d141bd4bdeba62b4e9a08040837dfb25b01ce96f0a5c25fe4ac81b625b74", "c0bc4f0000000000165d142540f27e90740933c99d4f17ab2dfc6c82951cfb"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["f9b86e355753a0f7d1178f44a1088ef38025cd452017401a4b3fce94aaa7151fd173eef0f43ce56565e4f7a6a39231826f79f45a6667b46547c758980615ab85", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/4f3b0d3de5e5a892c662d05f7df9b836b5083f4e b/txscript/data/taproot-ref/4f3b0d3de5e5a892c662d05f7df9b836b5083f4e new file mode 100644 index 0000000000..c5ef65d1d6 --- /dev/null +++ b/txscript/data/taproot-ref/4f3b0d3de5e5a892c662d05f7df9b836b5083f4e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4f3eb1205832e452025bc7463ab84f005ccd56a6 b/txscript/data/taproot-ref/4f3eb1205832e452025bc7463ab84f005ccd56a6 new file mode 100644 index 0000000000..9bfaad59ec --- /dev/null +++ b/txscript/data/taproot-ref/4f3eb1205832e452025bc7463ab84f005ccd56a6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4f444cefd89a49cf66c69836b968e18c893e6243 b/txscript/data/taproot-ref/4f444cefd89a49cf66c69836b968e18c893e6243 new file mode 100644 index 0000000000..90c15c92fc --- /dev/null +++ b/txscript/data/taproot-ref/4f444cefd89a49cf66c69836b968e18c893e6243 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4f4de778bdec3be4e7cc1f875680330eb9edda65 b/txscript/data/taproot-ref/4f4de778bdec3be4e7cc1f875680330eb9edda65 new file mode 100644 index 0000000000..23ea469845 --- /dev/null +++ b/txscript/data/taproot-ref/4f4de778bdec3be4e7cc1f875680330eb9edda65 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4f54816eeaa1958560b3411df01fd36e2cc3cf78 b/txscript/data/taproot-ref/4f54816eeaa1958560b3411df01fd36e2cc3cf78 new file mode 100644 index 0000000000..bd9cd98da1 --- /dev/null +++ b/txscript/data/taproot-ref/4f54816eeaa1958560b3411df01fd36e2cc3cf78 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4f5d2d6eb42d852d85a2d40419830ff372017208 b/txscript/data/taproot-ref/4f5d2d6eb42d852d85a2d40419830ff372017208 new file mode 100644 index 0000000000..98690482f9 --- /dev/null +++ b/txscript/data/taproot-ref/4f5d2d6eb42d852d85a2d40419830ff372017208 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4f692f08e2284094269303792599c3ca996925a1 b/txscript/data/taproot-ref/4f692f08e2284094269303792599c3ca996925a1 new file mode 100644 index 0000000000..3f6ae1623a --- /dev/null +++ b/txscript/data/taproot-ref/4f692f08e2284094269303792599c3ca996925a1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4f967edf0f22d51ce89c007d5351844488bfc1d4 b/txscript/data/taproot-ref/4f967edf0f22d51ce89c007d5351844488bfc1d4 new file mode 100644 index 0000000000..9a3d3e2dca --- /dev/null +++ b/txscript/data/taproot-ref/4f967edf0f22d51ce89c007d5351844488bfc1d4 @@ -0,0 +1 @@ +{"tx": "01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c438000000001ea2ccb8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf180200000014118e3a013b6381000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748747a2fb1d", "prevouts": ["0dfa40000000000017a914f0ed99a28545ab2ceacee60b5537a9e5c34fcd5187", "67f27700000000002251202b6311c61a2a508a144ec510c52a71fff5d62c4fa86296d42faefa4fd619b162"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "215b1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b", "witness": ["09e9fcaea32a4aa595828226e2229902d1d88d4c7faad932d9658fba57fc06a73098bd9f61f3b0a752472bed18c70cb645844935573e9647fad8ed6d42a89396"]}}, diff --git a/txscript/data/taproot-ref/4f9df26c7948631ce06cb7292bcc481337bff811 b/txscript/data/taproot-ref/4f9df26c7948631ce06cb7292bcc481337bff811 new file mode 100644 index 0000000000..e0f02f5435 --- /dev/null +++ b/txscript/data/taproot-ref/4f9df26c7948631ce06cb7292bcc481337bff811 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/4faee5238fb7a4ab5d716bcfb441ef4b0ab3f888 b/txscript/data/taproot-ref/4faee5238fb7a4ab5d716bcfb441ef4b0ab3f888 new file mode 100644 index 0000000000..e7c858cbed --- /dev/null +++ b/txscript/data/taproot-ref/4faee5238fb7a4ab5d716bcfb441ef4b0ab3f888 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4fc70db2882c50f92cbf554605f20aa8afdc9e7b b/txscript/data/taproot-ref/4fc70db2882c50f92cbf554605f20aa8afdc9e7b new file mode 100644 index 0000000000..281e866530 --- /dev/null +++ b/txscript/data/taproot-ref/4fc70db2882c50f92cbf554605f20aa8afdc9e7b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4fd09ff1c3fd39676f5029f8a82082c4a788cbe7 b/txscript/data/taproot-ref/4fd09ff1c3fd39676f5029f8a82082c4a788cbe7 new file mode 100644 index 0000000000..8b7e398b1d --- /dev/null +++ b/txscript/data/taproot-ref/4fd09ff1c3fd39676f5029f8a82082c4a788cbe7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4fd67112498e9041d549dca8902b4b18f4151e0a b/txscript/data/taproot-ref/4fd67112498e9041d549dca8902b4b18f4151e0a new file mode 100644 index 0000000000..72d2d88ba8 --- /dev/null +++ b/txscript/data/taproot-ref/4fd67112498e9041d549dca8902b4b18f4151e0a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4fdbb01ee1c89fea2c908ade5230cbf49b493184 b/txscript/data/taproot-ref/4fdbb01ee1c89fea2c908ade5230cbf49b493184 new file mode 100644 index 0000000000..a6d5d22e02 --- /dev/null +++ b/txscript/data/taproot-ref/4fdbb01ee1c89fea2c908ade5230cbf49b493184 @@ -0,0 +1 @@ +{"tx": "02000000017cacf58c1885ec7a53b7658a58e4f1dee7e8d7a954fb736b3a502279c0be18ef0100000000ddf8e0e404c5a5538b160000001976a91472fb0c729bce8fb851f92a5ad48d3d4231beda4988ac5802000000000000160014f2ca549f2f8613e81a7cb48fd110f37b7fb1529a580200000000000017a914ca5375a68588393c82c00f5d2ab21f91e99aa5ce8758020000000000001976a914a875a4732dcf342e2587f26f2b7b2ea4a2fd587488ac10010000", "prevouts": ["979f558b1600000022512034153a16ef8458ec2412ba42dd5be0fabd8b4c2f532d179dc958fc1fca3cae43"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY", "comment": "inactive/scriptpath_invalidsig", "success": {"scriptSig": "", "witness": ["cde641a27c5267172f2757bdf093f55c990d9cef17568a37276c373b3597303004035690bf6772d6c9ff5401569850db8553020c011ff0530e988a693d5fea34", "20cb0ba18c127bd01c824f94fd2578ac4109c167b40bd92fd4f8ede9600f7f41f3ac", "c0cb0ba18c127bd01c824f94fd2578ac4109c167b40bd92fd4f8ede9600f7f41f312f383ce02997bd7885b2023ff24b4d79c49e77348af650460f5903df7baafc9"]}}, diff --git a/txscript/data/taproot-ref/4fe78456cf82ee1f4f6bf880baf672a53376c62d b/txscript/data/taproot-ref/4fe78456cf82ee1f4f6bf880baf672a53376c62d new file mode 100644 index 0000000000..599a15b6ed --- /dev/null +++ b/txscript/data/taproot-ref/4fe78456cf82ee1f4f6bf880baf672a53376c62d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/4fe9d51c1a4a51db63ace4b7593bf4d0179da70e b/txscript/data/taproot-ref/4fe9d51c1a4a51db63ace4b7593bf4d0179da70e new file mode 100644 index 0000000000..44177aa804 --- /dev/null +++ b/txscript/data/taproot-ref/4fe9d51c1a4a51db63ace4b7593bf4d0179da70e @@ -0,0 +1 @@ +{"tx": "706e0a0002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd70100000024a962a960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b600000000b076b3840399c468000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac2b971d54", "prevouts": ["cf2e5b000000000022512049309db7adc24e71859de9f715c32a97834a8db8d4836c0bee01675ed84352f5", "ad3810000000000017a914613e66961ccf40c7c83ed07cc80b2528cfe51edb87"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "2258202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "witness": ["ffb7fe6f8c670a9fbcab42d8e49650ec5cbcc1fd92640bbcdbb19aec61302f2984e22b033cc8bec4b2e1308769422d14f23b55d485fd17856aeab0601a169b81"]}}, diff --git a/txscript/data/taproot-ref/5008a5b791ae73ec29ac0e451b2193e921d7d91e b/txscript/data/taproot-ref/5008a5b791ae73ec29ac0e451b2193e921d7d91e new file mode 100644 index 0000000000..7b1ab24d8e --- /dev/null +++ b/txscript/data/taproot-ref/5008a5b791ae73ec29ac0e451b2193e921d7d91e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/50197b1f963b6c70cf02494a68b83252169b58f8 b/txscript/data/taproot-ref/50197b1f963b6c70cf02494a68b83252169b58f8 new file mode 100644 index 0000000000..303a1e2d59 --- /dev/null +++ b/txscript/data/taproot-ref/50197b1f963b6c70cf02494a68b83252169b58f8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/501c6aa901d9b79489250b1e7c008dad90b998ba b/txscript/data/taproot-ref/501c6aa901d9b79489250b1e7c008dad90b998ba new file mode 100644 index 0000000000..884e172cf7 --- /dev/null +++ b/txscript/data/taproot-ref/501c6aa901d9b79489250b1e7c008dad90b998ba @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/501cdfc8b8bfd47787c30328084cb44010d48a2a b/txscript/data/taproot-ref/501cdfc8b8bfd47787c30328084cb44010d48a2a new file mode 100644 index 0000000000..503ec4421b --- /dev/null +++ b/txscript/data/taproot-ref/501cdfc8b8bfd47787c30328084cb44010d48a2a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5020bfad68bbf3d62a9901f11d582b9367ff01a8 b/txscript/data/taproot-ref/5020bfad68bbf3d62a9901f11d582b9367ff01a8 new file mode 100644 index 0000000000..723b1424de --- /dev/null +++ b/txscript/data/taproot-ref/5020bfad68bbf3d62a9901f11d582b9367ff01a8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5027b63206364f920f33ae41d244998d60e6d000 b/txscript/data/taproot-ref/5027b63206364f920f33ae41d244998d60e6d000 new file mode 100644 index 0000000000..a6950c87e5 --- /dev/null +++ b/txscript/data/taproot-ref/5027b63206364f920f33ae41d244998d60e6d000 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/502ba5490df10d7b64842c917be0cc8dce168153 b/txscript/data/taproot-ref/502ba5490df10d7b64842c917be0cc8dce168153 new file mode 100644 index 0000000000..8fc1f3f436 --- /dev/null +++ b/txscript/data/taproot-ref/502ba5490df10d7b64842c917be0cc8dce168153 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5040561743c74062906a64802db725e7cb87b572 b/txscript/data/taproot-ref/5040561743c74062906a64802db725e7cb87b572 new file mode 100644 index 0000000000..c387e5c53f --- /dev/null +++ b/txscript/data/taproot-ref/5040561743c74062906a64802db725e7cb87b572 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5047a7a4c5f22dc492d73a6de284a0603fc06171 b/txscript/data/taproot-ref/5047a7a4c5f22dc492d73a6de284a0603fc06171 new file mode 100644 index 0000000000..2ef8897f19 --- /dev/null +++ b/txscript/data/taproot-ref/5047a7a4c5f22dc492d73a6de284a0603fc06171 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/50701ea0af2da8b084ea4a3566db2cedf8dcc2b9 b/txscript/data/taproot-ref/50701ea0af2da8b084ea4a3566db2cedf8dcc2b9 new file mode 100644 index 0000000000..7c60673b1f --- /dev/null +++ b/txscript/data/taproot-ref/50701ea0af2da8b084ea4a3566db2cedf8dcc2b9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/50765c36b2c5b67d14ed6d3f1006bcac492b9d7e b/txscript/data/taproot-ref/50765c36b2c5b67d14ed6d3f1006bcac492b9d7e new file mode 100644 index 0000000000..9ed3f96c2b --- /dev/null +++ b/txscript/data/taproot-ref/50765c36b2c5b67d14ed6d3f1006bcac492b9d7e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/50ade4cb2bfd78d63959c0c196702463020ec1a7 b/txscript/data/taproot-ref/50ade4cb2bfd78d63959c0c196702463020ec1a7 new file mode 100644 index 0000000000..af8042efb6 --- /dev/null +++ b/txscript/data/taproot-ref/50ade4cb2bfd78d63959c0c196702463020ec1a7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/50e97f4dc4e78ccd7491b23a05fec77e705d6d17 b/txscript/data/taproot-ref/50e97f4dc4e78ccd7491b23a05fec77e705d6d17 new file mode 100644 index 0000000000..0075b80b95 --- /dev/null +++ b/txscript/data/taproot-ref/50e97f4dc4e78ccd7491b23a05fec77e705d6d17 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/512819dc5f866c4c52a96393d1dc161a298b58cf b/txscript/data/taproot-ref/512819dc5f866c4c52a96393d1dc161a298b58cf new file mode 100644 index 0000000000..b44cbca146 --- /dev/null +++ b/txscript/data/taproot-ref/512819dc5f866c4c52a96393d1dc161a298b58cf @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5134a98d252e038c84c184e2a60b3ab15541c32f b/txscript/data/taproot-ref/5134a98d252e038c84c184e2a60b3ab15541c32f new file mode 100644 index 0000000000..7afd4a0ac6 --- /dev/null +++ b/txscript/data/taproot-ref/5134a98d252e038c84c184e2a60b3ab15541c32f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/513b5b1cd7ae4a18b0684e98b8bea2445f0f267c b/txscript/data/taproot-ref/513b5b1cd7ae4a18b0684e98b8bea2445f0f267c new file mode 100644 index 0000000000..c2a74190ab --- /dev/null +++ b/txscript/data/taproot-ref/513b5b1cd7ae4a18b0684e98b8bea2445f0f267c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5145a2f823d50829addf9a923816226e49b73772 b/txscript/data/taproot-ref/5145a2f823d50829addf9a923816226e49b73772 new file mode 100644 index 0000000000..42253b3061 --- /dev/null +++ b/txscript/data/taproot-ref/5145a2f823d50829addf9a923816226e49b73772 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/51585e660838f7655a9d3f8e62673ed896abc1b1 b/txscript/data/taproot-ref/51585e660838f7655a9d3f8e62673ed896abc1b1 new file mode 100644 index 0000000000..3d245907f0 --- /dev/null +++ b/txscript/data/taproot-ref/51585e660838f7655a9d3f8e62673ed896abc1b1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5159ef1765261a6a8967fe22b91be23bc4f7c672 b/txscript/data/taproot-ref/5159ef1765261a6a8967fe22b91be23bc4f7c672 new file mode 100644 index 0000000000..1e236dcb3b --- /dev/null +++ b/txscript/data/taproot-ref/5159ef1765261a6a8967fe22b91be23bc4f7c672 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/516e8f247c632cc97a34b088b9b9c5522f6b4b7b b/txscript/data/taproot-ref/516e8f247c632cc97a34b088b9b9c5522f6b4b7b new file mode 100644 index 0000000000..ed4fb6213e --- /dev/null +++ b/txscript/data/taproot-ref/516e8f247c632cc97a34b088b9b9c5522f6b4b7b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/51902d7c0dc3e60282faf7c3bed70ad3588b79cc b/txscript/data/taproot-ref/51902d7c0dc3e60282faf7c3bed70ad3588b79cc new file mode 100644 index 0000000000..b4e821a92d --- /dev/null +++ b/txscript/data/taproot-ref/51902d7c0dc3e60282faf7c3bed70ad3588b79cc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/51cb6bd8e208996ef5816ab2e4a5f0a4392acd9f b/txscript/data/taproot-ref/51cb6bd8e208996ef5816ab2e4a5f0a4392acd9f new file mode 100644 index 0000000000..5428630041 --- /dev/null +++ b/txscript/data/taproot-ref/51cb6bd8e208996ef5816ab2e4a5f0a4392acd9f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/51d22c9e318035b292b06c7e92cff7a7dcd2ef46 b/txscript/data/taproot-ref/51d22c9e318035b292b06c7e92cff7a7dcd2ef46 new file mode 100644 index 0000000000..ba600f1a7f --- /dev/null +++ b/txscript/data/taproot-ref/51d22c9e318035b292b06c7e92cff7a7dcd2ef46 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/51df77e1f5047cc73d62f6a82b06c76b2f2dfcf2 b/txscript/data/taproot-ref/51df77e1f5047cc73d62f6a82b06c76b2f2dfcf2 new file mode 100644 index 0000000000..c447a5881e --- /dev/null +++ b/txscript/data/taproot-ref/51df77e1f5047cc73d62f6a82b06c76b2f2dfcf2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/51f4a12afbc5c09d84488a09c1ec4fad2f8ad55b b/txscript/data/taproot-ref/51f4a12afbc5c09d84488a09c1ec4fad2f8ad55b new file mode 100644 index 0000000000..2ee0582420 --- /dev/null +++ b/txscript/data/taproot-ref/51f4a12afbc5c09d84488a09c1ec4fad2f8ad55b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5201220ebf5a752ed230ba1c4660d6768ea0ab37 b/txscript/data/taproot-ref/5201220ebf5a752ed230ba1c4660d6768ea0ab37 new file mode 100644 index 0000000000..8f2917f7ef --- /dev/null +++ b/txscript/data/taproot-ref/5201220ebf5a752ed230ba1c4660d6768ea0ab37 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/52406f743dd8cf468c8739e0e49a5e8c2abe890d b/txscript/data/taproot-ref/52406f743dd8cf468c8739e0e49a5e8c2abe890d new file mode 100644 index 0000000000..dd10e3ac3c --- /dev/null +++ b/txscript/data/taproot-ref/52406f743dd8cf468c8739e0e49a5e8c2abe890d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/524a8fbae511284a4b3feffd7e69391eebfe5fe3 b/txscript/data/taproot-ref/524a8fbae511284a4b3feffd7e69391eebfe5fe3 new file mode 100644 index 0000000000..4b495282c5 --- /dev/null +++ b/txscript/data/taproot-ref/524a8fbae511284a4b3feffd7e69391eebfe5fe3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/525afb4266fbfcb9a9457044ffa429e6345aca74 b/txscript/data/taproot-ref/525afb4266fbfcb9a9457044ffa429e6345aca74 new file mode 100644 index 0000000000..bd2e90190c --- /dev/null +++ b/txscript/data/taproot-ref/525afb4266fbfcb9a9457044ffa429e6345aca74 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/526b41de4d7b2b6cca5b8cca2aff4e05e1edd180 b/txscript/data/taproot-ref/526b41de4d7b2b6cca5b8cca2aff4e05e1edd180 new file mode 100644 index 0000000000..f26bd58a60 --- /dev/null +++ b/txscript/data/taproot-ref/526b41de4d7b2b6cca5b8cca2aff4e05e1edd180 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/528808e08755d1c4badf200ea1e46b471e697367 b/txscript/data/taproot-ref/528808e08755d1c4badf200ea1e46b471e697367 new file mode 100644 index 0000000000..f524f43a63 --- /dev/null +++ b/txscript/data/taproot-ref/528808e08755d1c4badf200ea1e46b471e697367 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5292dd4bbfc4ed134ecca359a50042487bdab8de b/txscript/data/taproot-ref/5292dd4bbfc4ed134ecca359a50042487bdab8de new file mode 100644 index 0000000000..2449e979bb --- /dev/null +++ b/txscript/data/taproot-ref/5292dd4bbfc4ed134ecca359a50042487bdab8de @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/529e15d7495022b3928ad252f217ff7066f4a8c4 b/txscript/data/taproot-ref/529e15d7495022b3928ad252f217ff7066f4a8c4 new file mode 100644 index 0000000000..0cb8d34b7b --- /dev/null +++ b/txscript/data/taproot-ref/529e15d7495022b3928ad252f217ff7066f4a8c4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/529e417f9521111e7e2b214bbe3a009fb241e0e3 b/txscript/data/taproot-ref/529e417f9521111e7e2b214bbe3a009fb241e0e3 new file mode 100644 index 0000000000..a5f84064e5 --- /dev/null +++ b/txscript/data/taproot-ref/529e417f9521111e7e2b214bbe3a009fb241e0e3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/52a46ce5d115709464d927bd868cb66e64d5d890 b/txscript/data/taproot-ref/52a46ce5d115709464d927bd868cb66e64d5d890 new file mode 100644 index 0000000000..07d5ec4882 --- /dev/null +++ b/txscript/data/taproot-ref/52a46ce5d115709464d927bd868cb66e64d5d890 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/52b71f15e64724663db04868b953a0dd6f8ab01a b/txscript/data/taproot-ref/52b71f15e64724663db04868b953a0dd6f8ab01a new file mode 100644 index 0000000000..3269065b13 --- /dev/null +++ b/txscript/data/taproot-ref/52b71f15e64724663db04868b953a0dd6f8ab01a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/52c7e56d194272214280372b7dbacf979b86a714 b/txscript/data/taproot-ref/52c7e56d194272214280372b7dbacf979b86a714 new file mode 100644 index 0000000000..971719a72d --- /dev/null +++ b/txscript/data/taproot-ref/52c7e56d194272214280372b7dbacf979b86a714 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/52da571031bbcc150454dd6be63a21c6a2dca5e5 b/txscript/data/taproot-ref/52da571031bbcc150454dd6be63a21c6a2dca5e5 new file mode 100644 index 0000000000..e277a30d5f --- /dev/null +++ b/txscript/data/taproot-ref/52da571031bbcc150454dd6be63a21c6a2dca5e5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/53045f62216e6dd1d7b2d1c05dbda813f59f4d38 b/txscript/data/taproot-ref/53045f62216e6dd1d7b2d1c05dbda813f59f4d38 new file mode 100644 index 0000000000..129001df8f --- /dev/null +++ b/txscript/data/taproot-ref/53045f62216e6dd1d7b2d1c05dbda813f59f4d38 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/53090ff0e10b029e37a0eab690a757a5f4c346ea b/txscript/data/taproot-ref/53090ff0e10b029e37a0eab690a757a5f4c346ea new file mode 100644 index 0000000000..9b9924c338 --- /dev/null +++ b/txscript/data/taproot-ref/53090ff0e10b029e37a0eab690a757a5f4c346ea @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/530e0b9098674994a45495cf1eb8c3fd36b04ef3 b/txscript/data/taproot-ref/530e0b9098674994a45495cf1eb8c3fd36b04ef3 new file mode 100644 index 0000000000..b2635d0e08 --- /dev/null +++ b/txscript/data/taproot-ref/530e0b9098674994a45495cf1eb8c3fd36b04ef3 @@ -0,0 +1 @@ +{"tx": "3c688b8f028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c501000000794a30f18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c30100000090cacde503a0306f00000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a61e4ba658", "prevouts": ["83f8390000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b", "8c143700000000002357212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["e9440ccff55d93379936d095be283dffe5541de496e585ee7250bbcaa943ffab41aba468e5c0aecd6a12d830b424289f15b0a5564fdc86e42e7f72d95df28f99", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/53123aee1da68a8b9619edd5140ab5c6aae10886 b/txscript/data/taproot-ref/53123aee1da68a8b9619edd5140ab5c6aae10886 new file mode 100644 index 0000000000..0c3ba945e8 --- /dev/null +++ b/txscript/data/taproot-ref/53123aee1da68a8b9619edd5140ab5c6aae10886 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/53234e0beefd772757294c48658a6fb1b632e5f3 b/txscript/data/taproot-ref/53234e0beefd772757294c48658a6fb1b632e5f3 new file mode 100644 index 0000000000..517f71508f --- /dev/null +++ b/txscript/data/taproot-ref/53234e0beefd772757294c48658a6fb1b632e5f3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5349c13d7b8dd8f692718b4ef221a21825fb04f3 b/txscript/data/taproot-ref/5349c13d7b8dd8f692718b4ef221a21825fb04f3 new file mode 100644 index 0000000000..d7e0aa66a5 --- /dev/null +++ b/txscript/data/taproot-ref/5349c13d7b8dd8f692718b4ef221a21825fb04f3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5366b2cab843c6f4979214e27b561d35321bd2a6 b/txscript/data/taproot-ref/5366b2cab843c6f4979214e27b561d35321bd2a6 new file mode 100644 index 0000000000..01862ae476 --- /dev/null +++ b/txscript/data/taproot-ref/5366b2cab843c6f4979214e27b561d35321bd2a6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5379718fd6733c3194547aea3041303f46159862 b/txscript/data/taproot-ref/5379718fd6733c3194547aea3041303f46159862 new file mode 100644 index 0000000000..1623271144 --- /dev/null +++ b/txscript/data/taproot-ref/5379718fd6733c3194547aea3041303f46159862 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5394689c5e237d677fa75daa48d897e73a858ecf b/txscript/data/taproot-ref/5394689c5e237d677fa75daa48d897e73a858ecf new file mode 100644 index 0000000000..c036804c3a --- /dev/null +++ b/txscript/data/taproot-ref/5394689c5e237d677fa75daa48d897e73a858ecf @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/539798847b99eee00985bc1951275a98b55dd7fd b/txscript/data/taproot-ref/539798847b99eee00985bc1951275a98b55dd7fd new file mode 100644 index 0000000000..24e2adb643 --- /dev/null +++ b/txscript/data/taproot-ref/539798847b99eee00985bc1951275a98b55dd7fd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/53a808e42f754a6b97d63d9648f1e9a70ef36421 b/txscript/data/taproot-ref/53a808e42f754a6b97d63d9648f1e9a70ef36421 new file mode 100644 index 0000000000..ddd672514e --- /dev/null +++ b/txscript/data/taproot-ref/53a808e42f754a6b97d63d9648f1e9a70ef36421 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/53c007e4c811059c16e10ba22c2b8c0f4ce3d99d b/txscript/data/taproot-ref/53c007e4c811059c16e10ba22c2b8c0f4ce3d99d new file mode 100644 index 0000000000..306d3c2c8f --- /dev/null +++ b/txscript/data/taproot-ref/53c007e4c811059c16e10ba22c2b8c0f4ce3d99d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/53c3edf3601218d001c1e5074a2e608ca903fa25 b/txscript/data/taproot-ref/53c3edf3601218d001c1e5074a2e608ca903fa25 new file mode 100644 index 0000000000..3e1aa777ba --- /dev/null +++ b/txscript/data/taproot-ref/53c3edf3601218d001c1e5074a2e608ca903fa25 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/53c8c5901bf8077df2161336a0fc9a5f774e1a5d b/txscript/data/taproot-ref/53c8c5901bf8077df2161336a0fc9a5f774e1a5d new file mode 100644 index 0000000000..0bf7d3e195 --- /dev/null +++ b/txscript/data/taproot-ref/53c8c5901bf8077df2161336a0fc9a5f774e1a5d @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/53d0cafdef4e74e058c9073bbd755b723f71207d b/txscript/data/taproot-ref/53d0cafdef4e74e058c9073bbd755b723f71207d new file mode 100644 index 0000000000..b5c6ec7fe0 --- /dev/null +++ b/txscript/data/taproot-ref/53d0cafdef4e74e058c9073bbd755b723f71207d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/53dc16200f550b0ebabb6c5c132ae4191e1a1482 b/txscript/data/taproot-ref/53dc16200f550b0ebabb6c5c132ae4191e1a1482 new file mode 100644 index 0000000000..8a69945160 --- /dev/null +++ b/txscript/data/taproot-ref/53dc16200f550b0ebabb6c5c132ae4191e1a1482 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/53f7ba7985ea8688080ed30b57d08c4ab91d4a7c b/txscript/data/taproot-ref/53f7ba7985ea8688080ed30b57d08c4ab91d4a7c new file mode 100644 index 0000000000..2a4d01a3cc --- /dev/null +++ b/txscript/data/taproot-ref/53f7ba7985ea8688080ed30b57d08c4ab91d4a7c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/53fd1406ce1667cf7d7de3b444b90660d76871fb b/txscript/data/taproot-ref/53fd1406ce1667cf7d7de3b444b90660d76871fb new file mode 100644 index 0000000000..6a49d49007 --- /dev/null +++ b/txscript/data/taproot-ref/53fd1406ce1667cf7d7de3b444b90660d76871fb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/540c6dd899720dbbc04e0f316f56549b4c1ea925 b/txscript/data/taproot-ref/540c6dd899720dbbc04e0f316f56549b4c1ea925 new file mode 100644 index 0000000000..ca473460d7 --- /dev/null +++ b/txscript/data/taproot-ref/540c6dd899720dbbc04e0f316f56549b4c1ea925 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/542c02db48e5517905eab16fd96de2d76702fe3a b/txscript/data/taproot-ref/542c02db48e5517905eab16fd96de2d76702fe3a new file mode 100644 index 0000000000..b5460e15d3 --- /dev/null +++ b/txscript/data/taproot-ref/542c02db48e5517905eab16fd96de2d76702fe3a @@ -0,0 +1 @@ +{"tx": "0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1701000000233e40828bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c407000000004acef7c7044c5ca200000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e72614dd3a", "prevouts": ["a8956b0000000000225a202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "ca23390000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["b83a6cc838fe4ff92a9af858d2efde524ed333cea01ebbc4b7f4773fab924030cf11433ef5c5edaafe13139710b3980b471a60ecd69fa7ace7bec388560a62f3"]}}, diff --git a/txscript/data/taproot-ref/54305f14909100e1757674ae16a759d855c4a647 b/txscript/data/taproot-ref/54305f14909100e1757674ae16a759d855c4a647 new file mode 100644 index 0000000000..6353dc4bb0 --- /dev/null +++ b/txscript/data/taproot-ref/54305f14909100e1757674ae16a759d855c4a647 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5445a326ed6ffd6f95dc9cb3c9514a0e53f4868a b/txscript/data/taproot-ref/5445a326ed6ffd6f95dc9cb3c9514a0e53f4868a new file mode 100644 index 0000000000..b0eed9f1e9 --- /dev/null +++ b/txscript/data/taproot-ref/5445a326ed6ffd6f95dc9cb3c9514a0e53f4868a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/545537c377201418fedef933281d2dcbea90a159 b/txscript/data/taproot-ref/545537c377201418fedef933281d2dcbea90a159 new file mode 100644 index 0000000000..d2438b6bdd --- /dev/null +++ b/txscript/data/taproot-ref/545537c377201418fedef933281d2dcbea90a159 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/547539d40d65ab39026f065bc9152d96c7c4ad43 b/txscript/data/taproot-ref/547539d40d65ab39026f065bc9152d96c7c4ad43 new file mode 100644 index 0000000000..4f4d3485a2 --- /dev/null +++ b/txscript/data/taproot-ref/547539d40d65ab39026f065bc9152d96c7c4ad43 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/54ab5c42625d4869197c04f218c443750527c92e b/txscript/data/taproot-ref/54ab5c42625d4869197c04f218c443750527c92e new file mode 100644 index 0000000000..844de985f3 --- /dev/null +++ b/txscript/data/taproot-ref/54ab5c42625d4869197c04f218c443750527c92e @@ -0,0 +1 @@ +{"tx": "103e89be02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b830000000082ed4bd360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709600000000ede849cf0184480a0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e70c17ce26", "prevouts": ["149c1f000000000017a914bf07e8218e5a3c93fa381357100b6dba1ff2a91287", "e7361200000000002251208fa17604bea1a2fa3728b697c38b10509b65e0ce8e421d974d98824035b3dbb8"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "2354212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "witness": ["f76e93c925e04e4c813605eae544eec8140e2351cd3f147a2f144173f57b90bf742eb4d523deb2161014d82e5c33c9681a1814e02147707e45695d7109d47601"]}}, diff --git a/txscript/data/taproot-ref/54b4f9842dadbaeb2ac90b0f6d8177f76ce3f9a1 b/txscript/data/taproot-ref/54b4f9842dadbaeb2ac90b0f6d8177f76ce3f9a1 new file mode 100644 index 0000000000..77f29ea688 --- /dev/null +++ b/txscript/data/taproot-ref/54b4f9842dadbaeb2ac90b0f6d8177f76ce3f9a1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/54b9966d625700d7ab8b6fb6e1c3e019b5a09f6c b/txscript/data/taproot-ref/54b9966d625700d7ab8b6fb6e1c3e019b5a09f6c new file mode 100644 index 0000000000..3c21d678d6 --- /dev/null +++ b/txscript/data/taproot-ref/54b9966d625700d7ab8b6fb6e1c3e019b5a09f6c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/54bb653bb1662d8b2730bde1e4a255606fea193d b/txscript/data/taproot-ref/54bb653bb1662d8b2730bde1e4a255606fea193d new file mode 100644 index 0000000000..c42d67cf53 --- /dev/null +++ b/txscript/data/taproot-ref/54bb653bb1662d8b2730bde1e4a255606fea193d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/54c4a1f796d9ff3acf74d30faba1654e46cb8e87 b/txscript/data/taproot-ref/54c4a1f796d9ff3acf74d30faba1654e46cb8e87 new file mode 100644 index 0000000000..5e4ed8e100 --- /dev/null +++ b/txscript/data/taproot-ref/54c4a1f796d9ff3acf74d30faba1654e46cb8e87 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/54db865605c4886df424d455f6674d7c9f904922 b/txscript/data/taproot-ref/54db865605c4886df424d455f6674d7c9f904922 new file mode 100644 index 0000000000..80da63bd96 --- /dev/null +++ b/txscript/data/taproot-ref/54db865605c4886df424d455f6674d7c9f904922 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/54eef01ce1e7ec1e6b58bb1a7e192b0e5d3a98e8 b/txscript/data/taproot-ref/54eef01ce1e7ec1e6b58bb1a7e192b0e5d3a98e8 new file mode 100644 index 0000000000..12e3406c9a --- /dev/null +++ b/txscript/data/taproot-ref/54eef01ce1e7ec1e6b58bb1a7e192b0e5d3a98e8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/54fe044e4c6d4dfed594e15518f9550df3910bc9 b/txscript/data/taproot-ref/54fe044e4c6d4dfed594e15518f9550df3910bc9 new file mode 100644 index 0000000000..7c04fa42f6 --- /dev/null +++ b/txscript/data/taproot-ref/54fe044e4c6d4dfed594e15518f9550df3910bc9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/55222bbf499234ced0243f0c54a06a8e01ee78e8 b/txscript/data/taproot-ref/55222bbf499234ced0243f0c54a06a8e01ee78e8 new file mode 100644 index 0000000000..78052ff481 --- /dev/null +++ b/txscript/data/taproot-ref/55222bbf499234ced0243f0c54a06a8e01ee78e8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/55296a40c4a4eec0b8b959e6e4af29fbf647774b b/txscript/data/taproot-ref/55296a40c4a4eec0b8b959e6e4af29fbf647774b new file mode 100644 index 0000000000..45f702eed2 --- /dev/null +++ b/txscript/data/taproot-ref/55296a40c4a4eec0b8b959e6e4af29fbf647774b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/554254ae450e17abd46d3c290600e3620f888246 b/txscript/data/taproot-ref/554254ae450e17abd46d3c290600e3620f888246 new file mode 100644 index 0000000000..8c72e6faf2 --- /dev/null +++ b/txscript/data/taproot-ref/554254ae450e17abd46d3c290600e3620f888246 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/554ee85d50ac67df97fb01a2eb533f4a62a41c9f b/txscript/data/taproot-ref/554ee85d50ac67df97fb01a2eb533f4a62a41c9f new file mode 100644 index 0000000000..0159376fe8 --- /dev/null +++ b/txscript/data/taproot-ref/554ee85d50ac67df97fb01a2eb533f4a62a41c9f @@ -0,0 +1 @@ +{"tx": "1856b3df02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4e01000000bd0fc0dd8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b0010000008f497eb404b1cd82000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87c40df233", "prevouts": ["dc4e490000000000225120bd5bbc5b1bf3fe4b708ed63f9408b7b63aebc344d9604176f38c41259c503453", "11a53b00000000002255202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["e5978118d5ab7952e4e6e4d5a8c98c5e9f64c85c89fdf7e3707edd32a9535f8ce29fc39d031b595a30ca3ad31811cebf67b7a27203d8b37a4c7ce5a7310277e5", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/555fcf75ef7ac731ace1cd81886b6cc1b013e911 b/txscript/data/taproot-ref/555fcf75ef7ac731ace1cd81886b6cc1b013e911 new file mode 100644 index 0000000000..4ae6dfbd41 --- /dev/null +++ b/txscript/data/taproot-ref/555fcf75ef7ac731ace1cd81886b6cc1b013e911 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/555fe6827560beb47e96016c2aae78850a4e345c b/txscript/data/taproot-ref/555fe6827560beb47e96016c2aae78850a4e345c new file mode 100644 index 0000000000..bb2494742a --- /dev/null +++ b/txscript/data/taproot-ref/555fe6827560beb47e96016c2aae78850a4e345c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/556a65730f4092db6fd77c12b631d10117d47033 b/txscript/data/taproot-ref/556a65730f4092db6fd77c12b631d10117d47033 new file mode 100644 index 0000000000..4e00d85626 --- /dev/null +++ b/txscript/data/taproot-ref/556a65730f4092db6fd77c12b631d10117d47033 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/556db9cb87763f9c127e87edfb88a8e8443c00d6 b/txscript/data/taproot-ref/556db9cb87763f9c127e87edfb88a8e8443c00d6 new file mode 100644 index 0000000000..ef6f0a1137 --- /dev/null +++ b/txscript/data/taproot-ref/556db9cb87763f9c127e87edfb88a8e8443c00d6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5581fa4307ec84b987cdfaee72db964e4a304876 b/txscript/data/taproot-ref/5581fa4307ec84b987cdfaee72db964e4a304876 new file mode 100644 index 0000000000..2f5fe72de9 --- /dev/null +++ b/txscript/data/taproot-ref/5581fa4307ec84b987cdfaee72db964e4a304876 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/55944a2b94a2ca58cff331e3ef254a2869f5fb50 b/txscript/data/taproot-ref/55944a2b94a2ca58cff331e3ef254a2869f5fb50 new file mode 100644 index 0000000000..da041cb683 --- /dev/null +++ b/txscript/data/taproot-ref/55944a2b94a2ca58cff331e3ef254a2869f5fb50 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/55b0896604f6a6b38c17cf95f8c053e19d26090c b/txscript/data/taproot-ref/55b0896604f6a6b38c17cf95f8c053e19d26090c new file mode 100644 index 0000000000..8aa0ec19e4 --- /dev/null +++ b/txscript/data/taproot-ref/55b0896604f6a6b38c17cf95f8c053e19d26090c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/55c61e7a6bf6a7b27176d90e85c792e38fa47d95 b/txscript/data/taproot-ref/55c61e7a6bf6a7b27176d90e85c792e38fa47d95 new file mode 100644 index 0000000000..bad4053857 --- /dev/null +++ b/txscript/data/taproot-ref/55c61e7a6bf6a7b27176d90e85c792e38fa47d95 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/55c9ce0b7ccbe8ff676abebe7761bee66f38e3bc b/txscript/data/taproot-ref/55c9ce0b7ccbe8ff676abebe7761bee66f38e3bc new file mode 100644 index 0000000000..c3babe95c7 --- /dev/null +++ b/txscript/data/taproot-ref/55c9ce0b7ccbe8ff676abebe7761bee66f38e3bc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/55cabf94b48b77fc7b0a87efd62377c6a44cfd3d b/txscript/data/taproot-ref/55cabf94b48b77fc7b0a87efd62377c6a44cfd3d new file mode 100644 index 0000000000..4542cd02b5 --- /dev/null +++ b/txscript/data/taproot-ref/55cabf94b48b77fc7b0a87efd62377c6a44cfd3d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/55db8d546fc7e337dd899c328c82a60b6102a7b5 b/txscript/data/taproot-ref/55db8d546fc7e337dd899c328c82a60b6102a7b5 new file mode 100644 index 0000000000..723b25901e --- /dev/null +++ b/txscript/data/taproot-ref/55db8d546fc7e337dd899c328c82a60b6102a7b5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/55f99e2d68ee85b75133f78cb948a5b7466cb4ea b/txscript/data/taproot-ref/55f99e2d68ee85b75133f78cb948a5b7466cb4ea new file mode 100644 index 0000000000..3de6eb57cd --- /dev/null +++ b/txscript/data/taproot-ref/55f99e2d68ee85b75133f78cb948a5b7466cb4ea @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/55faab0c69903138a86beca8e6ebc3e7a2010e0b b/txscript/data/taproot-ref/55faab0c69903138a86beca8e6ebc3e7a2010e0b new file mode 100644 index 0000000000..ec143a72a4 --- /dev/null +++ b/txscript/data/taproot-ref/55faab0c69903138a86beca8e6ebc3e7a2010e0b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/55fc38b7d593fc118d407fcbd2ed49e3ea890734 b/txscript/data/taproot-ref/55fc38b7d593fc118d407fcbd2ed49e3ea890734 new file mode 100644 index 0000000000..068cc4d799 --- /dev/null +++ b/txscript/data/taproot-ref/55fc38b7d593fc118d407fcbd2ed49e3ea890734 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/56397a2ccd392deb6d3ed52e0a065fdde579e9d6 b/txscript/data/taproot-ref/56397a2ccd392deb6d3ed52e0a065fdde579e9d6 new file mode 100644 index 0000000000..2d9973ff88 --- /dev/null +++ b/txscript/data/taproot-ref/56397a2ccd392deb6d3ed52e0a065fdde579e9d6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/56567e4be5618770bb97f61b1487c7d47cf8192c b/txscript/data/taproot-ref/56567e4be5618770bb97f61b1487c7d47cf8192c new file mode 100644 index 0000000000..a870acd8ed --- /dev/null +++ b/txscript/data/taproot-ref/56567e4be5618770bb97f61b1487c7d47cf8192c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5658a8d8fb388e7c7e5f7c7fc8630d3de961b676 b/txscript/data/taproot-ref/5658a8d8fb388e7c7e5f7c7fc8630d3de961b676 new file mode 100644 index 0000000000..5405105a71 --- /dev/null +++ b/txscript/data/taproot-ref/5658a8d8fb388e7c7e5f7c7fc8630d3de961b676 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5687a5e9c47486c4d2f24f74e09c95a9b9139145 b/txscript/data/taproot-ref/5687a5e9c47486c4d2f24f74e09c95a9b9139145 new file mode 100644 index 0000000000..77e0f671f5 --- /dev/null +++ b/txscript/data/taproot-ref/5687a5e9c47486c4d2f24f74e09c95a9b9139145 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/56c988fc520dc9a5bafa28ad83eb0e972fd70567 b/txscript/data/taproot-ref/56c988fc520dc9a5bafa28ad83eb0e972fd70567 new file mode 100644 index 0000000000..9fd3c8b0a0 --- /dev/null +++ b/txscript/data/taproot-ref/56c988fc520dc9a5bafa28ad83eb0e972fd70567 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/56cc448ba82bed7220a831c4b05eabed0406386b b/txscript/data/taproot-ref/56cc448ba82bed7220a831c4b05eabed0406386b new file mode 100644 index 0000000000..95e88576a2 --- /dev/null +++ b/txscript/data/taproot-ref/56cc448ba82bed7220a831c4b05eabed0406386b @@ -0,0 +1 @@ +{"tx": "0100000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2000000000868a0dee04630f6000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48766030000", "prevouts": ["93c66200000000002351212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["738bdbe9cd1a5424b7d83bd7a5e298273445228a286a1ad1a0ab62ab3a890fc0260cccb593eaa605fc1be61b5642b639897bc50cbbf04051dd29a71273e862b6", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/56ed4007baeecebd4a8905063055ace47704a0dc b/txscript/data/taproot-ref/56ed4007baeecebd4a8905063055ace47704a0dc new file mode 100644 index 0000000000..a8f7b72011 --- /dev/null +++ b/txscript/data/taproot-ref/56ed4007baeecebd4a8905063055ace47704a0dc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/56ff467c9c6b5e3079baa559955ba107d89d77fc b/txscript/data/taproot-ref/56ff467c9c6b5e3079baa559955ba107d89d77fc new file mode 100644 index 0000000000..42ae461223 --- /dev/null +++ b/txscript/data/taproot-ref/56ff467c9c6b5e3079baa559955ba107d89d77fc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/570fb69de8afa341b54dd79455b6d21085c0334f b/txscript/data/taproot-ref/570fb69de8afa341b54dd79455b6d21085c0334f new file mode 100644 index 0000000000..8b848f797e --- /dev/null +++ b/txscript/data/taproot-ref/570fb69de8afa341b54dd79455b6d21085c0334f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/570fc65b0c81c1473fc82b8545f5ae6efeb839ff b/txscript/data/taproot-ref/570fc65b0c81c1473fc82b8545f5ae6efeb839ff new file mode 100644 index 0000000000..9cdff3eeb8 --- /dev/null +++ b/txscript/data/taproot-ref/570fc65b0c81c1473fc82b8545f5ae6efeb839ff @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/57267f8aca1eeab5fdc28ec5f2cdbd6ce0d150ae b/txscript/data/taproot-ref/57267f8aca1eeab5fdc28ec5f2cdbd6ce0d150ae new file mode 100644 index 0000000000..fde1d631ce --- /dev/null +++ b/txscript/data/taproot-ref/57267f8aca1eeab5fdc28ec5f2cdbd6ce0d150ae @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/572c410d27df3156ea85e726a966af51c9cadf8f b/txscript/data/taproot-ref/572c410d27df3156ea85e726a966af51c9cadf8f new file mode 100644 index 0000000000..7f9042b2a0 --- /dev/null +++ b/txscript/data/taproot-ref/572c410d27df3156ea85e726a966af51c9cadf8f @@ -0,0 +1 @@ +{"tx": "0100000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ccd01000000309951c10172eb4000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7ca010000", "prevouts": ["0b135b000000000017a91468f63610c45a6790781558e4d5ce83e16e8f3f3b87"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "2352212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "witness": ["0eb4b3e6ef96cf190e4d3359e19dad29fc52872294cbd7ae7630dd5a95d2abfdb7b008f9acdbba52783b9bc8c4a580b3e3e16f383c551b11d02a41f07a84aa76"]}}, diff --git a/txscript/data/taproot-ref/576476370370b5501ea6a61ac033110ea83ed7c6 b/txscript/data/taproot-ref/576476370370b5501ea6a61ac033110ea83ed7c6 new file mode 100644 index 0000000000..61cd4f07dd --- /dev/null +++ b/txscript/data/taproot-ref/576476370370b5501ea6a61ac033110ea83ed7c6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/57731bef67046b96aa1a3f92ffbb41851e7b3353 b/txscript/data/taproot-ref/57731bef67046b96aa1a3f92ffbb41851e7b3353 new file mode 100644 index 0000000000..20ebae181a --- /dev/null +++ b/txscript/data/taproot-ref/57731bef67046b96aa1a3f92ffbb41851e7b3353 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5777068b6f7170fa6a505e9144aa3f6fc8625b74 b/txscript/data/taproot-ref/5777068b6f7170fa6a505e9144aa3f6fc8625b74 new file mode 100644 index 0000000000..19e3c122bb --- /dev/null +++ b/txscript/data/taproot-ref/5777068b6f7170fa6a505e9144aa3f6fc8625b74 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/578701a27b2e9321384f3e516f48fe5d2ebfad6d b/txscript/data/taproot-ref/578701a27b2e9321384f3e516f48fe5d2ebfad6d new file mode 100644 index 0000000000..be5941d138 --- /dev/null +++ b/txscript/data/taproot-ref/578701a27b2e9321384f3e516f48fe5d2ebfad6d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/57ba07044f687929674d01d0c501e408072f02f8 b/txscript/data/taproot-ref/57ba07044f687929674d01d0c501e408072f02f8 new file mode 100644 index 0000000000..413e588377 --- /dev/null +++ b/txscript/data/taproot-ref/57ba07044f687929674d01d0c501e408072f02f8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/57e2edb6bce9815f7e92a1cacf2c42a1d8a5ed21 b/txscript/data/taproot-ref/57e2edb6bce9815f7e92a1cacf2c42a1d8a5ed21 new file mode 100644 index 0000000000..ab0a09d92c --- /dev/null +++ b/txscript/data/taproot-ref/57e2edb6bce9815f7e92a1cacf2c42a1d8a5ed21 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/580742d9b18b0603cb29360f8e7cbfef479c00c6 b/txscript/data/taproot-ref/580742d9b18b0603cb29360f8e7cbfef479c00c6 new file mode 100644 index 0000000000..9cb967cdf1 --- /dev/null +++ b/txscript/data/taproot-ref/580742d9b18b0603cb29360f8e7cbfef479c00c6 @@ -0,0 +1 @@ +{"tx": "2cdaf2c70260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127012010000003b999eed60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705901000000d23472a40318961e000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5f000000", "prevouts": ["05ce0e0000000000225120ea4dd4fdddeb85910d968a8720de3e26cfa946a55a30f257fee5a4b92ccf36fe", "bd5f1100000000001651142540f27e90740933c99d4f17ab2dfc6c82951cfb"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["3577a9f5e5afd7dec8794ec90f5b30191dc3d1d03aff482e4b3dd0ad46069d3c1df5ffe05a93b0914354000c5013e139352c853c670c19dfdbe29a79b6a88351", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/5876822a1e4504b3dcd7a3ddd10ca0dafc4c9ce7 b/txscript/data/taproot-ref/5876822a1e4504b3dcd7a3ddd10ca0dafc4c9ce7 new file mode 100644 index 0000000000..37b0b70e6d --- /dev/null +++ b/txscript/data/taproot-ref/5876822a1e4504b3dcd7a3ddd10ca0dafc4c9ce7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/58d98ae03e7b63b61749dae272899a7f41a89c30 b/txscript/data/taproot-ref/58d98ae03e7b63b61749dae272899a7f41a89c30 new file mode 100644 index 0000000000..77b1651781 --- /dev/null +++ b/txscript/data/taproot-ref/58d98ae03e7b63b61749dae272899a7f41a89c30 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/58dd5844bf68fb5f47e929bf24c7d8dc2cab5791 b/txscript/data/taproot-ref/58dd5844bf68fb5f47e929bf24c7d8dc2cab5791 new file mode 100644 index 0000000000..28bc3d1f69 --- /dev/null +++ b/txscript/data/taproot-ref/58dd5844bf68fb5f47e929bf24c7d8dc2cab5791 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/58e9cc8b18e2ee0f4ef6cfa6222d9ba9c4e6999e b/txscript/data/taproot-ref/58e9cc8b18e2ee0f4ef6cfa6222d9ba9c4e6999e new file mode 100644 index 0000000000..4b176e65eb --- /dev/null +++ b/txscript/data/taproot-ref/58e9cc8b18e2ee0f4ef6cfa6222d9ba9c4e6999e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/58f607b447f90cc1f1f8626ebec53c5173658a3b b/txscript/data/taproot-ref/58f607b447f90cc1f1f8626ebec53c5173658a3b new file mode 100644 index 0000000000..3a1fadbafa --- /dev/null +++ b/txscript/data/taproot-ref/58f607b447f90cc1f1f8626ebec53c5173658a3b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/58fb9dddb99befb27e93f61cc7346e2e320d4124 b/txscript/data/taproot-ref/58fb9dddb99befb27e93f61cc7346e2e320d4124 new file mode 100644 index 0000000000..59bd96f0c7 --- /dev/null +++ b/txscript/data/taproot-ref/58fb9dddb99befb27e93f61cc7346e2e320d4124 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5901e4b94bc2da63a3099505728106aad680aaf1 b/txscript/data/taproot-ref/5901e4b94bc2da63a3099505728106aad680aaf1 new file mode 100644 index 0000000000..1095acdd75 --- /dev/null +++ b/txscript/data/taproot-ref/5901e4b94bc2da63a3099505728106aad680aaf1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/59170b1799ffe9d1e085f2b8c38cf655ca14f1bb b/txscript/data/taproot-ref/59170b1799ffe9d1e085f2b8c38cf655ca14f1bb new file mode 100644 index 0000000000..0a95bb3cb1 --- /dev/null +++ b/txscript/data/taproot-ref/59170b1799ffe9d1e085f2b8c38cf655ca14f1bb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/592e17797674340048f2ec49023bde0febe810f4 b/txscript/data/taproot-ref/592e17797674340048f2ec49023bde0febe810f4 new file mode 100644 index 0000000000..5d31ba9900 --- /dev/null +++ b/txscript/data/taproot-ref/592e17797674340048f2ec49023bde0febe810f4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5930d2e1ddc70c728b1f219bfa14e4053fe56dbc b/txscript/data/taproot-ref/5930d2e1ddc70c728b1f219bfa14e4053fe56dbc new file mode 100644 index 0000000000..1fbd24aef3 --- /dev/null +++ b/txscript/data/taproot-ref/5930d2e1ddc70c728b1f219bfa14e4053fe56dbc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/59357c2c93a40183682393a898e6b58d6e81cb14 b/txscript/data/taproot-ref/59357c2c93a40183682393a898e6b58d6e81cb14 new file mode 100644 index 0000000000..20f47da858 --- /dev/null +++ b/txscript/data/taproot-ref/59357c2c93a40183682393a898e6b58d6e81cb14 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5951e8f0a0cafab1db40426b854148481b762ce2 b/txscript/data/taproot-ref/5951e8f0a0cafab1db40426b854148481b762ce2 new file mode 100644 index 0000000000..f3069965c6 --- /dev/null +++ b/txscript/data/taproot-ref/5951e8f0a0cafab1db40426b854148481b762ce2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/595901e13730319ffed24982bd4ea8c12e89bc96 b/txscript/data/taproot-ref/595901e13730319ffed24982bd4ea8c12e89bc96 new file mode 100644 index 0000000000..c67f036e2f --- /dev/null +++ b/txscript/data/taproot-ref/595901e13730319ffed24982bd4ea8c12e89bc96 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/597a6a03965d41f1179d6a45268ac32531a9c209 b/txscript/data/taproot-ref/597a6a03965d41f1179d6a45268ac32531a9c209 new file mode 100644 index 0000000000..01096d88f5 --- /dev/null +++ b/txscript/data/taproot-ref/597a6a03965d41f1179d6a45268ac32531a9c209 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5981777edd562076958d2a1e4c80225a425eb08e b/txscript/data/taproot-ref/5981777edd562076958d2a1e4c80225a425eb08e new file mode 100644 index 0000000000..ed1fbea985 --- /dev/null +++ b/txscript/data/taproot-ref/5981777edd562076958d2a1e4c80225a425eb08e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/598b73c14cf25c235e0cc5c5a3bf6a5add3b0b66 b/txscript/data/taproot-ref/598b73c14cf25c235e0cc5c5a3bf6a5add3b0b66 new file mode 100644 index 0000000000..a81af9b446 --- /dev/null +++ b/txscript/data/taproot-ref/598b73c14cf25c235e0cc5c5a3bf6a5add3b0b66 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5991f803b4df614fde19c2f5742b860c1a14d33c b/txscript/data/taproot-ref/5991f803b4df614fde19c2f5742b860c1a14d33c new file mode 100644 index 0000000000..12863e5db2 --- /dev/null +++ b/txscript/data/taproot-ref/5991f803b4df614fde19c2f5742b860c1a14d33c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/59a01c32eca07dea482bf25537b7d52b7bc5aaca b/txscript/data/taproot-ref/59a01c32eca07dea482bf25537b7d52b7bc5aaca new file mode 100644 index 0000000000..e31e1e5ea9 --- /dev/null +++ b/txscript/data/taproot-ref/59a01c32eca07dea482bf25537b7d52b7bc5aaca @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/59aa7a8b1146af0061b9b9478ffb499b5e7f3229 b/txscript/data/taproot-ref/59aa7a8b1146af0061b9b9478ffb499b5e7f3229 new file mode 100644 index 0000000000..ec5fe8b440 --- /dev/null +++ b/txscript/data/taproot-ref/59aa7a8b1146af0061b9b9478ffb499b5e7f3229 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/59b9a0e1dfe394504f08eae69abd47bfab092572 b/txscript/data/taproot-ref/59b9a0e1dfe394504f08eae69abd47bfab092572 new file mode 100644 index 0000000000..7091d116f7 --- /dev/null +++ b/txscript/data/taproot-ref/59b9a0e1dfe394504f08eae69abd47bfab092572 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5a198317abb136510b17c59de5eaa7c880152f8b b/txscript/data/taproot-ref/5a198317abb136510b17c59de5eaa7c880152f8b new file mode 100644 index 0000000000..a7279a2145 --- /dev/null +++ b/txscript/data/taproot-ref/5a198317abb136510b17c59de5eaa7c880152f8b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5a53b6c3fb03892958b022df8a6e0a4cd3d8e51c b/txscript/data/taproot-ref/5a53b6c3fb03892958b022df8a6e0a4cd3d8e51c new file mode 100644 index 0000000000..8bb0020292 --- /dev/null +++ b/txscript/data/taproot-ref/5a53b6c3fb03892958b022df8a6e0a4cd3d8e51c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5a5abab97631cffda0f11fd3ecd87d86dc325f8f b/txscript/data/taproot-ref/5a5abab97631cffda0f11fd3ecd87d86dc325f8f new file mode 100644 index 0000000000..cc5ca6fe83 --- /dev/null +++ b/txscript/data/taproot-ref/5a5abab97631cffda0f11fd3ecd87d86dc325f8f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5a5d03ff40bbb94cac9b06c3d47e693d8db5af67 b/txscript/data/taproot-ref/5a5d03ff40bbb94cac9b06c3d47e693d8db5af67 new file mode 100644 index 0000000000..5ca23af06b --- /dev/null +++ b/txscript/data/taproot-ref/5a5d03ff40bbb94cac9b06c3d47e693d8db5af67 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5a5efe209bb7d1e1b0085b1515836fcb2144c5f7 b/txscript/data/taproot-ref/5a5efe209bb7d1e1b0085b1515836fcb2144c5f7 new file mode 100644 index 0000000000..f25be87c57 --- /dev/null +++ b/txscript/data/taproot-ref/5a5efe209bb7d1e1b0085b1515836fcb2144c5f7 @@ -0,0 +1 @@ +{"tx": "e804ef7102bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe80100000034edbacedceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd1010000006fa7aca801349d22000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787f2e54f5a", "prevouts": ["e25f660000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b", "146920000000000017a9148fdfffe253d045df4a2985902e5465482e50374187"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "2360212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "witness": ["3201faf0f008f4b991bde7c4e5a8e0151e32e6e436f2cdf4795a2128a90e73dcc7985f3467b350aefdb57ee932643e64353e10f0a4d7bf4c1a9cf1a394ee51f0"]}}, diff --git a/txscript/data/taproot-ref/5a81cfc3ec9bfa6d49dcb19b411b6a4b6043df15 b/txscript/data/taproot-ref/5a81cfc3ec9bfa6d49dcb19b411b6a4b6043df15 new file mode 100644 index 0000000000..3f738f36e5 --- /dev/null +++ b/txscript/data/taproot-ref/5a81cfc3ec9bfa6d49dcb19b411b6a4b6043df15 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5a9d9ae70e2df49baefc66227ea1c1604902038d b/txscript/data/taproot-ref/5a9d9ae70e2df49baefc66227ea1c1604902038d new file mode 100644 index 0000000000..deb05b109f --- /dev/null +++ b/txscript/data/taproot-ref/5a9d9ae70e2df49baefc66227ea1c1604902038d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5a9f746ca2d826a621e61152c995893027ae3dff b/txscript/data/taproot-ref/5a9f746ca2d826a621e61152c995893027ae3dff new file mode 100644 index 0000000000..b43be10c85 --- /dev/null +++ b/txscript/data/taproot-ref/5a9f746ca2d826a621e61152c995893027ae3dff @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5b000b738705bfd4a6198d22129f7e9f2ccf1708 b/txscript/data/taproot-ref/5b000b738705bfd4a6198d22129f7e9f2ccf1708 new file mode 100644 index 0000000000..31c5c70678 --- /dev/null +++ b/txscript/data/taproot-ref/5b000b738705bfd4a6198d22129f7e9f2ccf1708 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5b08bfcfc4f7317c5e45fbc3a683064ae85a3794 b/txscript/data/taproot-ref/5b08bfcfc4f7317c5e45fbc3a683064ae85a3794 new file mode 100644 index 0000000000..723fb63b2d --- /dev/null +++ b/txscript/data/taproot-ref/5b08bfcfc4f7317c5e45fbc3a683064ae85a3794 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5b33a7895ef81de11965a513bcadc8ee53993d21 b/txscript/data/taproot-ref/5b33a7895ef81de11965a513bcadc8ee53993d21 new file mode 100644 index 0000000000..21f7e199df --- /dev/null +++ b/txscript/data/taproot-ref/5b33a7895ef81de11965a513bcadc8ee53993d21 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5b718764a0b56ae1705be7dcf35a2c639fbee6f4 b/txscript/data/taproot-ref/5b718764a0b56ae1705be7dcf35a2c639fbee6f4 new file mode 100644 index 0000000000..50829aa842 --- /dev/null +++ b/txscript/data/taproot-ref/5b718764a0b56ae1705be7dcf35a2c639fbee6f4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5b72a3d1797578b12f235ecdfb8305d928514960 b/txscript/data/taproot-ref/5b72a3d1797578b12f235ecdfb8305d928514960 new file mode 100644 index 0000000000..a9ae70055d --- /dev/null +++ b/txscript/data/taproot-ref/5b72a3d1797578b12f235ecdfb8305d928514960 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5b831888d2299bcbbe9bb60f6812a461f2da8720 b/txscript/data/taproot-ref/5b831888d2299bcbbe9bb60f6812a461f2da8720 new file mode 100644 index 0000000000..67bad7f940 --- /dev/null +++ b/txscript/data/taproot-ref/5b831888d2299bcbbe9bb60f6812a461f2da8720 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5b89dad22b6b9ad7d97be2de400eaaa8ab2a03e9 b/txscript/data/taproot-ref/5b89dad22b6b9ad7d97be2de400eaaa8ab2a03e9 new file mode 100644 index 0000000000..bb55fa5245 --- /dev/null +++ b/txscript/data/taproot-ref/5b89dad22b6b9ad7d97be2de400eaaa8ab2a03e9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5b9296392fbbb89f20c46a8276795c3b237a921b b/txscript/data/taproot-ref/5b9296392fbbb89f20c46a8276795c3b237a921b new file mode 100644 index 0000000000..e7f99697cd --- /dev/null +++ b/txscript/data/taproot-ref/5b9296392fbbb89f20c46a8276795c3b237a921b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5b9476567b263e9cd4c8455b1383c48f559cdd5c b/txscript/data/taproot-ref/5b9476567b263e9cd4c8455b1383c48f559cdd5c new file mode 100644 index 0000000000..6d4d006d03 --- /dev/null +++ b/txscript/data/taproot-ref/5b9476567b263e9cd4c8455b1383c48f559cdd5c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5b95416a6aeb72fb134a6149c2103c7b4b8af54a b/txscript/data/taproot-ref/5b95416a6aeb72fb134a6149c2103c7b4b8af54a new file mode 100644 index 0000000000..8bbdcc78f1 --- /dev/null +++ b/txscript/data/taproot-ref/5b95416a6aeb72fb134a6149c2103c7b4b8af54a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5bc0284515461bcb5e3ebafccc633649bb1ec2fd b/txscript/data/taproot-ref/5bc0284515461bcb5e3ebafccc633649bb1ec2fd new file mode 100644 index 0000000000..a1a73cafea --- /dev/null +++ b/txscript/data/taproot-ref/5bc0284515461bcb5e3ebafccc633649bb1ec2fd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5bdb30e6f918889383a02c0269f0e346fb129035 b/txscript/data/taproot-ref/5bdb30e6f918889383a02c0269f0e346fb129035 new file mode 100644 index 0000000000..bc810eb2f6 --- /dev/null +++ b/txscript/data/taproot-ref/5bdb30e6f918889383a02c0269f0e346fb129035 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5be7de136c7e263729c299d1617ae86dd468f91d b/txscript/data/taproot-ref/5be7de136c7e263729c299d1617ae86dd468f91d new file mode 100644 index 0000000000..109f1b0a8d --- /dev/null +++ b/txscript/data/taproot-ref/5be7de136c7e263729c299d1617ae86dd468f91d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5c2aec0e280cc6dccb0aa9c3d4c5354a71c3d8e8 b/txscript/data/taproot-ref/5c2aec0e280cc6dccb0aa9c3d4c5354a71c3d8e8 new file mode 100644 index 0000000000..a5bde1d40b --- /dev/null +++ b/txscript/data/taproot-ref/5c2aec0e280cc6dccb0aa9c3d4c5354a71c3d8e8 @@ -0,0 +1 @@ +{"tx": "02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48a01000000668a29f1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3d00000000680a248b0199335c00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acd1918f56", "prevouts": ["64343f0000000000225120ed261f3c61e168679c7f8a74453f2ce25dbf3ff98d002ebf2f6af0aeed189847", "251a20000000000017a91454957ff2b5c5fa7ace3c6fb485b914ecf6ce0c8c87"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "1658142540f27e90740933c99d4f17ab2dfc6c82951cfb", "witness": ["7698efe28cd54922ea5e6da351039d28e1396fc2b3f262ce287a666ab6bad6f86ddc89802934ad992a50fcc287f7b187b9bf6084e175b85c15f2928f55af056a"]}}, diff --git a/txscript/data/taproot-ref/5c2cccde1ba71ca24440e1be3fe94d8b2abc9ba0 b/txscript/data/taproot-ref/5c2cccde1ba71ca24440e1be3fe94d8b2abc9ba0 new file mode 100644 index 0000000000..58de42aca8 --- /dev/null +++ b/txscript/data/taproot-ref/5c2cccde1ba71ca24440e1be3fe94d8b2abc9ba0 @@ -0,0 +1 @@ +{"tx": "b07ccdb3028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40e02000000ac2245c68bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48c0000000092334be801f08a5b000000000017a914719f78084af863e000acd618ba76df979722368987818e012b", "prevouts": ["35c53600000000001658142540f27e90740933c99d4f17ab2dfc6c82951cfb", "1c5737000000000022512020555e2c878e81dabdc8b4bbb4d8fbb562c672b13f4ba4a3f97a1487e7c521d9"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["8767dc918e57c70b298c1e561d76c5e65deefece0466c1b170a15e69fa408a920e2b04e96f142cc6b66e76d5b89c9b25ae8fbe00cff03bbe00e52c31d1dfc2fd", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/5c414ad191f1a4f17701285f026d3be386795f46 b/txscript/data/taproot-ref/5c414ad191f1a4f17701285f026d3be386795f46 new file mode 100644 index 0000000000..a794fef6c5 --- /dev/null +++ b/txscript/data/taproot-ref/5c414ad191f1a4f17701285f026d3be386795f46 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5c4b2bd5199eaae65eb1b50ff2282715f285525d b/txscript/data/taproot-ref/5c4b2bd5199eaae65eb1b50ff2282715f285525d new file mode 100644 index 0000000000..0a10994ca1 --- /dev/null +++ b/txscript/data/taproot-ref/5c4b2bd5199eaae65eb1b50ff2282715f285525d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5c4e02eac5ec6bfd2aacdf25eb5606e7f1f8d245 b/txscript/data/taproot-ref/5c4e02eac5ec6bfd2aacdf25eb5606e7f1f8d245 new file mode 100644 index 0000000000..d5278a3d1d --- /dev/null +++ b/txscript/data/taproot-ref/5c4e02eac5ec6bfd2aacdf25eb5606e7f1f8d245 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/5c58efa0b606fd3a9f5c4149f78312e37884f070 b/txscript/data/taproot-ref/5c58efa0b606fd3a9f5c4149f78312e37884f070 new file mode 100644 index 0000000000..5838f8e974 --- /dev/null +++ b/txscript/data/taproot-ref/5c58efa0b606fd3a9f5c4149f78312e37884f070 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5c7526188d4edba67f479317b2da9ebd815e25d8 b/txscript/data/taproot-ref/5c7526188d4edba67f479317b2da9ebd815e25d8 new file mode 100644 index 0000000000..4090f4b31a --- /dev/null +++ b/txscript/data/taproot-ref/5c7526188d4edba67f479317b2da9ebd815e25d8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5c82173fb5f60e67f6c570773d0e7ca501b2ef2a b/txscript/data/taproot-ref/5c82173fb5f60e67f6c570773d0e7ca501b2ef2a new file mode 100644 index 0000000000..8ae9bc13ea --- /dev/null +++ b/txscript/data/taproot-ref/5c82173fb5f60e67f6c570773d0e7ca501b2ef2a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5cb8c6d32062773a2963b39820bf5c9c9d4d14f4 b/txscript/data/taproot-ref/5cb8c6d32062773a2963b39820bf5c9c9d4d14f4 new file mode 100644 index 0000000000..0753b7868a --- /dev/null +++ b/txscript/data/taproot-ref/5cb8c6d32062773a2963b39820bf5c9c9d4d14f4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5ccd74670aa8f9270b7b6d1ec35f26366e24af92 b/txscript/data/taproot-ref/5ccd74670aa8f9270b7b6d1ec35f26366e24af92 new file mode 100644 index 0000000000..b125013e11 --- /dev/null +++ b/txscript/data/taproot-ref/5ccd74670aa8f9270b7b6d1ec35f26366e24af92 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5ccf6b63be9a26dc12ed0d8d9fcf8f9bd4d32aae b/txscript/data/taproot-ref/5ccf6b63be9a26dc12ed0d8d9fcf8f9bd4d32aae new file mode 100644 index 0000000000..a9982488f5 --- /dev/null +++ b/txscript/data/taproot-ref/5ccf6b63be9a26dc12ed0d8d9fcf8f9bd4d32aae @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5cd441bea952394300fbb2b175630e939f70734a b/txscript/data/taproot-ref/5cd441bea952394300fbb2b175630e939f70734a new file mode 100644 index 0000000000..02afb63633 --- /dev/null +++ b/txscript/data/taproot-ref/5cd441bea952394300fbb2b175630e939f70734a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5cd9d11e72f21213a0cd5e3b000d85ffc71a267a b/txscript/data/taproot-ref/5cd9d11e72f21213a0cd5e3b000d85ffc71a267a new file mode 100644 index 0000000000..25ecaa257a --- /dev/null +++ b/txscript/data/taproot-ref/5cd9d11e72f21213a0cd5e3b000d85ffc71a267a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5cf79ca7fb6c27351843e8929c62c99f6d116b3e b/txscript/data/taproot-ref/5cf79ca7fb6c27351843e8929c62c99f6d116b3e new file mode 100644 index 0000000000..0cfab35907 --- /dev/null +++ b/txscript/data/taproot-ref/5cf79ca7fb6c27351843e8929c62c99f6d116b3e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5d460d2d593010e8b116c549316144cec213da3d b/txscript/data/taproot-ref/5d460d2d593010e8b116c549316144cec213da3d new file mode 100644 index 0000000000..b3f530004a --- /dev/null +++ b/txscript/data/taproot-ref/5d460d2d593010e8b116c549316144cec213da3d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5d547488bdc33c4ba9f4eb64d9e510fe10c43b64 b/txscript/data/taproot-ref/5d547488bdc33c4ba9f4eb64d9e510fe10c43b64 new file mode 100644 index 0000000000..585afc76b1 --- /dev/null +++ b/txscript/data/taproot-ref/5d547488bdc33c4ba9f4eb64d9e510fe10c43b64 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5d5955b5c12cb917cf3b4b20cef145f61555cebb b/txscript/data/taproot-ref/5d5955b5c12cb917cf3b4b20cef145f61555cebb new file mode 100644 index 0000000000..bf74245f6b --- /dev/null +++ b/txscript/data/taproot-ref/5d5955b5c12cb917cf3b4b20cef145f61555cebb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5d5d395b7d0d39e7e061299a0ac6d887b277e7f6 b/txscript/data/taproot-ref/5d5d395b7d0d39e7e061299a0ac6d887b277e7f6 new file mode 100644 index 0000000000..fe4c561513 --- /dev/null +++ b/txscript/data/taproot-ref/5d5d395b7d0d39e7e061299a0ac6d887b277e7f6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5d67205500c9fd9a4b6a49b76f5ba2c4bc80f718 b/txscript/data/taproot-ref/5d67205500c9fd9a4b6a49b76f5ba2c4bc80f718 new file mode 100644 index 0000000000..b7a9185fcc --- /dev/null +++ b/txscript/data/taproot-ref/5d67205500c9fd9a4b6a49b76f5ba2c4bc80f718 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5d979fc0c97f4b30b22b3b449446ef2dad2f94fd b/txscript/data/taproot-ref/5d979fc0c97f4b30b22b3b449446ef2dad2f94fd new file mode 100644 index 0000000000..c7cccd89bd --- /dev/null +++ b/txscript/data/taproot-ref/5d979fc0c97f4b30b22b3b449446ef2dad2f94fd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5da06db4c347f603cf5309c3456c26cc7ff974ad b/txscript/data/taproot-ref/5da06db4c347f603cf5309c3456c26cc7ff974ad new file mode 100644 index 0000000000..4d72f3d8f1 --- /dev/null +++ b/txscript/data/taproot-ref/5da06db4c347f603cf5309c3456c26cc7ff974ad @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5dccc42ff618aec2747273439401c4901ac182b8 b/txscript/data/taproot-ref/5dccc42ff618aec2747273439401c4901ac182b8 new file mode 100644 index 0000000000..ce174cbfe6 --- /dev/null +++ b/txscript/data/taproot-ref/5dccc42ff618aec2747273439401c4901ac182b8 @@ -0,0 +1 @@ +{"tx": "020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703200000000ac43b0a9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2801000000ab411cb402bca15a00000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7963af0dd3e", "prevouts": ["d08e120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b", "319b4a000000000017a9141d8eff3030620b266a8bb5e50900ecd7b2ab72da87"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "21561f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b", "witness": ["974d25958931043c6b7cc3344c248be7a6ed9e6277f40fb672a1e4edd83a2bdff2a10e66e172c91858921ab17edcd9b8c1dc8a065c4bf5c8b78ffd8da66e47a6"]}}, diff --git a/txscript/data/taproot-ref/5e1b24b8be80cb985494cc5e6aad6e0169f302a9 b/txscript/data/taproot-ref/5e1b24b8be80cb985494cc5e6aad6e0169f302a9 new file mode 100644 index 0000000000..615c886ba0 --- /dev/null +++ b/txscript/data/taproot-ref/5e1b24b8be80cb985494cc5e6aad6e0169f302a9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5e29c824e31a38432a78e51cb6163effbc1b7632 b/txscript/data/taproot-ref/5e29c824e31a38432a78e51cb6163effbc1b7632 new file mode 100644 index 0000000000..524836d159 --- /dev/null +++ b/txscript/data/taproot-ref/5e29c824e31a38432a78e51cb6163effbc1b7632 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5e5cf1d19425ce321d71cf332626bab6bf9e5c44 b/txscript/data/taproot-ref/5e5cf1d19425ce321d71cf332626bab6bf9e5c44 new file mode 100644 index 0000000000..5340436649 --- /dev/null +++ b/txscript/data/taproot-ref/5e5cf1d19425ce321d71cf332626bab6bf9e5c44 @@ -0,0 +1 @@ +{"tx": "0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf92010000002d7002b0dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb100000000c01dcced048b91e100000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79628eed841", "prevouts": ["b3f9850000000000235e212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "aa485e0000000000225120398f9b6183163c03ad23a14c61a29f1667ce990766f9351cc380767011c973dd"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["b4f086362b79d90b8b59621bf6f80fc3c9e75f17a9109a8b9b2a68fc59cb536dafce45d091db8e55c50b7793462c89389e9b46a622028e2bbd3eff32815638f7"]}}, diff --git a/txscript/data/taproot-ref/5e7998196110af78479912905025c638163deb00 b/txscript/data/taproot-ref/5e7998196110af78479912905025c638163deb00 new file mode 100644 index 0000000000..075753dd4b --- /dev/null +++ b/txscript/data/taproot-ref/5e7998196110af78479912905025c638163deb00 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5ec7eb46ae8e0891018b9848bc2341e3ef6ee62c b/txscript/data/taproot-ref/5ec7eb46ae8e0891018b9848bc2341e3ef6ee62c new file mode 100644 index 0000000000..c03c641ed3 --- /dev/null +++ b/txscript/data/taproot-ref/5ec7eb46ae8e0891018b9848bc2341e3ef6ee62c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5ef0bcd2fc8dc128e8583e90e1d3848ad698670d b/txscript/data/taproot-ref/5ef0bcd2fc8dc128e8583e90e1d3848ad698670d new file mode 100644 index 0000000000..19dbf9fa65 --- /dev/null +++ b/txscript/data/taproot-ref/5ef0bcd2fc8dc128e8583e90e1d3848ad698670d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5f065a6b9d7bf300aef6fc736b6256c582fa075b b/txscript/data/taproot-ref/5f065a6b9d7bf300aef6fc736b6256c582fa075b new file mode 100644 index 0000000000..76fd668984 --- /dev/null +++ b/txscript/data/taproot-ref/5f065a6b9d7bf300aef6fc736b6256c582fa075b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5f06fb75a8156e71669ca65d0d928c7effc223ff b/txscript/data/taproot-ref/5f06fb75a8156e71669ca65d0d928c7effc223ff new file mode 100644 index 0000000000..e818902f36 --- /dev/null +++ b/txscript/data/taproot-ref/5f06fb75a8156e71669ca65d0d928c7effc223ff @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5f148693c5a6505500494101603fb4754464594f b/txscript/data/taproot-ref/5f148693c5a6505500494101603fb4754464594f new file mode 100644 index 0000000000..c0032ea05d --- /dev/null +++ b/txscript/data/taproot-ref/5f148693c5a6505500494101603fb4754464594f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5f1c481f15b7e89e16871d58cd5784dc2fbfc8f0 b/txscript/data/taproot-ref/5f1c481f15b7e89e16871d58cd5784dc2fbfc8f0 new file mode 100644 index 0000000000..cce94cbf34 --- /dev/null +++ b/txscript/data/taproot-ref/5f1c481f15b7e89e16871d58cd5784dc2fbfc8f0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5f33c80c85ea079ca0e803f9157053bb5cc26ce9 b/txscript/data/taproot-ref/5f33c80c85ea079ca0e803f9157053bb5cc26ce9 new file mode 100644 index 0000000000..9dd828755f --- /dev/null +++ b/txscript/data/taproot-ref/5f33c80c85ea079ca0e803f9157053bb5cc26ce9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5f49d9e42303e9fd5d3b3beb8b4f91d1d295e920 b/txscript/data/taproot-ref/5f49d9e42303e9fd5d3b3beb8b4f91d1d295e920 new file mode 100644 index 0000000000..fb702c57e8 --- /dev/null +++ b/txscript/data/taproot-ref/5f49d9e42303e9fd5d3b3beb8b4f91d1d295e920 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5f617801a71e54b50b37fa8715f4acb9c710bc1d b/txscript/data/taproot-ref/5f617801a71e54b50b37fa8715f4acb9c710bc1d new file mode 100644 index 0000000000..3be642437c --- /dev/null +++ b/txscript/data/taproot-ref/5f617801a71e54b50b37fa8715f4acb9c710bc1d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5fae0f3d4ccf63a68fa6fc6ed2f605c153bc568e b/txscript/data/taproot-ref/5fae0f3d4ccf63a68fa6fc6ed2f605c153bc568e new file mode 100644 index 0000000000..5de7ba5a9b --- /dev/null +++ b/txscript/data/taproot-ref/5fae0f3d4ccf63a68fa6fc6ed2f605c153bc568e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5fd0ea816791d944d140a7f5a132e628c4df41cf b/txscript/data/taproot-ref/5fd0ea816791d944d140a7f5a132e628c4df41cf new file mode 100644 index 0000000000..7530c47da4 --- /dev/null +++ b/txscript/data/taproot-ref/5fd0ea816791d944d140a7f5a132e628c4df41cf @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/5fd72300746767ed3942898b20e747b5e468bf3f b/txscript/data/taproot-ref/5fd72300746767ed3942898b20e747b5e468bf3f new file mode 100644 index 0000000000..31dc81be4d --- /dev/null +++ b/txscript/data/taproot-ref/5fd72300746767ed3942898b20e747b5e468bf3f @@ -0,0 +1 @@ +{"tx": "af047eec0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708d0100000035cba8a8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0500000000056a088502900d7b000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fca77d2341", "prevouts": ["67e6110000000000225120979ac728ddd945fd0096bd7ed70641d6c3e965c9318f95ca3c406aaae5bf23bb", "63c76b00000000002354212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["4734f7eefaabd240db74a20e895a323978e3541c66ea1e8b55f9b9cc3a956339431fb1d9ecf8acdc726ab83cdcc6c9a89a2e9a0edc755bacfdaf9d5d6db5d5c7"]}}, diff --git a/txscript/data/taproot-ref/600a49efd1ef275dd0d15886970d34f50ceb2cb5 b/txscript/data/taproot-ref/600a49efd1ef275dd0d15886970d34f50ceb2cb5 new file mode 100644 index 0000000000..b3b1e32745 --- /dev/null +++ b/txscript/data/taproot-ref/600a49efd1ef275dd0d15886970d34f50ceb2cb5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/600aee354a6065175892343ec14dc1eced5c33d7 b/txscript/data/taproot-ref/600aee354a6065175892343ec14dc1eced5c33d7 new file mode 100644 index 0000000000..4dd9b5542c --- /dev/null +++ b/txscript/data/taproot-ref/600aee354a6065175892343ec14dc1eced5c33d7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/60157ba4a7cd240aad985554d23dafcb6b99be47 b/txscript/data/taproot-ref/60157ba4a7cd240aad985554d23dafcb6b99be47 new file mode 100644 index 0000000000..ec1a64cf66 --- /dev/null +++ b/txscript/data/taproot-ref/60157ba4a7cd240aad985554d23dafcb6b99be47 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/601bf2a7aa8b6c3a9adef4933fc515d494f4a95c b/txscript/data/taproot-ref/601bf2a7aa8b6c3a9adef4933fc515d494f4a95c new file mode 100644 index 0000000000..d8b6c58c63 --- /dev/null +++ b/txscript/data/taproot-ref/601bf2a7aa8b6c3a9adef4933fc515d494f4a95c @@ -0,0 +1 @@ +{"tx": "01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47801000000d864d64160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706300000000b0448b2f01b9302e000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8754010000", "prevouts": ["fb623f0000000000225120b5971b61c25a2798e5070f8744a1dfc2e930eb6eb2b95087e25b503f53923ed3", "33201100000000002256202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["7e6eff66ddca203267f8079794c4aa5cc3e46d949ac5d785b162a8c7acf888f7b978e1f3a0accdf966e42dfe4dd7cc59d4d6da856cd372a1bbf908a6bfdb3ed1", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/6030146df9ff31d1d977c2672cfc3792ad81865d b/txscript/data/taproot-ref/6030146df9ff31d1d977c2672cfc3792ad81865d new file mode 100644 index 0000000000..5db2bf3f4c --- /dev/null +++ b/txscript/data/taproot-ref/6030146df9ff31d1d977c2672cfc3792ad81865d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/60350336430acbd30d2f4a7afd671e1a676249b8 b/txscript/data/taproot-ref/60350336430acbd30d2f4a7afd671e1a676249b8 new file mode 100644 index 0000000000..68ecbcf327 --- /dev/null +++ b/txscript/data/taproot-ref/60350336430acbd30d2f4a7afd671e1a676249b8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/604aa389e1cdb7844558781a66e69bb80e5f7ed4 b/txscript/data/taproot-ref/604aa389e1cdb7844558781a66e69bb80e5f7ed4 new file mode 100644 index 0000000000..c716cd364a --- /dev/null +++ b/txscript/data/taproot-ref/604aa389e1cdb7844558781a66e69bb80e5f7ed4 @@ -0,0 +1 @@ +{"tx": "020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270240100000016d9ce96dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b740100000085d2d2f90174352f00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acc1040000", "prevouts": ["3fde11000000000017a9149d4bcb1ed806c9beed692a78614f8b90a68c708187", "7903270000000000225120703a27ee37b547411791bd0e189100b9b1aab12509c8c95d384d172c3abbca5e"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "21571f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b", "witness": ["15bb12fdf12c0e4a1e19ec0ed405846f8e030af8e2f45a52e90f8b4b848d733c528a438c305cc14eaafe646856418e70cd834fed506aa34c27265e7829ddc9ae"]}}, diff --git a/txscript/data/taproot-ref/6070c8050e46e845c5170ec25daefa937dbbdd11 b/txscript/data/taproot-ref/6070c8050e46e845c5170ec25daefa937dbbdd11 new file mode 100644 index 0000000000..a0d9486890 --- /dev/null +++ b/txscript/data/taproot-ref/6070c8050e46e845c5170ec25daefa937dbbdd11 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/608151513d665821b3914810e70e9c1f957da187 b/txscript/data/taproot-ref/608151513d665821b3914810e70e9c1f957da187 new file mode 100644 index 0000000000..55b0d2b881 --- /dev/null +++ b/txscript/data/taproot-ref/608151513d665821b3914810e70e9c1f957da187 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/60a40b71e2980d806f6e3f1f604e1c25d8d684a9 b/txscript/data/taproot-ref/60a40b71e2980d806f6e3f1f604e1c25d8d684a9 new file mode 100644 index 0000000000..4b0aeea0c2 --- /dev/null +++ b/txscript/data/taproot-ref/60a40b71e2980d806f6e3f1f604e1c25d8d684a9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/60c433ddebf0bd6ec3f44d608946aed9e843587f b/txscript/data/taproot-ref/60c433ddebf0bd6ec3f44d608946aed9e843587f new file mode 100644 index 0000000000..3720170c9c --- /dev/null +++ b/txscript/data/taproot-ref/60c433ddebf0bd6ec3f44d608946aed9e843587f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/616a7fdb9927448c5c9e34f94d4f6d784f55ccf8 b/txscript/data/taproot-ref/616a7fdb9927448c5c9e34f94d4f6d784f55ccf8 new file mode 100644 index 0000000000..d62bf54c5c --- /dev/null +++ b/txscript/data/taproot-ref/616a7fdb9927448c5c9e34f94d4f6d784f55ccf8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/617d47ec32a898ac6e2b5bdd9b8e643408054596 b/txscript/data/taproot-ref/617d47ec32a898ac6e2b5bdd9b8e643408054596 new file mode 100644 index 0000000000..7e97511558 --- /dev/null +++ b/txscript/data/taproot-ref/617d47ec32a898ac6e2b5bdd9b8e643408054596 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/61ac7af8ebd0ac559618d67f23d159b57dce5577 b/txscript/data/taproot-ref/61ac7af8ebd0ac559618d67f23d159b57dce5577 new file mode 100644 index 0000000000..25849920c2 --- /dev/null +++ b/txscript/data/taproot-ref/61ac7af8ebd0ac559618d67f23d159b57dce5577 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/61ad3f5b692481700ab46b1c77ecf7e1590f4f72 b/txscript/data/taproot-ref/61ad3f5b692481700ab46b1c77ecf7e1590f4f72 new file mode 100644 index 0000000000..48195102c1 --- /dev/null +++ b/txscript/data/taproot-ref/61ad3f5b692481700ab46b1c77ecf7e1590f4f72 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/61ad53ecbb9e93b9d193624ee3222dd39af8c8a4 b/txscript/data/taproot-ref/61ad53ecbb9e93b9d193624ee3222dd39af8c8a4 new file mode 100644 index 0000000000..a6a5e0a972 --- /dev/null +++ b/txscript/data/taproot-ref/61ad53ecbb9e93b9d193624ee3222dd39af8c8a4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/61af1bfa70f27db871da9994cee2a1fa6dbfe915 b/txscript/data/taproot-ref/61af1bfa70f27db871da9994cee2a1fa6dbfe915 new file mode 100644 index 0000000000..6c663fb176 --- /dev/null +++ b/txscript/data/taproot-ref/61af1bfa70f27db871da9994cee2a1fa6dbfe915 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/61cb3c37ef29bf5abdbf60157dd9334ea8578716 b/txscript/data/taproot-ref/61cb3c37ef29bf5abdbf60157dd9334ea8578716 new file mode 100644 index 0000000000..26a09e6eff --- /dev/null +++ b/txscript/data/taproot-ref/61cb3c37ef29bf5abdbf60157dd9334ea8578716 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/61cca434775b13627deda2ffc7b421cc834c16ee b/txscript/data/taproot-ref/61cca434775b13627deda2ffc7b421cc834c16ee new file mode 100644 index 0000000000..aa618207fe --- /dev/null +++ b/txscript/data/taproot-ref/61cca434775b13627deda2ffc7b421cc834c16ee @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/61cd2f257a7e5a750b8f03f5aac0ffb2badc3aef b/txscript/data/taproot-ref/61cd2f257a7e5a750b8f03f5aac0ffb2badc3aef new file mode 100644 index 0000000000..ae8613b20f --- /dev/null +++ b/txscript/data/taproot-ref/61cd2f257a7e5a750b8f03f5aac0ffb2badc3aef @@ -0,0 +1 @@ +{"tx": "0200000001f85ef04c4139d614d10d1a30e75a9f6421df67317126da87b2f877c2ab20246301000000002a67d6e90189d4f84f050000001976a914a875a4732dcf342e2587f26f2b7b2ea4a2fd587488ac30050000", "prevouts": ["1acc45b01400000022512034153a16ef8458ec2412ba42dd5be0fabd8b4c2f532d179dc958fc1fca3cae43"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY", "comment": "inactive/scriptpath_valid", "success": {"scriptSig": "", "witness": ["576dd7bfb72e5379a8317f3a54b9287d49891291fd96a2084e781943b3424287a63f413d1b4cccd89e1529deaba58b40aa10b57644af7a2ee55203e2c0244f02", "20cb0ba18c127bd01c824f94fd2578ac4109c167b40bd92fd4f8ede9600f7f41f3ac", "c0cb0ba18c127bd01c824f94fd2578ac4109c167b40bd92fd4f8ede9600f7f41f312f383ce02997bd7885b2023ff24b4d79c49e77348af650460f5903df7baafc9"]}}, diff --git a/txscript/data/taproot-ref/61dfcc18f9bbed9da1c93970d11da1509777d17c b/txscript/data/taproot-ref/61dfcc18f9bbed9da1c93970d11da1509777d17c new file mode 100644 index 0000000000..84e267f312 --- /dev/null +++ b/txscript/data/taproot-ref/61dfcc18f9bbed9da1c93970d11da1509777d17c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/622454dc9deabc8438f95f3e6280211c37369c04 b/txscript/data/taproot-ref/622454dc9deabc8438f95f3e6280211c37369c04 new file mode 100644 index 0000000000..11e592195f --- /dev/null +++ b/txscript/data/taproot-ref/622454dc9deabc8438f95f3e6280211c37369c04 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/626dec99c8f47a95e864b2a31b4ca6b916ee594c b/txscript/data/taproot-ref/626dec99c8f47a95e864b2a31b4ca6b916ee594c new file mode 100644 index 0000000000..5f4393d3a5 --- /dev/null +++ b/txscript/data/taproot-ref/626dec99c8f47a95e864b2a31b4ca6b916ee594c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/629399f535a4b780a7126fd274938c9e1bdd9b94 b/txscript/data/taproot-ref/629399f535a4b780a7126fd274938c9e1bdd9b94 new file mode 100644 index 0000000000..28e0524f1d --- /dev/null +++ b/txscript/data/taproot-ref/629399f535a4b780a7126fd274938c9e1bdd9b94 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/629683fa749137e2dfd6e82633d304ea6c124ce3 b/txscript/data/taproot-ref/629683fa749137e2dfd6e82633d304ea6c124ce3 new file mode 100644 index 0000000000..fe76f11a19 --- /dev/null +++ b/txscript/data/taproot-ref/629683fa749137e2dfd6e82633d304ea6c124ce3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/62c572a03d69a6b40d25947abae19bf6ce5eb385 b/txscript/data/taproot-ref/62c572a03d69a6b40d25947abae19bf6ce5eb385 new file mode 100644 index 0000000000..5b4fb69fa1 --- /dev/null +++ b/txscript/data/taproot-ref/62c572a03d69a6b40d25947abae19bf6ce5eb385 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/62d04745f9fcb76848b12153a162a268f14abeca b/txscript/data/taproot-ref/62d04745f9fcb76848b12153a162a268f14abeca new file mode 100644 index 0000000000..66b15aabce --- /dev/null +++ b/txscript/data/taproot-ref/62d04745f9fcb76848b12153a162a268f14abeca @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/62f4696a4d80fd4c0dc13ef75f8bacef6743b8d7 b/txscript/data/taproot-ref/62f4696a4d80fd4c0dc13ef75f8bacef6743b8d7 new file mode 100644 index 0000000000..a6c9eaaedf --- /dev/null +++ b/txscript/data/taproot-ref/62f4696a4d80fd4c0dc13ef75f8bacef6743b8d7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/62f8cb127c31b1882150c0c8effbd39c09119e5f b/txscript/data/taproot-ref/62f8cb127c31b1882150c0c8effbd39c09119e5f new file mode 100644 index 0000000000..d3a313cd1b --- /dev/null +++ b/txscript/data/taproot-ref/62f8cb127c31b1882150c0c8effbd39c09119e5f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/630f756a29287a797ffb5586566bc1d25758573d b/txscript/data/taproot-ref/630f756a29287a797ffb5586566bc1d25758573d new file mode 100644 index 0000000000..2033b06ee9 --- /dev/null +++ b/txscript/data/taproot-ref/630f756a29287a797ffb5586566bc1d25758573d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/63167cb8ba3874badf57f0e855e7f02478cfd49f b/txscript/data/taproot-ref/63167cb8ba3874badf57f0e855e7f02478cfd49f new file mode 100644 index 0000000000..b62f8c1ce1 --- /dev/null +++ b/txscript/data/taproot-ref/63167cb8ba3874badf57f0e855e7f02478cfd49f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6316bbbc6a41808b00262eab5f5262fcfa97066b b/txscript/data/taproot-ref/6316bbbc6a41808b00262eab5f5262fcfa97066b new file mode 100644 index 0000000000..f21fb881a1 --- /dev/null +++ b/txscript/data/taproot-ref/6316bbbc6a41808b00262eab5f5262fcfa97066b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/63254af008fbdb6301cc07058a867abb97610c66 b/txscript/data/taproot-ref/63254af008fbdb6301cc07058a867abb97610c66 new file mode 100644 index 0000000000..60c37fd7dc --- /dev/null +++ b/txscript/data/taproot-ref/63254af008fbdb6301cc07058a867abb97610c66 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/633faf2de8dd00d4d8b3bbdda4d9f2125613a89d b/txscript/data/taproot-ref/633faf2de8dd00d4d8b3bbdda4d9f2125613a89d new file mode 100644 index 0000000000..c56385f932 --- /dev/null +++ b/txscript/data/taproot-ref/633faf2de8dd00d4d8b3bbdda4d9f2125613a89d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/63428d34338ada0748fdd95dc5f6db204de7543a b/txscript/data/taproot-ref/63428d34338ada0748fdd95dc5f6db204de7543a new file mode 100644 index 0000000000..3cd8ad8743 --- /dev/null +++ b/txscript/data/taproot-ref/63428d34338ada0748fdd95dc5f6db204de7543a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/634458fa7be2820b5e56c8ae2c193b953af0ad40 b/txscript/data/taproot-ref/634458fa7be2820b5e56c8ae2c193b953af0ad40 new file mode 100644 index 0000000000..3af8a0b6cf --- /dev/null +++ b/txscript/data/taproot-ref/634458fa7be2820b5e56c8ae2c193b953af0ad40 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6360d46053a73eb3d4ae1cc875f022d5d461f571 b/txscript/data/taproot-ref/6360d46053a73eb3d4ae1cc875f022d5d461f571 new file mode 100644 index 0000000000..95043a36cf --- /dev/null +++ b/txscript/data/taproot-ref/6360d46053a73eb3d4ae1cc875f022d5d461f571 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/636131ac174bfe63b118e739bb030a2fae2ae0ed b/txscript/data/taproot-ref/636131ac174bfe63b118e739bb030a2fae2ae0ed new file mode 100644 index 0000000000..123ca7f2b3 --- /dev/null +++ b/txscript/data/taproot-ref/636131ac174bfe63b118e739bb030a2fae2ae0ed @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6391af63a3bab91b1f963e133bbb54d1ec7814cb b/txscript/data/taproot-ref/6391af63a3bab91b1f963e133bbb54d1ec7814cb new file mode 100644 index 0000000000..5d9a1e3ab4 --- /dev/null +++ b/txscript/data/taproot-ref/6391af63a3bab91b1f963e133bbb54d1ec7814cb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/639afaf27cd09001a498697b15842c3394f9535d b/txscript/data/taproot-ref/639afaf27cd09001a498697b15842c3394f9535d new file mode 100644 index 0000000000..192b7934ed --- /dev/null +++ b/txscript/data/taproot-ref/639afaf27cd09001a498697b15842c3394f9535d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/63b0cec5acbe499ece5bd821c8af36dd0de95819 b/txscript/data/taproot-ref/63b0cec5acbe499ece5bd821c8af36dd0de95819 new file mode 100644 index 0000000000..e7ee124a51 --- /dev/null +++ b/txscript/data/taproot-ref/63b0cec5acbe499ece5bd821c8af36dd0de95819 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/63b754b26183ec079fd02af865aea1d5c49d93cb b/txscript/data/taproot-ref/63b754b26183ec079fd02af865aea1d5c49d93cb new file mode 100644 index 0000000000..b327557833 --- /dev/null +++ b/txscript/data/taproot-ref/63b754b26183ec079fd02af865aea1d5c49d93cb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/63c6cb5ef992299a9604582c39c7f956c65860b3 b/txscript/data/taproot-ref/63c6cb5ef992299a9604582c39c7f956c65860b3 new file mode 100644 index 0000000000..1ee2a6a8fb --- /dev/null +++ b/txscript/data/taproot-ref/63c6cb5ef992299a9604582c39c7f956c65860b3 @@ -0,0 +1 @@ +{"tx": "020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702b01000000563eb1acdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cfe0100000075a2baca015d162200000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688aca7030000", "prevouts": ["503d1300000000001660142540f27e90740933c99d4f17ab2dfc6c82951cfb", "112b4d00000000002251209bc793d7c3b05f6eda9a2c26b213a9e100dca8f4a7f94360c5b61ae9a4f972e8"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["cd6080e32a37eed9423b6209c11b9115af7004c3f774d587368b784e2d008cb826acbfaa43d1b4f66476a1fa51cb847dfc530f1dbca5a3d261af4280ee787fcb", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/63c8bbd564a4a1648edf9f05d80a6b089c40883c b/txscript/data/taproot-ref/63c8bbd564a4a1648edf9f05d80a6b089c40883c new file mode 100644 index 0000000000..3d54c3c6ed --- /dev/null +++ b/txscript/data/taproot-ref/63c8bbd564a4a1648edf9f05d80a6b089c40883c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/63cc94dee9c6256ddfe004eb9fcabb932627fcce b/txscript/data/taproot-ref/63cc94dee9c6256ddfe004eb9fcabb932627fcce new file mode 100644 index 0000000000..24330e791c --- /dev/null +++ b/txscript/data/taproot-ref/63cc94dee9c6256ddfe004eb9fcabb932627fcce @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/63e781018cd701d6d445dc7c4ea28f9a53de825f b/txscript/data/taproot-ref/63e781018cd701d6d445dc7c4ea28f9a53de825f new file mode 100644 index 0000000000..6c4791f121 --- /dev/null +++ b/txscript/data/taproot-ref/63e781018cd701d6d445dc7c4ea28f9a53de825f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/642e1fbd4f64d1ba035193a0100aefc8d436121a b/txscript/data/taproot-ref/642e1fbd4f64d1ba035193a0100aefc8d436121a new file mode 100644 index 0000000000..9e886dbf6a --- /dev/null +++ b/txscript/data/taproot-ref/642e1fbd4f64d1ba035193a0100aefc8d436121a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/642f40f85c3e92c672ec038a2e238351c6c24178 b/txscript/data/taproot-ref/642f40f85c3e92c672ec038a2e238351c6c24178 new file mode 100644 index 0000000000..4d9e41f937 --- /dev/null +++ b/txscript/data/taproot-ref/642f40f85c3e92c672ec038a2e238351c6c24178 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/643386ed0f556a2227416f5b32e310b70a2cf743 b/txscript/data/taproot-ref/643386ed0f556a2227416f5b32e310b70a2cf743 new file mode 100644 index 0000000000..a5b3aca4be --- /dev/null +++ b/txscript/data/taproot-ref/643386ed0f556a2227416f5b32e310b70a2cf743 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/643f751fa11ea6d366ace6319feda720f2e8accd b/txscript/data/taproot-ref/643f751fa11ea6d366ace6319feda720f2e8accd new file mode 100644 index 0000000000..4839589471 --- /dev/null +++ b/txscript/data/taproot-ref/643f751fa11ea6d366ace6319feda720f2e8accd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/64537ec43a7b2b59f2b936c7247b94e44e1bb551 b/txscript/data/taproot-ref/64537ec43a7b2b59f2b936c7247b94e44e1bb551 new file mode 100644 index 0000000000..c17f4e1810 --- /dev/null +++ b/txscript/data/taproot-ref/64537ec43a7b2b59f2b936c7247b94e44e1bb551 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/648fef1a9a568a6e98c2cb836193a18ec11b60ce b/txscript/data/taproot-ref/648fef1a9a568a6e98c2cb836193a18ec11b60ce new file mode 100644 index 0000000000..30766cecc0 --- /dev/null +++ b/txscript/data/taproot-ref/648fef1a9a568a6e98c2cb836193a18ec11b60ce @@ -0,0 +1 @@ +{"tx": "0b6fe83703bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acffe000000007cacfbdb8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c468000000009c09df848bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f700000000774f468401c92a7500000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acbd79e031", "prevouts": ["dcc37900000000002251202361d91ff13391fd25020ba7e60c60643b5255f5adbfbdf7f0353592847fec4a", "129d37000000000017a91439ec132e1466f40f0086baa7ac253013e83c7dc387", "bc53380000000000225120f3eef30b2db388e6b8a313ffb142e2e6ffc970ce6b6a81ae6dc1d81725c678ea"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "215e1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b", "witness": ["e9df93b6b02ca0341b0345a2523cec9961d8ca0d900cfd5450582da4b60610363d1cc329fbc34c7929fa8007b99f10aade2fbebaa3985bca24226f56725bba88"]}}, diff --git a/txscript/data/taproot-ref/64b6416da57fa74cb892f8728aac8bc6064ac5dc b/txscript/data/taproot-ref/64b6416da57fa74cb892f8728aac8bc6064ac5dc new file mode 100644 index 0000000000..279ebb88e5 --- /dev/null +++ b/txscript/data/taproot-ref/64b6416da57fa74cb892f8728aac8bc6064ac5dc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/64c1ab90001da13422d892838a22208f71109eb2 b/txscript/data/taproot-ref/64c1ab90001da13422d892838a22208f71109eb2 new file mode 100644 index 0000000000..ae7bba12d7 --- /dev/null +++ b/txscript/data/taproot-ref/64c1ab90001da13422d892838a22208f71109eb2 @@ -0,0 +1 @@ +{"tx": "01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4680100000014cd4d66dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5b01000000d231e7ff03efb58d0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc27030000", "prevouts": ["9db93700000000001654142540f27e90740933c99d4f17ab2dfc6c82951cfb", "7b045800000000002358212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["e306379641defa88af163715a7c95126d1913945bd4b8d1a728c7e37d4b3879888f06f2be13e87d68eeae13ce45da9a2c8cf25215a8c593795cbbd4bd7a3aedd"]}}, diff --git a/txscript/data/taproot-ref/64c86a5fba96a19af3d7f98cb11533d79ff4433f b/txscript/data/taproot-ref/64c86a5fba96a19af3d7f98cb11533d79ff4433f new file mode 100644 index 0000000000..762e10fa42 --- /dev/null +++ b/txscript/data/taproot-ref/64c86a5fba96a19af3d7f98cb11533d79ff4433f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/64c9c1019b362e31675420967685e3e5e1d92f06 b/txscript/data/taproot-ref/64c9c1019b362e31675420967685e3e5e1d92f06 new file mode 100644 index 0000000000..4204f71eaf --- /dev/null +++ b/txscript/data/taproot-ref/64c9c1019b362e31675420967685e3e5e1d92f06 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/64e713b456a3f23cd86eeb23d796639b7c85d2b6 b/txscript/data/taproot-ref/64e713b456a3f23cd86eeb23d796639b7c85d2b6 new file mode 100644 index 0000000000..b48f7fdf9e --- /dev/null +++ b/txscript/data/taproot-ref/64e713b456a3f23cd86eeb23d796639b7c85d2b6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/650b0fcd68979a929ceb682e9024fb7beb57c2b1 b/txscript/data/taproot-ref/650b0fcd68979a929ceb682e9024fb7beb57c2b1 new file mode 100644 index 0000000000..41208d2f74 --- /dev/null +++ b/txscript/data/taproot-ref/650b0fcd68979a929ceb682e9024fb7beb57c2b1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/652f7178db85a30195aec38e5bed56f8d492b18c b/txscript/data/taproot-ref/652f7178db85a30195aec38e5bed56f8d492b18c new file mode 100644 index 0000000000..41dc25ac66 --- /dev/null +++ b/txscript/data/taproot-ref/652f7178db85a30195aec38e5bed56f8d492b18c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6536f2a8bf497dc4fb07e6344571b041ddf3e9ce b/txscript/data/taproot-ref/6536f2a8bf497dc4fb07e6344571b041ddf3e9ce new file mode 100644 index 0000000000..ba973cf12d --- /dev/null +++ b/txscript/data/taproot-ref/6536f2a8bf497dc4fb07e6344571b041ddf3e9ce @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6552bfcd6579a934948b7068b4c551a0117ad0f9 b/txscript/data/taproot-ref/6552bfcd6579a934948b7068b4c551a0117ad0f9 new file mode 100644 index 0000000000..7a2040fdce --- /dev/null +++ b/txscript/data/taproot-ref/6552bfcd6579a934948b7068b4c551a0117ad0f9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/657e868eb96e89c02af5430fd6fd6b371011ad19 b/txscript/data/taproot-ref/657e868eb96e89c02af5430fd6fd6b371011ad19 new file mode 100644 index 0000000000..a66d6cbb8f --- /dev/null +++ b/txscript/data/taproot-ref/657e868eb96e89c02af5430fd6fd6b371011ad19 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/65883b58c6b3dd90d25b39f5ccc47be52f17c9fc b/txscript/data/taproot-ref/65883b58c6b3dd90d25b39f5ccc47be52f17c9fc new file mode 100644 index 0000000000..f91b386c9c --- /dev/null +++ b/txscript/data/taproot-ref/65883b58c6b3dd90d25b39f5ccc47be52f17c9fc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/658ae5cbb0d9d2acbdf007a1d56b7a8d343343c5 b/txscript/data/taproot-ref/658ae5cbb0d9d2acbdf007a1d56b7a8d343343c5 new file mode 100644 index 0000000000..1f58253154 --- /dev/null +++ b/txscript/data/taproot-ref/658ae5cbb0d9d2acbdf007a1d56b7a8d343343c5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/659a2dd2fa1b9d801f3241e5ff84637ce06ccb77 b/txscript/data/taproot-ref/659a2dd2fa1b9d801f3241e5ff84637ce06ccb77 new file mode 100644 index 0000000000..71c94c3512 --- /dev/null +++ b/txscript/data/taproot-ref/659a2dd2fa1b9d801f3241e5ff84637ce06ccb77 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/65a933e1d1978ba3bd2f831c22458a755de9ba53 b/txscript/data/taproot-ref/65a933e1d1978ba3bd2f831c22458a755de9ba53 new file mode 100644 index 0000000000..79c89731cc --- /dev/null +++ b/txscript/data/taproot-ref/65a933e1d1978ba3bd2f831c22458a755de9ba53 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/65b54fb91b4a1cb8c833485f4d132f6e676256e0 b/txscript/data/taproot-ref/65b54fb91b4a1cb8c833485f4d132f6e676256e0 new file mode 100644 index 0000000000..3d6d01cf65 --- /dev/null +++ b/txscript/data/taproot-ref/65b54fb91b4a1cb8c833485f4d132f6e676256e0 @@ -0,0 +1 @@ +{"tx": "0100000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c48010000008639869704fe1f4e00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914719f78084af863e000acd618ba76df979722368987ae010000", "prevouts": ["dcde4f00000000002356212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["059ae24d6eb313597f458e4b902a3ab80888f6266fc76748d0059bfd693f46ff2281f631dbf4acbfeb5a2bce2a20dd8b768eac99932f285edb9e8017bd95a764", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/65b5fce87c9d43529bc25317899f3d88952342f0 b/txscript/data/taproot-ref/65b5fce87c9d43529bc25317899f3d88952342f0 new file mode 100644 index 0000000000..2d5dc10807 --- /dev/null +++ b/txscript/data/taproot-ref/65b5fce87c9d43529bc25317899f3d88952342f0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/65e72ac1ffd20fc948eb9fd0715334a200044fb6 b/txscript/data/taproot-ref/65e72ac1ffd20fc948eb9fd0715334a200044fb6 new file mode 100644 index 0000000000..f84f19a1f2 --- /dev/null +++ b/txscript/data/taproot-ref/65e72ac1ffd20fc948eb9fd0715334a200044fb6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/65f7ef2d10a182c5af3e4c60b4f23f13770b1d2f b/txscript/data/taproot-ref/65f7ef2d10a182c5af3e4c60b4f23f13770b1d2f new file mode 100644 index 0000000000..32674ff225 --- /dev/null +++ b/txscript/data/taproot-ref/65f7ef2d10a182c5af3e4c60b4f23f13770b1d2f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/660b8322660c10bb3072efbf02a01b028869f3ed b/txscript/data/taproot-ref/660b8322660c10bb3072efbf02a01b028869f3ed new file mode 100644 index 0000000000..8530efbd3b --- /dev/null +++ b/txscript/data/taproot-ref/660b8322660c10bb3072efbf02a01b028869f3ed @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/660ef1c053328676703178f6c1f1a9eab0eba34d b/txscript/data/taproot-ref/660ef1c053328676703178f6c1f1a9eab0eba34d new file mode 100644 index 0000000000..98dd793db0 --- /dev/null +++ b/txscript/data/taproot-ref/660ef1c053328676703178f6c1f1a9eab0eba34d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/66252c3d296124f1a894a2bef80eb0b8d2780c58 b/txscript/data/taproot-ref/66252c3d296124f1a894a2bef80eb0b8d2780c58 new file mode 100644 index 0000000000..e8610a3c36 --- /dev/null +++ b/txscript/data/taproot-ref/66252c3d296124f1a894a2bef80eb0b8d2780c58 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6652466b4852d5b5fdaaa69e10880f1a3b76c3fa b/txscript/data/taproot-ref/6652466b4852d5b5fdaaa69e10880f1a3b76c3fa new file mode 100644 index 0000000000..fa4dc8b583 --- /dev/null +++ b/txscript/data/taproot-ref/6652466b4852d5b5fdaaa69e10880f1a3b76c3fa @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/665eb41953197df4c60f261f2844052bbd0c48b6 b/txscript/data/taproot-ref/665eb41953197df4c60f261f2844052bbd0c48b6 new file mode 100644 index 0000000000..ec0497ea40 --- /dev/null +++ b/txscript/data/taproot-ref/665eb41953197df4c60f261f2844052bbd0c48b6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/66726b80715835e1ff8fad96f3c76a0309586a88 b/txscript/data/taproot-ref/66726b80715835e1ff8fad96f3c76a0309586a88 new file mode 100644 index 0000000000..296f888af6 --- /dev/null +++ b/txscript/data/taproot-ref/66726b80715835e1ff8fad96f3c76a0309586a88 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6699c94d11593280e700614b550ad835b0025476 b/txscript/data/taproot-ref/6699c94d11593280e700614b550ad835b0025476 new file mode 100644 index 0000000000..2b1bb778ef --- /dev/null +++ b/txscript/data/taproot-ref/6699c94d11593280e700614b550ad835b0025476 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/669ff69c2c67c7765c32e86e0eda8fcf04bcdbdd b/txscript/data/taproot-ref/669ff69c2c67c7765c32e86e0eda8fcf04bcdbdd new file mode 100644 index 0000000000..e3791cdf8d --- /dev/null +++ b/txscript/data/taproot-ref/669ff69c2c67c7765c32e86e0eda8fcf04bcdbdd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/66bbe506485ecc1f5f29905e93bbc326b119a9db b/txscript/data/taproot-ref/66bbe506485ecc1f5f29905e93bbc326b119a9db new file mode 100644 index 0000000000..4635407fab --- /dev/null +++ b/txscript/data/taproot-ref/66bbe506485ecc1f5f29905e93bbc326b119a9db @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/66cb36473c4a75d094b0c109710f2456a52e3ac0 b/txscript/data/taproot-ref/66cb36473c4a75d094b0c109710f2456a52e3ac0 new file mode 100644 index 0000000000..6f00d1f193 --- /dev/null +++ b/txscript/data/taproot-ref/66cb36473c4a75d094b0c109710f2456a52e3ac0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/66e881b64f9e9007cc27f9ae6ea1d9c09b7ff1dd b/txscript/data/taproot-ref/66e881b64f9e9007cc27f9ae6ea1d9c09b7ff1dd new file mode 100644 index 0000000000..69deff653e --- /dev/null +++ b/txscript/data/taproot-ref/66e881b64f9e9007cc27f9ae6ea1d9c09b7ff1dd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/66fd2e2f42f7b15c03f46c8f5852fc2b2a1288d4 b/txscript/data/taproot-ref/66fd2e2f42f7b15c03f46c8f5852fc2b2a1288d4 new file mode 100644 index 0000000000..f44c6eeaff --- /dev/null +++ b/txscript/data/taproot-ref/66fd2e2f42f7b15c03f46c8f5852fc2b2a1288d4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6723a627907cb1d91034b75d6a69d055a9d2a9b2 b/txscript/data/taproot-ref/6723a627907cb1d91034b75d6a69d055a9d2a9b2 new file mode 100644 index 0000000000..b38d733d28 --- /dev/null +++ b/txscript/data/taproot-ref/6723a627907cb1d91034b75d6a69d055a9d2a9b2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/674c86a431b193721af73dfdf07aeef65a7ef508 b/txscript/data/taproot-ref/674c86a431b193721af73dfdf07aeef65a7ef508 new file mode 100644 index 0000000000..e9278f1e3d --- /dev/null +++ b/txscript/data/taproot-ref/674c86a431b193721af73dfdf07aeef65a7ef508 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/674e2feab074ca0240a6ca55826b14e434793461 b/txscript/data/taproot-ref/674e2feab074ca0240a6ca55826b14e434793461 new file mode 100644 index 0000000000..a83df62ffb --- /dev/null +++ b/txscript/data/taproot-ref/674e2feab074ca0240a6ca55826b14e434793461 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6766fbe9f961609fc3c2e2dbb922ddf1dc771d96 b/txscript/data/taproot-ref/6766fbe9f961609fc3c2e2dbb922ddf1dc771d96 new file mode 100644 index 0000000000..021ca0fa4d --- /dev/null +++ b/txscript/data/taproot-ref/6766fbe9f961609fc3c2e2dbb922ddf1dc771d96 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/677c2fb0bd66dbf157aed281b05b92ad2c197c37 b/txscript/data/taproot-ref/677c2fb0bd66dbf157aed281b05b92ad2c197c37 new file mode 100644 index 0000000000..f81e2f7ea8 --- /dev/null +++ b/txscript/data/taproot-ref/677c2fb0bd66dbf157aed281b05b92ad2c197c37 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6790425ac6ab89b1bf9e69e61d0a23def2470c84 b/txscript/data/taproot-ref/6790425ac6ab89b1bf9e69e61d0a23def2470c84 new file mode 100644 index 0000000000..a79455f15b --- /dev/null +++ b/txscript/data/taproot-ref/6790425ac6ab89b1bf9e69e61d0a23def2470c84 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/679748203674073239d2e5a0f7f9da26bc60feb9 b/txscript/data/taproot-ref/679748203674073239d2e5a0f7f9da26bc60feb9 new file mode 100644 index 0000000000..ef8efec2d9 --- /dev/null +++ b/txscript/data/taproot-ref/679748203674073239d2e5a0f7f9da26bc60feb9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/67cfc5cf8010d9b1c152301eae06d149589112ba b/txscript/data/taproot-ref/67cfc5cf8010d9b1c152301eae06d149589112ba new file mode 100644 index 0000000000..d0e5f9ca08 --- /dev/null +++ b/txscript/data/taproot-ref/67cfc5cf8010d9b1c152301eae06d149589112ba @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/67f26334e58a0356529496d89738359b7a8dd136 b/txscript/data/taproot-ref/67f26334e58a0356529496d89738359b7a8dd136 new file mode 100644 index 0000000000..d6651d3cda --- /dev/null +++ b/txscript/data/taproot-ref/67f26334e58a0356529496d89738359b7a8dd136 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/68052b4483af39b51b45980874124e3793c72420 b/txscript/data/taproot-ref/68052b4483af39b51b45980874124e3793c72420 new file mode 100644 index 0000000000..5a6ae99e4b --- /dev/null +++ b/txscript/data/taproot-ref/68052b4483af39b51b45980874124e3793c72420 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/680f37fd69b7d65b2bea1f6968d0d19d60d93bb6 b/txscript/data/taproot-ref/680f37fd69b7d65b2bea1f6968d0d19d60d93bb6 new file mode 100644 index 0000000000..839a0d3aa5 --- /dev/null +++ b/txscript/data/taproot-ref/680f37fd69b7d65b2bea1f6968d0d19d60d93bb6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/682b9ef29382e2d77b5242e0860693527c825702 b/txscript/data/taproot-ref/682b9ef29382e2d77b5242e0860693527c825702 new file mode 100644 index 0000000000..ec68f31d63 --- /dev/null +++ b/txscript/data/taproot-ref/682b9ef29382e2d77b5242e0860693527c825702 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/68560332b36281ab2ef6e177361019a087666119 b/txscript/data/taproot-ref/68560332b36281ab2ef6e177361019a087666119 new file mode 100644 index 0000000000..10743cdd27 --- /dev/null +++ b/txscript/data/taproot-ref/68560332b36281ab2ef6e177361019a087666119 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/685bad2808b9ebb6dd3bebf554aba2916e169a21 b/txscript/data/taproot-ref/685bad2808b9ebb6dd3bebf554aba2916e169a21 new file mode 100644 index 0000000000..b62fdb5b22 --- /dev/null +++ b/txscript/data/taproot-ref/685bad2808b9ebb6dd3bebf554aba2916e169a21 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/685c94cdfdc42c71493f0fbf86f6cc75a2bfe7f5 b/txscript/data/taproot-ref/685c94cdfdc42c71493f0fbf86f6cc75a2bfe7f5 new file mode 100644 index 0000000000..da7e77ac11 --- /dev/null +++ b/txscript/data/taproot-ref/685c94cdfdc42c71493f0fbf86f6cc75a2bfe7f5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6864a32b8e40345c0b76999afe5f1c070d474908 b/txscript/data/taproot-ref/6864a32b8e40345c0b76999afe5f1c070d474908 new file mode 100644 index 0000000000..5659876d09 --- /dev/null +++ b/txscript/data/taproot-ref/6864a32b8e40345c0b76999afe5f1c070d474908 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6864d1927bc63a92a60460a41b2a104d48d49e0a b/txscript/data/taproot-ref/6864d1927bc63a92a60460a41b2a104d48d49e0a new file mode 100644 index 0000000000..d9e301cd74 --- /dev/null +++ b/txscript/data/taproot-ref/6864d1927bc63a92a60460a41b2a104d48d49e0a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/687590a8d9eb9f62d77022572d103d4c5adc9867 b/txscript/data/taproot-ref/687590a8d9eb9f62d77022572d103d4c5adc9867 new file mode 100644 index 0000000000..3a2b29449f --- /dev/null +++ b/txscript/data/taproot-ref/687590a8d9eb9f62d77022572d103d4c5adc9867 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/687648741dc59ceab592c14d35fa96ac27ef98d1 b/txscript/data/taproot-ref/687648741dc59ceab592c14d35fa96ac27ef98d1 new file mode 100644 index 0000000000..1749d6d0fd --- /dev/null +++ b/txscript/data/taproot-ref/687648741dc59ceab592c14d35fa96ac27ef98d1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6890f89ae85a96d458a2e92ae84db78ff5a3d8e4 b/txscript/data/taproot-ref/6890f89ae85a96d458a2e92ae84db78ff5a3d8e4 new file mode 100644 index 0000000000..3ad3da7344 --- /dev/null +++ b/txscript/data/taproot-ref/6890f89ae85a96d458a2e92ae84db78ff5a3d8e4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6893c34edde19b9be594417a3321f7522c83713a b/txscript/data/taproot-ref/6893c34edde19b9be594417a3321f7522c83713a new file mode 100644 index 0000000000..f1ca122a06 --- /dev/null +++ b/txscript/data/taproot-ref/6893c34edde19b9be594417a3321f7522c83713a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/68ae4d6748f33706497031526da5fa76f0c923a1 b/txscript/data/taproot-ref/68ae4d6748f33706497031526da5fa76f0c923a1 new file mode 100644 index 0000000000..ed60de8803 --- /dev/null +++ b/txscript/data/taproot-ref/68ae4d6748f33706497031526da5fa76f0c923a1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/68b62ec5b8680759a52e8934526dbf400162c104 b/txscript/data/taproot-ref/68b62ec5b8680759a52e8934526dbf400162c104 new file mode 100644 index 0000000000..431c5cc248 --- /dev/null +++ b/txscript/data/taproot-ref/68b62ec5b8680759a52e8934526dbf400162c104 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/68c6c0d42504385245c61282657b3afb267a068a b/txscript/data/taproot-ref/68c6c0d42504385245c61282657b3afb267a068a new file mode 100644 index 0000000000..1b16d382a8 --- /dev/null +++ b/txscript/data/taproot-ref/68c6c0d42504385245c61282657b3afb267a068a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/68ebe4901e5b73c0d6c376b14ab93cb27b6b9b29 b/txscript/data/taproot-ref/68ebe4901e5b73c0d6c376b14ab93cb27b6b9b29 new file mode 100644 index 0000000000..1b06240cf0 --- /dev/null +++ b/txscript/data/taproot-ref/68ebe4901e5b73c0d6c376b14ab93cb27b6b9b29 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/68f2022142d8ce6c1188c67a635ce455d70e8668 b/txscript/data/taproot-ref/68f2022142d8ce6c1188c67a635ce455d70e8668 new file mode 100644 index 0000000000..c20811ca0f --- /dev/null +++ b/txscript/data/taproot-ref/68f2022142d8ce6c1188c67a635ce455d70e8668 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/68f3ade32553e6641d33ffec7c4bbbe70c966a75 b/txscript/data/taproot-ref/68f3ade32553e6641d33ffec7c4bbbe70c966a75 new file mode 100644 index 0000000000..9e700dc34d --- /dev/null +++ b/txscript/data/taproot-ref/68f3ade32553e6641d33ffec7c4bbbe70c966a75 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/692178574c30ecc0fe297e53225c7fe6b7047923 b/txscript/data/taproot-ref/692178574c30ecc0fe297e53225c7fe6b7047923 new file mode 100644 index 0000000000..4c95ed4d07 --- /dev/null +++ b/txscript/data/taproot-ref/692178574c30ecc0fe297e53225c7fe6b7047923 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/692a5e26fd84eb7c487336a8ad5a27bbf550d3e5 b/txscript/data/taproot-ref/692a5e26fd84eb7c487336a8ad5a27bbf550d3e5 new file mode 100644 index 0000000000..2aeac14b1f --- /dev/null +++ b/txscript/data/taproot-ref/692a5e26fd84eb7c487336a8ad5a27bbf550d3e5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/693b4e80b442d5871a480b72fc7f154489eada7b b/txscript/data/taproot-ref/693b4e80b442d5871a480b72fc7f154489eada7b new file mode 100644 index 0000000000..70051d8a6e --- /dev/null +++ b/txscript/data/taproot-ref/693b4e80b442d5871a480b72fc7f154489eada7b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/693f1072f030299b192b97d19cba8ff9e045ceba b/txscript/data/taproot-ref/693f1072f030299b192b97d19cba8ff9e045ceba new file mode 100644 index 0000000000..83ce6a336e --- /dev/null +++ b/txscript/data/taproot-ref/693f1072f030299b192b97d19cba8ff9e045ceba @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/696eb3cf37f866313a3dbf40b4af77d45f827d98 b/txscript/data/taproot-ref/696eb3cf37f866313a3dbf40b4af77d45f827d98 new file mode 100644 index 0000000000..f074342ccd --- /dev/null +++ b/txscript/data/taproot-ref/696eb3cf37f866313a3dbf40b4af77d45f827d98 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/69763ca3d19be4c3d360ac96f990730c211450f4 b/txscript/data/taproot-ref/69763ca3d19be4c3d360ac96f990730c211450f4 new file mode 100644 index 0000000000..ba198cb03d --- /dev/null +++ b/txscript/data/taproot-ref/69763ca3d19be4c3d360ac96f990730c211450f4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6977dc4cb03457ddcfe3fb5e4ebd32c7a60a4f4e b/txscript/data/taproot-ref/6977dc4cb03457ddcfe3fb5e4ebd32c7a60a4f4e new file mode 100644 index 0000000000..6ad45c6eae --- /dev/null +++ b/txscript/data/taproot-ref/6977dc4cb03457ddcfe3fb5e4ebd32c7a60a4f4e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/697a7f07151aad714b88aad13a439841eb1d849b b/txscript/data/taproot-ref/697a7f07151aad714b88aad13a439841eb1d849b new file mode 100644 index 0000000000..b426e57f73 --- /dev/null +++ b/txscript/data/taproot-ref/697a7f07151aad714b88aad13a439841eb1d849b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/69c1c268224ffcce5d6dc13b49962a3c8887c2ba b/txscript/data/taproot-ref/69c1c268224ffcce5d6dc13b49962a3c8887c2ba new file mode 100644 index 0000000000..c78bf0b8af --- /dev/null +++ b/txscript/data/taproot-ref/69c1c268224ffcce5d6dc13b49962a3c8887c2ba @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/69d24f5639ca8a5eaf58924722cc313b9936c330 b/txscript/data/taproot-ref/69d24f5639ca8a5eaf58924722cc313b9936c330 new file mode 100644 index 0000000000..85271df79f --- /dev/null +++ b/txscript/data/taproot-ref/69d24f5639ca8a5eaf58924722cc313b9936c330 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/69f36a1e1c567e1d5e44edc58c355abb92e23f68 b/txscript/data/taproot-ref/69f36a1e1c567e1d5e44edc58c355abb92e23f68 new file mode 100644 index 0000000000..45e714fe77 --- /dev/null +++ b/txscript/data/taproot-ref/69f36a1e1c567e1d5e44edc58c355abb92e23f68 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6a35130e1e9674f6d1c241fd478fe85332fbdbb1 b/txscript/data/taproot-ref/6a35130e1e9674f6d1c241fd478fe85332fbdbb1 new file mode 100644 index 0000000000..d4a07492b1 --- /dev/null +++ b/txscript/data/taproot-ref/6a35130e1e9674f6d1c241fd478fe85332fbdbb1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6a37620db708370995281cf6c46512cd60efeda8 b/txscript/data/taproot-ref/6a37620db708370995281cf6c46512cd60efeda8 new file mode 100644 index 0000000000..1e70d29d15 --- /dev/null +++ b/txscript/data/taproot-ref/6a37620db708370995281cf6c46512cd60efeda8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6a8e8effd233033afabfdaf9d971d772b2bf9ecd b/txscript/data/taproot-ref/6a8e8effd233033afabfdaf9d971d772b2bf9ecd new file mode 100644 index 0000000000..c69cc25dd5 --- /dev/null +++ b/txscript/data/taproot-ref/6a8e8effd233033afabfdaf9d971d772b2bf9ecd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6abb0ece7e16ec849987f8c8acf3aee7013ec5de b/txscript/data/taproot-ref/6abb0ece7e16ec849987f8c8acf3aee7013ec5de new file mode 100644 index 0000000000..4b887cd600 --- /dev/null +++ b/txscript/data/taproot-ref/6abb0ece7e16ec849987f8c8acf3aee7013ec5de @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/6addba1d7123769bf9727a6a4106110126f36086 b/txscript/data/taproot-ref/6addba1d7123769bf9727a6a4106110126f36086 new file mode 100644 index 0000000000..3bfb7cf09a --- /dev/null +++ b/txscript/data/taproot-ref/6addba1d7123769bf9727a6a4106110126f36086 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6aff050ffc62f58100aca0e5b1839f097fe65155 b/txscript/data/taproot-ref/6aff050ffc62f58100aca0e5b1839f097fe65155 new file mode 100644 index 0000000000..f74cc021ab --- /dev/null +++ b/txscript/data/taproot-ref/6aff050ffc62f58100aca0e5b1839f097fe65155 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6aff0519662314531494b8b3319e2768ebd40a35 b/txscript/data/taproot-ref/6aff0519662314531494b8b3319e2768ebd40a35 new file mode 100644 index 0000000000..6869586d9f --- /dev/null +++ b/txscript/data/taproot-ref/6aff0519662314531494b8b3319e2768ebd40a35 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6b14353e2b7d7788062623a8ab274c36f8e8bf3b b/txscript/data/taproot-ref/6b14353e2b7d7788062623a8ab274c36f8e8bf3b new file mode 100644 index 0000000000..54f4ce8558 --- /dev/null +++ b/txscript/data/taproot-ref/6b14353e2b7d7788062623a8ab274c36f8e8bf3b @@ -0,0 +1 @@ +{"tx": "0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca9000000009dff9cf2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8e0000000003edc09f0396a2ae00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914719f78084af863e000acd618ba76df9797223689872927853a", "prevouts": ["872f5600000000002260202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "759c5a00000000002251204c67bfe7b8ea24990d5c0ded805d67c336776f2a51059014263e3e0b5e292bd1"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["5edb9a0c74e702190efa0d08a6efde6df53a84ca9ddce445816b6240e779519091725c66624cdb8d7186ec31dcef6a5fa4f81e7cc1318d959d333c1a90ae40a1", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/6b611309b991acee95b55b4b19539f65ceccf76b b/txscript/data/taproot-ref/6b611309b991acee95b55b4b19539f65ceccf76b new file mode 100644 index 0000000000..f39738ed2b --- /dev/null +++ b/txscript/data/taproot-ref/6b611309b991acee95b55b4b19539f65ceccf76b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6b861044122a6b081803e3a99f47b40277743d06 b/txscript/data/taproot-ref/6b861044122a6b081803e3a99f47b40277743d06 new file mode 100644 index 0000000000..f5012f5f52 --- /dev/null +++ b/txscript/data/taproot-ref/6b861044122a6b081803e3a99f47b40277743d06 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6b8790739dcd1f8d3ef41a03c6508717d78feb52 b/txscript/data/taproot-ref/6b8790739dcd1f8d3ef41a03c6508717d78feb52 new file mode 100644 index 0000000000..92888194eb --- /dev/null +++ b/txscript/data/taproot-ref/6b8790739dcd1f8d3ef41a03c6508717d78feb52 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6ba407f0a422507bed18c1d5b52f1f550c278fcb b/txscript/data/taproot-ref/6ba407f0a422507bed18c1d5b52f1f550c278fcb new file mode 100644 index 0000000000..622e7849da --- /dev/null +++ b/txscript/data/taproot-ref/6ba407f0a422507bed18c1d5b52f1f550c278fcb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6bc93c9d2144506aeb9dbbe41a5b4a095f8fe9cb b/txscript/data/taproot-ref/6bc93c9d2144506aeb9dbbe41a5b4a095f8fe9cb new file mode 100644 index 0000000000..43a0bc1f65 --- /dev/null +++ b/txscript/data/taproot-ref/6bc93c9d2144506aeb9dbbe41a5b4a095f8fe9cb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6bde125fedeb05208eb8991bab6ad0713a60d9e4 b/txscript/data/taproot-ref/6bde125fedeb05208eb8991bab6ad0713a60d9e4 new file mode 100644 index 0000000000..9753aed16c --- /dev/null +++ b/txscript/data/taproot-ref/6bde125fedeb05208eb8991bab6ad0713a60d9e4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6be0d8042ea3f474de849bc8205c65b017a3d587 b/txscript/data/taproot-ref/6be0d8042ea3f474de849bc8205c65b017a3d587 new file mode 100644 index 0000000000..ababc08b2c --- /dev/null +++ b/txscript/data/taproot-ref/6be0d8042ea3f474de849bc8205c65b017a3d587 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6c1bef32f6ca0cfaee1705746902336e4fd67e96 b/txscript/data/taproot-ref/6c1bef32f6ca0cfaee1705746902336e4fd67e96 new file mode 100644 index 0000000000..ca6f223d12 --- /dev/null +++ b/txscript/data/taproot-ref/6c1bef32f6ca0cfaee1705746902336e4fd67e96 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6c3db2c6ab0b6b80838387b923869561f9e1cf11 b/txscript/data/taproot-ref/6c3db2c6ab0b6b80838387b923869561f9e1cf11 new file mode 100644 index 0000000000..a64a953498 --- /dev/null +++ b/txscript/data/taproot-ref/6c3db2c6ab0b6b80838387b923869561f9e1cf11 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6c7e6cdda9913347f0ba8eed8f914941cec5b2c1 b/txscript/data/taproot-ref/6c7e6cdda9913347f0ba8eed8f914941cec5b2c1 new file mode 100644 index 0000000000..db6538f5c0 --- /dev/null +++ b/txscript/data/taproot-ref/6c7e6cdda9913347f0ba8eed8f914941cec5b2c1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6c8a1b2ea553e6dfa5f653afeeb135465732aa6e b/txscript/data/taproot-ref/6c8a1b2ea553e6dfa5f653afeeb135465732aa6e new file mode 100644 index 0000000000..e1a2eed239 --- /dev/null +++ b/txscript/data/taproot-ref/6c8a1b2ea553e6dfa5f653afeeb135465732aa6e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6c8acc451d0c73e74ad6918585d0c8776498affd b/txscript/data/taproot-ref/6c8acc451d0c73e74ad6918585d0c8776498affd new file mode 100644 index 0000000000..f0fdd2575b --- /dev/null +++ b/txscript/data/taproot-ref/6c8acc451d0c73e74ad6918585d0c8776498affd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6ca4ca112dc6f3b82a4ee1dcb539f5412b61802e b/txscript/data/taproot-ref/6ca4ca112dc6f3b82a4ee1dcb539f5412b61802e new file mode 100644 index 0000000000..9582dd5207 --- /dev/null +++ b/txscript/data/taproot-ref/6ca4ca112dc6f3b82a4ee1dcb539f5412b61802e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6ca7072324326a43f42b641dd4cc2d785bfbb7d6 b/txscript/data/taproot-ref/6ca7072324326a43f42b641dd4cc2d785bfbb7d6 new file mode 100644 index 0000000000..9dc4fd311a --- /dev/null +++ b/txscript/data/taproot-ref/6ca7072324326a43f42b641dd4cc2d785bfbb7d6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6cbefe4b22649c02c818e52d3142c768ae99b9eb b/txscript/data/taproot-ref/6cbefe4b22649c02c818e52d3142c768ae99b9eb new file mode 100644 index 0000000000..b16cb276af --- /dev/null +++ b/txscript/data/taproot-ref/6cbefe4b22649c02c818e52d3142c768ae99b9eb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6cdb87bebca9057c621affd2eddfbe726630b1c6 b/txscript/data/taproot-ref/6cdb87bebca9057c621affd2eddfbe726630b1c6 new file mode 100644 index 0000000000..7dff22543a --- /dev/null +++ b/txscript/data/taproot-ref/6cdb87bebca9057c621affd2eddfbe726630b1c6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6ceffd0098b1fadf6f95341e39b6b1486b6e2dab b/txscript/data/taproot-ref/6ceffd0098b1fadf6f95341e39b6b1486b6e2dab new file mode 100644 index 0000000000..074786edf4 --- /dev/null +++ b/txscript/data/taproot-ref/6ceffd0098b1fadf6f95341e39b6b1486b6e2dab @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6d1ad01f9d4765e28554608aaaaf7f86d7fee48a b/txscript/data/taproot-ref/6d1ad01f9d4765e28554608aaaaf7f86d7fee48a new file mode 100644 index 0000000000..c5ff533a99 --- /dev/null +++ b/txscript/data/taproot-ref/6d1ad01f9d4765e28554608aaaaf7f86d7fee48a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6d2c53b612c9e3931c251808123e215918c34b60 b/txscript/data/taproot-ref/6d2c53b612c9e3931c251808123e215918c34b60 new file mode 100644 index 0000000000..14c876474a --- /dev/null +++ b/txscript/data/taproot-ref/6d2c53b612c9e3931c251808123e215918c34b60 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6d6cb592531f25b7c0a1a607342e2c3dcf35ac1f b/txscript/data/taproot-ref/6d6cb592531f25b7c0a1a607342e2c3dcf35ac1f new file mode 100644 index 0000000000..d5210518b0 --- /dev/null +++ b/txscript/data/taproot-ref/6d6cb592531f25b7c0a1a607342e2c3dcf35ac1f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6d776b8dcea06b627feb06e8e07e6455f48086d2 b/txscript/data/taproot-ref/6d776b8dcea06b627feb06e8e07e6455f48086d2 new file mode 100644 index 0000000000..2496cecc08 --- /dev/null +++ b/txscript/data/taproot-ref/6d776b8dcea06b627feb06e8e07e6455f48086d2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6d807824d43b2e677fee210fcdda1e52cabbbbc5 b/txscript/data/taproot-ref/6d807824d43b2e677fee210fcdda1e52cabbbbc5 new file mode 100644 index 0000000000..ac5f832253 --- /dev/null +++ b/txscript/data/taproot-ref/6d807824d43b2e677fee210fcdda1e52cabbbbc5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6d874714ddd3706018c9051c55abbcf1210b4643 b/txscript/data/taproot-ref/6d874714ddd3706018c9051c55abbcf1210b4643 new file mode 100644 index 0000000000..f5f4df5833 --- /dev/null +++ b/txscript/data/taproot-ref/6d874714ddd3706018c9051c55abbcf1210b4643 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6d9b8efdf33eb396820e03892263d3b784e5dcf5 b/txscript/data/taproot-ref/6d9b8efdf33eb396820e03892263d3b784e5dcf5 new file mode 100644 index 0000000000..2fb75a2412 --- /dev/null +++ b/txscript/data/taproot-ref/6d9b8efdf33eb396820e03892263d3b784e5dcf5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6de00eee762e4ed839eb40fe1f0e25de0071e584 b/txscript/data/taproot-ref/6de00eee762e4ed839eb40fe1f0e25de0071e584 new file mode 100644 index 0000000000..fef46a4f34 --- /dev/null +++ b/txscript/data/taproot-ref/6de00eee762e4ed839eb40fe1f0e25de0071e584 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6e0058983c03e5e6a363e64deb28a252b20617c1 b/txscript/data/taproot-ref/6e0058983c03e5e6a363e64deb28a252b20617c1 new file mode 100644 index 0000000000..c54ff09ec9 --- /dev/null +++ b/txscript/data/taproot-ref/6e0058983c03e5e6a363e64deb28a252b20617c1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6e20107c698b7f36b9163a7db7382e068caca218 b/txscript/data/taproot-ref/6e20107c698b7f36b9163a7db7382e068caca218 new file mode 100644 index 0000000000..1087b0f436 --- /dev/null +++ b/txscript/data/taproot-ref/6e20107c698b7f36b9163a7db7382e068caca218 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6e41239fdb2bae4970f0a9787e683e94dcfb1760 b/txscript/data/taproot-ref/6e41239fdb2bae4970f0a9787e683e94dcfb1760 new file mode 100644 index 0000000000..76a7d10bb7 --- /dev/null +++ b/txscript/data/taproot-ref/6e41239fdb2bae4970f0a9787e683e94dcfb1760 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6e59dc43f59b064311d89a689dd58f9a905d10e3 b/txscript/data/taproot-ref/6e59dc43f59b064311d89a689dd58f9a905d10e3 new file mode 100644 index 0000000000..2d18e2d0da --- /dev/null +++ b/txscript/data/taproot-ref/6e59dc43f59b064311d89a689dd58f9a905d10e3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6e85ec4ec7f9980d8de6d6892d1415072155eb5f b/txscript/data/taproot-ref/6e85ec4ec7f9980d8de6d6892d1415072155eb5f new file mode 100644 index 0000000000..1d756f0a7e --- /dev/null +++ b/txscript/data/taproot-ref/6e85ec4ec7f9980d8de6d6892d1415072155eb5f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6e99af85369d8643f1c91d6e46c038af402d368c b/txscript/data/taproot-ref/6e99af85369d8643f1c91d6e46c038af402d368c new file mode 100644 index 0000000000..6cc08b300e --- /dev/null +++ b/txscript/data/taproot-ref/6e99af85369d8643f1c91d6e46c038af402d368c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6eb985be69c6686dbcfaa0cfeba04cbc68dd5298 b/txscript/data/taproot-ref/6eb985be69c6686dbcfaa0cfeba04cbc68dd5298 new file mode 100644 index 0000000000..4cc11b36ff --- /dev/null +++ b/txscript/data/taproot-ref/6eb985be69c6686dbcfaa0cfeba04cbc68dd5298 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6f3e92cd7c0bd1c759a5d1ec589fa593028c2f27 b/txscript/data/taproot-ref/6f3e92cd7c0bd1c759a5d1ec589fa593028c2f27 new file mode 100644 index 0000000000..dac3ca09f8 --- /dev/null +++ b/txscript/data/taproot-ref/6f3e92cd7c0bd1c759a5d1ec589fa593028c2f27 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6f52449eba2cea1fa19799e7de8f931e69c70cdb b/txscript/data/taproot-ref/6f52449eba2cea1fa19799e7de8f931e69c70cdb new file mode 100644 index 0000000000..b95be97e27 --- /dev/null +++ b/txscript/data/taproot-ref/6f52449eba2cea1fa19799e7de8f931e69c70cdb @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/6f56fca6cc1c01fee921e3ebec30d918b7e84af1 b/txscript/data/taproot-ref/6f56fca6cc1c01fee921e3ebec30d918b7e84af1 new file mode 100644 index 0000000000..1c6651a76d --- /dev/null +++ b/txscript/data/taproot-ref/6f56fca6cc1c01fee921e3ebec30d918b7e84af1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6f6d754696a56d367c058bd6cef710ac92a36c4d b/txscript/data/taproot-ref/6f6d754696a56d367c058bd6cef710ac92a36c4d new file mode 100644 index 0000000000..06b66bf342 --- /dev/null +++ b/txscript/data/taproot-ref/6f6d754696a56d367c058bd6cef710ac92a36c4d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6f7390dad86b309a8464acc781b7a22cdc6164de b/txscript/data/taproot-ref/6f7390dad86b309a8464acc781b7a22cdc6164de new file mode 100644 index 0000000000..4f1407d77b --- /dev/null +++ b/txscript/data/taproot-ref/6f7390dad86b309a8464acc781b7a22cdc6164de @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6f775290762b949c8416b8db72a80fd4f625aeeb b/txscript/data/taproot-ref/6f775290762b949c8416b8db72a80fd4f625aeeb new file mode 100644 index 0000000000..20a1329617 --- /dev/null +++ b/txscript/data/taproot-ref/6f775290762b949c8416b8db72a80fd4f625aeeb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6f8393bbb9d02857705efc61028b43ee819ae6ef b/txscript/data/taproot-ref/6f8393bbb9d02857705efc61028b43ee819ae6ef new file mode 100644 index 0000000000..b6b1647018 --- /dev/null +++ b/txscript/data/taproot-ref/6f8393bbb9d02857705efc61028b43ee819ae6ef @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6f8e2a9cd5725921d637323d42b65faaa53b2d0c b/txscript/data/taproot-ref/6f8e2a9cd5725921d637323d42b65faaa53b2d0c new file mode 100644 index 0000000000..f1a46cb1fa --- /dev/null +++ b/txscript/data/taproot-ref/6f8e2a9cd5725921d637323d42b65faaa53b2d0c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6f9c6ccc8504bc417cff64152e5d55f2da6384f6 b/txscript/data/taproot-ref/6f9c6ccc8504bc417cff64152e5d55f2da6384f6 new file mode 100644 index 0000000000..f89407ffc3 --- /dev/null +++ b/txscript/data/taproot-ref/6f9c6ccc8504bc417cff64152e5d55f2da6384f6 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/6fae620fa980b4c2193b8d1ca489fecb771da643 b/txscript/data/taproot-ref/6fae620fa980b4c2193b8d1ca489fecb771da643 new file mode 100644 index 0000000000..0949ec2ac1 --- /dev/null +++ b/txscript/data/taproot-ref/6fae620fa980b4c2193b8d1ca489fecb771da643 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6fd7c011c1e087678c2fc502f6049d5a1610b285 b/txscript/data/taproot-ref/6fd7c011c1e087678c2fc502f6049d5a1610b285 new file mode 100644 index 0000000000..ed7bb551d6 --- /dev/null +++ b/txscript/data/taproot-ref/6fd7c011c1e087678c2fc502f6049d5a1610b285 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6fda74aa278e18be569d89d76d2b7d189719fc9b b/txscript/data/taproot-ref/6fda74aa278e18be569d89d76d2b7d189719fc9b new file mode 100644 index 0000000000..e156647fe3 --- /dev/null +++ b/txscript/data/taproot-ref/6fda74aa278e18be569d89d76d2b7d189719fc9b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6fe4cc6bb00f0db22fe4cf7e68170752bf9e1f7d b/txscript/data/taproot-ref/6fe4cc6bb00f0db22fe4cf7e68170752bf9e1f7d new file mode 100644 index 0000000000..83fe5ed885 --- /dev/null +++ b/txscript/data/taproot-ref/6fe4cc6bb00f0db22fe4cf7e68170752bf9e1f7d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6ff3146da9ac0acb6f0c208976dc39290b684b16 b/txscript/data/taproot-ref/6ff3146da9ac0acb6f0c208976dc39290b684b16 new file mode 100644 index 0000000000..459e15670d --- /dev/null +++ b/txscript/data/taproot-ref/6ff3146da9ac0acb6f0c208976dc39290b684b16 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/6ffb4a945d04f8b031049d6b6fa49f15f19568e5 b/txscript/data/taproot-ref/6ffb4a945d04f8b031049d6b6fa49f15f19568e5 new file mode 100644 index 0000000000..97b6a255f1 --- /dev/null +++ b/txscript/data/taproot-ref/6ffb4a945d04f8b031049d6b6fa49f15f19568e5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/70103c6bfa6033fc750d73a791d50375a1b86fea b/txscript/data/taproot-ref/70103c6bfa6033fc750d73a791d50375a1b86fea new file mode 100644 index 0000000000..ab95a1b2e4 --- /dev/null +++ b/txscript/data/taproot-ref/70103c6bfa6033fc750d73a791d50375a1b86fea @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/70294d4a0a0438dea998f982369933dacc66aacd b/txscript/data/taproot-ref/70294d4a0a0438dea998f982369933dacc66aacd new file mode 100644 index 0000000000..3ddb130aef --- /dev/null +++ b/txscript/data/taproot-ref/70294d4a0a0438dea998f982369933dacc66aacd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/708f0996354e7df20b2aef4b10bc9586dcaa5db0 b/txscript/data/taproot-ref/708f0996354e7df20b2aef4b10bc9586dcaa5db0 new file mode 100644 index 0000000000..55230d8920 --- /dev/null +++ b/txscript/data/taproot-ref/708f0996354e7df20b2aef4b10bc9586dcaa5db0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/70c7802de56e11939701cba269f74c5c54434e61 b/txscript/data/taproot-ref/70c7802de56e11939701cba269f74c5c54434e61 new file mode 100644 index 0000000000..a76b046575 --- /dev/null +++ b/txscript/data/taproot-ref/70c7802de56e11939701cba269f74c5c54434e61 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/70cd3f4760a280eac2806e6373034a5e750cb013 b/txscript/data/taproot-ref/70cd3f4760a280eac2806e6373034a5e750cb013 new file mode 100644 index 0000000000..bd14e3346b --- /dev/null +++ b/txscript/data/taproot-ref/70cd3f4760a280eac2806e6373034a5e750cb013 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/70e123fe2099ae69883a84234ee7d2c67ffae902 b/txscript/data/taproot-ref/70e123fe2099ae69883a84234ee7d2c67ffae902 new file mode 100644 index 0000000000..ecb83e3c60 --- /dev/null +++ b/txscript/data/taproot-ref/70e123fe2099ae69883a84234ee7d2c67ffae902 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/70f98e7683065de833f78e968b12a17560c6d145 b/txscript/data/taproot-ref/70f98e7683065de833f78e968b12a17560c6d145 new file mode 100644 index 0000000000..cda9e56c7c --- /dev/null +++ b/txscript/data/taproot-ref/70f98e7683065de833f78e968b12a17560c6d145 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7125c24e3079aa7ecd8a075096657aa41cbf32aa b/txscript/data/taproot-ref/7125c24e3079aa7ecd8a075096657aa41cbf32aa new file mode 100644 index 0000000000..97b926ffcc --- /dev/null +++ b/txscript/data/taproot-ref/7125c24e3079aa7ecd8a075096657aa41cbf32aa @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/712c593d655c49212ff38704eff4d5d68d14506d b/txscript/data/taproot-ref/712c593d655c49212ff38704eff4d5d68d14506d new file mode 100644 index 0000000000..b9158cc2e9 --- /dev/null +++ b/txscript/data/taproot-ref/712c593d655c49212ff38704eff4d5d68d14506d @@ -0,0 +1 @@ +{"tx": "01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4460000000086c6650edceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc500000000f5bf2afe03cdd85f00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac3de12d2f", "prevouts": ["c9003a000000000022512009aaafe5c25742bc31707a3d3e67825093b9287fcffecedf6a81328faea09126", "c668270000000000165f142540f27e90740933c99d4f17ab2dfc6c82951cfb"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["71eefcdb8d2379aa4114d1652ff5b26ff9e9837a357afe394faff811594b984a68cfccc007366d1849ce7ea39f0378e7103d955f117853687334736851d75c37"]}}, diff --git a/txscript/data/taproot-ref/713565a78c4f0eefe92a042e831427511dd4f5b9 b/txscript/data/taproot-ref/713565a78c4f0eefe92a042e831427511dd4f5b9 new file mode 100644 index 0000000000..de4957cc6c --- /dev/null +++ b/txscript/data/taproot-ref/713565a78c4f0eefe92a042e831427511dd4f5b9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/715cf3f1edec8508d34687cba9eb9735c4113fc8 b/txscript/data/taproot-ref/715cf3f1edec8508d34687cba9eb9735c4113fc8 new file mode 100644 index 0000000000..6274e18b8f --- /dev/null +++ b/txscript/data/taproot-ref/715cf3f1edec8508d34687cba9eb9735c4113fc8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/716e9a2309a2d14f0b54d759df166270321962ca b/txscript/data/taproot-ref/716e9a2309a2d14f0b54d759df166270321962ca new file mode 100644 index 0000000000..4f39e6ae2d --- /dev/null +++ b/txscript/data/taproot-ref/716e9a2309a2d14f0b54d759df166270321962ca @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/71807ffa82a2c8190651c69c857cb71bcb08e301 b/txscript/data/taproot-ref/71807ffa82a2c8190651c69c857cb71bcb08e301 new file mode 100644 index 0000000000..347207f434 --- /dev/null +++ b/txscript/data/taproot-ref/71807ffa82a2c8190651c69c857cb71bcb08e301 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/71a2de6544779c774612b1f87277375ae9792a62 b/txscript/data/taproot-ref/71a2de6544779c774612b1f87277375ae9792a62 new file mode 100644 index 0000000000..f03a7f00a8 --- /dev/null +++ b/txscript/data/taproot-ref/71a2de6544779c774612b1f87277375ae9792a62 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/71d2976410e52b3891d47b0bf5daf36223655072 b/txscript/data/taproot-ref/71d2976410e52b3891d47b0bf5daf36223655072 new file mode 100644 index 0000000000..9405ce88bf --- /dev/null +++ b/txscript/data/taproot-ref/71d2976410e52b3891d47b0bf5daf36223655072 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/71d3d5be815413f81a15e1f21d82fa46ce4eeab9 b/txscript/data/taproot-ref/71d3d5be815413f81a15e1f21d82fa46ce4eeab9 new file mode 100644 index 0000000000..e5fac92912 --- /dev/null +++ b/txscript/data/taproot-ref/71d3d5be815413f81a15e1f21d82fa46ce4eeab9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/71ea7e6e573f89e2a23138bfbd547d888bdb7c55 b/txscript/data/taproot-ref/71ea7e6e573f89e2a23138bfbd547d888bdb7c55 new file mode 100644 index 0000000000..eda3a1c2af --- /dev/null +++ b/txscript/data/taproot-ref/71ea7e6e573f89e2a23138bfbd547d888bdb7c55 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/71f13e97734a6166d08d71982621f3785ea5ae3d b/txscript/data/taproot-ref/71f13e97734a6166d08d71982621f3785ea5ae3d new file mode 100644 index 0000000000..842861294e --- /dev/null +++ b/txscript/data/taproot-ref/71f13e97734a6166d08d71982621f3785ea5ae3d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7217d80b5053a43d6fb6822470d12e76b42b2764 b/txscript/data/taproot-ref/7217d80b5053a43d6fb6822470d12e76b42b2764 new file mode 100644 index 0000000000..8f297b5d9e --- /dev/null +++ b/txscript/data/taproot-ref/7217d80b5053a43d6fb6822470d12e76b42b2764 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7222bfdff7231c2aa5afe88a9b8860e057c947b7 b/txscript/data/taproot-ref/7222bfdff7231c2aa5afe88a9b8860e057c947b7 new file mode 100644 index 0000000000..0b86ab4a89 --- /dev/null +++ b/txscript/data/taproot-ref/7222bfdff7231c2aa5afe88a9b8860e057c947b7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/722914ef8c3dfacc1243877cf6bc0be5cc3eb6c2 b/txscript/data/taproot-ref/722914ef8c3dfacc1243877cf6bc0be5cc3eb6c2 new file mode 100644 index 0000000000..9651f7823f --- /dev/null +++ b/txscript/data/taproot-ref/722914ef8c3dfacc1243877cf6bc0be5cc3eb6c2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7275e47aff6a2c0f8bacb56d065aaba591e02a30 b/txscript/data/taproot-ref/7275e47aff6a2c0f8bacb56d065aaba591e02a30 new file mode 100644 index 0000000000..c438e634dc --- /dev/null +++ b/txscript/data/taproot-ref/7275e47aff6a2c0f8bacb56d065aaba591e02a30 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/72790cb9d6895411ac13e44b9be62c5cb05584e7 b/txscript/data/taproot-ref/72790cb9d6895411ac13e44b9be62c5cb05584e7 new file mode 100644 index 0000000000..00f3f2588f --- /dev/null +++ b/txscript/data/taproot-ref/72790cb9d6895411ac13e44b9be62c5cb05584e7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7282e73fa9d18fc99fa2f10c51211fe1079693fe b/txscript/data/taproot-ref/7282e73fa9d18fc99fa2f10c51211fe1079693fe new file mode 100644 index 0000000000..b459deec7b --- /dev/null +++ b/txscript/data/taproot-ref/7282e73fa9d18fc99fa2f10c51211fe1079693fe @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/72893e972bd42b8697f75e7ac80c8885bf7c3a45 b/txscript/data/taproot-ref/72893e972bd42b8697f75e7ac80c8885bf7c3a45 new file mode 100644 index 0000000000..1a45f4d4b6 --- /dev/null +++ b/txscript/data/taproot-ref/72893e972bd42b8697f75e7ac80c8885bf7c3a45 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/728c6175ed68889cfe3f359471f509fd1da1623a b/txscript/data/taproot-ref/728c6175ed68889cfe3f359471f509fd1da1623a new file mode 100644 index 0000000000..f99b438053 --- /dev/null +++ b/txscript/data/taproot-ref/728c6175ed68889cfe3f359471f509fd1da1623a @@ -0,0 +1 @@ +{"tx": "010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f8000000006d3588dc60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709300000000775f78d38bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45c01000000bf2c651d0114714500000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac1f010000", "prevouts": ["14030f00000000002359212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "0f160f0000000000225120639f61e583baa036c10ed0b3dae79674c76249899948b2504e8e1e0ca79edc96", "13d73e0000000000225120b5149551dc0241ae0d4420d11e06c98ebd87b9a952c2fc2c5fa7ce9cbc250e4b"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["aca3a5ded9f7d237520217cd24fefa492de0e6805413ebb39cc01b8f920819abce1996bb36eb2d4e73c88a9e82dbce2d459505aef6c35d81255e0b421387fb45"]}}, diff --git a/txscript/data/taproot-ref/729abe2b4cc9df53668a78ea8236ae421f3b5173 b/txscript/data/taproot-ref/729abe2b4cc9df53668a78ea8236ae421f3b5173 new file mode 100644 index 0000000000..776d904d3a --- /dev/null +++ b/txscript/data/taproot-ref/729abe2b4cc9df53668a78ea8236ae421f3b5173 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/729bc90d92d1235d6d3bc4c56bfc5a7cb1532e39 b/txscript/data/taproot-ref/729bc90d92d1235d6d3bc4c56bfc5a7cb1532e39 new file mode 100644 index 0000000000..d5e6fda38d --- /dev/null +++ b/txscript/data/taproot-ref/729bc90d92d1235d6d3bc4c56bfc5a7cb1532e39 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/72a19edf12311bc49d7e72f4ce0d25f68b5ba472 b/txscript/data/taproot-ref/72a19edf12311bc49d7e72f4ce0d25f68b5ba472 new file mode 100644 index 0000000000..db59dcc220 --- /dev/null +++ b/txscript/data/taproot-ref/72a19edf12311bc49d7e72f4ce0d25f68b5ba472 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/72b351e21f164a536ef913cda1b95716c0de23ce b/txscript/data/taproot-ref/72b351e21f164a536ef913cda1b95716c0de23ce new file mode 100644 index 0000000000..8df3b6d406 --- /dev/null +++ b/txscript/data/taproot-ref/72b351e21f164a536ef913cda1b95716c0de23ce @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/72b831f893332ad3733b0af04ea0e76cac65b5dc b/txscript/data/taproot-ref/72b831f893332ad3733b0af04ea0e76cac65b5dc new file mode 100644 index 0000000000..fb651beac7 --- /dev/null +++ b/txscript/data/taproot-ref/72b831f893332ad3733b0af04ea0e76cac65b5dc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/72bd024e4b285894458f234b460fcaf90e8445cb b/txscript/data/taproot-ref/72bd024e4b285894458f234b460fcaf90e8445cb new file mode 100644 index 0000000000..f69b95ee29 --- /dev/null +++ b/txscript/data/taproot-ref/72bd024e4b285894458f234b460fcaf90e8445cb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/72de723051c80828a6318b2251cdaf29db2600f1 b/txscript/data/taproot-ref/72de723051c80828a6318b2251cdaf29db2600f1 new file mode 100644 index 0000000000..60f0eb9e2c --- /dev/null +++ b/txscript/data/taproot-ref/72de723051c80828a6318b2251cdaf29db2600f1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/72e0280dc174679a75da3799cbb41ffe349f9f46 b/txscript/data/taproot-ref/72e0280dc174679a75da3799cbb41ffe349f9f46 new file mode 100644 index 0000000000..9d5c6bc4dc --- /dev/null +++ b/txscript/data/taproot-ref/72e0280dc174679a75da3799cbb41ffe349f9f46 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/72f423c06f55b024fcd60e3acd20f596205615ab b/txscript/data/taproot-ref/72f423c06f55b024fcd60e3acd20f596205615ab new file mode 100644 index 0000000000..370e607a33 --- /dev/null +++ b/txscript/data/taproot-ref/72f423c06f55b024fcd60e3acd20f596205615ab @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/73319dedec7db18100aca1acbdf582d38ed80c64 b/txscript/data/taproot-ref/73319dedec7db18100aca1acbdf582d38ed80c64 new file mode 100644 index 0000000000..616e5785b6 --- /dev/null +++ b/txscript/data/taproot-ref/73319dedec7db18100aca1acbdf582d38ed80c64 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/733a381bc9e56cec2e4a856413e56d0bb7972662 b/txscript/data/taproot-ref/733a381bc9e56cec2e4a856413e56d0bb7972662 new file mode 100644 index 0000000000..26011e7353 --- /dev/null +++ b/txscript/data/taproot-ref/733a381bc9e56cec2e4a856413e56d0bb7972662 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/734891576e6360feb0a79e5f6326f4a0f3310853 b/txscript/data/taproot-ref/734891576e6360feb0a79e5f6326f4a0f3310853 new file mode 100644 index 0000000000..1f6431c0c3 --- /dev/null +++ b/txscript/data/taproot-ref/734891576e6360feb0a79e5f6326f4a0f3310853 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/73617507f1dbe680e93caaef1d078ac92ad846ba b/txscript/data/taproot-ref/73617507f1dbe680e93caaef1d078ac92ad846ba new file mode 100644 index 0000000000..1d864eb333 --- /dev/null +++ b/txscript/data/taproot-ref/73617507f1dbe680e93caaef1d078ac92ad846ba @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/739b15f40bb87a9e4f1a8399ce654d068bd0d30b b/txscript/data/taproot-ref/739b15f40bb87a9e4f1a8399ce654d068bd0d30b new file mode 100644 index 0000000000..5aca0aea44 --- /dev/null +++ b/txscript/data/taproot-ref/739b15f40bb87a9e4f1a8399ce654d068bd0d30b @@ -0,0 +1 @@ +{"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": [""]}}, diff --git a/txscript/data/taproot-ref/739c724fbc1d946d981066a3f82cfb09a034ba1f b/txscript/data/taproot-ref/739c724fbc1d946d981066a3f82cfb09a034ba1f new file mode 100644 index 0000000000..08ec37a837 --- /dev/null +++ b/txscript/data/taproot-ref/739c724fbc1d946d981066a3f82cfb09a034ba1f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/73a2aaa511c3c79634f98183fed1aa515112c30c b/txscript/data/taproot-ref/73a2aaa511c3c79634f98183fed1aa515112c30c new file mode 100644 index 0000000000..90121b112e --- /dev/null +++ b/txscript/data/taproot-ref/73a2aaa511c3c79634f98183fed1aa515112c30c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/73ee1a7d0acd1f7e6a29e2cc9de52adf757c34f3 b/txscript/data/taproot-ref/73ee1a7d0acd1f7e6a29e2cc9de52adf757c34f3 new file mode 100644 index 0000000000..e7ffdfb358 --- /dev/null +++ b/txscript/data/taproot-ref/73ee1a7d0acd1f7e6a29e2cc9de52adf757c34f3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/74033d1959e62921897648eae99b7576a518dcbb b/txscript/data/taproot-ref/74033d1959e62921897648eae99b7576a518dcbb new file mode 100644 index 0000000000..d6889b6b23 --- /dev/null +++ b/txscript/data/taproot-ref/74033d1959e62921897648eae99b7576a518dcbb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/74068e2edea30ca07fc3d6536b7beb1e73610c5e b/txscript/data/taproot-ref/74068e2edea30ca07fc3d6536b7beb1e73610c5e new file mode 100644 index 0000000000..573d8530b8 --- /dev/null +++ b/txscript/data/taproot-ref/74068e2edea30ca07fc3d6536b7beb1e73610c5e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/74077dff1318da9fbe3c8ecbcf570fa2b161a310 b/txscript/data/taproot-ref/74077dff1318da9fbe3c8ecbcf570fa2b161a310 new file mode 100644 index 0000000000..e2bdad603f --- /dev/null +++ b/txscript/data/taproot-ref/74077dff1318da9fbe3c8ecbcf570fa2b161a310 @@ -0,0 +1 @@ +{"tx": "3980379002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7f00000000bdb16596dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc001000000f9f628ff01158fbf000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a68a000000", "prevouts": ["b65179000000000017a914f955a33e905fb6c7b7e694c8cef25993577deafb87", "68725e0000000000235b212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["dd847f17abd19500624fb671cc44dc06eb3fd029961806af87c7fe856962bed3c2ee456c83fdd6f3cb50df3b7efd2dda87b00a3db6ef23b78fe45e0732a40b2c", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/742166e63d37f163f9bfa53c3d1ca1c432028519 b/txscript/data/taproot-ref/742166e63d37f163f9bfa53c3d1ca1c432028519 new file mode 100644 index 0000000000..34f6b4067c --- /dev/null +++ b/txscript/data/taproot-ref/742166e63d37f163f9bfa53c3d1ca1c432028519 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/742c9cda5fd595f2f4acc988670128b67aa2cce0 b/txscript/data/taproot-ref/742c9cda5fd595f2f4acc988670128b67aa2cce0 new file mode 100644 index 0000000000..28407e4e81 --- /dev/null +++ b/txscript/data/taproot-ref/742c9cda5fd595f2f4acc988670128b67aa2cce0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/743bd395e890e120441210e9d92579d0c7fd94d9 b/txscript/data/taproot-ref/743bd395e890e120441210e9d92579d0c7fd94d9 new file mode 100644 index 0000000000..57bf5a2e38 --- /dev/null +++ b/txscript/data/taproot-ref/743bd395e890e120441210e9d92579d0c7fd94d9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/74433925d2da6bb3c3edcc954a98eca9eeb57abd b/txscript/data/taproot-ref/74433925d2da6bb3c3edcc954a98eca9eeb57abd new file mode 100644 index 0000000000..bb99eae4c0 --- /dev/null +++ b/txscript/data/taproot-ref/74433925d2da6bb3c3edcc954a98eca9eeb57abd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/746569f919dd66a45ca13b1e18824a0afdb22d9e b/txscript/data/taproot-ref/746569f919dd66a45ca13b1e18824a0afdb22d9e new file mode 100644 index 0000000000..844ff64aae --- /dev/null +++ b/txscript/data/taproot-ref/746569f919dd66a45ca13b1e18824a0afdb22d9e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/74685cb831119333da8b5a7c83e055eedbef944e b/txscript/data/taproot-ref/74685cb831119333da8b5a7c83e055eedbef944e new file mode 100644 index 0000000000..5e74981814 --- /dev/null +++ b/txscript/data/taproot-ref/74685cb831119333da8b5a7c83e055eedbef944e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7482f850ee397dd25bd1687e64b7eea626e9c608 b/txscript/data/taproot-ref/7482f850ee397dd25bd1687e64b7eea626e9c608 new file mode 100644 index 0000000000..b137fa866f --- /dev/null +++ b/txscript/data/taproot-ref/7482f850ee397dd25bd1687e64b7eea626e9c608 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/748b5f0d6e2f9fa4665f7445654524ae50ffc8ad b/txscript/data/taproot-ref/748b5f0d6e2f9fa4665f7445654524ae50ffc8ad new file mode 100644 index 0000000000..78945d9667 --- /dev/null +++ b/txscript/data/taproot-ref/748b5f0d6e2f9fa4665f7445654524ae50ffc8ad @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/748ece6f6568749de6856f4e101f00d04a22d979 b/txscript/data/taproot-ref/748ece6f6568749de6856f4e101f00d04a22d979 new file mode 100644 index 0000000000..45924464d7 --- /dev/null +++ b/txscript/data/taproot-ref/748ece6f6568749de6856f4e101f00d04a22d979 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/74965c4ae1074a7c5d80f0889dda62db64f0d7d3 b/txscript/data/taproot-ref/74965c4ae1074a7c5d80f0889dda62db64f0d7d3 new file mode 100644 index 0000000000..5385c5354a --- /dev/null +++ b/txscript/data/taproot-ref/74965c4ae1074a7c5d80f0889dda62db64f0d7d3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/74b0040c6bed65b152921df24d1d78125695306f b/txscript/data/taproot-ref/74b0040c6bed65b152921df24d1d78125695306f new file mode 100644 index 0000000000..d684855cb1 --- /dev/null +++ b/txscript/data/taproot-ref/74b0040c6bed65b152921df24d1d78125695306f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/74ba2f22626f43b6a2563b0cb35c620433682d40 b/txscript/data/taproot-ref/74ba2f22626f43b6a2563b0cb35c620433682d40 new file mode 100644 index 0000000000..015fb5324a --- /dev/null +++ b/txscript/data/taproot-ref/74ba2f22626f43b6a2563b0cb35c620433682d40 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/74dba0abfcd70931e9e189f44c9fe76cb1cdbb0a b/txscript/data/taproot-ref/74dba0abfcd70931e9e189f44c9fe76cb1cdbb0a new file mode 100644 index 0000000000..c0c1dd359f --- /dev/null +++ b/txscript/data/taproot-ref/74dba0abfcd70931e9e189f44c9fe76cb1cdbb0a @@ -0,0 +1 @@ +{"tx": "01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b4010000009fa83274dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7e00000000eee18aed04b9ab5c00000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acec010000", "prevouts": ["5a6440000000000017a91495eb8fe3d959e08a2cc279c1b4ede1921d14a93b87", "fdbb1e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "2257202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "witness": ["ee979f36ea2c02a592926939e3326dab1625c9106db43b47b5bb96060197b48c55035cd0f9b24ae1f3588780876fc9aae0ecec5f2210ee85544970f15a2340de"]}}, diff --git a/txscript/data/taproot-ref/74e0dd99e051486e796a28c6482f0b52f0af67a1 b/txscript/data/taproot-ref/74e0dd99e051486e796a28c6482f0b52f0af67a1 new file mode 100644 index 0000000000..be0fcaf4fc --- /dev/null +++ b/txscript/data/taproot-ref/74e0dd99e051486e796a28c6482f0b52f0af67a1 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/75255d425818aa4e45fa7a8ce30896b30e5f57bf b/txscript/data/taproot-ref/75255d425818aa4e45fa7a8ce30896b30e5f57bf new file mode 100644 index 0000000000..4e8e71ceed --- /dev/null +++ b/txscript/data/taproot-ref/75255d425818aa4e45fa7a8ce30896b30e5f57bf @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/75362838d1ed152f60dc3cb74924d167c1b0fd2b b/txscript/data/taproot-ref/75362838d1ed152f60dc3cb74924d167c1b0fd2b new file mode 100644 index 0000000000..b9db0f36f3 --- /dev/null +++ b/txscript/data/taproot-ref/75362838d1ed152f60dc3cb74924d167c1b0fd2b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7559c841c04c474bc9ff45fe8504abb5d4e8f57d b/txscript/data/taproot-ref/7559c841c04c474bc9ff45fe8504abb5d4e8f57d new file mode 100644 index 0000000000..987c9bb0b7 --- /dev/null +++ b/txscript/data/taproot-ref/7559c841c04c474bc9ff45fe8504abb5d4e8f57d @@ -0,0 +1 @@ +{"tx": "8724841602dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1b020000002b49f9e18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41500000000a39d908104476a65000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47873b010000", "prevouts": ["ffb125000000000022512020555e2c878e81dabdc8b4bbb4d8fbb562c672b13f4ba4a3f97a1487e7c521d9", "e565410000000000215f1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["fe481de0054653f6dc89220421b81205d1f67dc9bf372464b33058d3f36b609fda47be226b9e2c17f1a76095a66ef57d64048027692203b62e8260064c28999c"]}}, diff --git a/txscript/data/taproot-ref/757adad4f7dd459070f4f1b1f4f4f2374a57ec6c b/txscript/data/taproot-ref/757adad4f7dd459070f4f1b1f4f4f2374a57ec6c new file mode 100644 index 0000000000..46ef8bc98d --- /dev/null +++ b/txscript/data/taproot-ref/757adad4f7dd459070f4f1b1f4f4f2374a57ec6c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/75ed237efa308c478c8ee1faa516c94e45f17495 b/txscript/data/taproot-ref/75ed237efa308c478c8ee1faa516c94e45f17495 new file mode 100644 index 0000000000..df0848f167 --- /dev/null +++ b/txscript/data/taproot-ref/75ed237efa308c478c8ee1faa516c94e45f17495 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/75f1856401af3c6957b627bba156ed076e49ef5a b/txscript/data/taproot-ref/75f1856401af3c6957b627bba156ed076e49ef5a new file mode 100644 index 0000000000..1350564217 --- /dev/null +++ b/txscript/data/taproot-ref/75f1856401af3c6957b627bba156ed076e49ef5a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/762487d62765bf58b6c712ce69edfc2a9d91f23c b/txscript/data/taproot-ref/762487d62765bf58b6c712ce69edfc2a9d91f23c new file mode 100644 index 0000000000..d23de65c80 --- /dev/null +++ b/txscript/data/taproot-ref/762487d62765bf58b6c712ce69edfc2a9d91f23c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/767dc9730435e95ff0446a5e08a10843c28b5e4d b/txscript/data/taproot-ref/767dc9730435e95ff0446a5e08a10843c28b5e4d new file mode 100644 index 0000000000..55ead189c4 --- /dev/null +++ b/txscript/data/taproot-ref/767dc9730435e95ff0446a5e08a10843c28b5e4d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/76967f9679742d07c45801b75cdb5ec88f3ea2e6 b/txscript/data/taproot-ref/76967f9679742d07c45801b75cdb5ec88f3ea2e6 new file mode 100644 index 0000000000..8291f37199 --- /dev/null +++ b/txscript/data/taproot-ref/76967f9679742d07c45801b75cdb5ec88f3ea2e6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7697ccd8a0cbc267875cf87e7ce982f8dbffa82b b/txscript/data/taproot-ref/7697ccd8a0cbc267875cf87e7ce982f8dbffa82b new file mode 100644 index 0000000000..69941cec66 --- /dev/null +++ b/txscript/data/taproot-ref/7697ccd8a0cbc267875cf87e7ce982f8dbffa82b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/769cf64713d5676b0d7823f406502b750f29f48a b/txscript/data/taproot-ref/769cf64713d5676b0d7823f406502b750f29f48a new file mode 100644 index 0000000000..233f4e570b --- /dev/null +++ b/txscript/data/taproot-ref/769cf64713d5676b0d7823f406502b750f29f48a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/76adb95f40dd46b0cd442f82b7eb70ed237f1676 b/txscript/data/taproot-ref/76adb95f40dd46b0cd442f82b7eb70ed237f1676 new file mode 100644 index 0000000000..a854e55aa5 --- /dev/null +++ b/txscript/data/taproot-ref/76adb95f40dd46b0cd442f82b7eb70ed237f1676 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/76ba7be2b975f49a68b47d255757883a4fe65358 b/txscript/data/taproot-ref/76ba7be2b975f49a68b47d255757883a4fe65358 new file mode 100644 index 0000000000..2b72f0addb --- /dev/null +++ b/txscript/data/taproot-ref/76ba7be2b975f49a68b47d255757883a4fe65358 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/76bc86d13bce32da92769372e37076c675520959 b/txscript/data/taproot-ref/76bc86d13bce32da92769372e37076c675520959 new file mode 100644 index 0000000000..e11af1e601 --- /dev/null +++ b/txscript/data/taproot-ref/76bc86d13bce32da92769372e37076c675520959 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/76c17c551bd5e5ae2efbb26f2e05d12c9c8181b3 b/txscript/data/taproot-ref/76c17c551bd5e5ae2efbb26f2e05d12c9c8181b3 new file mode 100644 index 0000000000..a39f92fbc6 --- /dev/null +++ b/txscript/data/taproot-ref/76c17c551bd5e5ae2efbb26f2e05d12c9c8181b3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/76c565f5646ff08d8c740ffe4cf133d9c8a3fe65 b/txscript/data/taproot-ref/76c565f5646ff08d8c740ffe4cf133d9c8a3fe65 new file mode 100644 index 0000000000..d49d4150fb --- /dev/null +++ b/txscript/data/taproot-ref/76c565f5646ff08d8c740ffe4cf133d9c8a3fe65 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/76f5c55837a53eb0781baf11e0de07184a6d08ee b/txscript/data/taproot-ref/76f5c55837a53eb0781baf11e0de07184a6d08ee new file mode 100644 index 0000000000..b118f36524 --- /dev/null +++ b/txscript/data/taproot-ref/76f5c55837a53eb0781baf11e0de07184a6d08ee @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/76f83799d26fbfe8607158f4718d6f5cfdc8621b b/txscript/data/taproot-ref/76f83799d26fbfe8607158f4718d6f5cfdc8621b new file mode 100644 index 0000000000..c61a5960d7 --- /dev/null +++ b/txscript/data/taproot-ref/76f83799d26fbfe8607158f4718d6f5cfdc8621b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7705fd1f70110abbefb84b8bb3679338dc85008b b/txscript/data/taproot-ref/7705fd1f70110abbefb84b8bb3679338dc85008b new file mode 100644 index 0000000000..2d5bc22462 --- /dev/null +++ b/txscript/data/taproot-ref/7705fd1f70110abbefb84b8bb3679338dc85008b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7722142222386c62ee3cf0d244202e77b759f34b b/txscript/data/taproot-ref/7722142222386c62ee3cf0d244202e77b759f34b new file mode 100644 index 0000000000..e429db0465 --- /dev/null +++ b/txscript/data/taproot-ref/7722142222386c62ee3cf0d244202e77b759f34b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/77258dc253bbfcab9ac3a990bda4f20592f9c651 b/txscript/data/taproot-ref/77258dc253bbfcab9ac3a990bda4f20592f9c651 new file mode 100644 index 0000000000..97352fa5d3 --- /dev/null +++ b/txscript/data/taproot-ref/77258dc253bbfcab9ac3a990bda4f20592f9c651 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7726ec0c41e3e97e7d617065e6504efb8f024cd4 b/txscript/data/taproot-ref/7726ec0c41e3e97e7d617065e6504efb8f024cd4 new file mode 100644 index 0000000000..a670fb4f62 --- /dev/null +++ b/txscript/data/taproot-ref/7726ec0c41e3e97e7d617065e6504efb8f024cd4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/773d0e073333f130bcff75d37d1111faaebee058 b/txscript/data/taproot-ref/773d0e073333f130bcff75d37d1111faaebee058 new file mode 100644 index 0000000000..0bacff9054 --- /dev/null +++ b/txscript/data/taproot-ref/773d0e073333f130bcff75d37d1111faaebee058 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/774784914f2077e1681344cb01340a934be26ba4 b/txscript/data/taproot-ref/774784914f2077e1681344cb01340a934be26ba4 new file mode 100644 index 0000000000..de619d44ef --- /dev/null +++ b/txscript/data/taproot-ref/774784914f2077e1681344cb01340a934be26ba4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/77907cfa0df9ad35b28a28dc974519599031d5b7 b/txscript/data/taproot-ref/77907cfa0df9ad35b28a28dc974519599031d5b7 new file mode 100644 index 0000000000..8ce468222b --- /dev/null +++ b/txscript/data/taproot-ref/77907cfa0df9ad35b28a28dc974519599031d5b7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/77a416c6802644089ebc937712578c64cd114e2e b/txscript/data/taproot-ref/77a416c6802644089ebc937712578c64cd114e2e new file mode 100644 index 0000000000..ab3e4f8fed --- /dev/null +++ b/txscript/data/taproot-ref/77a416c6802644089ebc937712578c64cd114e2e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/77b1d215fef8b044b5354a64c3541f96a5eed3ef b/txscript/data/taproot-ref/77b1d215fef8b044b5354a64c3541f96a5eed3ef new file mode 100644 index 0000000000..459bfd42ea --- /dev/null +++ b/txscript/data/taproot-ref/77b1d215fef8b044b5354a64c3541f96a5eed3ef @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/77bc35d370a04908ca4a6126a011623e2b09442d b/txscript/data/taproot-ref/77bc35d370a04908ca4a6126a011623e2b09442d new file mode 100644 index 0000000000..2a5e692ad8 --- /dev/null +++ b/txscript/data/taproot-ref/77bc35d370a04908ca4a6126a011623e2b09442d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/77d0cc6e1223f82ea66b45b7eefc97601034b9bb b/txscript/data/taproot-ref/77d0cc6e1223f82ea66b45b7eefc97601034b9bb new file mode 100644 index 0000000000..013a1350c4 --- /dev/null +++ b/txscript/data/taproot-ref/77d0cc6e1223f82ea66b45b7eefc97601034b9bb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/77faf5783504d2bd51c625bcecb48b8f87e8e165 b/txscript/data/taproot-ref/77faf5783504d2bd51c625bcecb48b8f87e8e165 new file mode 100644 index 0000000000..242948191e --- /dev/null +++ b/txscript/data/taproot-ref/77faf5783504d2bd51c625bcecb48b8f87e8e165 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/78251c5d9b329e36203639010c03798c0e1dcf20 b/txscript/data/taproot-ref/78251c5d9b329e36203639010c03798c0e1dcf20 new file mode 100644 index 0000000000..77527a1f43 --- /dev/null +++ b/txscript/data/taproot-ref/78251c5d9b329e36203639010c03798c0e1dcf20 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/78536c856a97d639ec3c9e87656c03a486180cb2 b/txscript/data/taproot-ref/78536c856a97d639ec3c9e87656c03a486180cb2 new file mode 100644 index 0000000000..8c2535d7bb --- /dev/null +++ b/txscript/data/taproot-ref/78536c856a97d639ec3c9e87656c03a486180cb2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/78a8516593c8bad79e4092b1b3fc0a850a266c4e b/txscript/data/taproot-ref/78a8516593c8bad79e4092b1b3fc0a850a266c4e new file mode 100644 index 0000000000..5258931f78 --- /dev/null +++ b/txscript/data/taproot-ref/78a8516593c8bad79e4092b1b3fc0a850a266c4e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/78a85c295a5f5c62f56d7eba74225f31406a0b51 b/txscript/data/taproot-ref/78a85c295a5f5c62f56d7eba74225f31406a0b51 new file mode 100644 index 0000000000..f04bd4ec92 --- /dev/null +++ b/txscript/data/taproot-ref/78a85c295a5f5c62f56d7eba74225f31406a0b51 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/78aa0f27c839d5f0b6120545131237373c9ae941 b/txscript/data/taproot-ref/78aa0f27c839d5f0b6120545131237373c9ae941 new file mode 100644 index 0000000000..58e4ac8792 --- /dev/null +++ b/txscript/data/taproot-ref/78aa0f27c839d5f0b6120545131237373c9ae941 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/78bb53d71409ce127d2a0ea2bb3fe8ab857c3db0 b/txscript/data/taproot-ref/78bb53d71409ce127d2a0ea2bb3fe8ab857c3db0 new file mode 100644 index 0000000000..283512de6b --- /dev/null +++ b/txscript/data/taproot-ref/78bb53d71409ce127d2a0ea2bb3fe8ab857c3db0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/78f579fb1bbed4948a321bcad1a70116b995076e b/txscript/data/taproot-ref/78f579fb1bbed4948a321bcad1a70116b995076e new file mode 100644 index 0000000000..b940880d76 --- /dev/null +++ b/txscript/data/taproot-ref/78f579fb1bbed4948a321bcad1a70116b995076e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7929ee70089306f9173670db39ef247d71e6d01c b/txscript/data/taproot-ref/7929ee70089306f9173670db39ef247d71e6d01c new file mode 100644 index 0000000000..75d007a18f --- /dev/null +++ b/txscript/data/taproot-ref/7929ee70089306f9173670db39ef247d71e6d01c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/79348dfc973141bd7bee5f470ac28ffd56e6591c b/txscript/data/taproot-ref/79348dfc973141bd7bee5f470ac28ffd56e6591c new file mode 100644 index 0000000000..1c3063a819 --- /dev/null +++ b/txscript/data/taproot-ref/79348dfc973141bd7bee5f470ac28ffd56e6591c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/794d2929ccd4a9f38151fa274b7bba0a898aa30c b/txscript/data/taproot-ref/794d2929ccd4a9f38151fa274b7bba0a898aa30c new file mode 100644 index 0000000000..1159c4af5f --- /dev/null +++ b/txscript/data/taproot-ref/794d2929ccd4a9f38151fa274b7bba0a898aa30c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/79693f140367ae963c396d7952f2b07e3e603755 b/txscript/data/taproot-ref/79693f140367ae963c396d7952f2b07e3e603755 new file mode 100644 index 0000000000..6f4aa336d4 --- /dev/null +++ b/txscript/data/taproot-ref/79693f140367ae963c396d7952f2b07e3e603755 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7988534604fb11aa559428f200cd7631d266dcdc b/txscript/data/taproot-ref/7988534604fb11aa559428f200cd7631d266dcdc new file mode 100644 index 0000000000..2961c0e170 --- /dev/null +++ b/txscript/data/taproot-ref/7988534604fb11aa559428f200cd7631d266dcdc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7993ab06fc93824943100f468b83a388dc8396fc b/txscript/data/taproot-ref/7993ab06fc93824943100f468b83a388dc8396fc new file mode 100644 index 0000000000..0f2b1b2502 --- /dev/null +++ b/txscript/data/taproot-ref/7993ab06fc93824943100f468b83a388dc8396fc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/79a78205700940deac5a3af06b37f7a837ba5d0c b/txscript/data/taproot-ref/79a78205700940deac5a3af06b37f7a837ba5d0c new file mode 100644 index 0000000000..805619ac25 --- /dev/null +++ b/txscript/data/taproot-ref/79a78205700940deac5a3af06b37f7a837ba5d0c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/79dcbe312ec0cae55271acea3fbcad77eb51a258 b/txscript/data/taproot-ref/79dcbe312ec0cae55271acea3fbcad77eb51a258 new file mode 100644 index 0000000000..41f2478fe7 --- /dev/null +++ b/txscript/data/taproot-ref/79dcbe312ec0cae55271acea3fbcad77eb51a258 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/79ed5f67b23082b621f1d3d307cbb3833df70b36 b/txscript/data/taproot-ref/79ed5f67b23082b621f1d3d307cbb3833df70b36 new file mode 100644 index 0000000000..25f0dee513 --- /dev/null +++ b/txscript/data/taproot-ref/79ed5f67b23082b621f1d3d307cbb3833df70b36 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/79ee5f66d93ee0d29f8b42ccf65fc760525867d6 b/txscript/data/taproot-ref/79ee5f66d93ee0d29f8b42ccf65fc760525867d6 new file mode 100644 index 0000000000..7d5ba81f35 --- /dev/null +++ b/txscript/data/taproot-ref/79ee5f66d93ee0d29f8b42ccf65fc760525867d6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7a043102c33d83ed36e9879386a6e618668535d9 b/txscript/data/taproot-ref/7a043102c33d83ed36e9879386a6e618668535d9 new file mode 100644 index 0000000000..331c0bb3bf --- /dev/null +++ b/txscript/data/taproot-ref/7a043102c33d83ed36e9879386a6e618668535d9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7a111af866866f2de4ef478fd546fb1c0fc25d0a b/txscript/data/taproot-ref/7a111af866866f2de4ef478fd546fb1c0fc25d0a new file mode 100644 index 0000000000..f5c2728280 --- /dev/null +++ b/txscript/data/taproot-ref/7a111af866866f2de4ef478fd546fb1c0fc25d0a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7a1820d857c8a49a2db73ca33ae771ff2942dccf b/txscript/data/taproot-ref/7a1820d857c8a49a2db73ca33ae771ff2942dccf new file mode 100644 index 0000000000..d50874b73f --- /dev/null +++ b/txscript/data/taproot-ref/7a1820d857c8a49a2db73ca33ae771ff2942dccf @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7a490995df2d5f17d023de70297a3ccd20b7e9f0 b/txscript/data/taproot-ref/7a490995df2d5f17d023de70297a3ccd20b7e9f0 new file mode 100644 index 0000000000..afac7d4a20 --- /dev/null +++ b/txscript/data/taproot-ref/7a490995df2d5f17d023de70297a3ccd20b7e9f0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7a4a6b8236fc89f7d9e11728eab5f34c87b831ca b/txscript/data/taproot-ref/7a4a6b8236fc89f7d9e11728eab5f34c87b831ca new file mode 100644 index 0000000000..9a4542c1e2 --- /dev/null +++ b/txscript/data/taproot-ref/7a4a6b8236fc89f7d9e11728eab5f34c87b831ca @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7a59b37e047189062f0abaf0d629290ecfb35f75 b/txscript/data/taproot-ref/7a59b37e047189062f0abaf0d629290ecfb35f75 new file mode 100644 index 0000000000..9bf6408aa5 --- /dev/null +++ b/txscript/data/taproot-ref/7a59b37e047189062f0abaf0d629290ecfb35f75 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7a69a216cc5a6c99a19546872d16973b864b8ec6 b/txscript/data/taproot-ref/7a69a216cc5a6c99a19546872d16973b864b8ec6 new file mode 100644 index 0000000000..c57f802603 --- /dev/null +++ b/txscript/data/taproot-ref/7a69a216cc5a6c99a19546872d16973b864b8ec6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7a6afdaaff4560a33eba5ebd9df662b110b72dc2 b/txscript/data/taproot-ref/7a6afdaaff4560a33eba5ebd9df662b110b72dc2 new file mode 100644 index 0000000000..df164b4594 --- /dev/null +++ b/txscript/data/taproot-ref/7a6afdaaff4560a33eba5ebd9df662b110b72dc2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7a87119e2369843226572e9e9603e14022ad565d b/txscript/data/taproot-ref/7a87119e2369843226572e9e9603e14022ad565d new file mode 100644 index 0000000000..6b0901b6ae --- /dev/null +++ b/txscript/data/taproot-ref/7a87119e2369843226572e9e9603e14022ad565d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7aa3606e89e98945870fd6072bc248da2ac00194 b/txscript/data/taproot-ref/7aa3606e89e98945870fd6072bc248da2ac00194 new file mode 100644 index 0000000000..dc3e167371 --- /dev/null +++ b/txscript/data/taproot-ref/7aa3606e89e98945870fd6072bc248da2ac00194 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7ab6a9ca3af298309556e392c5a2145121ecad20 b/txscript/data/taproot-ref/7ab6a9ca3af298309556e392c5a2145121ecad20 new file mode 100644 index 0000000000..2b380f4207 --- /dev/null +++ b/txscript/data/taproot-ref/7ab6a9ca3af298309556e392c5a2145121ecad20 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7ac66a26b371216e55464bd620f00f9b3cabf539 b/txscript/data/taproot-ref/7ac66a26b371216e55464bd620f00f9b3cabf539 new file mode 100644 index 0000000000..41971f6ee7 --- /dev/null +++ b/txscript/data/taproot-ref/7ac66a26b371216e55464bd620f00f9b3cabf539 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7adcfb6ec993d4f55872e19410191727163f6958 b/txscript/data/taproot-ref/7adcfb6ec993d4f55872e19410191727163f6958 new file mode 100644 index 0000000000..05a0244572 --- /dev/null +++ b/txscript/data/taproot-ref/7adcfb6ec993d4f55872e19410191727163f6958 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7ae9dff22041f4c1fe093655030d83341a775789 b/txscript/data/taproot-ref/7ae9dff22041f4c1fe093655030d83341a775789 new file mode 100644 index 0000000000..bf9225f029 --- /dev/null +++ b/txscript/data/taproot-ref/7ae9dff22041f4c1fe093655030d83341a775789 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7b1eb9664a41baa7f5e742f91eba9581bd509407 b/txscript/data/taproot-ref/7b1eb9664a41baa7f5e742f91eba9581bd509407 new file mode 100644 index 0000000000..47809a8bf3 --- /dev/null +++ b/txscript/data/taproot-ref/7b1eb9664a41baa7f5e742f91eba9581bd509407 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7b242c6392ed925c411f5a03c01a5b224498873d b/txscript/data/taproot-ref/7b242c6392ed925c411f5a03c01a5b224498873d new file mode 100644 index 0000000000..e514df880a --- /dev/null +++ b/txscript/data/taproot-ref/7b242c6392ed925c411f5a03c01a5b224498873d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7b302c63a0c095634d5b99d885e31d50d348915f b/txscript/data/taproot-ref/7b302c63a0c095634d5b99d885e31d50d348915f new file mode 100644 index 0000000000..a5d4185ef3 --- /dev/null +++ b/txscript/data/taproot-ref/7b302c63a0c095634d5b99d885e31d50d348915f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7b385bf3549519df825d01ede2e8d9864af0d4f1 b/txscript/data/taproot-ref/7b385bf3549519df825d01ede2e8d9864af0d4f1 new file mode 100644 index 0000000000..e8ec8e1f1e --- /dev/null +++ b/txscript/data/taproot-ref/7b385bf3549519df825d01ede2e8d9864af0d4f1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7b8328e1cf64ee86aed185c42ef2d58842a86505 b/txscript/data/taproot-ref/7b8328e1cf64ee86aed185c42ef2d58842a86505 new file mode 100644 index 0000000000..d61a3d0a4f --- /dev/null +++ b/txscript/data/taproot-ref/7b8328e1cf64ee86aed185c42ef2d58842a86505 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7b9f95b7241f7c9902e959452e13b67e26806ad6 b/txscript/data/taproot-ref/7b9f95b7241f7c9902e959452e13b67e26806ad6 new file mode 100644 index 0000000000..b7c2eb28ca --- /dev/null +++ b/txscript/data/taproot-ref/7b9f95b7241f7c9902e959452e13b67e26806ad6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7ba72ec40b0c475f5d75c1845b6a75ce8fa2c003 b/txscript/data/taproot-ref/7ba72ec40b0c475f5d75c1845b6a75ce8fa2c003 new file mode 100644 index 0000000000..d71d6d0c63 --- /dev/null +++ b/txscript/data/taproot-ref/7ba72ec40b0c475f5d75c1845b6a75ce8fa2c003 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7bcb414301b9d095183f9b852a0c948309483542 b/txscript/data/taproot-ref/7bcb414301b9d095183f9b852a0c948309483542 new file mode 100644 index 0000000000..d177943f6b --- /dev/null +++ b/txscript/data/taproot-ref/7bcb414301b9d095183f9b852a0c948309483542 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7bd191b72e7ea5e8407c5a81557fb3489574834c b/txscript/data/taproot-ref/7bd191b72e7ea5e8407c5a81557fb3489574834c new file mode 100644 index 0000000000..e39a41e6e2 --- /dev/null +++ b/txscript/data/taproot-ref/7bd191b72e7ea5e8407c5a81557fb3489574834c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7c0066094d3af7d6ae9649b1e0d8c4f65d29d5b7 b/txscript/data/taproot-ref/7c0066094d3af7d6ae9649b1e0d8c4f65d29d5b7 new file mode 100644 index 0000000000..e0aff19efc --- /dev/null +++ b/txscript/data/taproot-ref/7c0066094d3af7d6ae9649b1e0d8c4f65d29d5b7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7c3defc5ef17cddbacd31b76689e0f6d0737ac57 b/txscript/data/taproot-ref/7c3defc5ef17cddbacd31b76689e0f6d0737ac57 new file mode 100644 index 0000000000..8031a181be --- /dev/null +++ b/txscript/data/taproot-ref/7c3defc5ef17cddbacd31b76689e0f6d0737ac57 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7c7017c2b46f27580791e590ff2536195830225d b/txscript/data/taproot-ref/7c7017c2b46f27580791e590ff2536195830225d new file mode 100644 index 0000000000..2f20a00128 --- /dev/null +++ b/txscript/data/taproot-ref/7c7017c2b46f27580791e590ff2536195830225d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7c7b7ccbaea2f13ad6524f8a286a5a8e5de67e21 b/txscript/data/taproot-ref/7c7b7ccbaea2f13ad6524f8a286a5a8e5de67e21 new file mode 100644 index 0000000000..c5af2b72f3 --- /dev/null +++ b/txscript/data/taproot-ref/7c7b7ccbaea2f13ad6524f8a286a5a8e5de67e21 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7c81f44f5bced662dae488456a190a2b5b68c852 b/txscript/data/taproot-ref/7c81f44f5bced662dae488456a190a2b5b68c852 new file mode 100644 index 0000000000..d4204fb4ad --- /dev/null +++ b/txscript/data/taproot-ref/7c81f44f5bced662dae488456a190a2b5b68c852 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7cc6f39aa5cdd7a9af8b06f6627638b3bb770f40 b/txscript/data/taproot-ref/7cc6f39aa5cdd7a9af8b06f6627638b3bb770f40 new file mode 100644 index 0000000000..a54aba1544 --- /dev/null +++ b/txscript/data/taproot-ref/7cc6f39aa5cdd7a9af8b06f6627638b3bb770f40 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/7cfcff79af9057d0133f2b5da206b608722bd025 b/txscript/data/taproot-ref/7cfcff79af9057d0133f2b5da206b608722bd025 new file mode 100644 index 0000000000..7c0642eb53 --- /dev/null +++ b/txscript/data/taproot-ref/7cfcff79af9057d0133f2b5da206b608722bd025 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7d568d459cf98a02f42d26cf7a40def28f45c07c b/txscript/data/taproot-ref/7d568d459cf98a02f42d26cf7a40def28f45c07c new file mode 100644 index 0000000000..a9e19d6a17 --- /dev/null +++ b/txscript/data/taproot-ref/7d568d459cf98a02f42d26cf7a40def28f45c07c @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/7d77c20b635f8d363cafef80ce333359495fddeb b/txscript/data/taproot-ref/7d77c20b635f8d363cafef80ce333359495fddeb new file mode 100644 index 0000000000..8eca7b7a37 --- /dev/null +++ b/txscript/data/taproot-ref/7d77c20b635f8d363cafef80ce333359495fddeb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7dbdb91634696f23cadac0af049ca2841cbf75df b/txscript/data/taproot-ref/7dbdb91634696f23cadac0af049ca2841cbf75df new file mode 100644 index 0000000000..6a3c192d8a --- /dev/null +++ b/txscript/data/taproot-ref/7dbdb91634696f23cadac0af049ca2841cbf75df @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7dca132115921f6d0134e317bc0c5b2e5b97934d b/txscript/data/taproot-ref/7dca132115921f6d0134e317bc0c5b2e5b97934d new file mode 100644 index 0000000000..3203b59ea6 --- /dev/null +++ b/txscript/data/taproot-ref/7dca132115921f6d0134e317bc0c5b2e5b97934d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7dd14622cf7fe1695e710f01b45d90250043dea6 b/txscript/data/taproot-ref/7dd14622cf7fe1695e710f01b45d90250043dea6 new file mode 100644 index 0000000000..9ce1d1a6c4 --- /dev/null +++ b/txscript/data/taproot-ref/7dd14622cf7fe1695e710f01b45d90250043dea6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7ddf0e4fc007dcceddccc60c7634ce32af1c1782 b/txscript/data/taproot-ref/7ddf0e4fc007dcceddccc60c7634ce32af1c1782 new file mode 100644 index 0000000000..fa39edc63b --- /dev/null +++ b/txscript/data/taproot-ref/7ddf0e4fc007dcceddccc60c7634ce32af1c1782 @@ -0,0 +1 @@ +{"tx": "8e58b9e9028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b301000000df8399ad60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270620000000088e2538303dd3145000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6d6bda649", "prevouts": ["7be839000000000017a9146704ae21c886c9ded757e2b67d582abfc91902d487", "05500e000000000017a914f955a33e905fb6c7b7e694c8cef25993577deafb87"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "21581f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b", "witness": ["0d74bc0c44327702fd68a9e5652814cb4b2ec976729a3f33e2510bc66054b9d42152e2231d14e91753c54ff32f3659e978c0b9868dd8fbf4e474944350321844"]}}, diff --git a/txscript/data/taproot-ref/7de80c1c4a6415b28404560b4e476f7ff798b292 b/txscript/data/taproot-ref/7de80c1c4a6415b28404560b4e476f7ff798b292 new file mode 100644 index 0000000000..bbebcea0d4 --- /dev/null +++ b/txscript/data/taproot-ref/7de80c1c4a6415b28404560b4e476f7ff798b292 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7e165223d7af3c0a9b55423a23a84315b3549c34 b/txscript/data/taproot-ref/7e165223d7af3c0a9b55423a23a84315b3549c34 new file mode 100644 index 0000000000..3ee9be070a --- /dev/null +++ b/txscript/data/taproot-ref/7e165223d7af3c0a9b55423a23a84315b3549c34 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7e2b8b5d88ab86a02660c9f930b1dc7bc915500f b/txscript/data/taproot-ref/7e2b8b5d88ab86a02660c9f930b1dc7bc915500f new file mode 100644 index 0000000000..d3329aa19e --- /dev/null +++ b/txscript/data/taproot-ref/7e2b8b5d88ab86a02660c9f930b1dc7bc915500f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7e2f0de68af4544f103e74bd384b74b2e2f85241 b/txscript/data/taproot-ref/7e2f0de68af4544f103e74bd384b74b2e2f85241 new file mode 100644 index 0000000000..29334406ab --- /dev/null +++ b/txscript/data/taproot-ref/7e2f0de68af4544f103e74bd384b74b2e2f85241 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7e4029c06ed03535d5f51420d860c7da16cc155e b/txscript/data/taproot-ref/7e4029c06ed03535d5f51420d860c7da16cc155e new file mode 100644 index 0000000000..a3feae9668 --- /dev/null +++ b/txscript/data/taproot-ref/7e4029c06ed03535d5f51420d860c7da16cc155e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7e70e8a2a78ad2b7e350dc4a07651a5bf027cb57 b/txscript/data/taproot-ref/7e70e8a2a78ad2b7e350dc4a07651a5bf027cb57 new file mode 100644 index 0000000000..54f5a364ba --- /dev/null +++ b/txscript/data/taproot-ref/7e70e8a2a78ad2b7e350dc4a07651a5bf027cb57 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7e874b33beab6c09e8cdbcdcf34c226d959f53a7 b/txscript/data/taproot-ref/7e874b33beab6c09e8cdbcdcf34c226d959f53a7 new file mode 100644 index 0000000000..6387c3c585 --- /dev/null +++ b/txscript/data/taproot-ref/7e874b33beab6c09e8cdbcdcf34c226d959f53a7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7e926dc258ef73747c6dee6961a01976f75e194f b/txscript/data/taproot-ref/7e926dc258ef73747c6dee6961a01976f75e194f new file mode 100644 index 0000000000..5542d0372e --- /dev/null +++ b/txscript/data/taproot-ref/7e926dc258ef73747c6dee6961a01976f75e194f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7e952aa0d4d919ea11291440bf1f5548858938d6 b/txscript/data/taproot-ref/7e952aa0d4d919ea11291440bf1f5548858938d6 new file mode 100644 index 0000000000..3fa8a0050c --- /dev/null +++ b/txscript/data/taproot-ref/7e952aa0d4d919ea11291440bf1f5548858938d6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7e95b122591089fda778a2dbd434c55672c92346 b/txscript/data/taproot-ref/7e95b122591089fda778a2dbd434c55672c92346 new file mode 100644 index 0000000000..f16655da22 --- /dev/null +++ b/txscript/data/taproot-ref/7e95b122591089fda778a2dbd434c55672c92346 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7eaf9980118567289bdc91759abbffb031b64227 b/txscript/data/taproot-ref/7eaf9980118567289bdc91759abbffb031b64227 new file mode 100644 index 0000000000..79d91aecfb --- /dev/null +++ b/txscript/data/taproot-ref/7eaf9980118567289bdc91759abbffb031b64227 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7eca413996ccecf266e5bf306d63db50903b1ec0 b/txscript/data/taproot-ref/7eca413996ccecf266e5bf306d63db50903b1ec0 new file mode 100644 index 0000000000..9477d2de1c --- /dev/null +++ b/txscript/data/taproot-ref/7eca413996ccecf266e5bf306d63db50903b1ec0 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/7eeec8eac2847cfc829b4f04a7732871fa5b33bb b/txscript/data/taproot-ref/7eeec8eac2847cfc829b4f04a7732871fa5b33bb new file mode 100644 index 0000000000..f7783c9cde --- /dev/null +++ b/txscript/data/taproot-ref/7eeec8eac2847cfc829b4f04a7732871fa5b33bb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7f31dda7857641eb43ac8f245109af960b934c86 b/txscript/data/taproot-ref/7f31dda7857641eb43ac8f245109af960b934c86 new file mode 100644 index 0000000000..7997b4755a --- /dev/null +++ b/txscript/data/taproot-ref/7f31dda7857641eb43ac8f245109af960b934c86 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7f36ff093686c198384796967779e512b39b0067 b/txscript/data/taproot-ref/7f36ff093686c198384796967779e512b39b0067 new file mode 100644 index 0000000000..c5b3666f28 --- /dev/null +++ b/txscript/data/taproot-ref/7f36ff093686c198384796967779e512b39b0067 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7f37fc6f46dfd2056c23dce7388e996b2e007166 b/txscript/data/taproot-ref/7f37fc6f46dfd2056c23dce7388e996b2e007166 new file mode 100644 index 0000000000..4f099d0da4 --- /dev/null +++ b/txscript/data/taproot-ref/7f37fc6f46dfd2056c23dce7388e996b2e007166 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7f5fb097a29a27b116140b9366006e578d1139ce b/txscript/data/taproot-ref/7f5fb097a29a27b116140b9366006e578d1139ce new file mode 100644 index 0000000000..bb118b82c2 --- /dev/null +++ b/txscript/data/taproot-ref/7f5fb097a29a27b116140b9366006e578d1139ce @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7f6b5c7e454d101b3d586c7653b251e1aaa8404d b/txscript/data/taproot-ref/7f6b5c7e454d101b3d586c7653b251e1aaa8404d new file mode 100644 index 0000000000..1443ce8888 --- /dev/null +++ b/txscript/data/taproot-ref/7f6b5c7e454d101b3d586c7653b251e1aaa8404d @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/7f76a08aef5329137e1c80a8f4fc7245375849d9 b/txscript/data/taproot-ref/7f76a08aef5329137e1c80a8f4fc7245375849d9 new file mode 100644 index 0000000000..219485dca7 --- /dev/null +++ b/txscript/data/taproot-ref/7f76a08aef5329137e1c80a8f4fc7245375849d9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7f7be6c8663be7951320cb6c651781e5583ed65e b/txscript/data/taproot-ref/7f7be6c8663be7951320cb6c651781e5583ed65e new file mode 100644 index 0000000000..e7eff966a1 --- /dev/null +++ b/txscript/data/taproot-ref/7f7be6c8663be7951320cb6c651781e5583ed65e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7f8f81d1bf5547aca3adaba322cccf59977c80b0 b/txscript/data/taproot-ref/7f8f81d1bf5547aca3adaba322cccf59977c80b0 new file mode 100644 index 0000000000..8267ef7ad9 --- /dev/null +++ b/txscript/data/taproot-ref/7f8f81d1bf5547aca3adaba322cccf59977c80b0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7f9d1a52ba029c7f6e88ff84575df1fcb1075619 b/txscript/data/taproot-ref/7f9d1a52ba029c7f6e88ff84575df1fcb1075619 new file mode 100644 index 0000000000..335e059a2a --- /dev/null +++ b/txscript/data/taproot-ref/7f9d1a52ba029c7f6e88ff84575df1fcb1075619 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7fc1bf414713fa9f80c252358021f9f97b15c792 b/txscript/data/taproot-ref/7fc1bf414713fa9f80c252358021f9f97b15c792 new file mode 100644 index 0000000000..b7704af321 --- /dev/null +++ b/txscript/data/taproot-ref/7fc1bf414713fa9f80c252358021f9f97b15c792 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/7fdcc6c41ae23f27834e5e1303ac7e3a7a01c43f b/txscript/data/taproot-ref/7fdcc6c41ae23f27834e5e1303ac7e3a7a01c43f new file mode 100644 index 0000000000..f046704962 --- /dev/null +++ b/txscript/data/taproot-ref/7fdcc6c41ae23f27834e5e1303ac7e3a7a01c43f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/801315c10fe0fcc26c0c57bc8f631cd93596168d b/txscript/data/taproot-ref/801315c10fe0fcc26c0c57bc8f631cd93596168d new file mode 100644 index 0000000000..aa0b3b28e6 --- /dev/null +++ b/txscript/data/taproot-ref/801315c10fe0fcc26c0c57bc8f631cd93596168d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/80333b40950b8f22b44ba7c383dc625b1b094df3 b/txscript/data/taproot-ref/80333b40950b8f22b44ba7c383dc625b1b094df3 new file mode 100644 index 0000000000..084bcbb49b --- /dev/null +++ b/txscript/data/taproot-ref/80333b40950b8f22b44ba7c383dc625b1b094df3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/80376b2b822b9baaef72428ca022d2e8ad5fab95 b/txscript/data/taproot-ref/80376b2b822b9baaef72428ca022d2e8ad5fab95 new file mode 100644 index 0000000000..fb2aa6e2e4 --- /dev/null +++ b/txscript/data/taproot-ref/80376b2b822b9baaef72428ca022d2e8ad5fab95 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/803cd5f12d095d218780ad627b0b82b0bab86370 b/txscript/data/taproot-ref/803cd5f12d095d218780ad627b0b82b0bab86370 new file mode 100644 index 0000000000..9dcc8b1e85 --- /dev/null +++ b/txscript/data/taproot-ref/803cd5f12d095d218780ad627b0b82b0bab86370 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8046cd7645e89a0fda7d8f8378e8425fefabb6e8 b/txscript/data/taproot-ref/8046cd7645e89a0fda7d8f8378e8425fefabb6e8 new file mode 100644 index 0000000000..60b3bb112b --- /dev/null +++ b/txscript/data/taproot-ref/8046cd7645e89a0fda7d8f8378e8425fefabb6e8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/804b90af698434a3596956677aba5a5f73dbaed0 b/txscript/data/taproot-ref/804b90af698434a3596956677aba5a5f73dbaed0 new file mode 100644 index 0000000000..8af6c3783c --- /dev/null +++ b/txscript/data/taproot-ref/804b90af698434a3596956677aba5a5f73dbaed0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/808bb1522f5aa5de2dee150c5fe9b2240c76f14e b/txscript/data/taproot-ref/808bb1522f5aa5de2dee150c5fe9b2240c76f14e new file mode 100644 index 0000000000..424132bf62 --- /dev/null +++ b/txscript/data/taproot-ref/808bb1522f5aa5de2dee150c5fe9b2240c76f14e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/809f182745ce2d04f2ed1126bbd41c71d290955e b/txscript/data/taproot-ref/809f182745ce2d04f2ed1126bbd41c71d290955e new file mode 100644 index 0000000000..a4e8bc3499 --- /dev/null +++ b/txscript/data/taproot-ref/809f182745ce2d04f2ed1126bbd41c71d290955e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/80b5c3a4f3efc732cfad5a798289e246619f8977 b/txscript/data/taproot-ref/80b5c3a4f3efc732cfad5a798289e246619f8977 new file mode 100644 index 0000000000..18336844bb --- /dev/null +++ b/txscript/data/taproot-ref/80b5c3a4f3efc732cfad5a798289e246619f8977 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/80b9b953d5d211827d5046ddef05778d9e6fe889 b/txscript/data/taproot-ref/80b9b953d5d211827d5046ddef05778d9e6fe889 new file mode 100644 index 0000000000..abd464db0d --- /dev/null +++ b/txscript/data/taproot-ref/80b9b953d5d211827d5046ddef05778d9e6fe889 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/80ce5e7fb2b5a1cf0cf9bb4b9a786e4bf6735056 b/txscript/data/taproot-ref/80ce5e7fb2b5a1cf0cf9bb4b9a786e4bf6735056 new file mode 100644 index 0000000000..682d060d96 --- /dev/null +++ b/txscript/data/taproot-ref/80ce5e7fb2b5a1cf0cf9bb4b9a786e4bf6735056 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/80d98df3c15079be160fd7897dc74ef9a9b4774b b/txscript/data/taproot-ref/80d98df3c15079be160fd7897dc74ef9a9b4774b new file mode 100644 index 0000000000..1ff7c2b326 --- /dev/null +++ b/txscript/data/taproot-ref/80d98df3c15079be160fd7897dc74ef9a9b4774b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/80dfc8a9fc0fe40ea7577dfd42a34b367905756e b/txscript/data/taproot-ref/80dfc8a9fc0fe40ea7577dfd42a34b367905756e new file mode 100644 index 0000000000..1fa58a28ed --- /dev/null +++ b/txscript/data/taproot-ref/80dfc8a9fc0fe40ea7577dfd42a34b367905756e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/80ed8061d1dc94f53f2e897f7421f7e7109037ef b/txscript/data/taproot-ref/80ed8061d1dc94f53f2e897f7421f7e7109037ef new file mode 100644 index 0000000000..d118567329 --- /dev/null +++ b/txscript/data/taproot-ref/80ed8061d1dc94f53f2e897f7421f7e7109037ef @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8114bd4cff1787b06e5836915e62486478f693d1 b/txscript/data/taproot-ref/8114bd4cff1787b06e5836915e62486478f693d1 new file mode 100644 index 0000000000..98f85da36c --- /dev/null +++ b/txscript/data/taproot-ref/8114bd4cff1787b06e5836915e62486478f693d1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8114ee0d2c07fd933798fcf7febf9e08b6cf1043 b/txscript/data/taproot-ref/8114ee0d2c07fd933798fcf7febf9e08b6cf1043 new file mode 100644 index 0000000000..7d6da3c09b --- /dev/null +++ b/txscript/data/taproot-ref/8114ee0d2c07fd933798fcf7febf9e08b6cf1043 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/813b01314937089f22d1d64ac7030c5da92ac36d b/txscript/data/taproot-ref/813b01314937089f22d1d64ac7030c5da92ac36d new file mode 100644 index 0000000000..84abd8bb82 --- /dev/null +++ b/txscript/data/taproot-ref/813b01314937089f22d1d64ac7030c5da92ac36d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/814755d13f451119bbd6e341778fcca05d023f99 b/txscript/data/taproot-ref/814755d13f451119bbd6e341778fcca05d023f99 new file mode 100644 index 0000000000..2cfb65c2a8 --- /dev/null +++ b/txscript/data/taproot-ref/814755d13f451119bbd6e341778fcca05d023f99 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8152fa388ef907459fca58c6382e7cf481e8b03f b/txscript/data/taproot-ref/8152fa388ef907459fca58c6382e7cf481e8b03f new file mode 100644 index 0000000000..2338e015aa --- /dev/null +++ b/txscript/data/taproot-ref/8152fa388ef907459fca58c6382e7cf481e8b03f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/816316a3b73af9b70141fff8b2deda8269d38d34 b/txscript/data/taproot-ref/816316a3b73af9b70141fff8b2deda8269d38d34 new file mode 100644 index 0000000000..e752726ad9 --- /dev/null +++ b/txscript/data/taproot-ref/816316a3b73af9b70141fff8b2deda8269d38d34 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/81639ecf4a65a0d2972d186cbca46aa48c408a2b b/txscript/data/taproot-ref/81639ecf4a65a0d2972d186cbca46aa48c408a2b new file mode 100644 index 0000000000..36ccfe8d88 --- /dev/null +++ b/txscript/data/taproot-ref/81639ecf4a65a0d2972d186cbca46aa48c408a2b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/817d2dc89f753f1b403cbbdd6c078eeee50563d1 b/txscript/data/taproot-ref/817d2dc89f753f1b403cbbdd6c078eeee50563d1 new file mode 100644 index 0000000000..80fdab2390 --- /dev/null +++ b/txscript/data/taproot-ref/817d2dc89f753f1b403cbbdd6c078eeee50563d1 @@ -0,0 +1 @@ +{"tx": "0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c40000000009d51e232dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c42000000001c11fa30025f6fa30000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48730f47c39", "prevouts": ["9532570000000000225f202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "3d794e0000000000215a1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["ed9fd964f63d35214f9e8c00b0068cf2068da31bf44e5bc4957beee74745f0d1e21743e8cb3228f9486688a0ec355024ba54f99da996f1ec409e6279b24d6c89"]}}, diff --git a/txscript/data/taproot-ref/81873f88c2fbdb0a58e15e3492b63cb1eeebd61d b/txscript/data/taproot-ref/81873f88c2fbdb0a58e15e3492b63cb1eeebd61d new file mode 100644 index 0000000000..6552f1c92a --- /dev/null +++ b/txscript/data/taproot-ref/81873f88c2fbdb0a58e15e3492b63cb1eeebd61d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/818a1e4250991ce3f414e0f7215308cf2f23f7fd b/txscript/data/taproot-ref/818a1e4250991ce3f414e0f7215308cf2f23f7fd new file mode 100644 index 0000000000..2a3df3e6c5 --- /dev/null +++ b/txscript/data/taproot-ref/818a1e4250991ce3f414e0f7215308cf2f23f7fd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/82050e725b7ee8e6090dcb98775499dc19017c4d b/txscript/data/taproot-ref/82050e725b7ee8e6090dcb98775499dc19017c4d new file mode 100644 index 0000000000..700ff4f217 --- /dev/null +++ b/txscript/data/taproot-ref/82050e725b7ee8e6090dcb98775499dc19017c4d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/826b8362320fe6f06ab5a2f4b4fbf5c94448170f b/txscript/data/taproot-ref/826b8362320fe6f06ab5a2f4b4fbf5c94448170f new file mode 100644 index 0000000000..8f5dfecf5a --- /dev/null +++ b/txscript/data/taproot-ref/826b8362320fe6f06ab5a2f4b4fbf5c94448170f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8283d17b50ed5619f147c5b35a8f94626b7d5b26 b/txscript/data/taproot-ref/8283d17b50ed5619f147c5b35a8f94626b7d5b26 new file mode 100644 index 0000000000..aec3da84e9 --- /dev/null +++ b/txscript/data/taproot-ref/8283d17b50ed5619f147c5b35a8f94626b7d5b26 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/829c3ad6c8ab04d87634c91b6fcd79faa92656fb b/txscript/data/taproot-ref/829c3ad6c8ab04d87634c91b6fcd79faa92656fb new file mode 100644 index 0000000000..84912537ef --- /dev/null +++ b/txscript/data/taproot-ref/829c3ad6c8ab04d87634c91b6fcd79faa92656fb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/82a84993b98a8fb62799914dc21be4be700e7b5d b/txscript/data/taproot-ref/82a84993b98a8fb62799914dc21be4be700e7b5d new file mode 100644 index 0000000000..bef19504ff --- /dev/null +++ b/txscript/data/taproot-ref/82a84993b98a8fb62799914dc21be4be700e7b5d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/82e6db8a76fd387b0eb64cb1d7bf968ef761fb96 b/txscript/data/taproot-ref/82e6db8a76fd387b0eb64cb1d7bf968ef761fb96 new file mode 100644 index 0000000000..fb8982db17 --- /dev/null +++ b/txscript/data/taproot-ref/82e6db8a76fd387b0eb64cb1d7bf968ef761fb96 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/82ec131b824b4c3f3757e1edd238735d0656fc37 b/txscript/data/taproot-ref/82ec131b824b4c3f3757e1edd238735d0656fc37 new file mode 100644 index 0000000000..c54736762c --- /dev/null +++ b/txscript/data/taproot-ref/82ec131b824b4c3f3757e1edd238735d0656fc37 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8336cc9fb782ee91ec2fca64631271cf0078de20 b/txscript/data/taproot-ref/8336cc9fb782ee91ec2fca64631271cf0078de20 new file mode 100644 index 0000000000..97be45eee7 --- /dev/null +++ b/txscript/data/taproot-ref/8336cc9fb782ee91ec2fca64631271cf0078de20 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/833a14196d27bc959251f1d19b9e4e6829d267d5 b/txscript/data/taproot-ref/833a14196d27bc959251f1d19b9e4e6829d267d5 new file mode 100644 index 0000000000..1f3f5862c4 --- /dev/null +++ b/txscript/data/taproot-ref/833a14196d27bc959251f1d19b9e4e6829d267d5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8366f34c8cc56c4971befa8d4905f0f436bf6cda b/txscript/data/taproot-ref/8366f34c8cc56c4971befa8d4905f0f436bf6cda new file mode 100644 index 0000000000..434d309c4a --- /dev/null +++ b/txscript/data/taproot-ref/8366f34c8cc56c4971befa8d4905f0f436bf6cda @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8393e8cc899fa71d1c638c5cb8eea55c40342700 b/txscript/data/taproot-ref/8393e8cc899fa71d1c638c5cb8eea55c40342700 new file mode 100644 index 0000000000..6420768e97 --- /dev/null +++ b/txscript/data/taproot-ref/8393e8cc899fa71d1c638c5cb8eea55c40342700 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/83945bfa970aa433de420b7ac4f4efcc297ec972 b/txscript/data/taproot-ref/83945bfa970aa433de420b7ac4f4efcc297ec972 new file mode 100644 index 0000000000..b5a074058c --- /dev/null +++ b/txscript/data/taproot-ref/83945bfa970aa433de420b7ac4f4efcc297ec972 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/83970d72a6907256d4feab8e061182642c3d4b24 b/txscript/data/taproot-ref/83970d72a6907256d4feab8e061182642c3d4b24 new file mode 100644 index 0000000000..3453047685 --- /dev/null +++ b/txscript/data/taproot-ref/83970d72a6907256d4feab8e061182642c3d4b24 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/83b00e365af084f70ba64981a783c5ec81c0e650 b/txscript/data/taproot-ref/83b00e365af084f70ba64981a783c5ec81c0e650 new file mode 100644 index 0000000000..a61e742cf1 --- /dev/null +++ b/txscript/data/taproot-ref/83b00e365af084f70ba64981a783c5ec81c0e650 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8434ef7375003e0e049d9248cca04a7d89a51736 b/txscript/data/taproot-ref/8434ef7375003e0e049d9248cca04a7d89a51736 new file mode 100644 index 0000000000..273b90e9d7 --- /dev/null +++ b/txscript/data/taproot-ref/8434ef7375003e0e049d9248cca04a7d89a51736 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8442ffd276255dd9c5995c977f30f700234f866f b/txscript/data/taproot-ref/8442ffd276255dd9c5995c977f30f700234f866f new file mode 100644 index 0000000000..c86097d517 --- /dev/null +++ b/txscript/data/taproot-ref/8442ffd276255dd9c5995c977f30f700234f866f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8462f1863bdba9f38df24dbeb39d9be31a8b3d93 b/txscript/data/taproot-ref/8462f1863bdba9f38df24dbeb39d9be31a8b3d93 new file mode 100644 index 0000000000..403dfb1a5c --- /dev/null +++ b/txscript/data/taproot-ref/8462f1863bdba9f38df24dbeb39d9be31a8b3d93 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8478b1cc13202df27bd080e55410e541629423e8 b/txscript/data/taproot-ref/8478b1cc13202df27bd080e55410e541629423e8 new file mode 100644 index 0000000000..8366bb1c92 --- /dev/null +++ b/txscript/data/taproot-ref/8478b1cc13202df27bd080e55410e541629423e8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/847ca904186295e8fd47a4e29885615907cb992e b/txscript/data/taproot-ref/847ca904186295e8fd47a4e29885615907cb992e new file mode 100644 index 0000000000..ef281bba6b --- /dev/null +++ b/txscript/data/taproot-ref/847ca904186295e8fd47a4e29885615907cb992e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/847d38e6322523b12583cde1ac03aa9cb6c11494 b/txscript/data/taproot-ref/847d38e6322523b12583cde1ac03aa9cb6c11494 new file mode 100644 index 0000000000..921b8647b0 --- /dev/null +++ b/txscript/data/taproot-ref/847d38e6322523b12583cde1ac03aa9cb6c11494 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8485b7daa7b9582b7257e4ad6aa767ad9b2c7173 b/txscript/data/taproot-ref/8485b7daa7b9582b7257e4ad6aa767ad9b2c7173 new file mode 100644 index 0000000000..92a3ba4b02 --- /dev/null +++ b/txscript/data/taproot-ref/8485b7daa7b9582b7257e4ad6aa767ad9b2c7173 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/848ef68b2028c2d1d2c774427baef8811e6973c6 b/txscript/data/taproot-ref/848ef68b2028c2d1d2c774427baef8811e6973c6 new file mode 100644 index 0000000000..764601be43 --- /dev/null +++ b/txscript/data/taproot-ref/848ef68b2028c2d1d2c774427baef8811e6973c6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/84b78b9ad073a948405f0b7ab62f9f69118ba8f0 b/txscript/data/taproot-ref/84b78b9ad073a948405f0b7ab62f9f69118ba8f0 new file mode 100644 index 0000000000..3066b77180 --- /dev/null +++ b/txscript/data/taproot-ref/84b78b9ad073a948405f0b7ab62f9f69118ba8f0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/84c54f3da6a5e6fab8e1f0e9e437a602b838b808 b/txscript/data/taproot-ref/84c54f3da6a5e6fab8e1f0e9e437a602b838b808 new file mode 100644 index 0000000000..6a6ac6aae0 --- /dev/null +++ b/txscript/data/taproot-ref/84c54f3da6a5e6fab8e1f0e9e437a602b838b808 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/84d1cf1063766590aee538d2b55b7bd3698c0de7 b/txscript/data/taproot-ref/84d1cf1063766590aee538d2b55b7bd3698c0de7 new file mode 100644 index 0000000000..c5e3ba3c79 --- /dev/null +++ b/txscript/data/taproot-ref/84d1cf1063766590aee538d2b55b7bd3698c0de7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/84dce9fa92c533d455e0c1f97179960220f0a855 b/txscript/data/taproot-ref/84dce9fa92c533d455e0c1f97179960220f0a855 new file mode 100644 index 0000000000..a0706edfc6 --- /dev/null +++ b/txscript/data/taproot-ref/84dce9fa92c533d455e0c1f97179960220f0a855 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/84f74ecd7dcd980cbe8f5c5df3e9de9eb9e2198b b/txscript/data/taproot-ref/84f74ecd7dcd980cbe8f5c5df3e9de9eb9e2198b new file mode 100644 index 0000000000..154a04af71 --- /dev/null +++ b/txscript/data/taproot-ref/84f74ecd7dcd980cbe8f5c5df3e9de9eb9e2198b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/855137df77e723cfc86499f4fdb99f284ce7dfb2 b/txscript/data/taproot-ref/855137df77e723cfc86499f4fdb99f284ce7dfb2 new file mode 100644 index 0000000000..eb998d0c77 --- /dev/null +++ b/txscript/data/taproot-ref/855137df77e723cfc86499f4fdb99f284ce7dfb2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/857a099c2b46ccc02b866b3d0c0eb37858af7f6b b/txscript/data/taproot-ref/857a099c2b46ccc02b866b3d0c0eb37858af7f6b new file mode 100644 index 0000000000..7b2cb0582b --- /dev/null +++ b/txscript/data/taproot-ref/857a099c2b46ccc02b866b3d0c0eb37858af7f6b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/857c4d2b4cbe976e614059e4d9eeb613c69a523b b/txscript/data/taproot-ref/857c4d2b4cbe976e614059e4d9eeb613c69a523b new file mode 100644 index 0000000000..d23b12cfec --- /dev/null +++ b/txscript/data/taproot-ref/857c4d2b4cbe976e614059e4d9eeb613c69a523b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/858fcb46fd11dfff505511ab32c43de93cb923ab b/txscript/data/taproot-ref/858fcb46fd11dfff505511ab32c43de93cb923ab new file mode 100644 index 0000000000..e747e8c511 --- /dev/null +++ b/txscript/data/taproot-ref/858fcb46fd11dfff505511ab32c43de93cb923ab @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8592c80000cf304bf52753ab309ceb04e2652ec5 b/txscript/data/taproot-ref/8592c80000cf304bf52753ab309ceb04e2652ec5 new file mode 100644 index 0000000000..5e7ae0226f --- /dev/null +++ b/txscript/data/taproot-ref/8592c80000cf304bf52753ab309ceb04e2652ec5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/859bf525139277f5088a3ce814f120ba25928ba7 b/txscript/data/taproot-ref/859bf525139277f5088a3ce814f120ba25928ba7 new file mode 100644 index 0000000000..780881d543 --- /dev/null +++ b/txscript/data/taproot-ref/859bf525139277f5088a3ce814f120ba25928ba7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/85c3b1c5bc8469eb9f51ee2b19c514d2dcc9d4e5 b/txscript/data/taproot-ref/85c3b1c5bc8469eb9f51ee2b19c514d2dcc9d4e5 new file mode 100644 index 0000000000..866926cff4 --- /dev/null +++ b/txscript/data/taproot-ref/85c3b1c5bc8469eb9f51ee2b19c514d2dcc9d4e5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/85c9ddc38fbb85bd175bf3ac00a626752b964461 b/txscript/data/taproot-ref/85c9ddc38fbb85bd175bf3ac00a626752b964461 new file mode 100644 index 0000000000..b65e5aec54 --- /dev/null +++ b/txscript/data/taproot-ref/85c9ddc38fbb85bd175bf3ac00a626752b964461 @@ -0,0 +1 @@ +{"tx": "2168928d02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b680100000082a688d3bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0600000000b79a99bf04f55a8e000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ace8020000", "prevouts": ["0ab323000000000017a914c9840c38196e75dd475876fc1e51c080e92b574c87", "5cb06c00000000002353212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["9621b319c232918a7110a0dda37564d742a55c1be3d598ea7d166118b890070cac09138ae5f98033b6f64e501f2c6196913f21224e80329f83922ebf9ff84a92"]}}, diff --git a/txscript/data/taproot-ref/85cd37fe2c7301fdbdedfe4eee2559a27232c9e1 b/txscript/data/taproot-ref/85cd37fe2c7301fdbdedfe4eee2559a27232c9e1 new file mode 100644 index 0000000000..a4adf4713c --- /dev/null +++ b/txscript/data/taproot-ref/85cd37fe2c7301fdbdedfe4eee2559a27232c9e1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/85db7ff2b922cfebbf367553f67005a39f7c7481 b/txscript/data/taproot-ref/85db7ff2b922cfebbf367553f67005a39f7c7481 new file mode 100644 index 0000000000..c67b4336b2 --- /dev/null +++ b/txscript/data/taproot-ref/85db7ff2b922cfebbf367553f67005a39f7c7481 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/85f392952d2f71a976ea2c35e174e534ade34805 b/txscript/data/taproot-ref/85f392952d2f71a976ea2c35e174e534ade34805 new file mode 100644 index 0000000000..76d26ba37b --- /dev/null +++ b/txscript/data/taproot-ref/85f392952d2f71a976ea2c35e174e534ade34805 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/863c74afe345aa2460edf06abd9aa101ade521bf b/txscript/data/taproot-ref/863c74afe345aa2460edf06abd9aa101ade521bf new file mode 100644 index 0000000000..a43487cd26 --- /dev/null +++ b/txscript/data/taproot-ref/863c74afe345aa2460edf06abd9aa101ade521bf @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8641c37d6051843e6ca2af00b13ec220650722d5 b/txscript/data/taproot-ref/8641c37d6051843e6ca2af00b13ec220650722d5 new file mode 100644 index 0000000000..295aeb1d00 --- /dev/null +++ b/txscript/data/taproot-ref/8641c37d6051843e6ca2af00b13ec220650722d5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/86808a5b2f495881fed3418379a96faec86f72a3 b/txscript/data/taproot-ref/86808a5b2f495881fed3418379a96faec86f72a3 new file mode 100644 index 0000000000..6737dff06b --- /dev/null +++ b/txscript/data/taproot-ref/86808a5b2f495881fed3418379a96faec86f72a3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/869a1712bd79edfc9d95461a25217f1b4b203e29 b/txscript/data/taproot-ref/869a1712bd79edfc9d95461a25217f1b4b203e29 new file mode 100644 index 0000000000..84c0798307 --- /dev/null +++ b/txscript/data/taproot-ref/869a1712bd79edfc9d95461a25217f1b4b203e29 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/869e9e9fd462fca683f8b432da94616198c8eb41 b/txscript/data/taproot-ref/869e9e9fd462fca683f8b432da94616198c8eb41 new file mode 100644 index 0000000000..db49b818b6 --- /dev/null +++ b/txscript/data/taproot-ref/869e9e9fd462fca683f8b432da94616198c8eb41 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/86e9313b4a88cc4785b502796f36bd97f1174856 b/txscript/data/taproot-ref/86e9313b4a88cc4785b502796f36bd97f1174856 new file mode 100644 index 0000000000..5592f23f4d --- /dev/null +++ b/txscript/data/taproot-ref/86e9313b4a88cc4785b502796f36bd97f1174856 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/871647145b6c79309648164fe2e9294d7ba23b0b b/txscript/data/taproot-ref/871647145b6c79309648164fe2e9294d7ba23b0b new file mode 100644 index 0000000000..734074abe9 --- /dev/null +++ b/txscript/data/taproot-ref/871647145b6c79309648164fe2e9294d7ba23b0b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/871b6052e7f9a98779e47518bd5f8bf607a0e268 b/txscript/data/taproot-ref/871b6052e7f9a98779e47518bd5f8bf607a0e268 new file mode 100644 index 0000000000..f909413f9f --- /dev/null +++ b/txscript/data/taproot-ref/871b6052e7f9a98779e47518bd5f8bf607a0e268 @@ -0,0 +1 @@ +{"tx": "0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c13010000000be331e3bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6a00000000b0cea3c303fd75cf00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcb3030000", "prevouts": ["6a5f51000000000022512043e98e0a8fa214574b4f7d43d988f280e5f4237220ef6fffc40af5b8eb3be152", "eae27f000000000017a91448964eab407ad5d6e123f59d9280ca7998f71bce87"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "2351212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "witness": ["949576924f61566a81f8e2fc476db988f70735fe3efb5b0b8a3c7745c025d91dfa932233e661c3be0cad5b027933f921b7a5ee56a0d51065e09ac9f6f94f1e16"]}}, diff --git a/txscript/data/taproot-ref/87360adcbd85bcb0816fa5f993fc9a5e14182074 b/txscript/data/taproot-ref/87360adcbd85bcb0816fa5f993fc9a5e14182074 new file mode 100644 index 0000000000..d94b630906 --- /dev/null +++ b/txscript/data/taproot-ref/87360adcbd85bcb0816fa5f993fc9a5e14182074 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/874116a3fba0e5b88378c9825e5b2cd8fe9707c6 b/txscript/data/taproot-ref/874116a3fba0e5b88378c9825e5b2cd8fe9707c6 new file mode 100644 index 0000000000..bc745e1caa --- /dev/null +++ b/txscript/data/taproot-ref/874116a3fba0e5b88378c9825e5b2cd8fe9707c6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/874498dbd2d21fb6b01edf60814088feb89dc02e b/txscript/data/taproot-ref/874498dbd2d21fb6b01edf60814088feb89dc02e new file mode 100644 index 0000000000..577a20d05e --- /dev/null +++ b/txscript/data/taproot-ref/874498dbd2d21fb6b01edf60814088feb89dc02e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/874b8f129a3df7a4c057a29c6d71bfa99137ed88 b/txscript/data/taproot-ref/874b8f129a3df7a4c057a29c6d71bfa99137ed88 new file mode 100644 index 0000000000..39864d0a60 --- /dev/null +++ b/txscript/data/taproot-ref/874b8f129a3df7a4c057a29c6d71bfa99137ed88 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/874c302461e364f71a8f6570728f98611a5c96ce b/txscript/data/taproot-ref/874c302461e364f71a8f6570728f98611a5c96ce new file mode 100644 index 0000000000..770bcad8b1 --- /dev/null +++ b/txscript/data/taproot-ref/874c302461e364f71a8f6570728f98611a5c96ce @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8753f414b84b9ccd0c62553961f88f7c0264c379 b/txscript/data/taproot-ref/8753f414b84b9ccd0c62553961f88f7c0264c379 new file mode 100644 index 0000000000..1335a04e10 --- /dev/null +++ b/txscript/data/taproot-ref/8753f414b84b9ccd0c62553961f88f7c0264c379 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8768655b2d8b6e0cca092c104735354aee0c9b0a b/txscript/data/taproot-ref/8768655b2d8b6e0cca092c104735354aee0c9b0a new file mode 100644 index 0000000000..e0c8119341 --- /dev/null +++ b/txscript/data/taproot-ref/8768655b2d8b6e0cca092c104735354aee0c9b0a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/87d794de1dead52b89760fa5e136596c5b59bc40 b/txscript/data/taproot-ref/87d794de1dead52b89760fa5e136596c5b59bc40 new file mode 100644 index 0000000000..891a2f9619 --- /dev/null +++ b/txscript/data/taproot-ref/87d794de1dead52b89760fa5e136596c5b59bc40 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/87dcc971a3beea2e91a4d7e9643a5539ff94d52f b/txscript/data/taproot-ref/87dcc971a3beea2e91a4d7e9643a5539ff94d52f new file mode 100644 index 0000000000..c4b41b318f --- /dev/null +++ b/txscript/data/taproot-ref/87dcc971a3beea2e91a4d7e9643a5539ff94d52f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/87e1e382d129600c7e7f842f983fa6e87de06c9c b/txscript/data/taproot-ref/87e1e382d129600c7e7f842f983fa6e87de06c9c new file mode 100644 index 0000000000..c4db2b5a92 --- /dev/null +++ b/txscript/data/taproot-ref/87e1e382d129600c7e7f842f983fa6e87de06c9c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/87f0c2e540270b3692ef13bc2b91234c893bea37 b/txscript/data/taproot-ref/87f0c2e540270b3692ef13bc2b91234c893bea37 new file mode 100644 index 0000000000..d0c8913a9c --- /dev/null +++ b/txscript/data/taproot-ref/87f0c2e540270b3692ef13bc2b91234c893bea37 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/87f8602bd7dcfb5af1052f424e7403550ff631de b/txscript/data/taproot-ref/87f8602bd7dcfb5af1052f424e7403550ff631de new file mode 100644 index 0000000000..61255e1ac7 --- /dev/null +++ b/txscript/data/taproot-ref/87f8602bd7dcfb5af1052f424e7403550ff631de @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/87ffa0846cd9a6bebb41a9d3d719ba376c69285f b/txscript/data/taproot-ref/87ffa0846cd9a6bebb41a9d3d719ba376c69285f new file mode 100644 index 0000000000..614bd158bd --- /dev/null +++ b/txscript/data/taproot-ref/87ffa0846cd9a6bebb41a9d3d719ba376c69285f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/880f03671efb6dcc3f3fdaae9491625f46f6e4ac b/txscript/data/taproot-ref/880f03671efb6dcc3f3fdaae9491625f46f6e4ac new file mode 100644 index 0000000000..34d6e4a624 --- /dev/null +++ b/txscript/data/taproot-ref/880f03671efb6dcc3f3fdaae9491625f46f6e4ac @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8829fdc647553393e0d223a098067bdf44dd2c3e b/txscript/data/taproot-ref/8829fdc647553393e0d223a098067bdf44dd2c3e new file mode 100644 index 0000000000..29440d4054 --- /dev/null +++ b/txscript/data/taproot-ref/8829fdc647553393e0d223a098067bdf44dd2c3e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/882c32949367f4f504b543399fa13b4f4118344d b/txscript/data/taproot-ref/882c32949367f4f504b543399fa13b4f4118344d new file mode 100644 index 0000000000..95bf807f1f --- /dev/null +++ b/txscript/data/taproot-ref/882c32949367f4f504b543399fa13b4f4118344d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/884b9c73958e305260b7aa5b9969660166f550c3 b/txscript/data/taproot-ref/884b9c73958e305260b7aa5b9969660166f550c3 new file mode 100644 index 0000000000..1066c1a040 --- /dev/null +++ b/txscript/data/taproot-ref/884b9c73958e305260b7aa5b9969660166f550c3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/885db56c9eb82324c5a0f7e7aebd3d215505a5d3 b/txscript/data/taproot-ref/885db56c9eb82324c5a0f7e7aebd3d215505a5d3 new file mode 100644 index 0000000000..83b2c2b591 --- /dev/null +++ b/txscript/data/taproot-ref/885db56c9eb82324c5a0f7e7aebd3d215505a5d3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/88684adb319365b522f644e785033cac77380e06 b/txscript/data/taproot-ref/88684adb319365b522f644e785033cac77380e06 new file mode 100644 index 0000000000..1110bc1e50 --- /dev/null +++ b/txscript/data/taproot-ref/88684adb319365b522f644e785033cac77380e06 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/88797c1357072ec5f6d7a77f8f554fdf14935742 b/txscript/data/taproot-ref/88797c1357072ec5f6d7a77f8f554fdf14935742 new file mode 100644 index 0000000000..d1435ddf1f --- /dev/null +++ b/txscript/data/taproot-ref/88797c1357072ec5f6d7a77f8f554fdf14935742 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/88d3c033edc04d341651610ce654caab89f0c589 b/txscript/data/taproot-ref/88d3c033edc04d341651610ce654caab89f0c589 new file mode 100644 index 0000000000..46b5afdea5 --- /dev/null +++ b/txscript/data/taproot-ref/88d3c033edc04d341651610ce654caab89f0c589 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/88e2041ce84c5a5fd2b056669856844691b520a5 b/txscript/data/taproot-ref/88e2041ce84c5a5fd2b056669856844691b520a5 new file mode 100644 index 0000000000..8a004d02a6 --- /dev/null +++ b/txscript/data/taproot-ref/88e2041ce84c5a5fd2b056669856844691b520a5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/88e2266275388545e1f8f54b8fdbe89bbac43274 b/txscript/data/taproot-ref/88e2266275388545e1f8f54b8fdbe89bbac43274 new file mode 100644 index 0000000000..ace6057c5c --- /dev/null +++ b/txscript/data/taproot-ref/88e2266275388545e1f8f54b8fdbe89bbac43274 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/88ec99f421c2381e497fe2fc13b4f6dd8e8786d1 b/txscript/data/taproot-ref/88ec99f421c2381e497fe2fc13b4f6dd8e8786d1 new file mode 100644 index 0000000000..ef1391e78e --- /dev/null +++ b/txscript/data/taproot-ref/88ec99f421c2381e497fe2fc13b4f6dd8e8786d1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/88f24d3d0ee361f07b6a968b39726f1326ec9166 b/txscript/data/taproot-ref/88f24d3d0ee361f07b6a968b39726f1326ec9166 new file mode 100644 index 0000000000..5f63a5e21d --- /dev/null +++ b/txscript/data/taproot-ref/88f24d3d0ee361f07b6a968b39726f1326ec9166 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/89063488083093835287b1f9c18b2a7944664176 b/txscript/data/taproot-ref/89063488083093835287b1f9c18b2a7944664176 new file mode 100644 index 0000000000..6bc9869591 --- /dev/null +++ b/txscript/data/taproot-ref/89063488083093835287b1f9c18b2a7944664176 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/892cc3023c1245c75dd88475a0e49fe4d5063dd9 b/txscript/data/taproot-ref/892cc3023c1245c75dd88475a0e49fe4d5063dd9 new file mode 100644 index 0000000000..3f5fde2fb6 --- /dev/null +++ b/txscript/data/taproot-ref/892cc3023c1245c75dd88475a0e49fe4d5063dd9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8951f7b39335a2e501908ed76548372ea5979b19 b/txscript/data/taproot-ref/8951f7b39335a2e501908ed76548372ea5979b19 new file mode 100644 index 0000000000..fd08186495 --- /dev/null +++ b/txscript/data/taproot-ref/8951f7b39335a2e501908ed76548372ea5979b19 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/895da8e67657010ab55eddf2b5e50156498f59c1 b/txscript/data/taproot-ref/895da8e67657010ab55eddf2b5e50156498f59c1 new file mode 100644 index 0000000000..8e78b3bdb7 --- /dev/null +++ b/txscript/data/taproot-ref/895da8e67657010ab55eddf2b5e50156498f59c1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/89843a3d7b0d8895dac3541e10e30e0400dc0f5e b/txscript/data/taproot-ref/89843a3d7b0d8895dac3541e10e30e0400dc0f5e new file mode 100644 index 0000000000..3ba6f1f40c --- /dev/null +++ b/txscript/data/taproot-ref/89843a3d7b0d8895dac3541e10e30e0400dc0f5e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/899da8e446fd56d043e8d9fbd5821c09500c8654 b/txscript/data/taproot-ref/899da8e446fd56d043e8d9fbd5821c09500c8654 new file mode 100644 index 0000000000..360ab509d8 --- /dev/null +++ b/txscript/data/taproot-ref/899da8e446fd56d043e8d9fbd5821c09500c8654 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/89c130024a3230c8800c10efba7110244146ea67 b/txscript/data/taproot-ref/89c130024a3230c8800c10efba7110244146ea67 new file mode 100644 index 0000000000..7a6dc7634c --- /dev/null +++ b/txscript/data/taproot-ref/89c130024a3230c8800c10efba7110244146ea67 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/89d3b93983fbc2ea121d1407d7944b74f44c67ae b/txscript/data/taproot-ref/89d3b93983fbc2ea121d1407d7944b74f44c67ae new file mode 100644 index 0000000000..9580d633b8 --- /dev/null +++ b/txscript/data/taproot-ref/89d3b93983fbc2ea121d1407d7944b74f44c67ae @@ -0,0 +1 @@ +{"tx": "0200000001f85ef04c4139d614d10d1a30e75a9f6421df67317126da87b2f877c2ab20246300000000002f8f319604f3a7861511000000160014f2ca549f2f8613e81a7cb48fd110f37b7fb1529a580200000000000017a91402e53bc18808b3955166f5113b83b265fa421e9987580200000000000017a9143fd5279308772d81081a68d882f81a7ac08fe1d9875802000000000000160014bf1a19526352877c6b170dd8786dc91b1610ae1ceb8f3f5a", "prevouts": ["dd6589151100000022512034153a16ef8458ec2412ba42dd5be0fabd8b4c2f532d179dc958fc1fca3cae43"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY", "comment": "inactive/keypath_invalidsig", "success": {"scriptSig": "", "witness": ["2acb152055acd589ab559fab80591212866cc02b4a6967cab7e92676567cdf906fe0cb89855e0f7bf24b1b402af7b12ec05358eef773b32c861a8e53280322b4"]}}, diff --git a/txscript/data/taproot-ref/89db7a1ad6220b1635de9734c32a76ab69bb70e3 b/txscript/data/taproot-ref/89db7a1ad6220b1635de9734c32a76ab69bb70e3 new file mode 100644 index 0000000000..8ca1a4ed41 --- /dev/null +++ b/txscript/data/taproot-ref/89db7a1ad6220b1635de9734c32a76ab69bb70e3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/89df1562d15e81161f4c47827c0802d44a116dcd b/txscript/data/taproot-ref/89df1562d15e81161f4c47827c0802d44a116dcd new file mode 100644 index 0000000000..84ba97ad28 --- /dev/null +++ b/txscript/data/taproot-ref/89df1562d15e81161f4c47827c0802d44a116dcd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/89e008ea516ef46108ee4b85055e4cba034e75c2 b/txscript/data/taproot-ref/89e008ea516ef46108ee4b85055e4cba034e75c2 new file mode 100644 index 0000000000..8df3ee4717 --- /dev/null +++ b/txscript/data/taproot-ref/89e008ea516ef46108ee4b85055e4cba034e75c2 @@ -0,0 +1 @@ +{"tx": "01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45b010000002378e255bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2701000000bcdd8d74044f8ea9000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478740000000", "prevouts": ["780d3e000000000017a91481d4142ddc5ce7a3de4047bd48b623419b5bc45e87", "ab0c6d0000000000225120eec26bd33d4c7b88cfedb1ec4d1edaf2070bd273924a77ba1006105de9dd5258"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "21591f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b", "witness": ["5b1ac49476ce8752c6dc77f30c28a07a3c6555a0b869ccadbc97ddecfc5a9a87f24eb13ce140b2c2dadfb72d43206eb9e2965523aa3f02d2e478c54bb4a4e034"]}}, diff --git a/txscript/data/taproot-ref/89fa19afc7b932f3749a095009d1bf1c6162c607 b/txscript/data/taproot-ref/89fa19afc7b932f3749a095009d1bf1c6162c607 new file mode 100644 index 0000000000..5767afb631 --- /dev/null +++ b/txscript/data/taproot-ref/89fa19afc7b932f3749a095009d1bf1c6162c607 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8a0a41ec1bffbaf105b7b5b3784d680d00446960 b/txscript/data/taproot-ref/8a0a41ec1bffbaf105b7b5b3784d680d00446960 new file mode 100644 index 0000000000..c6884998a5 --- /dev/null +++ b/txscript/data/taproot-ref/8a0a41ec1bffbaf105b7b5b3784d680d00446960 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8a0ad7fc3cf79a721233622b6ae7a4bfc52c228a b/txscript/data/taproot-ref/8a0ad7fc3cf79a721233622b6ae7a4bfc52c228a new file mode 100644 index 0000000000..ecd97b97ba --- /dev/null +++ b/txscript/data/taproot-ref/8a0ad7fc3cf79a721233622b6ae7a4bfc52c228a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8a2775fc1b4fdf627698087dbc89fc1a3b0943be b/txscript/data/taproot-ref/8a2775fc1b4fdf627698087dbc89fc1a3b0943be new file mode 100644 index 0000000000..13f64d365c --- /dev/null +++ b/txscript/data/taproot-ref/8a2775fc1b4fdf627698087dbc89fc1a3b0943be @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8a289fe11f09a8013015d4bdd383c4d26de1f483 b/txscript/data/taproot-ref/8a289fe11f09a8013015d4bdd383c4d26de1f483 new file mode 100644 index 0000000000..ac1991494d --- /dev/null +++ b/txscript/data/taproot-ref/8a289fe11f09a8013015d4bdd383c4d26de1f483 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8a29d68c4034560207bd08a36c47e26953bebe3f b/txscript/data/taproot-ref/8a29d68c4034560207bd08a36c47e26953bebe3f new file mode 100644 index 0000000000..494b38d548 --- /dev/null +++ b/txscript/data/taproot-ref/8a29d68c4034560207bd08a36c47e26953bebe3f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8a3477e0575b2a93269f750c0395201cd0f19a37 b/txscript/data/taproot-ref/8a3477e0575b2a93269f750c0395201cd0f19a37 new file mode 100644 index 0000000000..3d3909f205 --- /dev/null +++ b/txscript/data/taproot-ref/8a3477e0575b2a93269f750c0395201cd0f19a37 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8a3c9306c70ceb610d6f1f738df6679eabff4238 b/txscript/data/taproot-ref/8a3c9306c70ceb610d6f1f738df6679eabff4238 new file mode 100644 index 0000000000..465e7ad769 --- /dev/null +++ b/txscript/data/taproot-ref/8a3c9306c70ceb610d6f1f738df6679eabff4238 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8a52da0771f3d868955501e901d2540538f4d521 b/txscript/data/taproot-ref/8a52da0771f3d868955501e901d2540538f4d521 new file mode 100644 index 0000000000..97d52e1487 --- /dev/null +++ b/txscript/data/taproot-ref/8a52da0771f3d868955501e901d2540538f4d521 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8a7bd56f4854fd39ca2b9dac03cf4e4f92a1b93d b/txscript/data/taproot-ref/8a7bd56f4854fd39ca2b9dac03cf4e4f92a1b93d new file mode 100644 index 0000000000..8f80f9b6d7 --- /dev/null +++ b/txscript/data/taproot-ref/8a7bd56f4854fd39ca2b9dac03cf4e4f92a1b93d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8a8928f98f7dd800744cfcdbefeff96b97543b76 b/txscript/data/taproot-ref/8a8928f98f7dd800744cfcdbefeff96b97543b76 new file mode 100644 index 0000000000..a5d083f583 --- /dev/null +++ b/txscript/data/taproot-ref/8a8928f98f7dd800744cfcdbefeff96b97543b76 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8a95cc474b746e69625f0fe8c262c07a37a82a7d b/txscript/data/taproot-ref/8a95cc474b746e69625f0fe8c262c07a37a82a7d new file mode 100644 index 0000000000..d5c2872406 --- /dev/null +++ b/txscript/data/taproot-ref/8a95cc474b746e69625f0fe8c262c07a37a82a7d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8ab6f611cd721ca128cb8f5ea3078c1b431d5704 b/txscript/data/taproot-ref/8ab6f611cd721ca128cb8f5ea3078c1b431d5704 new file mode 100644 index 0000000000..c7c5d45c21 --- /dev/null +++ b/txscript/data/taproot-ref/8ab6f611cd721ca128cb8f5ea3078c1b431d5704 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8abdd04f7c724f0a762d03fb6fb80e698280ae9c b/txscript/data/taproot-ref/8abdd04f7c724f0a762d03fb6fb80e698280ae9c new file mode 100644 index 0000000000..c0bad46e33 --- /dev/null +++ b/txscript/data/taproot-ref/8abdd04f7c724f0a762d03fb6fb80e698280ae9c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8b08333db48411d829619458a66585a39efcbb11 b/txscript/data/taproot-ref/8b08333db48411d829619458a66585a39efcbb11 new file mode 100644 index 0000000000..6e29548c63 --- /dev/null +++ b/txscript/data/taproot-ref/8b08333db48411d829619458a66585a39efcbb11 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8b2cadafb5c90652623fe20f1da4fa65454b1764 b/txscript/data/taproot-ref/8b2cadafb5c90652623fe20f1da4fa65454b1764 new file mode 100644 index 0000000000..5d867c97df --- /dev/null +++ b/txscript/data/taproot-ref/8b2cadafb5c90652623fe20f1da4fa65454b1764 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8b379a5db43a90e8d77da62355f3ac86f95b1422 b/txscript/data/taproot-ref/8b379a5db43a90e8d77da62355f3ac86f95b1422 new file mode 100644 index 0000000000..7618477a46 --- /dev/null +++ b/txscript/data/taproot-ref/8b379a5db43a90e8d77da62355f3ac86f95b1422 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8b436810adfe76e9f0a84f1a2382284cefc4128a b/txscript/data/taproot-ref/8b436810adfe76e9f0a84f1a2382284cefc4128a new file mode 100644 index 0000000000..52b6003bb7 --- /dev/null +++ b/txscript/data/taproot-ref/8b436810adfe76e9f0a84f1a2382284cefc4128a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8b4a8862bbb6306cc7b4473bba476bcaf6383aee b/txscript/data/taproot-ref/8b4a8862bbb6306cc7b4473bba476bcaf6383aee new file mode 100644 index 0000000000..4983f84bd2 --- /dev/null +++ b/txscript/data/taproot-ref/8b4a8862bbb6306cc7b4473bba476bcaf6383aee @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8b5c3d67f71726b53372b58a37b41fce4a30a5ac b/txscript/data/taproot-ref/8b5c3d67f71726b53372b58a37b41fce4a30a5ac new file mode 100644 index 0000000000..2569544acf --- /dev/null +++ b/txscript/data/taproot-ref/8b5c3d67f71726b53372b58a37b41fce4a30a5ac @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8b5c7dbd04ac3065bf6c8164f3068ebc910ddc30 b/txscript/data/taproot-ref/8b5c7dbd04ac3065bf6c8164f3068ebc910ddc30 new file mode 100644 index 0000000000..d96c5a4755 --- /dev/null +++ b/txscript/data/taproot-ref/8b5c7dbd04ac3065bf6c8164f3068ebc910ddc30 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8b714927de7515d6467407861bea2d1b6816f769 b/txscript/data/taproot-ref/8b714927de7515d6467407861bea2d1b6816f769 new file mode 100644 index 0000000000..7bf99e2eb2 --- /dev/null +++ b/txscript/data/taproot-ref/8b714927de7515d6467407861bea2d1b6816f769 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8b7781da37cae546b0800cc96db74dfb1988fa5d b/txscript/data/taproot-ref/8b7781da37cae546b0800cc96db74dfb1988fa5d new file mode 100644 index 0000000000..a84105428d --- /dev/null +++ b/txscript/data/taproot-ref/8b7781da37cae546b0800cc96db74dfb1988fa5d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8b8235aeb63d5111ff81b6406893e2c114f3d163 b/txscript/data/taproot-ref/8b8235aeb63d5111ff81b6406893e2c114f3d163 new file mode 100644 index 0000000000..0823aed2f3 --- /dev/null +++ b/txscript/data/taproot-ref/8b8235aeb63d5111ff81b6406893e2c114f3d163 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8b926866858180ba6c9e1a87ace930fdf129b59b b/txscript/data/taproot-ref/8b926866858180ba6c9e1a87ace930fdf129b59b new file mode 100644 index 0000000000..ea14ab5efc --- /dev/null +++ b/txscript/data/taproot-ref/8b926866858180ba6c9e1a87ace930fdf129b59b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8b9de640b20beae0f41a3d88dacf8e7c8c00e4a9 b/txscript/data/taproot-ref/8b9de640b20beae0f41a3d88dacf8e7c8c00e4a9 new file mode 100644 index 0000000000..33f32e2d98 --- /dev/null +++ b/txscript/data/taproot-ref/8b9de640b20beae0f41a3d88dacf8e7c8c00e4a9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8babec8da5a26469095793b097811d07f256a5e9 b/txscript/data/taproot-ref/8babec8da5a26469095793b097811d07f256a5e9 new file mode 100644 index 0000000000..3aad8cd052 --- /dev/null +++ b/txscript/data/taproot-ref/8babec8da5a26469095793b097811d07f256a5e9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8c4cbb21d02e5d466fb2539022255760626149f2 b/txscript/data/taproot-ref/8c4cbb21d02e5d466fb2539022255760626149f2 new file mode 100644 index 0000000000..af02cc01bc --- /dev/null +++ b/txscript/data/taproot-ref/8c4cbb21d02e5d466fb2539022255760626149f2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8c504464b5b4239a47fd8d4b185c3e0e1b6c1af0 b/txscript/data/taproot-ref/8c504464b5b4239a47fd8d4b185c3e0e1b6c1af0 new file mode 100644 index 0000000000..00a17e0724 --- /dev/null +++ b/txscript/data/taproot-ref/8c504464b5b4239a47fd8d4b185c3e0e1b6c1af0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8c716ab740c917b4df170efbc22b4e47873d8e3d b/txscript/data/taproot-ref/8c716ab740c917b4df170efbc22b4e47873d8e3d new file mode 100644 index 0000000000..7f4ce7892d --- /dev/null +++ b/txscript/data/taproot-ref/8c716ab740c917b4df170efbc22b4e47873d8e3d @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/8c7dc16b0e4c9ef242cc7ca7264ea3a4cb62a9bd b/txscript/data/taproot-ref/8c7dc16b0e4c9ef242cc7ca7264ea3a4cb62a9bd new file mode 100644 index 0000000000..f528e4a09b --- /dev/null +++ b/txscript/data/taproot-ref/8c7dc16b0e4c9ef242cc7ca7264ea3a4cb62a9bd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8c87d28e9f82d8cb2da362853cbfd7f6ed73becd b/txscript/data/taproot-ref/8c87d28e9f82d8cb2da362853cbfd7f6ed73becd new file mode 100644 index 0000000000..c543de899b --- /dev/null +++ b/txscript/data/taproot-ref/8c87d28e9f82d8cb2da362853cbfd7f6ed73becd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8cac7b8d77d23a0085a03a673ee2021520fbabea b/txscript/data/taproot-ref/8cac7b8d77d23a0085a03a673ee2021520fbabea new file mode 100644 index 0000000000..7076d914a1 --- /dev/null +++ b/txscript/data/taproot-ref/8cac7b8d77d23a0085a03a673ee2021520fbabea @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8cd544fbd46d49e76648955888fc3047bf5e24bc b/txscript/data/taproot-ref/8cd544fbd46d49e76648955888fc3047bf5e24bc new file mode 100644 index 0000000000..c1ef24e01e --- /dev/null +++ b/txscript/data/taproot-ref/8cd544fbd46d49e76648955888fc3047bf5e24bc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8cde25f4590bc7a0cb88896228ad8d28ecb9641a b/txscript/data/taproot-ref/8cde25f4590bc7a0cb88896228ad8d28ecb9641a new file mode 100644 index 0000000000..f30ab708d5 --- /dev/null +++ b/txscript/data/taproot-ref/8cde25f4590bc7a0cb88896228ad8d28ecb9641a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8cf7c389a03e6d9d8cdd4dc0ee8615f54cccd395 b/txscript/data/taproot-ref/8cf7c389a03e6d9d8cdd4dc0ee8615f54cccd395 new file mode 100644 index 0000000000..21deebc8fa --- /dev/null +++ b/txscript/data/taproot-ref/8cf7c389a03e6d9d8cdd4dc0ee8615f54cccd395 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/8cfbcd30e59e458884ca65687215ef8a39fa420b b/txscript/data/taproot-ref/8cfbcd30e59e458884ca65687215ef8a39fa420b new file mode 100644 index 0000000000..cf8b514ba0 --- /dev/null +++ b/txscript/data/taproot-ref/8cfbcd30e59e458884ca65687215ef8a39fa420b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8d2e1d4e20c8a37b8483b0636a53106414b2e098 b/txscript/data/taproot-ref/8d2e1d4e20c8a37b8483b0636a53106414b2e098 new file mode 100644 index 0000000000..244df6fd67 --- /dev/null +++ b/txscript/data/taproot-ref/8d2e1d4e20c8a37b8483b0636a53106414b2e098 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8d84c17e2d2a5f1b483ec417d4084cff8a83bd8b b/txscript/data/taproot-ref/8d84c17e2d2a5f1b483ec417d4084cff8a83bd8b new file mode 100644 index 0000000000..b8873ae0c1 --- /dev/null +++ b/txscript/data/taproot-ref/8d84c17e2d2a5f1b483ec417d4084cff8a83bd8b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8dad5eca9780e98722de60bdf4209e99730b7ce0 b/txscript/data/taproot-ref/8dad5eca9780e98722de60bdf4209e99730b7ce0 new file mode 100644 index 0000000000..0ea191f74c --- /dev/null +++ b/txscript/data/taproot-ref/8dad5eca9780e98722de60bdf4209e99730b7ce0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8db878b9f4d8758552ba375e70b1c319d8ca0248 b/txscript/data/taproot-ref/8db878b9f4d8758552ba375e70b1c319d8ca0248 new file mode 100644 index 0000000000..ec2675f9f2 --- /dev/null +++ b/txscript/data/taproot-ref/8db878b9f4d8758552ba375e70b1c319d8ca0248 @@ -0,0 +1 @@ +{"tx": "0100000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c30010000006ac7d40b042bcd4b0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47877c030000", "prevouts": ["b7da4d000000000017a914b60a534933f6e50f3846e396b9868efc9e681f4187"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "225c202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "witness": ["4182c373cf43d0dd9bf6414da623c57558ab25f87b66cb8aedf074334ca027beb6cd78beb6752e2cbb85dac453db9d5daa3f06470db784573f68e4d75e673e9c"]}}, diff --git a/txscript/data/taproot-ref/8dceab2924460f1a418835afa3ff5d4bde00914a b/txscript/data/taproot-ref/8dceab2924460f1a418835afa3ff5d4bde00914a new file mode 100644 index 0000000000..ca5615205e --- /dev/null +++ b/txscript/data/taproot-ref/8dceab2924460f1a418835afa3ff5d4bde00914a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8dd1413b2a30d480170c4918b00b9b7abe7ae2c6 b/txscript/data/taproot-ref/8dd1413b2a30d480170c4918b00b9b7abe7ae2c6 new file mode 100644 index 0000000000..1664d000d7 --- /dev/null +++ b/txscript/data/taproot-ref/8dd1413b2a30d480170c4918b00b9b7abe7ae2c6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8de4d54ede6f78c61866173f8b1096d7f5e3f478 b/txscript/data/taproot-ref/8de4d54ede6f78c61866173f8b1096d7f5e3f478 new file mode 100644 index 0000000000..f7411e8169 --- /dev/null +++ b/txscript/data/taproot-ref/8de4d54ede6f78c61866173f8b1096d7f5e3f478 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8e0a71d16611cdac906bb4dece9fbf87d1a0fc8b b/txscript/data/taproot-ref/8e0a71d16611cdac906bb4dece9fbf87d1a0fc8b new file mode 100644 index 0000000000..6a5fb05a25 --- /dev/null +++ b/txscript/data/taproot-ref/8e0a71d16611cdac906bb4dece9fbf87d1a0fc8b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8e1a1f4379046e33058d6b3df5184a181b98a2b5 b/txscript/data/taproot-ref/8e1a1f4379046e33058d6b3df5184a181b98a2b5 new file mode 100644 index 0000000000..f669a9ed14 --- /dev/null +++ b/txscript/data/taproot-ref/8e1a1f4379046e33058d6b3df5184a181b98a2b5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8e38afa0e7c920bbb4aec155f70d1940028204ee b/txscript/data/taproot-ref/8e38afa0e7c920bbb4aec155f70d1940028204ee new file mode 100644 index 0000000000..d70e10f953 --- /dev/null +++ b/txscript/data/taproot-ref/8e38afa0e7c920bbb4aec155f70d1940028204ee @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8ea1e2b4445b668065a333641c17f3c6038f2f27 b/txscript/data/taproot-ref/8ea1e2b4445b668065a333641c17f3c6038f2f27 new file mode 100644 index 0000000000..3df01eb11b --- /dev/null +++ b/txscript/data/taproot-ref/8ea1e2b4445b668065a333641c17f3c6038f2f27 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8eb143cfc057b1ffa8e90069a1d1ff91a90ac794 b/txscript/data/taproot-ref/8eb143cfc057b1ffa8e90069a1d1ff91a90ac794 new file mode 100644 index 0000000000..60e7c96fa2 --- /dev/null +++ b/txscript/data/taproot-ref/8eb143cfc057b1ffa8e90069a1d1ff91a90ac794 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8ebc6173196e2c3ad4ea6d665b4893fd67690d70 b/txscript/data/taproot-ref/8ebc6173196e2c3ad4ea6d665b4893fd67690d70 new file mode 100644 index 0000000000..aeefa32bf0 --- /dev/null +++ b/txscript/data/taproot-ref/8ebc6173196e2c3ad4ea6d665b4893fd67690d70 @@ -0,0 +1 @@ +{"tx": "c924110102bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff1010000009d574b958bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46900000000c2a4e1b8022e86a90000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a621a7f84a", "prevouts": ["fc546d0000000000165d142540f27e90740933c99d4f17ab2dfc6c82951cfb", "a0373e000000000022512024241b8c28db08f46e2039187a480378b2a1ee734bde764c6e80647709b09b47"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["56c614673f4398579993d3f4aaf119ab2881e992735707c31e57e1b6ba410e5c388597bf331c1ce9348b07097e077feff8c24a499b9048a615ad9d4426845dfc"]}}, diff --git a/txscript/data/taproot-ref/8ee6b6a7957bf8ed03aa4b95dbc232e5ba56ead5 b/txscript/data/taproot-ref/8ee6b6a7957bf8ed03aa4b95dbc232e5ba56ead5 new file mode 100644 index 0000000000..2860220070 --- /dev/null +++ b/txscript/data/taproot-ref/8ee6b6a7957bf8ed03aa4b95dbc232e5ba56ead5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8ef96afc00349b4248ec31f4755d1020b7fdda03 b/txscript/data/taproot-ref/8ef96afc00349b4248ec31f4755d1020b7fdda03 new file mode 100644 index 0000000000..98ffc58700 --- /dev/null +++ b/txscript/data/taproot-ref/8ef96afc00349b4248ec31f4755d1020b7fdda03 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8f07475a5f9d43a948b3b96452aea50918e4b9b7 b/txscript/data/taproot-ref/8f07475a5f9d43a948b3b96452aea50918e4b9b7 new file mode 100644 index 0000000000..aac4f275b7 --- /dev/null +++ b/txscript/data/taproot-ref/8f07475a5f9d43a948b3b96452aea50918e4b9b7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8f0862b153c849b8d035fa189f7ec654f8b3e862 b/txscript/data/taproot-ref/8f0862b153c849b8d035fa189f7ec654f8b3e862 new file mode 100644 index 0000000000..0cebb522a9 --- /dev/null +++ b/txscript/data/taproot-ref/8f0862b153c849b8d035fa189f7ec654f8b3e862 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8f0aa9d861c14d5c32d60092ba04c2253666c4c5 b/txscript/data/taproot-ref/8f0aa9d861c14d5c32d60092ba04c2253666c4c5 new file mode 100644 index 0000000000..9920489e8f --- /dev/null +++ b/txscript/data/taproot-ref/8f0aa9d861c14d5c32d60092ba04c2253666c4c5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8f4ba01ca74a466747b89a116a26047e58536ef9 b/txscript/data/taproot-ref/8f4ba01ca74a466747b89a116a26047e58536ef9 new file mode 100644 index 0000000000..d95adc9d09 --- /dev/null +++ b/txscript/data/taproot-ref/8f4ba01ca74a466747b89a116a26047e58536ef9 @@ -0,0 +1 @@ +{"tx": "0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cee00000000168bbd8bbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5e010000006458ed8f0459b6b50000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a607030000", "prevouts": ["7ea84f00000000001658142540f27e90740933c99d4f17ab2dfc6c82951cfb", "3dc468000000000017a91477661b6925aaf216859ba3f511d1eeb98029e4cd87"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["11b78558c296e038f53e1518c4e81c6eceb9ddd85c9f10faa08f9aa192446b2615dde6ff920d86ef09b7dad738c2cdab602d5cedfddfa1deac7365c5e8e1275f"]}}, diff --git a/txscript/data/taproot-ref/8f56d7ddb9c736b9c89113453c379ec0a21341f9 b/txscript/data/taproot-ref/8f56d7ddb9c736b9c89113453c379ec0a21341f9 new file mode 100644 index 0000000000..dd02866cec --- /dev/null +++ b/txscript/data/taproot-ref/8f56d7ddb9c736b9c89113453c379ec0a21341f9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8f7ed4f89eb5a042d9a19a78e61c47e5c984a9fa b/txscript/data/taproot-ref/8f7ed4f89eb5a042d9a19a78e61c47e5c984a9fa new file mode 100644 index 0000000000..cdcd0b6d7c --- /dev/null +++ b/txscript/data/taproot-ref/8f7ed4f89eb5a042d9a19a78e61c47e5c984a9fa @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8f94c8c6a37bcc91d7a39416023f9d78ff08129a b/txscript/data/taproot-ref/8f94c8c6a37bcc91d7a39416023f9d78ff08129a new file mode 100644 index 0000000000..fdd901a404 --- /dev/null +++ b/txscript/data/taproot-ref/8f94c8c6a37bcc91d7a39416023f9d78ff08129a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/8fc0dcb82f3f88e6c20e123adddbce9afa79dd7e b/txscript/data/taproot-ref/8fc0dcb82f3f88e6c20e123adddbce9afa79dd7e new file mode 100644 index 0000000000..967534bbfb --- /dev/null +++ b/txscript/data/taproot-ref/8fc0dcb82f3f88e6c20e123adddbce9afa79dd7e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/901261518c53841cdeb55041f748183f25fbdb6f b/txscript/data/taproot-ref/901261518c53841cdeb55041f748183f25fbdb6f new file mode 100644 index 0000000000..0e9b26c5f3 --- /dev/null +++ b/txscript/data/taproot-ref/901261518c53841cdeb55041f748183f25fbdb6f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9014cd1a175ea66532264c818ac4692ed805357f b/txscript/data/taproot-ref/9014cd1a175ea66532264c818ac4692ed805357f new file mode 100644 index 0000000000..d58d4a08d6 --- /dev/null +++ b/txscript/data/taproot-ref/9014cd1a175ea66532264c818ac4692ed805357f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/902fc67f6a0dd7c17809ac0002972da218f32b8c b/txscript/data/taproot-ref/902fc67f6a0dd7c17809ac0002972da218f32b8c new file mode 100644 index 0000000000..41381e5c9b --- /dev/null +++ b/txscript/data/taproot-ref/902fc67f6a0dd7c17809ac0002972da218f32b8c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/90439abb1bce7df95926ac69fbe35e9a75849704 b/txscript/data/taproot-ref/90439abb1bce7df95926ac69fbe35e9a75849704 new file mode 100644 index 0000000000..b5104d1802 --- /dev/null +++ b/txscript/data/taproot-ref/90439abb1bce7df95926ac69fbe35e9a75849704 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/906de10a0641d6cd4c0dd422fe885c2f9691128a b/txscript/data/taproot-ref/906de10a0641d6cd4c0dd422fe885c2f9691128a new file mode 100644 index 0000000000..b8bf0b6d09 --- /dev/null +++ b/txscript/data/taproot-ref/906de10a0641d6cd4c0dd422fe885c2f9691128a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9076f59736d1a417df0e4e53465ba7f80da49859 b/txscript/data/taproot-ref/9076f59736d1a417df0e4e53465ba7f80da49859 new file mode 100644 index 0000000000..3f96220d31 --- /dev/null +++ b/txscript/data/taproot-ref/9076f59736d1a417df0e4e53465ba7f80da49859 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/909f04b9af20cf2cb275ec1cf722f9a40b234fdf b/txscript/data/taproot-ref/909f04b9af20cf2cb275ec1cf722f9a40b234fdf new file mode 100644 index 0000000000..45802fa046 --- /dev/null +++ b/txscript/data/taproot-ref/909f04b9af20cf2cb275ec1cf722f9a40b234fdf @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/90b75e22907115340a987929a776f6f3bea1d9b5 b/txscript/data/taproot-ref/90b75e22907115340a987929a776f6f3bea1d9b5 new file mode 100644 index 0000000000..b3cbc4d030 --- /dev/null +++ b/txscript/data/taproot-ref/90b75e22907115340a987929a776f6f3bea1d9b5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/90cddd59c8cf3bcac6b2fb6df29c9362c3a69855 b/txscript/data/taproot-ref/90cddd59c8cf3bcac6b2fb6df29c9362c3a69855 new file mode 100644 index 0000000000..936af9641c --- /dev/null +++ b/txscript/data/taproot-ref/90cddd59c8cf3bcac6b2fb6df29c9362c3a69855 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/90e012902ea03831fe652fb98c2f284c57217115 b/txscript/data/taproot-ref/90e012902ea03831fe652fb98c2f284c57217115 new file mode 100644 index 0000000000..c8ed4d98bb --- /dev/null +++ b/txscript/data/taproot-ref/90e012902ea03831fe652fb98c2f284c57217115 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/910480b0cfba5cfd886687f687f8a73d081c0b15 b/txscript/data/taproot-ref/910480b0cfba5cfd886687f687f8a73d081c0b15 new file mode 100644 index 0000000000..a5c146ec7c --- /dev/null +++ b/txscript/data/taproot-ref/910480b0cfba5cfd886687f687f8a73d081c0b15 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9143eec00e7c0dcba52a44c54c7fea4ca90ac9db b/txscript/data/taproot-ref/9143eec00e7c0dcba52a44c54c7fea4ca90ac9db new file mode 100644 index 0000000000..7f8a172184 --- /dev/null +++ b/txscript/data/taproot-ref/9143eec00e7c0dcba52a44c54c7fea4ca90ac9db @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/914d626c074a269b3a9d1451d77761c9b6e8db28 b/txscript/data/taproot-ref/914d626c074a269b3a9d1451d77761c9b6e8db28 new file mode 100644 index 0000000000..cf38f17a8e --- /dev/null +++ b/txscript/data/taproot-ref/914d626c074a269b3a9d1451d77761c9b6e8db28 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/91b3598a2ceedd0e45722fd9287672a13bf221e1 b/txscript/data/taproot-ref/91b3598a2ceedd0e45722fd9287672a13bf221e1 new file mode 100644 index 0000000000..58f312b188 --- /dev/null +++ b/txscript/data/taproot-ref/91b3598a2ceedd0e45722fd9287672a13bf221e1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/91deadec3dc6c425ddc903b195066184526341bb b/txscript/data/taproot-ref/91deadec3dc6c425ddc903b195066184526341bb new file mode 100644 index 0000000000..41d7d754cf --- /dev/null +++ b/txscript/data/taproot-ref/91deadec3dc6c425ddc903b195066184526341bb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/91eb11de4a9b1c364da7e342da879d0915930da6 b/txscript/data/taproot-ref/91eb11de4a9b1c364da7e342da879d0915930da6 new file mode 100644 index 0000000000..aba7fc77d9 --- /dev/null +++ b/txscript/data/taproot-ref/91eb11de4a9b1c364da7e342da879d0915930da6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/91ed8c8f6952e9dfd27a3d45454432bd4886c8d1 b/txscript/data/taproot-ref/91ed8c8f6952e9dfd27a3d45454432bd4886c8d1 new file mode 100644 index 0000000000..3f2f6c7f6a --- /dev/null +++ b/txscript/data/taproot-ref/91ed8c8f6952e9dfd27a3d45454432bd4886c8d1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/91f11c0a3851e5a1b473cfd412ff28fcd7903c39 b/txscript/data/taproot-ref/91f11c0a3851e5a1b473cfd412ff28fcd7903c39 new file mode 100644 index 0000000000..af7878a940 --- /dev/null +++ b/txscript/data/taproot-ref/91f11c0a3851e5a1b473cfd412ff28fcd7903c39 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/91f5456cb58ea9371b0fc9864e05767c7a8ee7e4 b/txscript/data/taproot-ref/91f5456cb58ea9371b0fc9864e05767c7a8ee7e4 new file mode 100644 index 0000000000..45fde9e672 --- /dev/null +++ b/txscript/data/taproot-ref/91f5456cb58ea9371b0fc9864e05767c7a8ee7e4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/921d11cbd9a6ba01c1bbfcc40c1205f6ef275acb b/txscript/data/taproot-ref/921d11cbd9a6ba01c1bbfcc40c1205f6ef275acb new file mode 100644 index 0000000000..0b27ac89f2 --- /dev/null +++ b/txscript/data/taproot-ref/921d11cbd9a6ba01c1bbfcc40c1205f6ef275acb @@ -0,0 +1 @@ +{"tx": "01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c60000000077e8b85d8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e6000000009e49a865016e35600000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcb9000000", "prevouts": ["2580370000000000235e212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "0ca03a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["b3790a49c3a8fac6cbb4a7a2da0753a5d801f15728935ae6d5fcba46453fcc4ad01f70cbb990e1a8ad773906c5f6548e1f1204cebeb378f9a06402f44c770412", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/9238fc472251c9a3c817ab6cc5ea4e97c3d05410 b/txscript/data/taproot-ref/9238fc472251c9a3c817ab6cc5ea4e97c3d05410 new file mode 100644 index 0000000000..9e3b865bd1 --- /dev/null +++ b/txscript/data/taproot-ref/9238fc472251c9a3c817ab6cc5ea4e97c3d05410 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9250a8a685e1f24b96edf202f1204a332bcb0ba3 b/txscript/data/taproot-ref/9250a8a685e1f24b96edf202f1204a332bcb0ba3 new file mode 100644 index 0000000000..fcc86f2c1d --- /dev/null +++ b/txscript/data/taproot-ref/9250a8a685e1f24b96edf202f1204a332bcb0ba3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9266cfa0d3adb02eaa15bc09db296fa853d6deed b/txscript/data/taproot-ref/9266cfa0d3adb02eaa15bc09db296fa853d6deed new file mode 100644 index 0000000000..ac68c9023f --- /dev/null +++ b/txscript/data/taproot-ref/9266cfa0d3adb02eaa15bc09db296fa853d6deed @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/92848420c5779bd1c6d954bfc933383296c73c07 b/txscript/data/taproot-ref/92848420c5779bd1c6d954bfc933383296c73c07 new file mode 100644 index 0000000000..5d37ec6cc5 --- /dev/null +++ b/txscript/data/taproot-ref/92848420c5779bd1c6d954bfc933383296c73c07 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/92886f1a44cabcf2e2c4dcef68ee37caa458c47b b/txscript/data/taproot-ref/92886f1a44cabcf2e2c4dcef68ee37caa458c47b new file mode 100644 index 0000000000..1aa12b8d6b --- /dev/null +++ b/txscript/data/taproot-ref/92886f1a44cabcf2e2c4dcef68ee37caa458c47b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9289711f9cf1406a577387a27b8bd4930e29fd38 b/txscript/data/taproot-ref/9289711f9cf1406a577387a27b8bd4930e29fd38 new file mode 100644 index 0000000000..f2f2b85889 --- /dev/null +++ b/txscript/data/taproot-ref/9289711f9cf1406a577387a27b8bd4930e29fd38 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/92bddaa4b62dfceaf980ba7a89bb0cc57e8fc52c b/txscript/data/taproot-ref/92bddaa4b62dfceaf980ba7a89bb0cc57e8fc52c new file mode 100644 index 0000000000..fd60d42639 --- /dev/null +++ b/txscript/data/taproot-ref/92bddaa4b62dfceaf980ba7a89bb0cc57e8fc52c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/92c132ca1fe8044c1317c18feaca645a54713ffb b/txscript/data/taproot-ref/92c132ca1fe8044c1317c18feaca645a54713ffb new file mode 100644 index 0000000000..114a6f500c --- /dev/null +++ b/txscript/data/taproot-ref/92c132ca1fe8044c1317c18feaca645a54713ffb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/92e0a98f523af81899be75f9371608fd9948b337 b/txscript/data/taproot-ref/92e0a98f523af81899be75f9371608fd9948b337 new file mode 100644 index 0000000000..ddffcd971a --- /dev/null +++ b/txscript/data/taproot-ref/92e0a98f523af81899be75f9371608fd9948b337 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9309be25161f4e02117ef32870ded9650d0e4f7a b/txscript/data/taproot-ref/9309be25161f4e02117ef32870ded9650d0e4f7a new file mode 100644 index 0000000000..539d70c9d8 --- /dev/null +++ b/txscript/data/taproot-ref/9309be25161f4e02117ef32870ded9650d0e4f7a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/930d453e2c53ce2b64bd0f4b950552f988bdbc20 b/txscript/data/taproot-ref/930d453e2c53ce2b64bd0f4b950552f988bdbc20 new file mode 100644 index 0000000000..cc810aade2 --- /dev/null +++ b/txscript/data/taproot-ref/930d453e2c53ce2b64bd0f4b950552f988bdbc20 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/934c8ad33d4e9c5c13372bc93bf26cf3107839a5 b/txscript/data/taproot-ref/934c8ad33d4e9c5c13372bc93bf26cf3107839a5 new file mode 100644 index 0000000000..c091b73e0b --- /dev/null +++ b/txscript/data/taproot-ref/934c8ad33d4e9c5c13372bc93bf26cf3107839a5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/935a6ed5b994d0bfdaf42bf6dd6fef4ccdbfee4a b/txscript/data/taproot-ref/935a6ed5b994d0bfdaf42bf6dd6fef4ccdbfee4a new file mode 100644 index 0000000000..79b043d1dd --- /dev/null +++ b/txscript/data/taproot-ref/935a6ed5b994d0bfdaf42bf6dd6fef4ccdbfee4a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/935dfd118a575d599a75b00db37955c92ef6471b b/txscript/data/taproot-ref/935dfd118a575d599a75b00db37955c92ef6471b new file mode 100644 index 0000000000..ca6b5aa858 --- /dev/null +++ b/txscript/data/taproot-ref/935dfd118a575d599a75b00db37955c92ef6471b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/936af0357943e249bd7e428753fc79b7870c4f96 b/txscript/data/taproot-ref/936af0357943e249bd7e428753fc79b7870c4f96 new file mode 100644 index 0000000000..d5623131f7 --- /dev/null +++ b/txscript/data/taproot-ref/936af0357943e249bd7e428753fc79b7870c4f96 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/937fe4be2d5689c59d7c617e65996d41cfafdef5 b/txscript/data/taproot-ref/937fe4be2d5689c59d7c617e65996d41cfafdef5 new file mode 100644 index 0000000000..b4b8d7aeaf --- /dev/null +++ b/txscript/data/taproot-ref/937fe4be2d5689c59d7c617e65996d41cfafdef5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/938f94084baf3b93faae268cc5e094df56f01f7a b/txscript/data/taproot-ref/938f94084baf3b93faae268cc5e094df56f01f7a new file mode 100644 index 0000000000..2330077966 --- /dev/null +++ b/txscript/data/taproot-ref/938f94084baf3b93faae268cc5e094df56f01f7a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/939a2a924292c7f549cc8f8be939826a3de6b820 b/txscript/data/taproot-ref/939a2a924292c7f549cc8f8be939826a3de6b820 new file mode 100644 index 0000000000..e8c4ecd780 --- /dev/null +++ b/txscript/data/taproot-ref/939a2a924292c7f549cc8f8be939826a3de6b820 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/93aa13626c3895c12d82d3763e8e916a16a4fd52 b/txscript/data/taproot-ref/93aa13626c3895c12d82d3763e8e916a16a4fd52 new file mode 100644 index 0000000000..892c8a5988 --- /dev/null +++ b/txscript/data/taproot-ref/93aa13626c3895c12d82d3763e8e916a16a4fd52 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/93c0123f1118e26a15aba5739d9f8db784f21efa b/txscript/data/taproot-ref/93c0123f1118e26a15aba5739d9f8db784f21efa new file mode 100644 index 0000000000..fd5a5acb89 --- /dev/null +++ b/txscript/data/taproot-ref/93c0123f1118e26a15aba5739d9f8db784f21efa @@ -0,0 +1 @@ +{"tx": "8e58b9e9028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b301000000df8399ad60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270620000000088e2538303dd3145000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6d6bda649", "prevouts": ["7be839000000000017a9146704ae21c886c9ded757e2b67d582abfc91902d487", "05500e000000000017a914f955a33e905fb6c7b7e694c8cef25993577deafb87"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "165e142540f27e90740933c99d4f17ab2dfc6c82951cfb", "witness": ["2bb1a56194abdec51c8331e26013315467988ddbcb79c43216b1b1c8dedd9980c1370b18bcd322d72ddba207457f2254b5a0de08eeee92794bc91278330a2a49"]}}, diff --git a/txscript/data/taproot-ref/93c6f793e89f2bbe200dcd083729e8e2af40c2f2 b/txscript/data/taproot-ref/93c6f793e89f2bbe200dcd083729e8e2af40c2f2 new file mode 100644 index 0000000000..40f4f2f520 --- /dev/null +++ b/txscript/data/taproot-ref/93c6f793e89f2bbe200dcd083729e8e2af40c2f2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/93c799f74d4e3a3b8dafa975cb2453af687a8872 b/txscript/data/taproot-ref/93c799f74d4e3a3b8dafa975cb2453af687a8872 new file mode 100644 index 0000000000..22b1e84fde --- /dev/null +++ b/txscript/data/taproot-ref/93c799f74d4e3a3b8dafa975cb2453af687a8872 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/93cedb385de6371ec85a3086d53c93ba0e1c6926 b/txscript/data/taproot-ref/93cedb385de6371ec85a3086d53c93ba0e1c6926 new file mode 100644 index 0000000000..a86d36976e --- /dev/null +++ b/txscript/data/taproot-ref/93cedb385de6371ec85a3086d53c93ba0e1c6926 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/93d43e9d7f08eba5daa4d394a95703498c7e2139 b/txscript/data/taproot-ref/93d43e9d7f08eba5daa4d394a95703498c7e2139 new file mode 100644 index 0000000000..cd0cc6ea96 --- /dev/null +++ b/txscript/data/taproot-ref/93d43e9d7f08eba5daa4d394a95703498c7e2139 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/93db6d7b5e262a03c9f6ccf71ef4e8de7acf6fb6 b/txscript/data/taproot-ref/93db6d7b5e262a03c9f6ccf71ef4e8de7acf6fb6 new file mode 100644 index 0000000000..2acb5d0412 --- /dev/null +++ b/txscript/data/taproot-ref/93db6d7b5e262a03c9f6ccf71ef4e8de7acf6fb6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/940254cd6f8f945bc5f1edcef83ba2afc7edfdef b/txscript/data/taproot-ref/940254cd6f8f945bc5f1edcef83ba2afc7edfdef new file mode 100644 index 0000000000..65e54587fd --- /dev/null +++ b/txscript/data/taproot-ref/940254cd6f8f945bc5f1edcef83ba2afc7edfdef @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/94136714739c4978945621f669ecaf025dff07f8 b/txscript/data/taproot-ref/94136714739c4978945621f669ecaf025dff07f8 new file mode 100644 index 0000000000..861890c689 --- /dev/null +++ b/txscript/data/taproot-ref/94136714739c4978945621f669ecaf025dff07f8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/942302c74767926cf73be9bc6753fc422157855d b/txscript/data/taproot-ref/942302c74767926cf73be9bc6753fc422157855d new file mode 100644 index 0000000000..e81ffa9caf --- /dev/null +++ b/txscript/data/taproot-ref/942302c74767926cf73be9bc6753fc422157855d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/94232b6796277453192019999be8b0fce849e3c3 b/txscript/data/taproot-ref/94232b6796277453192019999be8b0fce849e3c3 new file mode 100644 index 0000000000..a82e356498 --- /dev/null +++ b/txscript/data/taproot-ref/94232b6796277453192019999be8b0fce849e3c3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/944304c86610b738afbff55026632249b735f401 b/txscript/data/taproot-ref/944304c86610b738afbff55026632249b735f401 new file mode 100644 index 0000000000..b9081021d1 --- /dev/null +++ b/txscript/data/taproot-ref/944304c86610b738afbff55026632249b735f401 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9447c6b9ffec17e55cc04961dec9cc9affec21dc b/txscript/data/taproot-ref/9447c6b9ffec17e55cc04961dec9cc9affec21dc new file mode 100644 index 0000000000..9eb058c5d5 --- /dev/null +++ b/txscript/data/taproot-ref/9447c6b9ffec17e55cc04961dec9cc9affec21dc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/94862fb03e48c18301c8d883c0b89da06351e369 b/txscript/data/taproot-ref/94862fb03e48c18301c8d883c0b89da06351e369 new file mode 100644 index 0000000000..212062a9a4 --- /dev/null +++ b/txscript/data/taproot-ref/94862fb03e48c18301c8d883c0b89da06351e369 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/948c81d5b83d1cdb3423d9e81a61becd8bf2a7bf b/txscript/data/taproot-ref/948c81d5b83d1cdb3423d9e81a61becd8bf2a7bf new file mode 100644 index 0000000000..31eb82d4be --- /dev/null +++ b/txscript/data/taproot-ref/948c81d5b83d1cdb3423d9e81a61becd8bf2a7bf @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9499a40681e896adc4c45047502a358ed7cf1237 b/txscript/data/taproot-ref/9499a40681e896adc4c45047502a358ed7cf1237 new file mode 100644 index 0000000000..1e18d1e7e9 --- /dev/null +++ b/txscript/data/taproot-ref/9499a40681e896adc4c45047502a358ed7cf1237 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/94a9f7a609640945c820b281c9b05d992b0ac4c2 b/txscript/data/taproot-ref/94a9f7a609640945c820b281c9b05d992b0ac4c2 new file mode 100644 index 0000000000..6a9540276c --- /dev/null +++ b/txscript/data/taproot-ref/94a9f7a609640945c820b281c9b05d992b0ac4c2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/94f8b89ee92aa4c7d64eb59fa7c8811ee71c5de1 b/txscript/data/taproot-ref/94f8b89ee92aa4c7d64eb59fa7c8811ee71c5de1 new file mode 100644 index 0000000000..487cb3b8ab --- /dev/null +++ b/txscript/data/taproot-ref/94f8b89ee92aa4c7d64eb59fa7c8811ee71c5de1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9506e2eb82ae6c5a245403a82c8c36c49e7dd19a b/txscript/data/taproot-ref/9506e2eb82ae6c5a245403a82c8c36c49e7dd19a new file mode 100644 index 0000000000..3ebd980ac5 --- /dev/null +++ b/txscript/data/taproot-ref/9506e2eb82ae6c5a245403a82c8c36c49e7dd19a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9512c13d6e0d292adb68e6b0ed8f466ba396e30a b/txscript/data/taproot-ref/9512c13d6e0d292adb68e6b0ed8f466ba396e30a new file mode 100644 index 0000000000..e3c5d98c41 --- /dev/null +++ b/txscript/data/taproot-ref/9512c13d6e0d292adb68e6b0ed8f466ba396e30a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/95285e78757c883cf8644bfcd7749e4b08cb59c4 b/txscript/data/taproot-ref/95285e78757c883cf8644bfcd7749e4b08cb59c4 new file mode 100644 index 0000000000..f2a6cbf486 --- /dev/null +++ b/txscript/data/taproot-ref/95285e78757c883cf8644bfcd7749e4b08cb59c4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9528c094e6823258fc43686ee4fdc5d619021a94 b/txscript/data/taproot-ref/9528c094e6823258fc43686ee4fdc5d619021a94 new file mode 100644 index 0000000000..d315a1eb7d --- /dev/null +++ b/txscript/data/taproot-ref/9528c094e6823258fc43686ee4fdc5d619021a94 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/95418ddbd4a17ea011fd39c57c1e4389b711dd7e b/txscript/data/taproot-ref/95418ddbd4a17ea011fd39c57c1e4389b711dd7e new file mode 100644 index 0000000000..7b41eb29c3 --- /dev/null +++ b/txscript/data/taproot-ref/95418ddbd4a17ea011fd39c57c1e4389b711dd7e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/954e0aead2f1448d168416547f795dc8baa7eb10 b/txscript/data/taproot-ref/954e0aead2f1448d168416547f795dc8baa7eb10 new file mode 100644 index 0000000000..af9b0facbb --- /dev/null +++ b/txscript/data/taproot-ref/954e0aead2f1448d168416547f795dc8baa7eb10 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/958966b97201943c2831502b3f5bbcccc2d1b2f3 b/txscript/data/taproot-ref/958966b97201943c2831502b3f5bbcccc2d1b2f3 new file mode 100644 index 0000000000..11074d9b7c --- /dev/null +++ b/txscript/data/taproot-ref/958966b97201943c2831502b3f5bbcccc2d1b2f3 @@ -0,0 +1 @@ +{"tx": "b063326b03dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cfd00000000d54304dcbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe900000000f78d71fd60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707000000000eeb7db83038ea0cc0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914719f78084af863e000acd618ba76df9797223689870b010000", "prevouts": ["daa652000000000017a914c9840c38196e75dd475876fc1e51c080e92b574c87", "f0016e0000000000225c202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "33870e000000000017a91452f6f26c4daf61bee17f895b7ca2f2ddc941756987"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["e68b325ef03fa84280a54b34dbf53a9277b395ea2fd16e226cca8ec132028a05ed3734d002e1b197dc424e81a0707786eadf555401954d3232adbab2301adeb7"]}}, diff --git a/txscript/data/taproot-ref/95957430f0fd0b98963bf7080efffaa2efc45563 b/txscript/data/taproot-ref/95957430f0fd0b98963bf7080efffaa2efc45563 new file mode 100644 index 0000000000..4a2dbbc855 --- /dev/null +++ b/txscript/data/taproot-ref/95957430f0fd0b98963bf7080efffaa2efc45563 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/959b1c7bccd9efde5105f9deaa24262e6171f127 b/txscript/data/taproot-ref/959b1c7bccd9efde5105f9deaa24262e6171f127 new file mode 100644 index 0000000000..be3cac94ba --- /dev/null +++ b/txscript/data/taproot-ref/959b1c7bccd9efde5105f9deaa24262e6171f127 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/959ef5c1dfba6621fcd8365261b27885ba0eedfb b/txscript/data/taproot-ref/959ef5c1dfba6621fcd8365261b27885ba0eedfb new file mode 100644 index 0000000000..1de88c4dc8 --- /dev/null +++ b/txscript/data/taproot-ref/959ef5c1dfba6621fcd8365261b27885ba0eedfb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/95a04b0c50967b773d91751126d1ffe273287347 b/txscript/data/taproot-ref/95a04b0c50967b773d91751126d1ffe273287347 new file mode 100644 index 0000000000..7e4f189e22 --- /dev/null +++ b/txscript/data/taproot-ref/95a04b0c50967b773d91751126d1ffe273287347 @@ -0,0 +1 @@ +{"tx": "0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2800000000247f1be9dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b470100000047d17b1904693c7500000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a62ec0844f", "prevouts": ["06e6540000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b", "c65b2300000000001654142540f27e90740933c99d4f17ab2dfc6c82951cfb"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["7f4e68e27590d41fc1d96b76995c0151017c929b2188301d6e02341a4932e699b7d144d2e1920d69af10294c7f52fc08ec27b4dd1d77a6e98601371e91cac3e5", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/95afe9b1e8db35a5924aabbffc0a617e6862a1d3 b/txscript/data/taproot-ref/95afe9b1e8db35a5924aabbffc0a617e6862a1d3 new file mode 100644 index 0000000000..85ab7be4cf --- /dev/null +++ b/txscript/data/taproot-ref/95afe9b1e8db35a5924aabbffc0a617e6862a1d3 @@ -0,0 +1 @@ +{"tx": "01000000011221809fa938f2ef41f6621f6e6a0e75e05349f5a7d7094926420abdf536093c0000000000229bfbc70260ef6a521200000017a914ca5375a68588393c82c00f5d2ab21f91e99aa5ce875802000000000000160014ca9858c362545bc83a3b93e73b12b27a9b3ca00336010000", "prevouts": ["1ff76d521200000022512034153a16ef8458ec2412ba42dd5be0fabd8b4c2f532d179dc958fc1fca3cae43"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY", "comment": "inactive/scriptpath_invalid_unkleaf", "success": {"scriptSig": "", "witness": ["8ce42f81440679dce044d02079a20729983aecfbca152c25d3e936f88c156f8f864364944d6f770c25d7d919ef277045ed1a2464dbb3348ff6203227b2ceb794", "20cb0ba18c127bd01c824f94fd2578ac4109c167b40bd92fd4f8ede9600f7f41f3ac", "c2cb0ba18c127bd01c824f94fd2578ac4109c167b40bd92fd4f8ede9600f7f41f3cbfc5d7464d6f9932fdfbdb59ed04135d3da1fd24a1d97149f3f9fe8acd746e901c94ae67cd857f8f23543b618b38154b6c0432568bb8cf7638fb55d4cc0a24e"]}}, diff --git a/txscript/data/taproot-ref/95b65f78191ad63ba2149f216ad4b1f3a404ee82 b/txscript/data/taproot-ref/95b65f78191ad63ba2149f216ad4b1f3a404ee82 new file mode 100644 index 0000000000..66d91c76fa --- /dev/null +++ b/txscript/data/taproot-ref/95b65f78191ad63ba2149f216ad4b1f3a404ee82 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/95bc7b2db1ac665317576e24031e551189f4efe7 b/txscript/data/taproot-ref/95bc7b2db1ac665317576e24031e551189f4efe7 new file mode 100644 index 0000000000..95acaacb94 --- /dev/null +++ b/txscript/data/taproot-ref/95bc7b2db1ac665317576e24031e551189f4efe7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/95da825d4132e9de80a280c89ba82724643b74f2 b/txscript/data/taproot-ref/95da825d4132e9de80a280c89ba82724643b74f2 new file mode 100644 index 0000000000..0bc239cf92 --- /dev/null +++ b/txscript/data/taproot-ref/95da825d4132e9de80a280c89ba82724643b74f2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/95e7d15b24fad0c2e4780004a45b735813a6d457 b/txscript/data/taproot-ref/95e7d15b24fad0c2e4780004a45b735813a6d457 new file mode 100644 index 0000000000..0aa37be26a --- /dev/null +++ b/txscript/data/taproot-ref/95e7d15b24fad0c2e4780004a45b735813a6d457 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/96089d3e37c85cc3e1727b58cbcd209157529a71 b/txscript/data/taproot-ref/96089d3e37c85cc3e1727b58cbcd209157529a71 new file mode 100644 index 0000000000..2a7200610d --- /dev/null +++ b/txscript/data/taproot-ref/96089d3e37c85cc3e1727b58cbcd209157529a71 @@ -0,0 +1 @@ +{"tx": "010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270de000000007f4af652dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca600000000e56eff118bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48000000000454a026504e231a400000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e79f410645", "prevouts": ["a4bd1100000000002251205c592164d59d166201a2e20d3b054756549dd213ab6179e4cd71f1fda3a90111", "f33b5400000000002251205fb82515a803bc66e22805d16c9967a9f99675502991462318dd4d89658b7382", "67d540000000000021531f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b"], "index": 2, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["81874ea55bb484ce75fe27abc22c65268eccb0819379e66ab9445a41764683988d2bb4ba25bd6eea6753501005e4b83c29e3040cd120cf530ca321279e53f5ca"]}}, diff --git a/txscript/data/taproot-ref/96197c6b417cdc946b9a34b57ac7c50feea0ada4 b/txscript/data/taproot-ref/96197c6b417cdc946b9a34b57ac7c50feea0ada4 new file mode 100644 index 0000000000..707b82f1da --- /dev/null +++ b/txscript/data/taproot-ref/96197c6b417cdc946b9a34b57ac7c50feea0ada4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/962bb09ab095bcd35f7f34055ed0fa8ae434af02 b/txscript/data/taproot-ref/962bb09ab095bcd35f7f34055ed0fa8ae434af02 new file mode 100644 index 0000000000..4616f5f918 --- /dev/null +++ b/txscript/data/taproot-ref/962bb09ab095bcd35f7f34055ed0fa8ae434af02 @@ -0,0 +1 @@ +{"tx": "7c5fc7c8028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4cd0100000043a3c7eedff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0f00000000209d439903a82a8c000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e763020000", "prevouts": ["4cba380000000000165c142540f27e90740933c99d4f17ab2dfc6c82951cfb", "d2fc540000000000225120979ac728ddd945fd0096bd7ed70641d6c3e965c9318f95ca3c406aaae5bf23bb"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["cdcd03b7982f23ad354233e9488a289dda72216c8b27a5e543001742fbf05d9388147474fc08919f4af4f6550f081c79cb058547d8047ec5e1876def72c265d4"]}}, diff --git a/txscript/data/taproot-ref/962d79802cab79d4bd0c5d840a5f94281465c290 b/txscript/data/taproot-ref/962d79802cab79d4bd0c5d840a5f94281465c290 new file mode 100644 index 0000000000..b19a042a97 --- /dev/null +++ b/txscript/data/taproot-ref/962d79802cab79d4bd0c5d840a5f94281465c290 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/966f41ea0609c64925ecaee5ba1af166ae43fdda b/txscript/data/taproot-ref/966f41ea0609c64925ecaee5ba1af166ae43fdda new file mode 100644 index 0000000000..d5fca4b3fe --- /dev/null +++ b/txscript/data/taproot-ref/966f41ea0609c64925ecaee5ba1af166ae43fdda @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/96735cbde31cd1fbca452de029d3f77a7072dd87 b/txscript/data/taproot-ref/96735cbde31cd1fbca452de029d3f77a7072dd87 new file mode 100644 index 0000000000..5d7a646e80 --- /dev/null +++ b/txscript/data/taproot-ref/96735cbde31cd1fbca452de029d3f77a7072dd87 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/967784fbda80e2586d2566b1d20422c209de8e3a b/txscript/data/taproot-ref/967784fbda80e2586d2566b1d20422c209de8e3a new file mode 100644 index 0000000000..22221c3589 --- /dev/null +++ b/txscript/data/taproot-ref/967784fbda80e2586d2566b1d20422c209de8e3a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/968b512c074558ddde3b21c60e2886fd579c950b b/txscript/data/taproot-ref/968b512c074558ddde3b21c60e2886fd579c950b new file mode 100644 index 0000000000..b0914b6ab0 --- /dev/null +++ b/txscript/data/taproot-ref/968b512c074558ddde3b21c60e2886fd579c950b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/96a0422936b6ca5c4077e1e8fceea23c5dd146fe b/txscript/data/taproot-ref/96a0422936b6ca5c4077e1e8fceea23c5dd146fe new file mode 100644 index 0000000000..8ae01395c1 --- /dev/null +++ b/txscript/data/taproot-ref/96a0422936b6ca5c4077e1e8fceea23c5dd146fe @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/96aac36c65d79125e3ee07ec601f71c0c09b0cb2 b/txscript/data/taproot-ref/96aac36c65d79125e3ee07ec601f71c0c09b0cb2 new file mode 100644 index 0000000000..b20df230e4 --- /dev/null +++ b/txscript/data/taproot-ref/96aac36c65d79125e3ee07ec601f71c0c09b0cb2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/96c1bbeb23affbc8ce9c5703062a448e21a42eeb b/txscript/data/taproot-ref/96c1bbeb23affbc8ce9c5703062a448e21a42eeb new file mode 100644 index 0000000000..f01557776f --- /dev/null +++ b/txscript/data/taproot-ref/96c1bbeb23affbc8ce9c5703062a448e21a42eeb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/96f5f4a5b64b8e8462a72eb1d259066fce9fbe2f b/txscript/data/taproot-ref/96f5f4a5b64b8e8462a72eb1d259066fce9fbe2f new file mode 100644 index 0000000000..f408010df2 --- /dev/null +++ b/txscript/data/taproot-ref/96f5f4a5b64b8e8462a72eb1d259066fce9fbe2f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9700352a9f17c39165256df2f2f7e4fa2ec9de61 b/txscript/data/taproot-ref/9700352a9f17c39165256df2f2f7e4fa2ec9de61 new file mode 100644 index 0000000000..bf48af767a --- /dev/null +++ b/txscript/data/taproot-ref/9700352a9f17c39165256df2f2f7e4fa2ec9de61 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9749e874bbbae2a0dce118ef7501ad135ea6cddc b/txscript/data/taproot-ref/9749e874bbbae2a0dce118ef7501ad135ea6cddc new file mode 100644 index 0000000000..5faf866590 --- /dev/null +++ b/txscript/data/taproot-ref/9749e874bbbae2a0dce118ef7501ad135ea6cddc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/975509735c405d7f26b8bd4c00a32158c4f2911b b/txscript/data/taproot-ref/975509735c405d7f26b8bd4c00a32158c4f2911b new file mode 100644 index 0000000000..48cc061449 --- /dev/null +++ b/txscript/data/taproot-ref/975509735c405d7f26b8bd4c00a32158c4f2911b @@ -0,0 +1 @@ +{"tx": "01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48f00000000d54e494e60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127089010000004f3ee92e0308664200000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ace75cfe40", "prevouts": ["113b33000000000021591f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b", "14ad1100000000002251202cb475dcea7fe75e0d25a92a7081f6c5af7d6f4e70a5adbeeb9514e98fbe57b4"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["4093438ed6da8aa0c53e5f73939acb7b5def70806f19c4bbcda28a1a09767df92d47a93e38f6d7349c99122a7c8d3236714cd472d0f69a7526a04cfcd596e6aa"]}}, diff --git a/txscript/data/taproot-ref/976fab0e9af7ab44ebc738f13b377d23ab763465 b/txscript/data/taproot-ref/976fab0e9af7ab44ebc738f13b377d23ab763465 new file mode 100644 index 0000000000..683e72ca2e --- /dev/null +++ b/txscript/data/taproot-ref/976fab0e9af7ab44ebc738f13b377d23ab763465 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/97703896dfbc748c76753b9dc807252baa7d17ab b/txscript/data/taproot-ref/97703896dfbc748c76753b9dc807252baa7d17ab new file mode 100644 index 0000000000..023d52725b --- /dev/null +++ b/txscript/data/taproot-ref/97703896dfbc748c76753b9dc807252baa7d17ab @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/978c3a312999502111000de7dfe47b35516164f4 b/txscript/data/taproot-ref/978c3a312999502111000de7dfe47b35516164f4 new file mode 100644 index 0000000000..fbe7080627 --- /dev/null +++ b/txscript/data/taproot-ref/978c3a312999502111000de7dfe47b35516164f4 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/97aba204ef02b37a3627221d61d8e55c8a4e1c89 b/txscript/data/taproot-ref/97aba204ef02b37a3627221d61d8e55c8a4e1c89 new file mode 100644 index 0000000000..f54b510a1f --- /dev/null +++ b/txscript/data/taproot-ref/97aba204ef02b37a3627221d61d8e55c8a4e1c89 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/97cc85297ae928c35b606a80f058ab18ea5187d1 b/txscript/data/taproot-ref/97cc85297ae928c35b606a80f058ab18ea5187d1 new file mode 100644 index 0000000000..d7821ad56b --- /dev/null +++ b/txscript/data/taproot-ref/97cc85297ae928c35b606a80f058ab18ea5187d1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/97f61b6d98c9ffe5ca701f864969608db86c81fe b/txscript/data/taproot-ref/97f61b6d98c9ffe5ca701f864969608db86c81fe new file mode 100644 index 0000000000..8c5df99bf9 --- /dev/null +++ b/txscript/data/taproot-ref/97f61b6d98c9ffe5ca701f864969608db86c81fe @@ -0,0 +1 @@ +{"tx": "0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cdc01000000f1553faf8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41f020000004d967d93dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b20000000009c7a29f501e4bd6e00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac9946af3a", "prevouts": ["8fa24e0000000000225120979ac728ddd945fd0096bd7ed70641d6c3e965c9318f95ca3c406aaae5bf23bb", "07ca3b000000000017a914a7d99db8790799e567017bcc9951f7f968dba70f87", "48721e000000000017a914a1b035f555fd87548264c3580a1f62a42acf027e87"], "index": 2, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "215d1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b", "witness": ["385f9b7511c5668b97f134642d8641fe4d541f4939e6edef8c0a138595b38cd8467d4691a7de84fdb38ad659746ff95930b07135d6178918fab0bef05c859758"]}}, diff --git a/txscript/data/taproot-ref/982a43466eb400711eaa92486fd3a9b22d4ed22c b/txscript/data/taproot-ref/982a43466eb400711eaa92486fd3a9b22d4ed22c new file mode 100644 index 0000000000..be95bd3050 --- /dev/null +++ b/txscript/data/taproot-ref/982a43466eb400711eaa92486fd3a9b22d4ed22c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/984d407c9a0781d661b22c64ad915a555d3bf64d b/txscript/data/taproot-ref/984d407c9a0781d661b22c64ad915a555d3bf64d new file mode 100644 index 0000000000..5be41c2585 --- /dev/null +++ b/txscript/data/taproot-ref/984d407c9a0781d661b22c64ad915a555d3bf64d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/98500d46f789f6e67f2c3e2f6af290db2fc124cd b/txscript/data/taproot-ref/98500d46f789f6e67f2c3e2f6af290db2fc124cd new file mode 100644 index 0000000000..6fce4e6f54 --- /dev/null +++ b/txscript/data/taproot-ref/98500d46f789f6e67f2c3e2f6af290db2fc124cd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9886f8415dd6095f89ff7e519af7516c9b7dc352 b/txscript/data/taproot-ref/9886f8415dd6095f89ff7e519af7516c9b7dc352 new file mode 100644 index 0000000000..ed1a14c4f4 --- /dev/null +++ b/txscript/data/taproot-ref/9886f8415dd6095f89ff7e519af7516c9b7dc352 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/98bd202ec6667081b4a70e2f6b929af634ac6d68 b/txscript/data/taproot-ref/98bd202ec6667081b4a70e2f6b929af634ac6d68 new file mode 100644 index 0000000000..ae7914475d --- /dev/null +++ b/txscript/data/taproot-ref/98bd202ec6667081b4a70e2f6b929af634ac6d68 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/98c6e09cd9cdc3967e01f4842102de38d4cda1a9 b/txscript/data/taproot-ref/98c6e09cd9cdc3967e01f4842102de38d4cda1a9 new file mode 100644 index 0000000000..7eeb4eaa0c --- /dev/null +++ b/txscript/data/taproot-ref/98c6e09cd9cdc3967e01f4842102de38d4cda1a9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/98c83bcdb5956bb94639dc29099871c76564d6bf b/txscript/data/taproot-ref/98c83bcdb5956bb94639dc29099871c76564d6bf new file mode 100644 index 0000000000..e2791e99cb --- /dev/null +++ b/txscript/data/taproot-ref/98c83bcdb5956bb94639dc29099871c76564d6bf @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/98d122b2f88e6c5326c77b7a643d054909d0e33a b/txscript/data/taproot-ref/98d122b2f88e6c5326c77b7a643d054909d0e33a new file mode 100644 index 0000000000..c386df40f9 --- /dev/null +++ b/txscript/data/taproot-ref/98d122b2f88e6c5326c77b7a643d054909d0e33a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/98d39d50572a07ce2b34b997b11f0801efe034d0 b/txscript/data/taproot-ref/98d39d50572a07ce2b34b997b11f0801efe034d0 new file mode 100644 index 0000000000..0b017c261d --- /dev/null +++ b/txscript/data/taproot-ref/98d39d50572a07ce2b34b997b11f0801efe034d0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/98e6557609649d2edfa5303dc85da6929b3e46cb b/txscript/data/taproot-ref/98e6557609649d2edfa5303dc85da6929b3e46cb new file mode 100644 index 0000000000..e672ff02fc --- /dev/null +++ b/txscript/data/taproot-ref/98e6557609649d2edfa5303dc85da6929b3e46cb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/990480b357aeb905cfea6ff646718d101978e980 b/txscript/data/taproot-ref/990480b357aeb905cfea6ff646718d101978e980 new file mode 100644 index 0000000000..27bf20e18b --- /dev/null +++ b/txscript/data/taproot-ref/990480b357aeb905cfea6ff646718d101978e980 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/990924cc189ea41b110bc4dd575460c49374f23d b/txscript/data/taproot-ref/990924cc189ea41b110bc4dd575460c49374f23d new file mode 100644 index 0000000000..ee35844d93 --- /dev/null +++ b/txscript/data/taproot-ref/990924cc189ea41b110bc4dd575460c49374f23d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/99621f82461534b8907da50ed4c7020620244c46 b/txscript/data/taproot-ref/99621f82461534b8907da50ed4c7020620244c46 new file mode 100644 index 0000000000..d61aedc32d --- /dev/null +++ b/txscript/data/taproot-ref/99621f82461534b8907da50ed4c7020620244c46 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/996fd99ab96f9643d5e5713a831995b17e7a3d6a b/txscript/data/taproot-ref/996fd99ab96f9643d5e5713a831995b17e7a3d6a new file mode 100644 index 0000000000..66948cd931 --- /dev/null +++ b/txscript/data/taproot-ref/996fd99ab96f9643d5e5713a831995b17e7a3d6a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/99d1d11e7c7797862b2f093aecd2482708213a46 b/txscript/data/taproot-ref/99d1d11e7c7797862b2f093aecd2482708213a46 new file mode 100644 index 0000000000..a3beb8349a --- /dev/null +++ b/txscript/data/taproot-ref/99d1d11e7c7797862b2f093aecd2482708213a46 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/99dec7b1a061c754594c315d70173856ee38ca53 b/txscript/data/taproot-ref/99dec7b1a061c754594c315d70173856ee38ca53 new file mode 100644 index 0000000000..3255ea72ac --- /dev/null +++ b/txscript/data/taproot-ref/99dec7b1a061c754594c315d70173856ee38ca53 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/99e6e3dc68bf0e9973d9cda82f1300e98c4d58a0 b/txscript/data/taproot-ref/99e6e3dc68bf0e9973d9cda82f1300e98c4d58a0 new file mode 100644 index 0000000000..4fe23a84a3 --- /dev/null +++ b/txscript/data/taproot-ref/99e6e3dc68bf0e9973d9cda82f1300e98c4d58a0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/99e8319b516c140aa7badd1e9ef03d1ff1c3bee0 b/txscript/data/taproot-ref/99e8319b516c140aa7badd1e9ef03d1ff1c3bee0 new file mode 100644 index 0000000000..309be8244f --- /dev/null +++ b/txscript/data/taproot-ref/99e8319b516c140aa7badd1e9ef03d1ff1c3bee0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9a11c2fda7b9c43e2b7720bd72c00e2503c9dd88 b/txscript/data/taproot-ref/9a11c2fda7b9c43e2b7720bd72c00e2503c9dd88 new file mode 100644 index 0000000000..4a8a51ebf6 --- /dev/null +++ b/txscript/data/taproot-ref/9a11c2fda7b9c43e2b7720bd72c00e2503c9dd88 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9a309f12e7243094d23099f5433d19602252797b b/txscript/data/taproot-ref/9a309f12e7243094d23099f5433d19602252797b new file mode 100644 index 0000000000..d662de8fad --- /dev/null +++ b/txscript/data/taproot-ref/9a309f12e7243094d23099f5433d19602252797b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9a89b6f3139174829b27ab6ead21acbf001ee2be b/txscript/data/taproot-ref/9a89b6f3139174829b27ab6ead21acbf001ee2be new file mode 100644 index 0000000000..32411aeaa9 --- /dev/null +++ b/txscript/data/taproot-ref/9a89b6f3139174829b27ab6ead21acbf001ee2be @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9abdf13e2635797e12d342e2dfb31a9c80d0edd9 b/txscript/data/taproot-ref/9abdf13e2635797e12d342e2dfb31a9c80d0edd9 new file mode 100644 index 0000000000..24c6bed713 --- /dev/null +++ b/txscript/data/taproot-ref/9abdf13e2635797e12d342e2dfb31a9c80d0edd9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9adf5a63b8158c84d6bc327d0b1ac1b5964a3ac4 b/txscript/data/taproot-ref/9adf5a63b8158c84d6bc327d0b1ac1b5964a3ac4 new file mode 100644 index 0000000000..2d205aea92 --- /dev/null +++ b/txscript/data/taproot-ref/9adf5a63b8158c84d6bc327d0b1ac1b5964a3ac4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9ae58507a65058e0fe31de871c7a34bab5415ae9 b/txscript/data/taproot-ref/9ae58507a65058e0fe31de871c7a34bab5415ae9 new file mode 100644 index 0000000000..eff3ac5589 --- /dev/null +++ b/txscript/data/taproot-ref/9ae58507a65058e0fe31de871c7a34bab5415ae9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9aece0f0260af3664b7ed391226bcf127e9fd163 b/txscript/data/taproot-ref/9aece0f0260af3664b7ed391226bcf127e9fd163 new file mode 100644 index 0000000000..4cf4a36c49 --- /dev/null +++ b/txscript/data/taproot-ref/9aece0f0260af3664b7ed391226bcf127e9fd163 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9af8af68c2f18bca7d94dd8b48ce8692c89ffb04 b/txscript/data/taproot-ref/9af8af68c2f18bca7d94dd8b48ce8692c89ffb04 new file mode 100644 index 0000000000..ceffc77630 --- /dev/null +++ b/txscript/data/taproot-ref/9af8af68c2f18bca7d94dd8b48ce8692c89ffb04 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9afe6dae1af7cdc07ef615de0c3d2ebdd4f68c15 b/txscript/data/taproot-ref/9afe6dae1af7cdc07ef615de0c3d2ebdd4f68c15 new file mode 100644 index 0000000000..4ad1295e10 --- /dev/null +++ b/txscript/data/taproot-ref/9afe6dae1af7cdc07ef615de0c3d2ebdd4f68c15 @@ -0,0 +1 @@ +{"tx": "dd3b93eb028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4350100000001cd7ca760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703001000000c72c4ce603c01c4200000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787eb283c35", "prevouts": ["7397340000000000215e1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b", "621410000000000017a914c7049bed1fc82cf46b0539507abaa88864b6346987"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["4365f1bafa45f9923db203de3ac8ed384e7a9fab5b5ff70682d274a571a3cb19c273da9aa6bd2b34be6b693eaba26bfe7e2cbabd3fb79f0845a0a5727bf14481", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/9b42d222b18945ea05823e8a6dbcb0d54a364700 b/txscript/data/taproot-ref/9b42d222b18945ea05823e8a6dbcb0d54a364700 new file mode 100644 index 0000000000..886de2acf1 --- /dev/null +++ b/txscript/data/taproot-ref/9b42d222b18945ea05823e8a6dbcb0d54a364700 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9b4d35c34d31ab2b9e6a0becef710c9b00ec976c b/txscript/data/taproot-ref/9b4d35c34d31ab2b9e6a0becef710c9b00ec976c new file mode 100644 index 0000000000..1961fe426f --- /dev/null +++ b/txscript/data/taproot-ref/9b4d35c34d31ab2b9e6a0becef710c9b00ec976c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9b51c6d0b56ce78a3dd7924a0c74626beea4b529 b/txscript/data/taproot-ref/9b51c6d0b56ce78a3dd7924a0c74626beea4b529 new file mode 100644 index 0000000000..74b8691034 --- /dev/null +++ b/txscript/data/taproot-ref/9b51c6d0b56ce78a3dd7924a0c74626beea4b529 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9b62911307d4c57e65b67719613737ad5d45433f b/txscript/data/taproot-ref/9b62911307d4c57e65b67719613737ad5d45433f new file mode 100644 index 0000000000..7a924109a3 --- /dev/null +++ b/txscript/data/taproot-ref/9b62911307d4c57e65b67719613737ad5d45433f @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/9ba6a6cf62c5826ffc6fcd084371c29d51f194c7 b/txscript/data/taproot-ref/9ba6a6cf62c5826ffc6fcd084371c29d51f194c7 new file mode 100644 index 0000000000..162fd32c8f --- /dev/null +++ b/txscript/data/taproot-ref/9ba6a6cf62c5826ffc6fcd084371c29d51f194c7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9baed9539fb0ad3446fb36b9804e562244aec18f b/txscript/data/taproot-ref/9baed9539fb0ad3446fb36b9804e562244aec18f new file mode 100644 index 0000000000..3345d158ec --- /dev/null +++ b/txscript/data/taproot-ref/9baed9539fb0ad3446fb36b9804e562244aec18f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9bb0ba96392a718e713162631e2036c2a0708ce2 b/txscript/data/taproot-ref/9bb0ba96392a718e713162631e2036c2a0708ce2 new file mode 100644 index 0000000000..49a6dda733 --- /dev/null +++ b/txscript/data/taproot-ref/9bb0ba96392a718e713162631e2036c2a0708ce2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9bb98651acde18815c952146548c472023a22072 b/txscript/data/taproot-ref/9bb98651acde18815c952146548c472023a22072 new file mode 100644 index 0000000000..11a796c716 --- /dev/null +++ b/txscript/data/taproot-ref/9bb98651acde18815c952146548c472023a22072 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9bbe3f1ede4caaf74b619e6e82cb6b6f779f366d b/txscript/data/taproot-ref/9bbe3f1ede4caaf74b619e6e82cb6b6f779f366d new file mode 100644 index 0000000000..e815622a6a --- /dev/null +++ b/txscript/data/taproot-ref/9bbe3f1ede4caaf74b619e6e82cb6b6f779f366d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9beb9170ecc8bc4e97002efea295cafc58d55688 b/txscript/data/taproot-ref/9beb9170ecc8bc4e97002efea295cafc58d55688 new file mode 100644 index 0000000000..151e89f473 --- /dev/null +++ b/txscript/data/taproot-ref/9beb9170ecc8bc4e97002efea295cafc58d55688 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9c1a6591aef6efd4346aa9f750f87940a9783107 b/txscript/data/taproot-ref/9c1a6591aef6efd4346aa9f750f87940a9783107 new file mode 100644 index 0000000000..3bdf49cbfc --- /dev/null +++ b/txscript/data/taproot-ref/9c1a6591aef6efd4346aa9f750f87940a9783107 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9c3a7896381a924c326a82a884be65e632a9f190 b/txscript/data/taproot-ref/9c3a7896381a924c326a82a884be65e632a9f190 new file mode 100644 index 0000000000..94d71fd2dc --- /dev/null +++ b/txscript/data/taproot-ref/9c3a7896381a924c326a82a884be65e632a9f190 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9ce105ac118fb5187b993ba8e83d9b199dc86fe9 b/txscript/data/taproot-ref/9ce105ac118fb5187b993ba8e83d9b199dc86fe9 new file mode 100644 index 0000000000..44ec6c215f --- /dev/null +++ b/txscript/data/taproot-ref/9ce105ac118fb5187b993ba8e83d9b199dc86fe9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9ce973c4df052f54b32f61eb27b74cff377e6752 b/txscript/data/taproot-ref/9ce973c4df052f54b32f61eb27b74cff377e6752 new file mode 100644 index 0000000000..bf4eca0732 --- /dev/null +++ b/txscript/data/taproot-ref/9ce973c4df052f54b32f61eb27b74cff377e6752 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9cf29382585d7d87b68e19e5244cd47ddedf35c0 b/txscript/data/taproot-ref/9cf29382585d7d87b68e19e5244cd47ddedf35c0 new file mode 100644 index 0000000000..212ef40b19 --- /dev/null +++ b/txscript/data/taproot-ref/9cf29382585d7d87b68e19e5244cd47ddedf35c0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9cffb02f79fc72e41c0ac0b800b862fb39b0a7fd b/txscript/data/taproot-ref/9cffb02f79fc72e41c0ac0b800b862fb39b0a7fd new file mode 100644 index 0000000000..9333c0dedc --- /dev/null +++ b/txscript/data/taproot-ref/9cffb02f79fc72e41c0ac0b800b862fb39b0a7fd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9d13b7a6b273e9242c1092d047290e60291087da b/txscript/data/taproot-ref/9d13b7a6b273e9242c1092d047290e60291087da new file mode 100644 index 0000000000..5770e6a08d --- /dev/null +++ b/txscript/data/taproot-ref/9d13b7a6b273e9242c1092d047290e60291087da @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9d2325335a737991316f3231a676fb415c357be8 b/txscript/data/taproot-ref/9d2325335a737991316f3231a676fb415c357be8 new file mode 100644 index 0000000000..ede0669f03 --- /dev/null +++ b/txscript/data/taproot-ref/9d2325335a737991316f3231a676fb415c357be8 @@ -0,0 +1 @@ +{"tx": "0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff2000000001c75619cdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4900000000cff75994dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b07010000003c029216047236f3000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8784d7ee4b", "prevouts": ["ac7783000000000017a91408247b8d3db4e641d0be1ff23f14280256870a5187", "06404d000000000017a914b60a534933f6e50f3846e396b9868efc9e681f4187", "4408250000000000225120103e7c2917eb37935b19ad951dd63925690af67710d97c5b32ba23098190dae6"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "1655142540f27e90740933c99d4f17ab2dfc6c82951cfb", "witness": ["829737e149730f35d49cc71ef0e5dc5a78d0a82a669a8d3820dc6ce454be71374970a23d87752512deae5f5565adae93d05958d0b8266ffc47742c389bcaff46"]}}, diff --git a/txscript/data/taproot-ref/9d3dab224014b620dde2b56cee3fec23463cb909 b/txscript/data/taproot-ref/9d3dab224014b620dde2b56cee3fec23463cb909 new file mode 100644 index 0000000000..1eaba609db --- /dev/null +++ b/txscript/data/taproot-ref/9d3dab224014b620dde2b56cee3fec23463cb909 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9d6211da7d3f0bda14d5067af27a1abd46dd187d b/txscript/data/taproot-ref/9d6211da7d3f0bda14d5067af27a1abd46dd187d new file mode 100644 index 0000000000..09128e618b --- /dev/null +++ b/txscript/data/taproot-ref/9d6211da7d3f0bda14d5067af27a1abd46dd187d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9d6647e7af1e10de1b3c608d829400e5663b3d7e b/txscript/data/taproot-ref/9d6647e7af1e10de1b3c608d829400e5663b3d7e new file mode 100644 index 0000000000..9e98c19e28 --- /dev/null +++ b/txscript/data/taproot-ref/9d6647e7af1e10de1b3c608d829400e5663b3d7e @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/9d86f6cf43b5947de7d50f80fec0483a9072ee0a b/txscript/data/taproot-ref/9d86f6cf43b5947de7d50f80fec0483a9072ee0a new file mode 100644 index 0000000000..b1b0ddb148 --- /dev/null +++ b/txscript/data/taproot-ref/9d86f6cf43b5947de7d50f80fec0483a9072ee0a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9d8bf71616bca5ac31e24117c80dad52352d5c2a b/txscript/data/taproot-ref/9d8bf71616bca5ac31e24117c80dad52352d5c2a new file mode 100644 index 0000000000..e12abd3997 --- /dev/null +++ b/txscript/data/taproot-ref/9d8bf71616bca5ac31e24117c80dad52352d5c2a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9da24604599fa08b01181b48265429ebf1cb213a b/txscript/data/taproot-ref/9da24604599fa08b01181b48265429ebf1cb213a new file mode 100644 index 0000000000..db380e26ae --- /dev/null +++ b/txscript/data/taproot-ref/9da24604599fa08b01181b48265429ebf1cb213a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9db297bad5b8a7a06f76713a5b05cdf2148f3b19 b/txscript/data/taproot-ref/9db297bad5b8a7a06f76713a5b05cdf2148f3b19 new file mode 100644 index 0000000000..3d8ae082e4 --- /dev/null +++ b/txscript/data/taproot-ref/9db297bad5b8a7a06f76713a5b05cdf2148f3b19 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9dc1141da1d44addec511e26f89d5046f97da2c6 b/txscript/data/taproot-ref/9dc1141da1d44addec511e26f89d5046f97da2c6 new file mode 100644 index 0000000000..2ff036f76f --- /dev/null +++ b/txscript/data/taproot-ref/9dc1141da1d44addec511e26f89d5046f97da2c6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9de0c2afad49fa532a8fea5e4dad68a5f1ab8a22 b/txscript/data/taproot-ref/9de0c2afad49fa532a8fea5e4dad68a5f1ab8a22 new file mode 100644 index 0000000000..7627ebd05e --- /dev/null +++ b/txscript/data/taproot-ref/9de0c2afad49fa532a8fea5e4dad68a5f1ab8a22 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9de4c3db0a099c27c523988b4b750ce3ee2c0ffc b/txscript/data/taproot-ref/9de4c3db0a099c27c523988b4b750ce3ee2c0ffc new file mode 100644 index 0000000000..a35494f2e1 --- /dev/null +++ b/txscript/data/taproot-ref/9de4c3db0a099c27c523988b4b750ce3ee2c0ffc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9e080c9060b0017ebfc6f81bd854014a8fc88ee8 b/txscript/data/taproot-ref/9e080c9060b0017ebfc6f81bd854014a8fc88ee8 new file mode 100644 index 0000000000..a26428c225 --- /dev/null +++ b/txscript/data/taproot-ref/9e080c9060b0017ebfc6f81bd854014a8fc88ee8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9e0885e261051e23c61d7b6859e9c25f16f9aa73 b/txscript/data/taproot-ref/9e0885e261051e23c61d7b6859e9c25f16f9aa73 new file mode 100644 index 0000000000..2a920bd2b8 --- /dev/null +++ b/txscript/data/taproot-ref/9e0885e261051e23c61d7b6859e9c25f16f9aa73 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9e533595a0cd03757f4ce00ca1a54a38453f6274 b/txscript/data/taproot-ref/9e533595a0cd03757f4ce00ca1a54a38453f6274 new file mode 100644 index 0000000000..324498bdfd --- /dev/null +++ b/txscript/data/taproot-ref/9e533595a0cd03757f4ce00ca1a54a38453f6274 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9e7cd3ed8c99ea2f99c6c55da41e1a2e4c56fb9b b/txscript/data/taproot-ref/9e7cd3ed8c99ea2f99c6c55da41e1a2e4c56fb9b new file mode 100644 index 0000000000..4cbe7798f7 --- /dev/null +++ b/txscript/data/taproot-ref/9e7cd3ed8c99ea2f99c6c55da41e1a2e4c56fb9b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9e94137b564120169fc22f85678cc20df3a1128c b/txscript/data/taproot-ref/9e94137b564120169fc22f85678cc20df3a1128c new file mode 100644 index 0000000000..dfa8148b56 --- /dev/null +++ b/txscript/data/taproot-ref/9e94137b564120169fc22f85678cc20df3a1128c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9ea50ae0758462d0e77fe1397a5af6f83ad15f39 b/txscript/data/taproot-ref/9ea50ae0758462d0e77fe1397a5af6f83ad15f39 new file mode 100644 index 0000000000..526eef44c4 --- /dev/null +++ b/txscript/data/taproot-ref/9ea50ae0758462d0e77fe1397a5af6f83ad15f39 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9eafe1e70dda380dee958b8ae1138ab758f76857 b/txscript/data/taproot-ref/9eafe1e70dda380dee958b8ae1138ab758f76857 new file mode 100644 index 0000000000..62b7a4b8fe --- /dev/null +++ b/txscript/data/taproot-ref/9eafe1e70dda380dee958b8ae1138ab758f76857 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9ee645ca92c85ae4515e7e01d35579bbc6cb046f b/txscript/data/taproot-ref/9ee645ca92c85ae4515e7e01d35579bbc6cb046f new file mode 100644 index 0000000000..7325539ad4 --- /dev/null +++ b/txscript/data/taproot-ref/9ee645ca92c85ae4515e7e01d35579bbc6cb046f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9efceb8b8d6841f20ca0f194b19427087f5a97ea b/txscript/data/taproot-ref/9efceb8b8d6841f20ca0f194b19427087f5a97ea new file mode 100644 index 0000000000..208e66cd89 --- /dev/null +++ b/txscript/data/taproot-ref/9efceb8b8d6841f20ca0f194b19427087f5a97ea @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9f0427c58e85128c73cd97a9ba41519871d70331 b/txscript/data/taproot-ref/9f0427c58e85128c73cd97a9ba41519871d70331 new file mode 100644 index 0000000000..288a041d16 --- /dev/null +++ b/txscript/data/taproot-ref/9f0427c58e85128c73cd97a9ba41519871d70331 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9f07a530e3bc65a6d0a8da0a8ad697b5dc9ab202 b/txscript/data/taproot-ref/9f07a530e3bc65a6d0a8da0a8ad697b5dc9ab202 new file mode 100644 index 0000000000..9ad3cb0a2f --- /dev/null +++ b/txscript/data/taproot-ref/9f07a530e3bc65a6d0a8da0a8ad697b5dc9ab202 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9f0aaa42e73656b0fce8443aea84266d564470e9 b/txscript/data/taproot-ref/9f0aaa42e73656b0fce8443aea84266d564470e9 new file mode 100644 index 0000000000..40449f7893 --- /dev/null +++ b/txscript/data/taproot-ref/9f0aaa42e73656b0fce8443aea84266d564470e9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9f1fe443098130f838ce7d5c1460cdc0f13bb12e b/txscript/data/taproot-ref/9f1fe443098130f838ce7d5c1460cdc0f13bb12e new file mode 100644 index 0000000000..b1ded70f7a --- /dev/null +++ b/txscript/data/taproot-ref/9f1fe443098130f838ce7d5c1460cdc0f13bb12e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9f282d2e013696b3d63d9269bf869f906bd8cef4 b/txscript/data/taproot-ref/9f282d2e013696b3d63d9269bf869f906bd8cef4 new file mode 100644 index 0000000000..30d63cce3b --- /dev/null +++ b/txscript/data/taproot-ref/9f282d2e013696b3d63d9269bf869f906bd8cef4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9f78e819952e56d7b1961320d611fdc489b34e51 b/txscript/data/taproot-ref/9f78e819952e56d7b1961320d611fdc489b34e51 new file mode 100644 index 0000000000..6369115253 --- /dev/null +++ b/txscript/data/taproot-ref/9f78e819952e56d7b1961320d611fdc489b34e51 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9f9bfc59905231b990a2d55faaa21a4cf26c8781 b/txscript/data/taproot-ref/9f9bfc59905231b990a2d55faaa21a4cf26c8781 new file mode 100644 index 0000000000..b1068a843e --- /dev/null +++ b/txscript/data/taproot-ref/9f9bfc59905231b990a2d55faaa21a4cf26c8781 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9fd2c2accbc395448a7b5d7d8bcafd190ce329a7 b/txscript/data/taproot-ref/9fd2c2accbc395448a7b5d7d8bcafd190ce329a7 new file mode 100644 index 0000000000..9d3a8c1b28 --- /dev/null +++ b/txscript/data/taproot-ref/9fd2c2accbc395448a7b5d7d8bcafd190ce329a7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9fda11dcb9654da892e82b6566c4aeab962c8278 b/txscript/data/taproot-ref/9fda11dcb9654da892e82b6566c4aeab962c8278 new file mode 100644 index 0000000000..2fb24ec291 --- /dev/null +++ b/txscript/data/taproot-ref/9fda11dcb9654da892e82b6566c4aeab962c8278 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/9fe5d577717a9a11e4740f29f231fa15b9f4d01c b/txscript/data/taproot-ref/9fe5d577717a9a11e4740f29f231fa15b9f4d01c new file mode 100644 index 0000000000..d1680b8e96 --- /dev/null +++ b/txscript/data/taproot-ref/9fe5d577717a9a11e4740f29f231fa15b9f4d01c @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/a01b0232919914b0a33ff87262f8ba59543b0ab6 b/txscript/data/taproot-ref/a01b0232919914b0a33ff87262f8ba59543b0ab6 new file mode 100644 index 0000000000..a10a2233cd --- /dev/null +++ b/txscript/data/taproot-ref/a01b0232919914b0a33ff87262f8ba59543b0ab6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a027f0c1c564bf78407eed47f2a9f03c60eadc02 b/txscript/data/taproot-ref/a027f0c1c564bf78407eed47f2a9f03c60eadc02 new file mode 100644 index 0000000000..0ca1e02774 --- /dev/null +++ b/txscript/data/taproot-ref/a027f0c1c564bf78407eed47f2a9f03c60eadc02 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a0482c5ebc234aebacf836bed890b373827b5958 b/txscript/data/taproot-ref/a0482c5ebc234aebacf836bed890b373827b5958 new file mode 100644 index 0000000000..5cf0817361 --- /dev/null +++ b/txscript/data/taproot-ref/a0482c5ebc234aebacf836bed890b373827b5958 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a04e38678141417445359665f17e2c444cc55835 b/txscript/data/taproot-ref/a04e38678141417445359665f17e2c444cc55835 new file mode 100644 index 0000000000..8be635df29 --- /dev/null +++ b/txscript/data/taproot-ref/a04e38678141417445359665f17e2c444cc55835 @@ -0,0 +1 @@ +{"tx": "0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acffc010000000732978e60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270880000000072fd39a2034e918800000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e776a0d52a", "prevouts": ["c1b27a0000000000215e1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b", "57e90f00000000002254202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["e4eb2e5c01db2c5b9db34a40e1ecc9df9d595262605d1edfdef071ce3b0817d8eceada0922be4bad565f02cddc3a9e4cd3511d2d4e5d807c47c8cdd21f6d5468"]}}, diff --git a/txscript/data/taproot-ref/a05131b921bd9d6b4ea47f249e51ee98efc05f54 b/txscript/data/taproot-ref/a05131b921bd9d6b4ea47f249e51ee98efc05f54 new file mode 100644 index 0000000000..2dc645c35a --- /dev/null +++ b/txscript/data/taproot-ref/a05131b921bd9d6b4ea47f249e51ee98efc05f54 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a080874cf108744cedfbb712de9629eed229ec49 b/txscript/data/taproot-ref/a080874cf108744cedfbb712de9629eed229ec49 new file mode 100644 index 0000000000..337fe5c37f --- /dev/null +++ b/txscript/data/taproot-ref/a080874cf108744cedfbb712de9629eed229ec49 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a086f46eaeca09d3649d592dc5a55044d8de1f41 b/txscript/data/taproot-ref/a086f46eaeca09d3649d592dc5a55044d8de1f41 new file mode 100644 index 0000000000..7a0c4a5a83 --- /dev/null +++ b/txscript/data/taproot-ref/a086f46eaeca09d3649d592dc5a55044d8de1f41 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a0951cc6042b25d64914d945c4e3758a0407ea87 b/txscript/data/taproot-ref/a0951cc6042b25d64914d945c4e3758a0407ea87 new file mode 100644 index 0000000000..8cc97d8112 --- /dev/null +++ b/txscript/data/taproot-ref/a0951cc6042b25d64914d945c4e3758a0407ea87 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a0c092d70e81d7131ac1cb03d9ac8db9d2c0709b b/txscript/data/taproot-ref/a0c092d70e81d7131ac1cb03d9ac8db9d2c0709b new file mode 100644 index 0000000000..4374c92962 --- /dev/null +++ b/txscript/data/taproot-ref/a0c092d70e81d7131ac1cb03d9ac8db9d2c0709b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a0d64b88f7e1a35f28c08292725d25214520f7a6 b/txscript/data/taproot-ref/a0d64b88f7e1a35f28c08292725d25214520f7a6 new file mode 100644 index 0000000000..c959d27ec1 --- /dev/null +++ b/txscript/data/taproot-ref/a0d64b88f7e1a35f28c08292725d25214520f7a6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a1258cbda9cc624bb9f238882cc84253a1dc87c2 b/txscript/data/taproot-ref/a1258cbda9cc624bb9f238882cc84253a1dc87c2 new file mode 100644 index 0000000000..eca64a77f4 --- /dev/null +++ b/txscript/data/taproot-ref/a1258cbda9cc624bb9f238882cc84253a1dc87c2 @@ -0,0 +1 @@ +{"tx": "01000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4910100000045a9a31203bb9d36000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8724030000", "prevouts": ["845f38000000000021531f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["1dff371c0f48cfce29e4d1379377185cdbd69cc7427224110ab9dff4e29f28ea6b2a1651841473ef5b0f5ed2ad0fbe587aaa778f04f4456f364ce1af0851add6", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/a1430a0798548b8c620d89157e6f2a54d9f94f2e b/txscript/data/taproot-ref/a1430a0798548b8c620d89157e6f2a54d9f94f2e new file mode 100644 index 0000000000..d7c29e8a53 --- /dev/null +++ b/txscript/data/taproot-ref/a1430a0798548b8c620d89157e6f2a54d9f94f2e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a16835f468084695f51026fc26ce3f842fc97714 b/txscript/data/taproot-ref/a16835f468084695f51026fc26ce3f842fc97714 new file mode 100644 index 0000000000..b31e7575db --- /dev/null +++ b/txscript/data/taproot-ref/a16835f468084695f51026fc26ce3f842fc97714 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a17272e8d29e6c955e3b27761ff0e3908e202ff1 b/txscript/data/taproot-ref/a17272e8d29e6c955e3b27761ff0e3908e202ff1 new file mode 100644 index 0000000000..258b3bd2a0 --- /dev/null +++ b/txscript/data/taproot-ref/a17272e8d29e6c955e3b27761ff0e3908e202ff1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a175484c1508738494b7c85ab928bb65c4a07f42 b/txscript/data/taproot-ref/a175484c1508738494b7c85ab928bb65c4a07f42 new file mode 100644 index 0000000000..bf7986859c --- /dev/null +++ b/txscript/data/taproot-ref/a175484c1508738494b7c85ab928bb65c4a07f42 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a17a5140033f84e309aac8415b2a580b4050203c b/txscript/data/taproot-ref/a17a5140033f84e309aac8415b2a580b4050203c new file mode 100644 index 0000000000..461b47d017 --- /dev/null +++ b/txscript/data/taproot-ref/a17a5140033f84e309aac8415b2a580b4050203c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a1b572d1fe5a9c9111033297ae5ff70014c256ce b/txscript/data/taproot-ref/a1b572d1fe5a9c9111033297ae5ff70014c256ce new file mode 100644 index 0000000000..e42ed982fd --- /dev/null +++ b/txscript/data/taproot-ref/a1b572d1fe5a9c9111033297ae5ff70014c256ce @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a1e666afd74df95cb5c06318730dff9116d6a22f b/txscript/data/taproot-ref/a1e666afd74df95cb5c06318730dff9116d6a22f new file mode 100644 index 0000000000..7b62e01096 --- /dev/null +++ b/txscript/data/taproot-ref/a1e666afd74df95cb5c06318730dff9116d6a22f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a1e97b7bd972796aecfd4b83180776a015f64a8e b/txscript/data/taproot-ref/a1e97b7bd972796aecfd4b83180776a015f64a8e new file mode 100644 index 0000000000..f3e5d82a45 --- /dev/null +++ b/txscript/data/taproot-ref/a1e97b7bd972796aecfd4b83180776a015f64a8e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a2124d0d2b17ee1f1e0998338eea25cffadf437c b/txscript/data/taproot-ref/a2124d0d2b17ee1f1e0998338eea25cffadf437c new file mode 100644 index 0000000000..b26aa4a44b --- /dev/null +++ b/txscript/data/taproot-ref/a2124d0d2b17ee1f1e0998338eea25cffadf437c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a2135bcd7d491b07a72fbd501a3b0be1b9f3bdc2 b/txscript/data/taproot-ref/a2135bcd7d491b07a72fbd501a3b0be1b9f3bdc2 new file mode 100644 index 0000000000..0c692030f8 --- /dev/null +++ b/txscript/data/taproot-ref/a2135bcd7d491b07a72fbd501a3b0be1b9f3bdc2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a21f2d7b6393cda8bcff8df7034062e8925f6377 b/txscript/data/taproot-ref/a21f2d7b6393cda8bcff8df7034062e8925f6377 new file mode 100644 index 0000000000..7290433b26 --- /dev/null +++ b/txscript/data/taproot-ref/a21f2d7b6393cda8bcff8df7034062e8925f6377 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a2452fe77f45ef6a612ce676a6ad9d9002b9331e b/txscript/data/taproot-ref/a2452fe77f45ef6a612ce676a6ad9d9002b9331e new file mode 100644 index 0000000000..63d8584c8f --- /dev/null +++ b/txscript/data/taproot-ref/a2452fe77f45ef6a612ce676a6ad9d9002b9331e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a25b4431040ecd4aca97dad2844cf0080a40800b b/txscript/data/taproot-ref/a25b4431040ecd4aca97dad2844cf0080a40800b new file mode 100644 index 0000000000..d6c2f415bc --- /dev/null +++ b/txscript/data/taproot-ref/a25b4431040ecd4aca97dad2844cf0080a40800b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a26f67d81684b9007a2109269de4afe49d23f938 b/txscript/data/taproot-ref/a26f67d81684b9007a2109269de4afe49d23f938 new file mode 100644 index 0000000000..f334688527 --- /dev/null +++ b/txscript/data/taproot-ref/a26f67d81684b9007a2109269de4afe49d23f938 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a293d31bc0cff7b14f873a325579ef283c8e2068 b/txscript/data/taproot-ref/a293d31bc0cff7b14f873a325579ef283c8e2068 new file mode 100644 index 0000000000..0b91537104 --- /dev/null +++ b/txscript/data/taproot-ref/a293d31bc0cff7b14f873a325579ef283c8e2068 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a2a3d1e6a386b04424a390d174bdd394f0b88602 b/txscript/data/taproot-ref/a2a3d1e6a386b04424a390d174bdd394f0b88602 new file mode 100644 index 0000000000..30674d104c --- /dev/null +++ b/txscript/data/taproot-ref/a2a3d1e6a386b04424a390d174bdd394f0b88602 @@ -0,0 +1 @@ +{"tx": "6a7bc0ae03dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2d010000005909f2bfdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc501000000c4642ca8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b22020000008a37259c02ef808b00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac4c7b8943", "prevouts": ["697b510000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b", "a86c1f0000000000165b142540f27e90740933c99d4f17ab2dfc6c82951cfb", "e3fe1c0000000000225120e57a7d71b34e22305b9beadfd5a56c380e33d3960d06bf6fd3c82fe378d7b10f"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["1c8ae8c42dca6eec413a2a33e76060a08817f826743139ab4caefbf03e884c281167c767454bc3c057abe112dfabda4a58e393e744ee39c71cf5ba744b10c43f"]}}, diff --git a/txscript/data/taproot-ref/a2ad73830bfcdf027adbf16721e9d3b54303b060 b/txscript/data/taproot-ref/a2ad73830bfcdf027adbf16721e9d3b54303b060 new file mode 100644 index 0000000000..b9d1be0ae8 --- /dev/null +++ b/txscript/data/taproot-ref/a2ad73830bfcdf027adbf16721e9d3b54303b060 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a2c43c8aa3d41b7eab2ae20fb1f9e973802d902e b/txscript/data/taproot-ref/a2c43c8aa3d41b7eab2ae20fb1f9e973802d902e new file mode 100644 index 0000000000..8eff24b61c --- /dev/null +++ b/txscript/data/taproot-ref/a2c43c8aa3d41b7eab2ae20fb1f9e973802d902e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a2c7ad1b00fd60ced001c83967d4fb945e86a28a b/txscript/data/taproot-ref/a2c7ad1b00fd60ced001c83967d4fb945e86a28a new file mode 100644 index 0000000000..5173b5d083 --- /dev/null +++ b/txscript/data/taproot-ref/a2c7ad1b00fd60ced001c83967d4fb945e86a28a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a2ccb0337cf44bc0b3562bbf7dcdd792989d5faa b/txscript/data/taproot-ref/a2ccb0337cf44bc0b3562bbf7dcdd792989d5faa new file mode 100644 index 0000000000..8c13940605 --- /dev/null +++ b/txscript/data/taproot-ref/a2ccb0337cf44bc0b3562bbf7dcdd792989d5faa @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a2f70a0c20b111ca1ab34de6f2319109527a564e b/txscript/data/taproot-ref/a2f70a0c20b111ca1ab34de6f2319109527a564e new file mode 100644 index 0000000000..99dda4da16 --- /dev/null +++ b/txscript/data/taproot-ref/a2f70a0c20b111ca1ab34de6f2319109527a564e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a32041608e8afe0ca18b503f0e9c30cd1480f6e2 b/txscript/data/taproot-ref/a32041608e8afe0ca18b503f0e9c30cd1480f6e2 new file mode 100644 index 0000000000..c9440f130f --- /dev/null +++ b/txscript/data/taproot-ref/a32041608e8afe0ca18b503f0e9c30cd1480f6e2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a32cec9ef7fd885815ad4d76f8a45026473405b3 b/txscript/data/taproot-ref/a32cec9ef7fd885815ad4d76f8a45026473405b3 new file mode 100644 index 0000000000..1020bfeb3a --- /dev/null +++ b/txscript/data/taproot-ref/a32cec9ef7fd885815ad4d76f8a45026473405b3 @@ -0,0 +1 @@ +{"tx": "0200000001a86a862f8a1bc1808f7ba2abcc71e2c0ff30c2c698fc832f6545a8dcb978b6cb00000000003bb9f1ec02bd2aa1fc110000001600143f886f8feaf75ad7bedd5713d4d148e7c97c1134580200000000000017a91402e53bc18808b3955166f5113b83b265fa421e998704f78020", "prevouts": ["de2ea3fc1100000022512034153a16ef8458ec2412ba42dd5be0fabd8b4c2f532d179dc958fc1fca3cae43"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY", "comment": "inactive/scriptpath_valid_opsuccess", "success": {"scriptSig": "", "witness": ["6d02d0213a37fd5a30867aa1387a81339fc2ddd1d3cf93c769e1d1383d69d5bc7e92044187af535f3f12de8952a123bf6cdc45dad9163ba4efd411fea48ca188", "20cb0ba18c127bd01c824f94fd2578ac4109c167b40bd92fd4f8ede9600f7f41f3ac00635068", "c0cb0ba18c127bd01c824f94fd2578ac4109c167b40bd92fd4f8ede9600f7f41f370d37925ebbaa58968ca2d1c370a50dc7325130308285a7d9868d3ad5a34267b01c94ae67cd857f8f23543b618b38154b6c0432568bb8cf7638fb55d4cc0a24e"]}}, diff --git a/txscript/data/taproot-ref/a34ff67c5e9162f46fa22c082d21a7ac7a23c3a9 b/txscript/data/taproot-ref/a34ff67c5e9162f46fa22c082d21a7ac7a23c3a9 new file mode 100644 index 0000000000..6032d5d5e7 --- /dev/null +++ b/txscript/data/taproot-ref/a34ff67c5e9162f46fa22c082d21a7ac7a23c3a9 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/a3770de2569e6bc576e5a3947ac08e8bbe24cb5b b/txscript/data/taproot-ref/a3770de2569e6bc576e5a3947ac08e8bbe24cb5b new file mode 100644 index 0000000000..48f6da9c36 --- /dev/null +++ b/txscript/data/taproot-ref/a3770de2569e6bc576e5a3947ac08e8bbe24cb5b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a3823af6285ec27ac5824bddb591a1f209bc4018 b/txscript/data/taproot-ref/a3823af6285ec27ac5824bddb591a1f209bc4018 new file mode 100644 index 0000000000..bf0130e5b1 --- /dev/null +++ b/txscript/data/taproot-ref/a3823af6285ec27ac5824bddb591a1f209bc4018 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a38819d7d0147d7cfd3e537fe3756def5a12274d b/txscript/data/taproot-ref/a38819d7d0147d7cfd3e537fe3756def5a12274d new file mode 100644 index 0000000000..3372f61946 --- /dev/null +++ b/txscript/data/taproot-ref/a38819d7d0147d7cfd3e537fe3756def5a12274d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a3ad36fa2c2c376afbf409d8fb83e076d6d87bac b/txscript/data/taproot-ref/a3ad36fa2c2c376afbf409d8fb83e076d6d87bac new file mode 100644 index 0000000000..3649311e74 --- /dev/null +++ b/txscript/data/taproot-ref/a3ad36fa2c2c376afbf409d8fb83e076d6d87bac @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a3af8000afdeacd1c3d6137959029e3b260c72ad b/txscript/data/taproot-ref/a3af8000afdeacd1c3d6137959029e3b260c72ad new file mode 100644 index 0000000000..541e855371 --- /dev/null +++ b/txscript/data/taproot-ref/a3af8000afdeacd1c3d6137959029e3b260c72ad @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a3b21dcd0e4adb6a0ef920d74555d2f699917d39 b/txscript/data/taproot-ref/a3b21dcd0e4adb6a0ef920d74555d2f699917d39 new file mode 100644 index 0000000000..f9075ec82b --- /dev/null +++ b/txscript/data/taproot-ref/a3b21dcd0e4adb6a0ef920d74555d2f699917d39 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a3ce74eabac11a8d8a11955afa3ad09d86b22961 b/txscript/data/taproot-ref/a3ce74eabac11a8d8a11955afa3ad09d86b22961 new file mode 100644 index 0000000000..100ad7c91a --- /dev/null +++ b/txscript/data/taproot-ref/a3ce74eabac11a8d8a11955afa3ad09d86b22961 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a3d08eda208b96260cb5b47c1478e155264ff8c1 b/txscript/data/taproot-ref/a3d08eda208b96260cb5b47c1478e155264ff8c1 new file mode 100644 index 0000000000..7d7d029a00 --- /dev/null +++ b/txscript/data/taproot-ref/a3d08eda208b96260cb5b47c1478e155264ff8c1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a3e5f143cabf7cdb1f6111fd744b4230796b6064 b/txscript/data/taproot-ref/a3e5f143cabf7cdb1f6111fd744b4230796b6064 new file mode 100644 index 0000000000..fe0575f100 --- /dev/null +++ b/txscript/data/taproot-ref/a3e5f143cabf7cdb1f6111fd744b4230796b6064 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a42eb9002c5144273a55bdd736db4fde19aee488 b/txscript/data/taproot-ref/a42eb9002c5144273a55bdd736db4fde19aee488 new file mode 100644 index 0000000000..0499469c89 --- /dev/null +++ b/txscript/data/taproot-ref/a42eb9002c5144273a55bdd736db4fde19aee488 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a446bc4e40187735edce2ecd8fcd0e7ed43952ee b/txscript/data/taproot-ref/a446bc4e40187735edce2ecd8fcd0e7ed43952ee new file mode 100644 index 0000000000..e3fd863379 --- /dev/null +++ b/txscript/data/taproot-ref/a446bc4e40187735edce2ecd8fcd0e7ed43952ee @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a45d7d60a1eef620afd536f4d69cd4196a0fa6e8 b/txscript/data/taproot-ref/a45d7d60a1eef620afd536f4d69cd4196a0fa6e8 new file mode 100644 index 0000000000..22cd5de2d7 --- /dev/null +++ b/txscript/data/taproot-ref/a45d7d60a1eef620afd536f4d69cd4196a0fa6e8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a460475c32082067af4eb3aca7203a69381aec6f b/txscript/data/taproot-ref/a460475c32082067af4eb3aca7203a69381aec6f new file mode 100644 index 0000000000..5a1f8c3596 --- /dev/null +++ b/txscript/data/taproot-ref/a460475c32082067af4eb3aca7203a69381aec6f @@ -0,0 +1 @@ +{"tx": "0200000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acffc00000000cb2d96c4010b104d0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7969a020000", "prevouts": ["adb67f000000000017a914de933560a9a700a6d4f856bfa5cf61713cb34ea687"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "235e212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "witness": ["9812921cf248a3062afe01f52b057f93bc52be09c8e70356114c3dac90a44a78e9a37585aa57022a1bb560677e47262ea82588fb92ec25026b7373ec8f443817"]}}, diff --git a/txscript/data/taproot-ref/a47eeeeb9c724e0247b882207d4598df2b1f9db0 b/txscript/data/taproot-ref/a47eeeeb9c724e0247b882207d4598df2b1f9db0 new file mode 100644 index 0000000000..09572007ef --- /dev/null +++ b/txscript/data/taproot-ref/a47eeeeb9c724e0247b882207d4598df2b1f9db0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a4b22b3869f32433a3caeafcc3e2dd92c010757d b/txscript/data/taproot-ref/a4b22b3869f32433a3caeafcc3e2dd92c010757d new file mode 100644 index 0000000000..14994dd4d0 --- /dev/null +++ b/txscript/data/taproot-ref/a4b22b3869f32433a3caeafcc3e2dd92c010757d @@ -0,0 +1 @@ +{"tx": "0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acffc010000000732978e60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270880000000072fd39a2034e918800000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e776a0d52a", "prevouts": ["c1b27a0000000000215e1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b", "57e90f00000000002254202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["a7b105433b4b1915ec19c609d0b6840b2317365b6a7eb657bbcdd76d3d3912ab855ce3c33a90f875c923d0c169d56c5e39986a1740ce00a05bce538bf8270c29"]}}, diff --git a/txscript/data/taproot-ref/a4b538f21947ef1c76087aab101911f7a2cd4ab0 b/txscript/data/taproot-ref/a4b538f21947ef1c76087aab101911f7a2cd4ab0 new file mode 100644 index 0000000000..9cfce6eeb5 --- /dev/null +++ b/txscript/data/taproot-ref/a4b538f21947ef1c76087aab101911f7a2cd4ab0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a4bb5997e547796263c8fda8ffb4c87967e2ea43 b/txscript/data/taproot-ref/a4bb5997e547796263c8fda8ffb4c87967e2ea43 new file mode 100644 index 0000000000..c244ca9a8e --- /dev/null +++ b/txscript/data/taproot-ref/a4bb5997e547796263c8fda8ffb4c87967e2ea43 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/a4c0daa47b25c77cdc37c485b2ddaf4db6edaac6 b/txscript/data/taproot-ref/a4c0daa47b25c77cdc37c485b2ddaf4db6edaac6 new file mode 100644 index 0000000000..16bafc6261 --- /dev/null +++ b/txscript/data/taproot-ref/a4c0daa47b25c77cdc37c485b2ddaf4db6edaac6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a4d7bdb95ff0421ff9f027700815f81ebac50d03 b/txscript/data/taproot-ref/a4d7bdb95ff0421ff9f027700815f81ebac50d03 new file mode 100644 index 0000000000..647c65e27e --- /dev/null +++ b/txscript/data/taproot-ref/a4d7bdb95ff0421ff9f027700815f81ebac50d03 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a4e49ce4052c6a3e72232ff2f764b972159ce65e b/txscript/data/taproot-ref/a4e49ce4052c6a3e72232ff2f764b972159ce65e new file mode 100644 index 0000000000..fcfae4045e --- /dev/null +++ b/txscript/data/taproot-ref/a4e49ce4052c6a3e72232ff2f764b972159ce65e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a4e87c35b253e9246a0bd98cbe936ecccbf2d89a b/txscript/data/taproot-ref/a4e87c35b253e9246a0bd98cbe936ecccbf2d89a new file mode 100644 index 0000000000..20aa5b31d4 --- /dev/null +++ b/txscript/data/taproot-ref/a4e87c35b253e9246a0bd98cbe936ecccbf2d89a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a4e89f79f42904ee1b600ddd79f2d3e27c855da0 b/txscript/data/taproot-ref/a4e89f79f42904ee1b600ddd79f2d3e27c855da0 new file mode 100644 index 0000000000..a32bb19e14 --- /dev/null +++ b/txscript/data/taproot-ref/a4e89f79f42904ee1b600ddd79f2d3e27c855da0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a4f449044130b59be750db18b3dd9cfd3bae5588 b/txscript/data/taproot-ref/a4f449044130b59be750db18b3dd9cfd3bae5588 new file mode 100644 index 0000000000..ca60fa6c78 --- /dev/null +++ b/txscript/data/taproot-ref/a4f449044130b59be750db18b3dd9cfd3bae5588 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a4f68b87043e04396cfebc9287c9d7280448eacb b/txscript/data/taproot-ref/a4f68b87043e04396cfebc9287c9d7280448eacb new file mode 100644 index 0000000000..fc11a83a58 --- /dev/null +++ b/txscript/data/taproot-ref/a4f68b87043e04396cfebc9287c9d7280448eacb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a4faeb187eb7094b39e0f0699026cacbbb9d2ea7 b/txscript/data/taproot-ref/a4faeb187eb7094b39e0f0699026cacbbb9d2ea7 new file mode 100644 index 0000000000..f3b70b993d --- /dev/null +++ b/txscript/data/taproot-ref/a4faeb187eb7094b39e0f0699026cacbbb9d2ea7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a4fb1b9f52700ffd6bf24f06e73666810b0e3260 b/txscript/data/taproot-ref/a4fb1b9f52700ffd6bf24f06e73666810b0e3260 new file mode 100644 index 0000000000..538c576ba8 --- /dev/null +++ b/txscript/data/taproot-ref/a4fb1b9f52700ffd6bf24f06e73666810b0e3260 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a506dd32985fc68730bdda9ec17bd68456455ba2 b/txscript/data/taproot-ref/a506dd32985fc68730bdda9ec17bd68456455ba2 new file mode 100644 index 0000000000..268352458e --- /dev/null +++ b/txscript/data/taproot-ref/a506dd32985fc68730bdda9ec17bd68456455ba2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a51dfad994645830ec06457aa99a3680c881234f b/txscript/data/taproot-ref/a51dfad994645830ec06457aa99a3680c881234f new file mode 100644 index 0000000000..f828e020bc --- /dev/null +++ b/txscript/data/taproot-ref/a51dfad994645830ec06457aa99a3680c881234f @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/a52cb7e463be1bd639929b2d3988c313fb4189b5 b/txscript/data/taproot-ref/a52cb7e463be1bd639929b2d3988c313fb4189b5 new file mode 100644 index 0000000000..ee8d416238 --- /dev/null +++ b/txscript/data/taproot-ref/a52cb7e463be1bd639929b2d3988c313fb4189b5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a545cc27e2d474a7a7b7ae974d6c61935d3bdfb6 b/txscript/data/taproot-ref/a545cc27e2d474a7a7b7ae974d6c61935d3bdfb6 new file mode 100644 index 0000000000..b8f0d327ec --- /dev/null +++ b/txscript/data/taproot-ref/a545cc27e2d474a7a7b7ae974d6c61935d3bdfb6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a547e004e80194fef36be8b3932bb2a42502c7b9 b/txscript/data/taproot-ref/a547e004e80194fef36be8b3932bb2a42502c7b9 new file mode 100644 index 0000000000..0b021374a3 --- /dev/null +++ b/txscript/data/taproot-ref/a547e004e80194fef36be8b3932bb2a42502c7b9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a54e57e8c7e474bf56e54f46813916ef373a9d88 b/txscript/data/taproot-ref/a54e57e8c7e474bf56e54f46813916ef373a9d88 new file mode 100644 index 0000000000..61746c5815 --- /dev/null +++ b/txscript/data/taproot-ref/a54e57e8c7e474bf56e54f46813916ef373a9d88 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a56763f3af3e1d367ff0097d69c129ed4bae7f00 b/txscript/data/taproot-ref/a56763f3af3e1d367ff0097d69c129ed4bae7f00 new file mode 100644 index 0000000000..03efe1c334 --- /dev/null +++ b/txscript/data/taproot-ref/a56763f3af3e1d367ff0097d69c129ed4bae7f00 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a5706ef86f9f5e79c7eb3a0ed8168f28bdc25f87 b/txscript/data/taproot-ref/a5706ef86f9f5e79c7eb3a0ed8168f28bdc25f87 new file mode 100644 index 0000000000..1ed99fd466 --- /dev/null +++ b/txscript/data/taproot-ref/a5706ef86f9f5e79c7eb3a0ed8168f28bdc25f87 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a574eeebf64538810c2a45c5864f3209361e1c96 b/txscript/data/taproot-ref/a574eeebf64538810c2a45c5864f3209361e1c96 new file mode 100644 index 0000000000..f560d1b21d --- /dev/null +++ b/txscript/data/taproot-ref/a574eeebf64538810c2a45c5864f3209361e1c96 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a59cd78a997d502a498c2b597cda9c8cb9b435e4 b/txscript/data/taproot-ref/a59cd78a997d502a498c2b597cda9c8cb9b435e4 new file mode 100644 index 0000000000..6e4e2237f8 --- /dev/null +++ b/txscript/data/taproot-ref/a59cd78a997d502a498c2b597cda9c8cb9b435e4 @@ -0,0 +1 @@ +{"tx": "0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bbf00000000a56b6a2060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f400000000b6cc542e020ae337000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acd5656735", "prevouts": ["148b28000000000021561f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b", "a4aa11000000000022512095cedeef0cb7aea3c0bd06d7fb572f0efff66b1d28013a778af1acfd69604efe"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["76f3c1c5360f37e418543fc90fdf11d4bc49ee0f5761f9397c721536f011ef6bee48fa7085ddb2789aaa88835f495523673adc441d8fbc12423c05431834c02b", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/a5aaae5e5cc3955871ba97a7c41d307fef2b72eb b/txscript/data/taproot-ref/a5aaae5e5cc3955871ba97a7c41d307fef2b72eb new file mode 100644 index 0000000000..a8aa7d3de6 --- /dev/null +++ b/txscript/data/taproot-ref/a5aaae5e5cc3955871ba97a7c41d307fef2b72eb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a5ace5adf4a44f04399e15b18f44e6a83e13b549 b/txscript/data/taproot-ref/a5ace5adf4a44f04399e15b18f44e6a83e13b549 new file mode 100644 index 0000000000..4f5af7d060 --- /dev/null +++ b/txscript/data/taproot-ref/a5ace5adf4a44f04399e15b18f44e6a83e13b549 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a5b907c867904b2e2631128c5f637988bef1282b b/txscript/data/taproot-ref/a5b907c867904b2e2631128c5f637988bef1282b new file mode 100644 index 0000000000..26cabc7b8b --- /dev/null +++ b/txscript/data/taproot-ref/a5b907c867904b2e2631128c5f637988bef1282b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a5c7d3a86b0f7fd48476aea167e188ad2e930dac b/txscript/data/taproot-ref/a5c7d3a86b0f7fd48476aea167e188ad2e930dac new file mode 100644 index 0000000000..5c2d8b7560 --- /dev/null +++ b/txscript/data/taproot-ref/a5c7d3a86b0f7fd48476aea167e188ad2e930dac @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a5ccdd516198da910321185e29de6f20d9be2985 b/txscript/data/taproot-ref/a5ccdd516198da910321185e29de6f20d9be2985 new file mode 100644 index 0000000000..78b832e6d9 --- /dev/null +++ b/txscript/data/taproot-ref/a5ccdd516198da910321185e29de6f20d9be2985 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a5d4903bde9105b510f48ef3783702f402c38289 b/txscript/data/taproot-ref/a5d4903bde9105b510f48ef3783702f402c38289 new file mode 100644 index 0000000000..0b6df5b1c1 --- /dev/null +++ b/txscript/data/taproot-ref/a5d4903bde9105b510f48ef3783702f402c38289 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a5f0f80d6202449807c3c23b59496812943f4d12 b/txscript/data/taproot-ref/a5f0f80d6202449807c3c23b59496812943f4d12 new file mode 100644 index 0000000000..6e97bfa79e --- /dev/null +++ b/txscript/data/taproot-ref/a5f0f80d6202449807c3c23b59496812943f4d12 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a610da0c9997c31b63719e6fe71e9b82d48595ec b/txscript/data/taproot-ref/a610da0c9997c31b63719e6fe71e9b82d48595ec new file mode 100644 index 0000000000..7c9845970f --- /dev/null +++ b/txscript/data/taproot-ref/a610da0c9997c31b63719e6fe71e9b82d48595ec @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a63c8dad9a5b7049824ad507266f11ef32fef7c3 b/txscript/data/taproot-ref/a63c8dad9a5b7049824ad507266f11ef32fef7c3 new file mode 100644 index 0000000000..d648eaeebf --- /dev/null +++ b/txscript/data/taproot-ref/a63c8dad9a5b7049824ad507266f11ef32fef7c3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a65e2a892ee1771cf4861f2c1bc2d5f505645c14 b/txscript/data/taproot-ref/a65e2a892ee1771cf4861f2c1bc2d5f505645c14 new file mode 100644 index 0000000000..6c64012223 --- /dev/null +++ b/txscript/data/taproot-ref/a65e2a892ee1771cf4861f2c1bc2d5f505645c14 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a66d01f6351976b51603542719f7e00648878dc0 b/txscript/data/taproot-ref/a66d01f6351976b51603542719f7e00648878dc0 new file mode 100644 index 0000000000..acfc7bdbab --- /dev/null +++ b/txscript/data/taproot-ref/a66d01f6351976b51603542719f7e00648878dc0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a686f07063eda38bb50a12b8bff95eb203e492e2 b/txscript/data/taproot-ref/a686f07063eda38bb50a12b8bff95eb203e492e2 new file mode 100644 index 0000000000..6ecb9d87cf --- /dev/null +++ b/txscript/data/taproot-ref/a686f07063eda38bb50a12b8bff95eb203e492e2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a6932b59aafceeb75607a7b5c0b5d93b3f2e17dc b/txscript/data/taproot-ref/a6932b59aafceeb75607a7b5c0b5d93b3f2e17dc new file mode 100644 index 0000000000..5dc9b50567 --- /dev/null +++ b/txscript/data/taproot-ref/a6932b59aafceeb75607a7b5c0b5d93b3f2e17dc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a6b7a9259b013c7a8613e1a5291dff6a4c46e85d b/txscript/data/taproot-ref/a6b7a9259b013c7a8613e1a5291dff6a4c46e85d new file mode 100644 index 0000000000..e4f22dc83f --- /dev/null +++ b/txscript/data/taproot-ref/a6b7a9259b013c7a8613e1a5291dff6a4c46e85d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a6ba23753e57cd1a1f2d7e37472e4679a0f113a7 b/txscript/data/taproot-ref/a6ba23753e57cd1a1f2d7e37472e4679a0f113a7 new file mode 100644 index 0000000000..ffeca1c769 --- /dev/null +++ b/txscript/data/taproot-ref/a6ba23753e57cd1a1f2d7e37472e4679a0f113a7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a6c5d8b49fda54f8534027bba1269af6af46da1f b/txscript/data/taproot-ref/a6c5d8b49fda54f8534027bba1269af6af46da1f new file mode 100644 index 0000000000..eb446a307d --- /dev/null +++ b/txscript/data/taproot-ref/a6c5d8b49fda54f8534027bba1269af6af46da1f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a6ccf2fabae7c6419459beefef87fd1e78fb2d4f b/txscript/data/taproot-ref/a6ccf2fabae7c6419459beefef87fd1e78fb2d4f new file mode 100644 index 0000000000..bc26c57525 --- /dev/null +++ b/txscript/data/taproot-ref/a6ccf2fabae7c6419459beefef87fd1e78fb2d4f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a6f23c5bb6dad507a24fea1ceecc0df2a026481c b/txscript/data/taproot-ref/a6f23c5bb6dad507a24fea1ceecc0df2a026481c new file mode 100644 index 0000000000..3b90beed62 --- /dev/null +++ b/txscript/data/taproot-ref/a6f23c5bb6dad507a24fea1ceecc0df2a026481c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a708a2f8ec818a38ec29e17b587179a32b43d704 b/txscript/data/taproot-ref/a708a2f8ec818a38ec29e17b587179a32b43d704 new file mode 100644 index 0000000000..25e42af2f8 --- /dev/null +++ b/txscript/data/taproot-ref/a708a2f8ec818a38ec29e17b587179a32b43d704 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a70da8709e12ffb27292ce7290967a40c89cf126 b/txscript/data/taproot-ref/a70da8709e12ffb27292ce7290967a40c89cf126 new file mode 100644 index 0000000000..9b43debdc1 --- /dev/null +++ b/txscript/data/taproot-ref/a70da8709e12ffb27292ce7290967a40c89cf126 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a72f0993c4460fa269fecd7c19909f1a8f319d4a b/txscript/data/taproot-ref/a72f0993c4460fa269fecd7c19909f1a8f319d4a new file mode 100644 index 0000000000..f2f537ab78 --- /dev/null +++ b/txscript/data/taproot-ref/a72f0993c4460fa269fecd7c19909f1a8f319d4a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a732f61f7a104110a42397e2f2bcff054f17f50d b/txscript/data/taproot-ref/a732f61f7a104110a42397e2f2bcff054f17f50d new file mode 100644 index 0000000000..2fc2ddd85b --- /dev/null +++ b/txscript/data/taproot-ref/a732f61f7a104110a42397e2f2bcff054f17f50d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a736014c5e879818948ab14c8851770efe5d5fbb b/txscript/data/taproot-ref/a736014c5e879818948ab14c8851770efe5d5fbb new file mode 100644 index 0000000000..65581ff4f7 --- /dev/null +++ b/txscript/data/taproot-ref/a736014c5e879818948ab14c8851770efe5d5fbb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a73a44e1dbbda1a5482aab336034e0f3b2631b86 b/txscript/data/taproot-ref/a73a44e1dbbda1a5482aab336034e0f3b2631b86 new file mode 100644 index 0000000000..9e17e39491 --- /dev/null +++ b/txscript/data/taproot-ref/a73a44e1dbbda1a5482aab336034e0f3b2631b86 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a742d0a1cc22ae97a4d67dae7649bce1710b89db b/txscript/data/taproot-ref/a742d0a1cc22ae97a4d67dae7649bce1710b89db new file mode 100644 index 0000000000..409c4e0592 --- /dev/null +++ b/txscript/data/taproot-ref/a742d0a1cc22ae97a4d67dae7649bce1710b89db @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/a758aa7b471d865a094148a124f948d84c1137bd b/txscript/data/taproot-ref/a758aa7b471d865a094148a124f948d84c1137bd new file mode 100644 index 0000000000..b82479efd1 --- /dev/null +++ b/txscript/data/taproot-ref/a758aa7b471d865a094148a124f948d84c1137bd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a76b07ca76b8129996817bda9c15cfe6c801c496 b/txscript/data/taproot-ref/a76b07ca76b8129996817bda9c15cfe6c801c496 new file mode 100644 index 0000000000..2a7123623c --- /dev/null +++ b/txscript/data/taproot-ref/a76b07ca76b8129996817bda9c15cfe6c801c496 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a777b3aa2b4eb6ca1a87d04550c620145fe1fd1d b/txscript/data/taproot-ref/a777b3aa2b4eb6ca1a87d04550c620145fe1fd1d new file mode 100644 index 0000000000..ea9252c0e2 --- /dev/null +++ b/txscript/data/taproot-ref/a777b3aa2b4eb6ca1a87d04550c620145fe1fd1d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a78c1ce484d2b06f18054390abe8ba3738befc47 b/txscript/data/taproot-ref/a78c1ce484d2b06f18054390abe8ba3738befc47 new file mode 100644 index 0000000000..08b88ad4c9 --- /dev/null +++ b/txscript/data/taproot-ref/a78c1ce484d2b06f18054390abe8ba3738befc47 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a7ca771886a4f3f8ef1274e272ed3b75f1c52957 b/txscript/data/taproot-ref/a7ca771886a4f3f8ef1274e272ed3b75f1c52957 new file mode 100644 index 0000000000..db0f9a7e76 --- /dev/null +++ b/txscript/data/taproot-ref/a7ca771886a4f3f8ef1274e272ed3b75f1c52957 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a7d8752018d8cded7995daa9e4cd387a0f75eafc b/txscript/data/taproot-ref/a7d8752018d8cded7995daa9e4cd387a0f75eafc new file mode 100644 index 0000000000..cbd57f46f1 --- /dev/null +++ b/txscript/data/taproot-ref/a7d8752018d8cded7995daa9e4cd387a0f75eafc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a7edc21f3d053cf490a4f0032887dd77602ce962 b/txscript/data/taproot-ref/a7edc21f3d053cf490a4f0032887dd77602ce962 new file mode 100644 index 0000000000..c04c45997b --- /dev/null +++ b/txscript/data/taproot-ref/a7edc21f3d053cf490a4f0032887dd77602ce962 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a80117d2623452c4c4d047ad5ffdcd2cfd707957 b/txscript/data/taproot-ref/a80117d2623452c4c4d047ad5ffdcd2cfd707957 new file mode 100644 index 0000000000..d098b52b19 --- /dev/null +++ b/txscript/data/taproot-ref/a80117d2623452c4c4d047ad5ffdcd2cfd707957 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a814c0230632e5c08f097102f2033615293348b7 b/txscript/data/taproot-ref/a814c0230632e5c08f097102f2033615293348b7 new file mode 100644 index 0000000000..2ab5851edb --- /dev/null +++ b/txscript/data/taproot-ref/a814c0230632e5c08f097102f2033615293348b7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a83603464a89b1ff53b86c47af7c54b0f8a72405 b/txscript/data/taproot-ref/a83603464a89b1ff53b86c47af7c54b0f8a72405 new file mode 100644 index 0000000000..1f1a18d01e --- /dev/null +++ b/txscript/data/taproot-ref/a83603464a89b1ff53b86c47af7c54b0f8a72405 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a858130542274ac050eecd7df40f62a22f2af3e5 b/txscript/data/taproot-ref/a858130542274ac050eecd7df40f62a22f2af3e5 new file mode 100644 index 0000000000..9d5a178f7c --- /dev/null +++ b/txscript/data/taproot-ref/a858130542274ac050eecd7df40f62a22f2af3e5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a87851edeb5a5db0f65fd04d5730500bf77c3e76 b/txscript/data/taproot-ref/a87851edeb5a5db0f65fd04d5730500bf77c3e76 new file mode 100644 index 0000000000..afdde25101 --- /dev/null +++ b/txscript/data/taproot-ref/a87851edeb5a5db0f65fd04d5730500bf77c3e76 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a8a3b52078ade562edb5a7dc6ab61ce4b3cca2ab b/txscript/data/taproot-ref/a8a3b52078ade562edb5a7dc6ab61ce4b3cca2ab new file mode 100644 index 0000000000..8a951c3930 --- /dev/null +++ b/txscript/data/taproot-ref/a8a3b52078ade562edb5a7dc6ab61ce4b3cca2ab @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a8b03c8e24ef968616c561f18edd3944caccbc5f b/txscript/data/taproot-ref/a8b03c8e24ef968616c561f18edd3944caccbc5f new file mode 100644 index 0000000000..77e376964f --- /dev/null +++ b/txscript/data/taproot-ref/a8b03c8e24ef968616c561f18edd3944caccbc5f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a8b6c76ee96d3aab811609a8979cfcc67cff79c6 b/txscript/data/taproot-ref/a8b6c76ee96d3aab811609a8979cfcc67cff79c6 new file mode 100644 index 0000000000..4cd0c3ec0d --- /dev/null +++ b/txscript/data/taproot-ref/a8b6c76ee96d3aab811609a8979cfcc67cff79c6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a8cd8ebe1c92a5ce01cb9d553c32988d450e82c9 b/txscript/data/taproot-ref/a8cd8ebe1c92a5ce01cb9d553c32988d450e82c9 new file mode 100644 index 0000000000..047f67cd97 --- /dev/null +++ b/txscript/data/taproot-ref/a8cd8ebe1c92a5ce01cb9d553c32988d450e82c9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a8f6f74ddb0e0e8e8361ea297e0abac830cc1dfd b/txscript/data/taproot-ref/a8f6f74ddb0e0e8e8361ea297e0abac830cc1dfd new file mode 100644 index 0000000000..48cbafae4f --- /dev/null +++ b/txscript/data/taproot-ref/a8f6f74ddb0e0e8e8361ea297e0abac830cc1dfd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a912b73ec5ce6f1628bcb8d8e2dca4f96fb71c5a b/txscript/data/taproot-ref/a912b73ec5ce6f1628bcb8d8e2dca4f96fb71c5a new file mode 100644 index 0000000000..97eff394b9 --- /dev/null +++ b/txscript/data/taproot-ref/a912b73ec5ce6f1628bcb8d8e2dca4f96fb71c5a @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/a91984528078da07c39af230d966ecfa33124d9d b/txscript/data/taproot-ref/a91984528078da07c39af230d966ecfa33124d9d new file mode 100644 index 0000000000..4706f60c9c --- /dev/null +++ b/txscript/data/taproot-ref/a91984528078da07c39af230d966ecfa33124d9d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a98e2c1c0077687fbc9166f61a386e4a7023ae4f b/txscript/data/taproot-ref/a98e2c1c0077687fbc9166f61a386e4a7023ae4f new file mode 100644 index 0000000000..8e8e5b3baf --- /dev/null +++ b/txscript/data/taproot-ref/a98e2c1c0077687fbc9166f61a386e4a7023ae4f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a99032acc713604176f8d95263865e2c6dd015fe b/txscript/data/taproot-ref/a99032acc713604176f8d95263865e2c6dd015fe new file mode 100644 index 0000000000..dfeb2e29c6 --- /dev/null +++ b/txscript/data/taproot-ref/a99032acc713604176f8d95263865e2c6dd015fe @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a9b04af95ae95e9a60941ab351fb387c007938a2 b/txscript/data/taproot-ref/a9b04af95ae95e9a60941ab351fb387c007938a2 new file mode 100644 index 0000000000..8ccfd4a512 --- /dev/null +++ b/txscript/data/taproot-ref/a9b04af95ae95e9a60941ab351fb387c007938a2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a9b58c8a3ebf4f2c3c8af6242b20c43aa733d6c5 b/txscript/data/taproot-ref/a9b58c8a3ebf4f2c3c8af6242b20c43aa733d6c5 new file mode 100644 index 0000000000..371389f21c --- /dev/null +++ b/txscript/data/taproot-ref/a9b58c8a3ebf4f2c3c8af6242b20c43aa733d6c5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/a9b81c4e5e52ddeed6c3bb9ecb2f67d7e056eb1f b/txscript/data/taproot-ref/a9b81c4e5e52ddeed6c3bb9ecb2f67d7e056eb1f new file mode 100644 index 0000000000..bc2e04d19f --- /dev/null +++ b/txscript/data/taproot-ref/a9b81c4e5e52ddeed6c3bb9ecb2f67d7e056eb1f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/aa0024897deb20273f4fad0f856967621953d402 b/txscript/data/taproot-ref/aa0024897deb20273f4fad0f856967621953d402 new file mode 100644 index 0000000000..99c8dec143 --- /dev/null +++ b/txscript/data/taproot-ref/aa0024897deb20273f4fad0f856967621953d402 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/aa0d4dde043c88d76ca0b51949f90e102187198f b/txscript/data/taproot-ref/aa0d4dde043c88d76ca0b51949f90e102187198f new file mode 100644 index 0000000000..8466345d40 --- /dev/null +++ b/txscript/data/taproot-ref/aa0d4dde043c88d76ca0b51949f90e102187198f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/aa17922f64ff7cd6d4aeb56bfab8af47218a86d1 b/txscript/data/taproot-ref/aa17922f64ff7cd6d4aeb56bfab8af47218a86d1 new file mode 100644 index 0000000000..40452b43c4 --- /dev/null +++ b/txscript/data/taproot-ref/aa17922f64ff7cd6d4aeb56bfab8af47218a86d1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/aa376ce844fe5f3d69f1047c99cbef99e732dbdd b/txscript/data/taproot-ref/aa376ce844fe5f3d69f1047c99cbef99e732dbdd new file mode 100644 index 0000000000..6ebbcfeec0 --- /dev/null +++ b/txscript/data/taproot-ref/aa376ce844fe5f3d69f1047c99cbef99e732dbdd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/aa471973e1dc517ae959d5706167622da05bab46 b/txscript/data/taproot-ref/aa471973e1dc517ae959d5706167622da05bab46 new file mode 100644 index 0000000000..229131afb4 --- /dev/null +++ b/txscript/data/taproot-ref/aa471973e1dc517ae959d5706167622da05bab46 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/aa56f625476b200e65ada22557c871b0993ff86e b/txscript/data/taproot-ref/aa56f625476b200e65ada22557c871b0993ff86e new file mode 100644 index 0000000000..bc8c68e714 --- /dev/null +++ b/txscript/data/taproot-ref/aa56f625476b200e65ada22557c871b0993ff86e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/aa76c2e6c5a061d0580802966b8efb8804164d68 b/txscript/data/taproot-ref/aa76c2e6c5a061d0580802966b8efb8804164d68 new file mode 100644 index 0000000000..b4692ce469 --- /dev/null +++ b/txscript/data/taproot-ref/aa76c2e6c5a061d0580802966b8efb8804164d68 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/aa8eac8fb7ebd4e613d8bdbce660665b3f45fa66 b/txscript/data/taproot-ref/aa8eac8fb7ebd4e613d8bdbce660665b3f45fa66 new file mode 100644 index 0000000000..eae7a6beaf --- /dev/null +++ b/txscript/data/taproot-ref/aa8eac8fb7ebd4e613d8bdbce660665b3f45fa66 @@ -0,0 +1 @@ +{"tx": "010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127076010000009e98a7e2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb70000000033ac90db0331e2690000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f878995083a", "prevouts": ["2bc7120000000000165a142540f27e90740933c99d4f17ab2dfc6c82951cfb", "e0b558000000000017a914d574841bde7bf0817694c799002118e85acf040e87"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["dff0006548d0260c0a1dac0892042eb1e23b110b81a12e1d068876601929ed6ac8749a22e15e624632b52257c2a704abf274f6d805aee49c4b3668b32f2efa00", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/aaa6693d92f9027513267fd416bd6201171873ac b/txscript/data/taproot-ref/aaa6693d92f9027513267fd416bd6201171873ac new file mode 100644 index 0000000000..43ad3b3fd4 --- /dev/null +++ b/txscript/data/taproot-ref/aaa6693d92f9027513267fd416bd6201171873ac @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/aab859864bc25e0a7b430273941b291f2b765ba7 b/txscript/data/taproot-ref/aab859864bc25e0a7b430273941b291f2b765ba7 new file mode 100644 index 0000000000..c83ed67e2c --- /dev/null +++ b/txscript/data/taproot-ref/aab859864bc25e0a7b430273941b291f2b765ba7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ab1a9283d7a85a42aff52d1937193ca27a794187 b/txscript/data/taproot-ref/ab1a9283d7a85a42aff52d1937193ca27a794187 new file mode 100644 index 0000000000..3b826cec84 --- /dev/null +++ b/txscript/data/taproot-ref/ab1a9283d7a85a42aff52d1937193ca27a794187 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ab3899ee5c2ed560ae6beb77e71e4950fc17aab3 b/txscript/data/taproot-ref/ab3899ee5c2ed560ae6beb77e71e4950fc17aab3 new file mode 100644 index 0000000000..62cb033bd6 --- /dev/null +++ b/txscript/data/taproot-ref/ab3899ee5c2ed560ae6beb77e71e4950fc17aab3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ab3bd8d93632f274ea33e6bac92fec9215c4f20f b/txscript/data/taproot-ref/ab3bd8d93632f274ea33e6bac92fec9215c4f20f new file mode 100644 index 0000000000..445a18bc87 --- /dev/null +++ b/txscript/data/taproot-ref/ab3bd8d93632f274ea33e6bac92fec9215c4f20f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ab3f300e2417c10f0eedeee88f719e82892e53a2 b/txscript/data/taproot-ref/ab3f300e2417c10f0eedeee88f719e82892e53a2 new file mode 100644 index 0000000000..f06006825a --- /dev/null +++ b/txscript/data/taproot-ref/ab3f300e2417c10f0eedeee88f719e82892e53a2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ab5267db0c03e93e08f51b597821900db93ae75c b/txscript/data/taproot-ref/ab5267db0c03e93e08f51b597821900db93ae75c new file mode 100644 index 0000000000..433ae0d345 --- /dev/null +++ b/txscript/data/taproot-ref/ab5267db0c03e93e08f51b597821900db93ae75c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ab8bd300852ee0d05f0c8d476f4205347466c6e3 b/txscript/data/taproot-ref/ab8bd300852ee0d05f0c8d476f4205347466c6e3 new file mode 100644 index 0000000000..16ee36a0f2 --- /dev/null +++ b/txscript/data/taproot-ref/ab8bd300852ee0d05f0c8d476f4205347466c6e3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ab8ffe370320d075a8c7b9daefaf545d29b7ac1b b/txscript/data/taproot-ref/ab8ffe370320d075a8c7b9daefaf545d29b7ac1b new file mode 100644 index 0000000000..076725a333 --- /dev/null +++ b/txscript/data/taproot-ref/ab8ffe370320d075a8c7b9daefaf545d29b7ac1b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ab9b4c72f3a16b2e16d40652ec33ca2a8ee4d3ef b/txscript/data/taproot-ref/ab9b4c72f3a16b2e16d40652ec33ca2a8ee4d3ef new file mode 100644 index 0000000000..93e23d6859 --- /dev/null +++ b/txscript/data/taproot-ref/ab9b4c72f3a16b2e16d40652ec33ca2a8ee4d3ef @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ab9c711cf8bbafb6cdfd30f945bfcb03cf0272b6 b/txscript/data/taproot-ref/ab9c711cf8bbafb6cdfd30f945bfcb03cf0272b6 new file mode 100644 index 0000000000..516b9931b5 --- /dev/null +++ b/txscript/data/taproot-ref/ab9c711cf8bbafb6cdfd30f945bfcb03cf0272b6 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/ac0b35cbd93f63ed7452d6acebde72ca9fcc3d81 b/txscript/data/taproot-ref/ac0b35cbd93f63ed7452d6acebde72ca9fcc3d81 new file mode 100644 index 0000000000..d1c31a372b --- /dev/null +++ b/txscript/data/taproot-ref/ac0b35cbd93f63ed7452d6acebde72ca9fcc3d81 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ac2088d883a0a84ac9d499824adcbd32f90b53c8 b/txscript/data/taproot-ref/ac2088d883a0a84ac9d499824adcbd32f90b53c8 new file mode 100644 index 0000000000..fa99360a7b --- /dev/null +++ b/txscript/data/taproot-ref/ac2088d883a0a84ac9d499824adcbd32f90b53c8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ac3cd67c26d777875eeebe2e90c716e8bd592ff4 b/txscript/data/taproot-ref/ac3cd67c26d777875eeebe2e90c716e8bd592ff4 new file mode 100644 index 0000000000..9dce465669 --- /dev/null +++ b/txscript/data/taproot-ref/ac3cd67c26d777875eeebe2e90c716e8bd592ff4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ac93b3ca2d9c1ec6e07725af461ea07bb19c4dee b/txscript/data/taproot-ref/ac93b3ca2d9c1ec6e07725af461ea07bb19c4dee new file mode 100644 index 0000000000..c44db52452 --- /dev/null +++ b/txscript/data/taproot-ref/ac93b3ca2d9c1ec6e07725af461ea07bb19c4dee @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/acef576be556d6720814253fa450ffd2684c3c7b b/txscript/data/taproot-ref/acef576be556d6720814253fa450ffd2684c3c7b new file mode 100644 index 0000000000..0cce5b0fcc --- /dev/null +++ b/txscript/data/taproot-ref/acef576be556d6720814253fa450ffd2684c3c7b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/acf314897698e9e208634f10df880184d9a7754d b/txscript/data/taproot-ref/acf314897698e9e208634f10df880184d9a7754d new file mode 100644 index 0000000000..b3592e9eaa --- /dev/null +++ b/txscript/data/taproot-ref/acf314897698e9e208634f10df880184d9a7754d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ad1589197b44cb0c659b26869de6c66b103e9682 b/txscript/data/taproot-ref/ad1589197b44cb0c659b26869de6c66b103e9682 new file mode 100644 index 0000000000..01a443f26c --- /dev/null +++ b/txscript/data/taproot-ref/ad1589197b44cb0c659b26869de6c66b103e9682 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ad16650f9e472fb459eb487a9f883c894760b565 b/txscript/data/taproot-ref/ad16650f9e472fb459eb487a9f883c894760b565 new file mode 100644 index 0000000000..af6dd11e7e --- /dev/null +++ b/txscript/data/taproot-ref/ad16650f9e472fb459eb487a9f883c894760b565 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ad382a856cee976ed155aa5fae9828cd059ccb26 b/txscript/data/taproot-ref/ad382a856cee976ed155aa5fae9828cd059ccb26 new file mode 100644 index 0000000000..69d7bc34ce --- /dev/null +++ b/txscript/data/taproot-ref/ad382a856cee976ed155aa5fae9828cd059ccb26 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ad4069abc0712cf1f3c8508b699379282bbf556a b/txscript/data/taproot-ref/ad4069abc0712cf1f3c8508b699379282bbf556a new file mode 100644 index 0000000000..1248ac843e --- /dev/null +++ b/txscript/data/taproot-ref/ad4069abc0712cf1f3c8508b699379282bbf556a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ad58a3216af0b6f002972233963f6be39c7aee60 b/txscript/data/taproot-ref/ad58a3216af0b6f002972233963f6be39c7aee60 new file mode 100644 index 0000000000..e404e2ec54 --- /dev/null +++ b/txscript/data/taproot-ref/ad58a3216af0b6f002972233963f6be39c7aee60 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ad67e4cfbdacd913d6561d8fe08f456a4341a88b b/txscript/data/taproot-ref/ad67e4cfbdacd913d6561d8fe08f456a4341a88b new file mode 100644 index 0000000000..20cac90cf8 --- /dev/null +++ b/txscript/data/taproot-ref/ad67e4cfbdacd913d6561d8fe08f456a4341a88b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ad705acdd20e8da3a2171681cbf04df9fa98a3f7 b/txscript/data/taproot-ref/ad705acdd20e8da3a2171681cbf04df9fa98a3f7 new file mode 100644 index 0000000000..59454d2974 --- /dev/null +++ b/txscript/data/taproot-ref/ad705acdd20e8da3a2171681cbf04df9fa98a3f7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ad8af6e7441c7a1e3628b69f1ca22b74068a2278 b/txscript/data/taproot-ref/ad8af6e7441c7a1e3628b69f1ca22b74068a2278 new file mode 100644 index 0000000000..536b51eee9 --- /dev/null +++ b/txscript/data/taproot-ref/ad8af6e7441c7a1e3628b69f1ca22b74068a2278 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/ad9cdf2ad4d35e3f1e5279c581d0394ae2aa6972 b/txscript/data/taproot-ref/ad9cdf2ad4d35e3f1e5279c581d0394ae2aa6972 new file mode 100644 index 0000000000..9db9034296 --- /dev/null +++ b/txscript/data/taproot-ref/ad9cdf2ad4d35e3f1e5279c581d0394ae2aa6972 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ada6178e8321efd51626a855bc6e5557d68ca3fa b/txscript/data/taproot-ref/ada6178e8321efd51626a855bc6e5557d68ca3fa new file mode 100644 index 0000000000..c777b7225b --- /dev/null +++ b/txscript/data/taproot-ref/ada6178e8321efd51626a855bc6e5557d68ca3fa @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/add98ecf3dbbc875a84ca24db0f18c054af38335 b/txscript/data/taproot-ref/add98ecf3dbbc875a84ca24db0f18c054af38335 new file mode 100644 index 0000000000..eaf588e8ec --- /dev/null +++ b/txscript/data/taproot-ref/add98ecf3dbbc875a84ca24db0f18c054af38335 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ade2c248d7512985cd0840191f643e986e49db2e b/txscript/data/taproot-ref/ade2c248d7512985cd0840191f643e986e49db2e new file mode 100644 index 0000000000..a2f39c073c --- /dev/null +++ b/txscript/data/taproot-ref/ade2c248d7512985cd0840191f643e986e49db2e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/aded7ddfdd7ffa25f49bad4502033ca4a8591786 b/txscript/data/taproot-ref/aded7ddfdd7ffa25f49bad4502033ca4a8591786 new file mode 100644 index 0000000000..5802a78b65 --- /dev/null +++ b/txscript/data/taproot-ref/aded7ddfdd7ffa25f49bad4502033ca4a8591786 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/adf617416382c5deb595144ff94dce09117c3181 b/txscript/data/taproot-ref/adf617416382c5deb595144ff94dce09117c3181 new file mode 100644 index 0000000000..099795dee0 --- /dev/null +++ b/txscript/data/taproot-ref/adf617416382c5deb595144ff94dce09117c3181 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/adfe9ae4df4e249a66eb91fd2f8b26ee063e6f76 b/txscript/data/taproot-ref/adfe9ae4df4e249a66eb91fd2f8b26ee063e6f76 new file mode 100644 index 0000000000..c34c764670 --- /dev/null +++ b/txscript/data/taproot-ref/adfe9ae4df4e249a66eb91fd2f8b26ee063e6f76 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ae32aa63248b35fca6503c67fb4fd2acf15a98ad b/txscript/data/taproot-ref/ae32aa63248b35fca6503c67fb4fd2acf15a98ad new file mode 100644 index 0000000000..4b8b291a89 --- /dev/null +++ b/txscript/data/taproot-ref/ae32aa63248b35fca6503c67fb4fd2acf15a98ad @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ae87ecd86f7053ab8d71a8f1fc84c2d2c62b472b b/txscript/data/taproot-ref/ae87ecd86f7053ab8d71a8f1fc84c2d2c62b472b new file mode 100644 index 0000000000..e7f9f6050b --- /dev/null +++ b/txscript/data/taproot-ref/ae87ecd86f7053ab8d71a8f1fc84c2d2c62b472b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ae887143b966f102e6e5967f76ea3c041af92e65 b/txscript/data/taproot-ref/ae887143b966f102e6e5967f76ea3c041af92e65 new file mode 100644 index 0000000000..0c49465ffd --- /dev/null +++ b/txscript/data/taproot-ref/ae887143b966f102e6e5967f76ea3c041af92e65 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/aea2776fad1a4341ceaff3aa6cf21d9c37587a96 b/txscript/data/taproot-ref/aea2776fad1a4341ceaff3aa6cf21d9c37587a96 new file mode 100644 index 0000000000..1536bb4084 --- /dev/null +++ b/txscript/data/taproot-ref/aea2776fad1a4341ceaff3aa6cf21d9c37587a96 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/aeabf0753dee7e4de87a4ffe6e1414931333b32a b/txscript/data/taproot-ref/aeabf0753dee7e4de87a4ffe6e1414931333b32a new file mode 100644 index 0000000000..c6d1d3e6a4 --- /dev/null +++ b/txscript/data/taproot-ref/aeabf0753dee7e4de87a4ffe6e1414931333b32a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/aeaf78544ff09661df34acf0ab140ca8f6834d93 b/txscript/data/taproot-ref/aeaf78544ff09661df34acf0ab140ca8f6834d93 new file mode 100644 index 0000000000..072875a4cd --- /dev/null +++ b/txscript/data/taproot-ref/aeaf78544ff09661df34acf0ab140ca8f6834d93 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/aeb2510aa3d77a9c6dcf533982e3925d74a03591 b/txscript/data/taproot-ref/aeb2510aa3d77a9c6dcf533982e3925d74a03591 new file mode 100644 index 0000000000..8eff19ac59 --- /dev/null +++ b/txscript/data/taproot-ref/aeb2510aa3d77a9c6dcf533982e3925d74a03591 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/af3246dfb5ebe1bed3d537e239a99af7422239e7 b/txscript/data/taproot-ref/af3246dfb5ebe1bed3d537e239a99af7422239e7 new file mode 100644 index 0000000000..127ab7fdc5 --- /dev/null +++ b/txscript/data/taproot-ref/af3246dfb5ebe1bed3d537e239a99af7422239e7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/af39e152ec29cf6ef9124bc09c621887cea05402 b/txscript/data/taproot-ref/af39e152ec29cf6ef9124bc09c621887cea05402 new file mode 100644 index 0000000000..f532828321 --- /dev/null +++ b/txscript/data/taproot-ref/af39e152ec29cf6ef9124bc09c621887cea05402 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/af4d15714a467c338537aaa00108e2bee33e8426 b/txscript/data/taproot-ref/af4d15714a467c338537aaa00108e2bee33e8426 new file mode 100644 index 0000000000..4c8cbad9c9 --- /dev/null +++ b/txscript/data/taproot-ref/af4d15714a467c338537aaa00108e2bee33e8426 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/af58cb52355f4201682a37056445b679070634b3 b/txscript/data/taproot-ref/af58cb52355f4201682a37056445b679070634b3 new file mode 100644 index 0000000000..dd09db0ef2 --- /dev/null +++ b/txscript/data/taproot-ref/af58cb52355f4201682a37056445b679070634b3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/af5fe2e1f2c809eb47dbe26c8a45e6a55718cce6 b/txscript/data/taproot-ref/af5fe2e1f2c809eb47dbe26c8a45e6a55718cce6 new file mode 100644 index 0000000000..9b93abf83b --- /dev/null +++ b/txscript/data/taproot-ref/af5fe2e1f2c809eb47dbe26c8a45e6a55718cce6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/af7648fbe02efa3d9188b9b61ce6422012612477 b/txscript/data/taproot-ref/af7648fbe02efa3d9188b9b61ce6422012612477 new file mode 100644 index 0000000000..68493b9e3f --- /dev/null +++ b/txscript/data/taproot-ref/af7648fbe02efa3d9188b9b61ce6422012612477 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/afa5c3718b0a518cee419488c60f2f2741ba28ff b/txscript/data/taproot-ref/afa5c3718b0a518cee419488c60f2f2741ba28ff new file mode 100644 index 0000000000..e3c83fe697 --- /dev/null +++ b/txscript/data/taproot-ref/afa5c3718b0a518cee419488c60f2f2741ba28ff @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/afb161887b4215368f593a2d8d8b6bc32170698d b/txscript/data/taproot-ref/afb161887b4215368f593a2d8d8b6bc32170698d new file mode 100644 index 0000000000..89e0d53357 --- /dev/null +++ b/txscript/data/taproot-ref/afb161887b4215368f593a2d8d8b6bc32170698d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/afb93dea86c318802ea31536847bc3786c8bb47c b/txscript/data/taproot-ref/afb93dea86c318802ea31536847bc3786c8bb47c new file mode 100644 index 0000000000..7f624d8f79 --- /dev/null +++ b/txscript/data/taproot-ref/afb93dea86c318802ea31536847bc3786c8bb47c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/afcc94478400491055613ccd42f75d4fa9c1ceab b/txscript/data/taproot-ref/afcc94478400491055613ccd42f75d4fa9c1ceab new file mode 100644 index 0000000000..a982f29e0e --- /dev/null +++ b/txscript/data/taproot-ref/afcc94478400491055613ccd42f75d4fa9c1ceab @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/afea0adf1a155b6acd7f6a1aac9dcfd781f953f1 b/txscript/data/taproot-ref/afea0adf1a155b6acd7f6a1aac9dcfd781f953f1 new file mode 100644 index 0000000000..aa37ed8a1f --- /dev/null +++ b/txscript/data/taproot-ref/afea0adf1a155b6acd7f6a1aac9dcfd781f953f1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b0225ebc20fa76a5b5efb83881756503681565fa b/txscript/data/taproot-ref/b0225ebc20fa76a5b5efb83881756503681565fa new file mode 100644 index 0000000000..207afaf20b --- /dev/null +++ b/txscript/data/taproot-ref/b0225ebc20fa76a5b5efb83881756503681565fa @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b02921b398ef06202f6f3b3f652c3c8f10888607 b/txscript/data/taproot-ref/b02921b398ef06202f6f3b3f652c3c8f10888607 new file mode 100644 index 0000000000..4f1f905678 --- /dev/null +++ b/txscript/data/taproot-ref/b02921b398ef06202f6f3b3f652c3c8f10888607 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b068dde987664207f704c5b73a6444bd16d46da8 b/txscript/data/taproot-ref/b068dde987664207f704c5b73a6444bd16d46da8 new file mode 100644 index 0000000000..cf56f72a5f --- /dev/null +++ b/txscript/data/taproot-ref/b068dde987664207f704c5b73a6444bd16d46da8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b06a48e5c2bc5a6b1fc1fec7273e5642a15c8c13 b/txscript/data/taproot-ref/b06a48e5c2bc5a6b1fc1fec7273e5642a15c8c13 new file mode 100644 index 0000000000..5f5a2e0659 --- /dev/null +++ b/txscript/data/taproot-ref/b06a48e5c2bc5a6b1fc1fec7273e5642a15c8c13 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b075dfb300337efeb5bdabad39fff800ee516fa3 b/txscript/data/taproot-ref/b075dfb300337efeb5bdabad39fff800ee516fa3 new file mode 100644 index 0000000000..5c2830d964 --- /dev/null +++ b/txscript/data/taproot-ref/b075dfb300337efeb5bdabad39fff800ee516fa3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b085cb29b4ab162f71d870e1b8f890fd0cf23cd6 b/txscript/data/taproot-ref/b085cb29b4ab162f71d870e1b8f890fd0cf23cd6 new file mode 100644 index 0000000000..a2a88ca800 --- /dev/null +++ b/txscript/data/taproot-ref/b085cb29b4ab162f71d870e1b8f890fd0cf23cd6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b08ac583665d8a49691a3a09c1d5cc1ee3b8a416 b/txscript/data/taproot-ref/b08ac583665d8a49691a3a09c1d5cc1ee3b8a416 new file mode 100644 index 0000000000..a8dec052ba --- /dev/null +++ b/txscript/data/taproot-ref/b08ac583665d8a49691a3a09c1d5cc1ee3b8a416 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b0a4831326c413d2804c49788050b9f91a6403f7 b/txscript/data/taproot-ref/b0a4831326c413d2804c49788050b9f91a6403f7 new file mode 100644 index 0000000000..e0ec213de8 --- /dev/null +++ b/txscript/data/taproot-ref/b0a4831326c413d2804c49788050b9f91a6403f7 @@ -0,0 +1 @@ +{"tx": "1dd1ae6902dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce500000000026e16df8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4100000000051563e9502ec56810000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc2caab52b", "prevouts": ["e99947000000000017a914de933560a9a700a6d4f856bfa5cf61713cb34ea687", "3f4a3c00000000002352212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["c121ee29e14189ecf575f48042069fb1cb2b67dd6b993ad51959e998da257d68d3a68e24af1b5a566a1cdd1366976d79d186e98fff0e84827211c49253546ac8"]}}, diff --git a/txscript/data/taproot-ref/b0ad1929e6a50924bb0dc2de48e23ed645f857f7 b/txscript/data/taproot-ref/b0ad1929e6a50924bb0dc2de48e23ed645f857f7 new file mode 100644 index 0000000000..c1a3325392 --- /dev/null +++ b/txscript/data/taproot-ref/b0ad1929e6a50924bb0dc2de48e23ed645f857f7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b0c00b0f653fb7d6d9c6d10a355b006e90bfdefd b/txscript/data/taproot-ref/b0c00b0f653fb7d6d9c6d10a355b006e90bfdefd new file mode 100644 index 0000000000..4e408fc5e1 --- /dev/null +++ b/txscript/data/taproot-ref/b0c00b0f653fb7d6d9c6d10a355b006e90bfdefd @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/b0c6d5f594246c874ab683269116303a280482fe b/txscript/data/taproot-ref/b0c6d5f594246c874ab683269116303a280482fe new file mode 100644 index 0000000000..c92d53419f --- /dev/null +++ b/txscript/data/taproot-ref/b0c6d5f594246c874ab683269116303a280482fe @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b0c73ceab30b62cfa56f40cdfd49c1ce58f55a01 b/txscript/data/taproot-ref/b0c73ceab30b62cfa56f40cdfd49c1ce58f55a01 new file mode 100644 index 0000000000..864941a86e --- /dev/null +++ b/txscript/data/taproot-ref/b0c73ceab30b62cfa56f40cdfd49c1ce58f55a01 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b0d9006bd4700ed6403142773e914c7bb257d345 b/txscript/data/taproot-ref/b0d9006bd4700ed6403142773e914c7bb257d345 new file mode 100644 index 0000000000..072800f47c --- /dev/null +++ b/txscript/data/taproot-ref/b0d9006bd4700ed6403142773e914c7bb257d345 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b0e3df60a56490ae4dccf3851d020b40b21b8b7b b/txscript/data/taproot-ref/b0e3df60a56490ae4dccf3851d020b40b21b8b7b new file mode 100644 index 0000000000..688584d688 --- /dev/null +++ b/txscript/data/taproot-ref/b0e3df60a56490ae4dccf3851d020b40b21b8b7b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b0ec063bde9113e41cd5590763cc5a80a27e57df b/txscript/data/taproot-ref/b0ec063bde9113e41cd5590763cc5a80a27e57df new file mode 100644 index 0000000000..247ba75ea4 --- /dev/null +++ b/txscript/data/taproot-ref/b0ec063bde9113e41cd5590763cc5a80a27e57df @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b105a50748888b6356015fc47a88bc2be5715d6d b/txscript/data/taproot-ref/b105a50748888b6356015fc47a88bc2be5715d6d new file mode 100644 index 0000000000..65bc917fff --- /dev/null +++ b/txscript/data/taproot-ref/b105a50748888b6356015fc47a88bc2be5715d6d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b14851f777181f4d6991a19eb5faf986f6c5d922 b/txscript/data/taproot-ref/b14851f777181f4d6991a19eb5faf986f6c5d922 new file mode 100644 index 0000000000..b0ddc298a3 --- /dev/null +++ b/txscript/data/taproot-ref/b14851f777181f4d6991a19eb5faf986f6c5d922 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b16c3acf4e0fdb0086f5e645c0abf5248401f236 b/txscript/data/taproot-ref/b16c3acf4e0fdb0086f5e645c0abf5248401f236 new file mode 100644 index 0000000000..3877cc288f --- /dev/null +++ b/txscript/data/taproot-ref/b16c3acf4e0fdb0086f5e645c0abf5248401f236 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b1776090f6173a9a430ec315e3ed5aabd24b1b72 b/txscript/data/taproot-ref/b1776090f6173a9a430ec315e3ed5aabd24b1b72 new file mode 100644 index 0000000000..20da9c8c70 --- /dev/null +++ b/txscript/data/taproot-ref/b1776090f6173a9a430ec315e3ed5aabd24b1b72 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b1a7636cf60adfde2e1358221f019b1e6b4155d6 b/txscript/data/taproot-ref/b1a7636cf60adfde2e1358221f019b1e6b4155d6 new file mode 100644 index 0000000000..130da96d80 --- /dev/null +++ b/txscript/data/taproot-ref/b1a7636cf60adfde2e1358221f019b1e6b4155d6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b1ad5a93a73ac48400168c0d0d6867c722e2ee94 b/txscript/data/taproot-ref/b1ad5a93a73ac48400168c0d0d6867c722e2ee94 new file mode 100644 index 0000000000..f5561e93c3 --- /dev/null +++ b/txscript/data/taproot-ref/b1ad5a93a73ac48400168c0d0d6867c722e2ee94 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b1b4eed63248ce097e83d9f1723c6762b7de9c27 b/txscript/data/taproot-ref/b1b4eed63248ce097e83d9f1723c6762b7de9c27 new file mode 100644 index 0000000000..bb2f3ad8aa --- /dev/null +++ b/txscript/data/taproot-ref/b1b4eed63248ce097e83d9f1723c6762b7de9c27 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b1bf9f8b4545db1b4c96961e0e20f15216c0e8b5 b/txscript/data/taproot-ref/b1bf9f8b4545db1b4c96961e0e20f15216c0e8b5 new file mode 100644 index 0000000000..be403d0272 --- /dev/null +++ b/txscript/data/taproot-ref/b1bf9f8b4545db1b4c96961e0e20f15216c0e8b5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b1c08a839cd0acb873c5f79044f09ba166bfa26d b/txscript/data/taproot-ref/b1c08a839cd0acb873c5f79044f09ba166bfa26d new file mode 100644 index 0000000000..671bca0fed --- /dev/null +++ b/txscript/data/taproot-ref/b1c08a839cd0acb873c5f79044f09ba166bfa26d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b1d288dfd536ad13a01041e19c9c11fead33ff91 b/txscript/data/taproot-ref/b1d288dfd536ad13a01041e19c9c11fead33ff91 new file mode 100644 index 0000000000..805d1a864c --- /dev/null +++ b/txscript/data/taproot-ref/b1d288dfd536ad13a01041e19c9c11fead33ff91 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b1e426a1d9ca218fe8dfbd94e4f84deb69cf3add b/txscript/data/taproot-ref/b1e426a1d9ca218fe8dfbd94e4f84deb69cf3add new file mode 100644 index 0000000000..cf52be42c4 --- /dev/null +++ b/txscript/data/taproot-ref/b1e426a1d9ca218fe8dfbd94e4f84deb69cf3add @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/b21f2a634774a50314c4e0ef19018373cfff5761 b/txscript/data/taproot-ref/b21f2a634774a50314c4e0ef19018373cfff5761 new file mode 100644 index 0000000000..4ee1bf8907 --- /dev/null +++ b/txscript/data/taproot-ref/b21f2a634774a50314c4e0ef19018373cfff5761 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b25b243c1918bd286e71165a606917ad6566dcb9 b/txscript/data/taproot-ref/b25b243c1918bd286e71165a606917ad6566dcb9 new file mode 100644 index 0000000000..035cb7bcf2 --- /dev/null +++ b/txscript/data/taproot-ref/b25b243c1918bd286e71165a606917ad6566dcb9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b279bf9258b4c48220f05e2e891b91c7b13e0572 b/txscript/data/taproot-ref/b279bf9258b4c48220f05e2e891b91c7b13e0572 new file mode 100644 index 0000000000..5e8b738104 --- /dev/null +++ b/txscript/data/taproot-ref/b279bf9258b4c48220f05e2e891b91c7b13e0572 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b2bf386739903299a1cce995ba58544747eee3f9 b/txscript/data/taproot-ref/b2bf386739903299a1cce995ba58544747eee3f9 new file mode 100644 index 0000000000..5be3e313ce --- /dev/null +++ b/txscript/data/taproot-ref/b2bf386739903299a1cce995ba58544747eee3f9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b34497bedf19b0567d48c3bb9d3c6c6b7285bf56 b/txscript/data/taproot-ref/b34497bedf19b0567d48c3bb9d3c6c6b7285bf56 new file mode 100644 index 0000000000..8fc74b13d4 --- /dev/null +++ b/txscript/data/taproot-ref/b34497bedf19b0567d48c3bb9d3c6c6b7285bf56 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b354cb571d5964e5709107acf8b69b7a52691648 b/txscript/data/taproot-ref/b354cb571d5964e5709107acf8b69b7a52691648 new file mode 100644 index 0000000000..bddb9973c3 --- /dev/null +++ b/txscript/data/taproot-ref/b354cb571d5964e5709107acf8b69b7a52691648 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b3621ec700f1905ab8a89bd0dc990c56dc5b2619 b/txscript/data/taproot-ref/b3621ec700f1905ab8a89bd0dc990c56dc5b2619 new file mode 100644 index 0000000000..f5a959df3a --- /dev/null +++ b/txscript/data/taproot-ref/b3621ec700f1905ab8a89bd0dc990c56dc5b2619 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b36fa07023f7e2c301fca71c92d63d4b9d3dbfe8 b/txscript/data/taproot-ref/b36fa07023f7e2c301fca71c92d63d4b9d3dbfe8 new file mode 100644 index 0000000000..15aa96385c --- /dev/null +++ b/txscript/data/taproot-ref/b36fa07023f7e2c301fca71c92d63d4b9d3dbfe8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b3acffc7854d876acec4be4e8f02c5785c9786cc b/txscript/data/taproot-ref/b3acffc7854d876acec4be4e8f02c5785c9786cc new file mode 100644 index 0000000000..2a7611ce63 --- /dev/null +++ b/txscript/data/taproot-ref/b3acffc7854d876acec4be4e8f02c5785c9786cc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b3b35af21b57765c4439d83505e2c122bcd9d159 b/txscript/data/taproot-ref/b3b35af21b57765c4439d83505e2c122bcd9d159 new file mode 100644 index 0000000000..2f80d038ad --- /dev/null +++ b/txscript/data/taproot-ref/b3b35af21b57765c4439d83505e2c122bcd9d159 @@ -0,0 +1 @@ +{"tx": "0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf330000000056a475b2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cba01000000746cca94dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cca00000000ed67c018043edd1c0100000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88accb010000", "prevouts": ["e2be7c000000000017a91441ce0eb0e6e5800ced23a872818e5aaa63be0d5b87", "3be74d00000000002251200106699296107db4ccd4290b8d3cc7be3754a2d9979743f64d14b4c3e7741f8d", "38fe530000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "1657142540f27e90740933c99d4f17ab2dfc6c82951cfb", "witness": ["ddaca7147b466835165381f7ed37d503db143637d11c7f16d815ec7bc34c0e9f3a3dba96eb04d63e872619684c4194998a63514ef6ffe93f0eaccbaa87b1ba47"]}}, diff --git a/txscript/data/taproot-ref/b3e2b23acbebfcbc2e5f4e54d4fd7005740cae7f b/txscript/data/taproot-ref/b3e2b23acbebfcbc2e5f4e54d4fd7005740cae7f new file mode 100644 index 0000000000..1ecc22a58f --- /dev/null +++ b/txscript/data/taproot-ref/b3e2b23acbebfcbc2e5f4e54d4fd7005740cae7f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b3f7745d61088bde2d2244a961085a6e8ca22a22 b/txscript/data/taproot-ref/b3f7745d61088bde2d2244a961085a6e8ca22a22 new file mode 100644 index 0000000000..078c12ede8 --- /dev/null +++ b/txscript/data/taproot-ref/b3f7745d61088bde2d2244a961085a6e8ca22a22 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b3fb8896212c7278ddd055ebe8806a9aadfbdbf4 b/txscript/data/taproot-ref/b3fb8896212c7278ddd055ebe8806a9aadfbdbf4 new file mode 100644 index 0000000000..6a9ed58cb2 --- /dev/null +++ b/txscript/data/taproot-ref/b3fb8896212c7278ddd055ebe8806a9aadfbdbf4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b42a78220d5bf6c02b4d64f379b4963da854ecf8 b/txscript/data/taproot-ref/b42a78220d5bf6c02b4d64f379b4963da854ecf8 new file mode 100644 index 0000000000..94fb92dec5 --- /dev/null +++ b/txscript/data/taproot-ref/b42a78220d5bf6c02b4d64f379b4963da854ecf8 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/b471b7933c10f89f075ebd244fc7dce18cc064ec b/txscript/data/taproot-ref/b471b7933c10f89f075ebd244fc7dce18cc064ec new file mode 100644 index 0000000000..fe47317fca --- /dev/null +++ b/txscript/data/taproot-ref/b471b7933c10f89f075ebd244fc7dce18cc064ec @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b4881b1ab0b628b8e08950b8799b2a7b2f90f6bb b/txscript/data/taproot-ref/b4881b1ab0b628b8e08950b8799b2a7b2f90f6bb new file mode 100644 index 0000000000..8a315bf3c9 --- /dev/null +++ b/txscript/data/taproot-ref/b4881b1ab0b628b8e08950b8799b2a7b2f90f6bb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b4b0e6e8de840a729657842fc3f326a51926695a b/txscript/data/taproot-ref/b4b0e6e8de840a729657842fc3f326a51926695a new file mode 100644 index 0000000000..1a70a81d1f --- /dev/null +++ b/txscript/data/taproot-ref/b4b0e6e8de840a729657842fc3f326a51926695a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b4c0e993f516711b0d2941c1993f065eee0512a5 b/txscript/data/taproot-ref/b4c0e993f516711b0d2941c1993f065eee0512a5 new file mode 100644 index 0000000000..0d502a8ecd --- /dev/null +++ b/txscript/data/taproot-ref/b4c0e993f516711b0d2941c1993f065eee0512a5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b4d27baa0c7f4d587689db8a9529b71fa55341ec b/txscript/data/taproot-ref/b4d27baa0c7f4d587689db8a9529b71fa55341ec new file mode 100644 index 0000000000..64d2e0bfbc --- /dev/null +++ b/txscript/data/taproot-ref/b4d27baa0c7f4d587689db8a9529b71fa55341ec @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b535e18acfb42d8eca463e3d005649eeec97a029 b/txscript/data/taproot-ref/b535e18acfb42d8eca463e3d005649eeec97a029 new file mode 100644 index 0000000000..2b43c6dd95 --- /dev/null +++ b/txscript/data/taproot-ref/b535e18acfb42d8eca463e3d005649eeec97a029 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b537477b73545075fe86dcab51eee08a1eff1f93 b/txscript/data/taproot-ref/b537477b73545075fe86dcab51eee08a1eff1f93 new file mode 100644 index 0000000000..5713f7dcdd --- /dev/null +++ b/txscript/data/taproot-ref/b537477b73545075fe86dcab51eee08a1eff1f93 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b545791a846adc504218666c3218bfaa83bc90d2 b/txscript/data/taproot-ref/b545791a846adc504218666c3218bfaa83bc90d2 new file mode 100644 index 0000000000..1d824d14f7 --- /dev/null +++ b/txscript/data/taproot-ref/b545791a846adc504218666c3218bfaa83bc90d2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b56d0867bbc5b009c7f592e99f5d598f728cda80 b/txscript/data/taproot-ref/b56d0867bbc5b009c7f592e99f5d598f728cda80 new file mode 100644 index 0000000000..8d54462565 --- /dev/null +++ b/txscript/data/taproot-ref/b56d0867bbc5b009c7f592e99f5d598f728cda80 @@ -0,0 +1 @@ +{"tx": "0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c720100000018c71abf60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b800000000898d559f03957a56000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48759030000", "prevouts": ["83a74800000000002355212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "20d90f0000000000225120cf270920c53765cb04b9e9f4d4bb11730a43c2f8bc3507d6160e85b28c4cc6fc"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["bf127f6c66b7e1102e7e4836650d9806400ed78271d46cc373e046582cdf8390c98ecc85b9404e8eb4b8e9e9b79bed4773fdb5eb0d950bfc127e46a8c7225e62"]}}, diff --git a/txscript/data/taproot-ref/b571a84a7a61d25a217f263add5e84836c981aad b/txscript/data/taproot-ref/b571a84a7a61d25a217f263add5e84836c981aad new file mode 100644 index 0000000000..c072031727 --- /dev/null +++ b/txscript/data/taproot-ref/b571a84a7a61d25a217f263add5e84836c981aad @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b592aa01c9d16fda0673296c91e16d85378ef308 b/txscript/data/taproot-ref/b592aa01c9d16fda0673296c91e16d85378ef308 new file mode 100644 index 0000000000..43dbb651a4 --- /dev/null +++ b/txscript/data/taproot-ref/b592aa01c9d16fda0673296c91e16d85378ef308 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b594302e03843a9f9c9551e5065d334f5788b18f b/txscript/data/taproot-ref/b594302e03843a9f9c9551e5065d334f5788b18f new file mode 100644 index 0000000000..640697cecd --- /dev/null +++ b/txscript/data/taproot-ref/b594302e03843a9f9c9551e5065d334f5788b18f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b5c23ef36f914bfe6734a376e3ff23afa4056cdf b/txscript/data/taproot-ref/b5c23ef36f914bfe6734a376e3ff23afa4056cdf new file mode 100644 index 0000000000..905529a43a --- /dev/null +++ b/txscript/data/taproot-ref/b5c23ef36f914bfe6734a376e3ff23afa4056cdf @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b5f858c267b5596e80a4ca9e1d9d9fc97493a161 b/txscript/data/taproot-ref/b5f858c267b5596e80a4ca9e1d9d9fc97493a161 new file mode 100644 index 0000000000..284f0bada3 --- /dev/null +++ b/txscript/data/taproot-ref/b5f858c267b5596e80a4ca9e1d9d9fc97493a161 @@ -0,0 +1 @@ +{"tx": "603fae9901dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2300000000c5bac1bd04e5355a00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac8e010000", "prevouts": ["62125c00000000002256202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["b492d21c321102276ae54fcbf77e697296436ec49857e79b4e0a7584486c791422a1272287f86f4f5d3201c76c402eb6c628126578e460265310ed7aea9a1c76"]}}, diff --git a/txscript/data/taproot-ref/b5f894878cea25475b042e2e6dccf49267130d0f b/txscript/data/taproot-ref/b5f894878cea25475b042e2e6dccf49267130d0f new file mode 100644 index 0000000000..6bbd52b400 --- /dev/null +++ b/txscript/data/taproot-ref/b5f894878cea25475b042e2e6dccf49267130d0f @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/b605240fb46dc5b5a62d8e4fe44362074c17cd79 b/txscript/data/taproot-ref/b605240fb46dc5b5a62d8e4fe44362074c17cd79 new file mode 100644 index 0000000000..7ddd1bbc2a --- /dev/null +++ b/txscript/data/taproot-ref/b605240fb46dc5b5a62d8e4fe44362074c17cd79 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b62a40520073f939f2c0c9f173f5df055dbcfe5e b/txscript/data/taproot-ref/b62a40520073f939f2c0c9f173f5df055dbcfe5e new file mode 100644 index 0000000000..2d24a5ebf2 --- /dev/null +++ b/txscript/data/taproot-ref/b62a40520073f939f2c0c9f173f5df055dbcfe5e @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/b646f8b3b9e38907889dca9d182ffcb148c5eb86 b/txscript/data/taproot-ref/b646f8b3b9e38907889dca9d182ffcb148c5eb86 new file mode 100644 index 0000000000..88ee50e33e --- /dev/null +++ b/txscript/data/taproot-ref/b646f8b3b9e38907889dca9d182ffcb148c5eb86 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b64c6d5ba93dfc04d7a168f3316abb231668ca1a b/txscript/data/taproot-ref/b64c6d5ba93dfc04d7a168f3316abb231668ca1a new file mode 100644 index 0000000000..1ba30d12d0 --- /dev/null +++ b/txscript/data/taproot-ref/b64c6d5ba93dfc04d7a168f3316abb231668ca1a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b66c4be98c84d4c925dd2af48a775cc657d0344d b/txscript/data/taproot-ref/b66c4be98c84d4c925dd2af48a775cc657d0344d new file mode 100644 index 0000000000..d185c645b5 --- /dev/null +++ b/txscript/data/taproot-ref/b66c4be98c84d4c925dd2af48a775cc657d0344d @@ -0,0 +1 @@ +{"tx": "010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127080010000003832b55860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f600000000395e212301b0d0000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79609c18144", "prevouts": ["126f1200000000002360212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "1cc50e00000000002251202b9c9277757683e3a6231ec9844202804510fe71120186742480ec3d3f4624b8"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["fc2469f70d2142b6c5a1bc787c6753454192d596cfa5390f25fdd84f537c2ffc2924d14846e63516a9c8eedfa1d017bfc24af99d1ad2bb0ff02030359d376267"]}}, diff --git a/txscript/data/taproot-ref/b6737bb08c29b827385850c321cf5d8413acfef6 b/txscript/data/taproot-ref/b6737bb08c29b827385850c321cf5d8413acfef6 new file mode 100644 index 0000000000..7eff83e8c4 --- /dev/null +++ b/txscript/data/taproot-ref/b6737bb08c29b827385850c321cf5d8413acfef6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b67e4f02f0ff506105dfa4a0171d89ceb6d26cfa b/txscript/data/taproot-ref/b67e4f02f0ff506105dfa4a0171d89ceb6d26cfa new file mode 100644 index 0000000000..e1734d0cc8 --- /dev/null +++ b/txscript/data/taproot-ref/b67e4f02f0ff506105dfa4a0171d89ceb6d26cfa @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b68b738158b1aed99780946dcf5925a67eb68cca b/txscript/data/taproot-ref/b68b738158b1aed99780946dcf5925a67eb68cca new file mode 100644 index 0000000000..70d0028c7c --- /dev/null +++ b/txscript/data/taproot-ref/b68b738158b1aed99780946dcf5925a67eb68cca @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b6df4711f8c031a1f3fc609594a2746d2d4e3d62 b/txscript/data/taproot-ref/b6df4711f8c031a1f3fc609594a2746d2d4e3d62 new file mode 100644 index 0000000000..547875d1b2 --- /dev/null +++ b/txscript/data/taproot-ref/b6df4711f8c031a1f3fc609594a2746d2d4e3d62 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b6e1970eedbfd9c6a474d94f15274687adf86c2e b/txscript/data/taproot-ref/b6e1970eedbfd9c6a474d94f15274687adf86c2e new file mode 100644 index 0000000000..0662f878a3 --- /dev/null +++ b/txscript/data/taproot-ref/b6e1970eedbfd9c6a474d94f15274687adf86c2e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b71c95db43c402381d9a9673ab063f0735eb1d31 b/txscript/data/taproot-ref/b71c95db43c402381d9a9673ab063f0735eb1d31 new file mode 100644 index 0000000000..c49d1b06a3 --- /dev/null +++ b/txscript/data/taproot-ref/b71c95db43c402381d9a9673ab063f0735eb1d31 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b71ebb4f48a1c213c17c8b1e9166cc38b072dc9d b/txscript/data/taproot-ref/b71ebb4f48a1c213c17c8b1e9166cc38b072dc9d new file mode 100644 index 0000000000..81916fb108 --- /dev/null +++ b/txscript/data/taproot-ref/b71ebb4f48a1c213c17c8b1e9166cc38b072dc9d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b72daece9e0661e0bd4c8a41d26c73ba8eef4882 b/txscript/data/taproot-ref/b72daece9e0661e0bd4c8a41d26c73ba8eef4882 new file mode 100644 index 0000000000..9ab237b428 --- /dev/null +++ b/txscript/data/taproot-ref/b72daece9e0661e0bd4c8a41d26c73ba8eef4882 @@ -0,0 +1 @@ +{"tx": "81f75e6703dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cae0000000014a05bb260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127036000000002ce4eb9c60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702201000000586df89c03fad66a0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487470e335d", "prevouts": ["52384c0000000000225120a633ee2ffb44c3c8f2264048054482ed19487fd868fbe840370e2c32dd11b85f", "aa2a13000000000021521f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b", "06580e00000000002251209f730866f32bab360a89a22c38a65c192ad65d3314437626484a41919647b175"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["e2724605c4d92803b851d6620f06e0d958a4b1b46f4b00b63c352345415d348718303dca66502c00dbb004c294b733f60a36fc50534cbd729ca50ea92420f08f"]}}, diff --git a/txscript/data/taproot-ref/b795709244b876a1f75a1d801c74732832748ebb b/txscript/data/taproot-ref/b795709244b876a1f75a1d801c74732832748ebb new file mode 100644 index 0000000000..95cc07fb81 --- /dev/null +++ b/txscript/data/taproot-ref/b795709244b876a1f75a1d801c74732832748ebb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b7a501079daff65d0e768364b11ab44c69980aa7 b/txscript/data/taproot-ref/b7a501079daff65d0e768364b11ab44c69980aa7 new file mode 100644 index 0000000000..a30d506805 --- /dev/null +++ b/txscript/data/taproot-ref/b7a501079daff65d0e768364b11ab44c69980aa7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b7b1691a7efc0fca08ac5b931ccb3dbf5aa891d8 b/txscript/data/taproot-ref/b7b1691a7efc0fca08ac5b931ccb3dbf5aa891d8 new file mode 100644 index 0000000000..16277c0d02 --- /dev/null +++ b/txscript/data/taproot-ref/b7b1691a7efc0fca08ac5b931ccb3dbf5aa891d8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b7cc907a8b0d3c3e1994be68a40873b4e99a5f78 b/txscript/data/taproot-ref/b7cc907a8b0d3c3e1994be68a40873b4e99a5f78 new file mode 100644 index 0000000000..65a3328c56 --- /dev/null +++ b/txscript/data/taproot-ref/b7cc907a8b0d3c3e1994be68a40873b4e99a5f78 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b8079c5bdcff63a0f477e2f79dd8aaf4928abda7 b/txscript/data/taproot-ref/b8079c5bdcff63a0f477e2f79dd8aaf4928abda7 new file mode 100644 index 0000000000..74eef9fb59 --- /dev/null +++ b/txscript/data/taproot-ref/b8079c5bdcff63a0f477e2f79dd8aaf4928abda7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b809617c671f07711eb77d11353900df3a1020b0 b/txscript/data/taproot-ref/b809617c671f07711eb77d11353900df3a1020b0 new file mode 100644 index 0000000000..e100c8f0cb --- /dev/null +++ b/txscript/data/taproot-ref/b809617c671f07711eb77d11353900df3a1020b0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b83c1c0b8c3121745e8e5a5de023dfb379736329 b/txscript/data/taproot-ref/b83c1c0b8c3121745e8e5a5de023dfb379736329 new file mode 100644 index 0000000000..1e4efeda6a --- /dev/null +++ b/txscript/data/taproot-ref/b83c1c0b8c3121745e8e5a5de023dfb379736329 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b83df399d9754f536f1c099dfad005119a65be7a b/txscript/data/taproot-ref/b83df399d9754f536f1c099dfad005119a65be7a new file mode 100644 index 0000000000..c413f3467f --- /dev/null +++ b/txscript/data/taproot-ref/b83df399d9754f536f1c099dfad005119a65be7a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b83ffefda146d967a06f51678c18eff540980695 b/txscript/data/taproot-ref/b83ffefda146d967a06f51678c18eff540980695 new file mode 100644 index 0000000000..0a4b3895d5 --- /dev/null +++ b/txscript/data/taproot-ref/b83ffefda146d967a06f51678c18eff540980695 @@ -0,0 +1 @@ +{"tx": "01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c429000000006320e29abcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5800000000394a92ad03058d9d000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fceb010000", "prevouts": ["57323200000000002257202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "ab5b6d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["dec9becce88c7c6ee39fcee29799b588f4e9694890ad4d72d43cbdac13b43b56712e17786a3b14e0edfc289967f985fcfec313b8d86e770a57ff687c43ebeb15", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/b84cd36f16a07a3e7153b397d87779a08b904316 b/txscript/data/taproot-ref/b84cd36f16a07a3e7153b397d87779a08b904316 new file mode 100644 index 0000000000..fe80906bdb --- /dev/null +++ b/txscript/data/taproot-ref/b84cd36f16a07a3e7153b397d87779a08b904316 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b8500830a3e73890fbb7f1b5e546f8dd9a851acb b/txscript/data/taproot-ref/b8500830a3e73890fbb7f1b5e546f8dd9a851acb new file mode 100644 index 0000000000..5e506231c6 --- /dev/null +++ b/txscript/data/taproot-ref/b8500830a3e73890fbb7f1b5e546f8dd9a851acb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b8684e0746d02b30dd7444f365d9552810403e85 b/txscript/data/taproot-ref/b8684e0746d02b30dd7444f365d9552810403e85 new file mode 100644 index 0000000000..94782fc4fc --- /dev/null +++ b/txscript/data/taproot-ref/b8684e0746d02b30dd7444f365d9552810403e85 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b8a16da4c5a5e56d3c75e8933ac8d444b9d06ecc b/txscript/data/taproot-ref/b8a16da4c5a5e56d3c75e8933ac8d444b9d06ecc new file mode 100644 index 0000000000..cf5a5ab353 --- /dev/null +++ b/txscript/data/taproot-ref/b8a16da4c5a5e56d3c75e8933ac8d444b9d06ecc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b8a400a5412cc152b17a2cda851c5874dd5ead2d b/txscript/data/taproot-ref/b8a400a5412cc152b17a2cda851c5874dd5ead2d new file mode 100644 index 0000000000..9acaab3d6c --- /dev/null +++ b/txscript/data/taproot-ref/b8a400a5412cc152b17a2cda851c5874dd5ead2d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b8a97f2ecce17499487b6afbfd74dcdb69711ff3 b/txscript/data/taproot-ref/b8a97f2ecce17499487b6afbfd74dcdb69711ff3 new file mode 100644 index 0000000000..d2f660e889 --- /dev/null +++ b/txscript/data/taproot-ref/b8a97f2ecce17499487b6afbfd74dcdb69711ff3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b8b534195cd5db1dd0cc83d99d7face7ebae029d b/txscript/data/taproot-ref/b8b534195cd5db1dd0cc83d99d7face7ebae029d new file mode 100644 index 0000000000..fdc0be032a --- /dev/null +++ b/txscript/data/taproot-ref/b8b534195cd5db1dd0cc83d99d7face7ebae029d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b8ba77481215495fefc3d9c89e8e4251b1514f9b b/txscript/data/taproot-ref/b8ba77481215495fefc3d9c89e8e4251b1514f9b new file mode 100644 index 0000000000..5bfe2ad36c --- /dev/null +++ b/txscript/data/taproot-ref/b8ba77481215495fefc3d9c89e8e4251b1514f9b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b8c25103015cf79375d6f576186c9bf014842e27 b/txscript/data/taproot-ref/b8c25103015cf79375d6f576186c9bf014842e27 new file mode 100644 index 0000000000..7ed6a8e98f --- /dev/null +++ b/txscript/data/taproot-ref/b8c25103015cf79375d6f576186c9bf014842e27 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b8c863f970b2f3c39e353171b5902be0355002ed b/txscript/data/taproot-ref/b8c863f970b2f3c39e353171b5902be0355002ed new file mode 100644 index 0000000000..606db95a3a --- /dev/null +++ b/txscript/data/taproot-ref/b8c863f970b2f3c39e353171b5902be0355002ed @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b8daa1c785e390cba67ca10da7ee578c00efb805 b/txscript/data/taproot-ref/b8daa1c785e390cba67ca10da7ee578c00efb805 new file mode 100644 index 0000000000..bea27d1084 --- /dev/null +++ b/txscript/data/taproot-ref/b8daa1c785e390cba67ca10da7ee578c00efb805 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b90034052330d016cb6261caaff33ff9b2007d1d b/txscript/data/taproot-ref/b90034052330d016cb6261caaff33ff9b2007d1d new file mode 100644 index 0000000000..15e749c0c5 --- /dev/null +++ b/txscript/data/taproot-ref/b90034052330d016cb6261caaff33ff9b2007d1d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b953ae08ca074cfcfeda2be630b7eabb0a0feef0 b/txscript/data/taproot-ref/b953ae08ca074cfcfeda2be630b7eabb0a0feef0 new file mode 100644 index 0000000000..a95b12247d --- /dev/null +++ b/txscript/data/taproot-ref/b953ae08ca074cfcfeda2be630b7eabb0a0feef0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b95d3cec25b96ed5bf972cb98ca8c6476eac7630 b/txscript/data/taproot-ref/b95d3cec25b96ed5bf972cb98ca8c6476eac7630 new file mode 100644 index 0000000000..e41ae9a7df --- /dev/null +++ b/txscript/data/taproot-ref/b95d3cec25b96ed5bf972cb98ca8c6476eac7630 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b95e31c70d4e1c7f52eb020450f422dc69f2b3f1 b/txscript/data/taproot-ref/b95e31c70d4e1c7f52eb020450f422dc69f2b3f1 new file mode 100644 index 0000000000..4b6c019bbd --- /dev/null +++ b/txscript/data/taproot-ref/b95e31c70d4e1c7f52eb020450f422dc69f2b3f1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b960c57badc5a9291e8064176397f05700f998c2 b/txscript/data/taproot-ref/b960c57badc5a9291e8064176397f05700f998c2 new file mode 100644 index 0000000000..f2a203f91b --- /dev/null +++ b/txscript/data/taproot-ref/b960c57badc5a9291e8064176397f05700f998c2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b98b3ae70f7b3075d295829a4a779d63ac54efc1 b/txscript/data/taproot-ref/b98b3ae70f7b3075d295829a4a779d63ac54efc1 new file mode 100644 index 0000000000..eb44d8e671 --- /dev/null +++ b/txscript/data/taproot-ref/b98b3ae70f7b3075d295829a4a779d63ac54efc1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/b9c4f033e767c62469be7d0c9837ff7976269c03 b/txscript/data/taproot-ref/b9c4f033e767c62469be7d0c9837ff7976269c03 new file mode 100644 index 0000000000..0c7559a343 --- /dev/null +++ b/txscript/data/taproot-ref/b9c4f033e767c62469be7d0c9837ff7976269c03 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ba1c9764d8c0c80309b24333c675854c1e92edf6 b/txscript/data/taproot-ref/ba1c9764d8c0c80309b24333c675854c1e92edf6 new file mode 100644 index 0000000000..5bd8d87a1d --- /dev/null +++ b/txscript/data/taproot-ref/ba1c9764d8c0c80309b24333c675854c1e92edf6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ba1e6bbaa2a233a2a9e108339e2a03d15db6c21a b/txscript/data/taproot-ref/ba1e6bbaa2a233a2a9e108339e2a03d15db6c21a new file mode 100644 index 0000000000..ceb19b207a --- /dev/null +++ b/txscript/data/taproot-ref/ba1e6bbaa2a233a2a9e108339e2a03d15db6c21a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ba213f9e83bc18ee5d889ce921f71786661cdb49 b/txscript/data/taproot-ref/ba213f9e83bc18ee5d889ce921f71786661cdb49 new file mode 100644 index 0000000000..f1c95891e2 --- /dev/null +++ b/txscript/data/taproot-ref/ba213f9e83bc18ee5d889ce921f71786661cdb49 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ba60320519e241dc303d027571c1b6b6677274ef b/txscript/data/taproot-ref/ba60320519e241dc303d027571c1b6b6677274ef new file mode 100644 index 0000000000..74275e7fdb --- /dev/null +++ b/txscript/data/taproot-ref/ba60320519e241dc303d027571c1b6b6677274ef @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ba66a56ebc2679a2d9e33cd52effe2bf5657ba63 b/txscript/data/taproot-ref/ba66a56ebc2679a2d9e33cd52effe2bf5657ba63 new file mode 100644 index 0000000000..978ad75912 --- /dev/null +++ b/txscript/data/taproot-ref/ba66a56ebc2679a2d9e33cd52effe2bf5657ba63 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ba71d7ae4697eea6a410b7c4d7d542ded867b329 b/txscript/data/taproot-ref/ba71d7ae4697eea6a410b7c4d7d542ded867b329 new file mode 100644 index 0000000000..254cd9b842 --- /dev/null +++ b/txscript/data/taproot-ref/ba71d7ae4697eea6a410b7c4d7d542ded867b329 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ba830627ab470b34e7d889cad07110a91669d64b b/txscript/data/taproot-ref/ba830627ab470b34e7d889cad07110a91669d64b new file mode 100644 index 0000000000..30a405c6ee --- /dev/null +++ b/txscript/data/taproot-ref/ba830627ab470b34e7d889cad07110a91669d64b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ba88104330b37c0458b14c5d53739d04527f803a b/txscript/data/taproot-ref/ba88104330b37c0458b14c5d53739d04527f803a new file mode 100644 index 0000000000..ab16a80716 --- /dev/null +++ b/txscript/data/taproot-ref/ba88104330b37c0458b14c5d53739d04527f803a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/baa4d60cb12ba51a47909ac8227ee6df6d0dc0b2 b/txscript/data/taproot-ref/baa4d60cb12ba51a47909ac8227ee6df6d0dc0b2 new file mode 100644 index 0000000000..6b0e3875d6 --- /dev/null +++ b/txscript/data/taproot-ref/baa4d60cb12ba51a47909ac8227ee6df6d0dc0b2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/baa96c5298845a9d61eb221acb395d2256d66ee5 b/txscript/data/taproot-ref/baa96c5298845a9d61eb221acb395d2256d66ee5 new file mode 100644 index 0000000000..5413438771 --- /dev/null +++ b/txscript/data/taproot-ref/baa96c5298845a9d61eb221acb395d2256d66ee5 @@ -0,0 +1 @@ +{"tx": "020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127075010000009e5d05f1bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0a01000000bbe4edb3018e8b46000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478715087253", "prevouts": ["3e281100000000002251209afd231cc3806be681d40ad69b07250c6c3c148fe648fcc127815dce6f5b16e8", "f75d75000000000021601f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["7eb34c8d1a1387448db057283b1804092fe8bed759b596c8dfc46534dc3d0f1722ba7889f2042d25cb663e37ff265891415c0a89e5b0424d7b65816c493c5c76"]}}, diff --git a/txscript/data/taproot-ref/baa9d2ad62a330c543ec07ad2137ad8de21565a1 b/txscript/data/taproot-ref/baa9d2ad62a330c543ec07ad2137ad8de21565a1 new file mode 100644 index 0000000000..b03c4d6b92 --- /dev/null +++ b/txscript/data/taproot-ref/baa9d2ad62a330c543ec07ad2137ad8de21565a1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bab370c81fa011cfbd5f4933e8e203b69b4613b9 b/txscript/data/taproot-ref/bab370c81fa011cfbd5f4933e8e203b69b4613b9 new file mode 100644 index 0000000000..b7c2878fa5 --- /dev/null +++ b/txscript/data/taproot-ref/bab370c81fa011cfbd5f4933e8e203b69b4613b9 @@ -0,0 +1 @@ +{"tx": "e4c3fc72038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ad00000000ef3908da60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270740000000074614a9ddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1001000000e3195ced032611a5000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487bd79c71f", "prevouts": ["c47c41000000000017a9148bc1125bf4e3450c593a5be1ae9a05461832d39a87", "ad5b0f0000000000225120defe27edd45ad927249675e5a926c89be2f3fb0cb8fc1f86ac9fffcfc79b097b", "b47b560000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "1653142540f27e90740933c99d4f17ab2dfc6c82951cfb", "witness": ["56ce4aac32ddc9b0137d682bf44e63f566123fbe72d36ac728c4c036e10f935e932ca13d7c8abfafe7f931daebe311f7a74c17285775adc4974f5334e62efd80"]}}, diff --git a/txscript/data/taproot-ref/bae295c693b97cb9ce1c49550985444f7083bf7d b/txscript/data/taproot-ref/bae295c693b97cb9ce1c49550985444f7083bf7d new file mode 100644 index 0000000000..fe25e83c2a --- /dev/null +++ b/txscript/data/taproot-ref/bae295c693b97cb9ce1c49550985444f7083bf7d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/baf106403ddec9a4e35d93e4d7e9c8858a1db975 b/txscript/data/taproot-ref/baf106403ddec9a4e35d93e4d7e9c8858a1db975 new file mode 100644 index 0000000000..10eeca7dda --- /dev/null +++ b/txscript/data/taproot-ref/baf106403ddec9a4e35d93e4d7e9c8858a1db975 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/baf7af0bebc3219aa43e93f239abf44c3c75cc84 b/txscript/data/taproot-ref/baf7af0bebc3219aa43e93f239abf44c3c75cc84 new file mode 100644 index 0000000000..96a9a8fc43 --- /dev/null +++ b/txscript/data/taproot-ref/baf7af0bebc3219aa43e93f239abf44c3c75cc84 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bb00878c7c40b024bd20fd9e026f76cc0f01bda7 b/txscript/data/taproot-ref/bb00878c7c40b024bd20fd9e026f76cc0f01bda7 new file mode 100644 index 0000000000..ce247e9b69 --- /dev/null +++ b/txscript/data/taproot-ref/bb00878c7c40b024bd20fd9e026f76cc0f01bda7 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/bb06616585d2cf60ef82187fc0334f6ddea3aafc b/txscript/data/taproot-ref/bb06616585d2cf60ef82187fc0334f6ddea3aafc new file mode 100644 index 0000000000..705aed8cf6 --- /dev/null +++ b/txscript/data/taproot-ref/bb06616585d2cf60ef82187fc0334f6ddea3aafc @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/bb0848b612e67f32638209d33374606f9f878516 b/txscript/data/taproot-ref/bb0848b612e67f32638209d33374606f9f878516 new file mode 100644 index 0000000000..b415999820 --- /dev/null +++ b/txscript/data/taproot-ref/bb0848b612e67f32638209d33374606f9f878516 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bb213f4cc6adea71bcd254acd7a66de7a21a8fb5 b/txscript/data/taproot-ref/bb213f4cc6adea71bcd254acd7a66de7a21a8fb5 new file mode 100644 index 0000000000..67a32d2242 --- /dev/null +++ b/txscript/data/taproot-ref/bb213f4cc6adea71bcd254acd7a66de7a21a8fb5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bb4c46289dbd303f6704b3a08d9e02f4c48b84e6 b/txscript/data/taproot-ref/bb4c46289dbd303f6704b3a08d9e02f4c48b84e6 new file mode 100644 index 0000000000..cd82bd085d --- /dev/null +++ b/txscript/data/taproot-ref/bb4c46289dbd303f6704b3a08d9e02f4c48b84e6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bb4cc97eb2c8303964e3730c003f85cb88a0211d b/txscript/data/taproot-ref/bb4cc97eb2c8303964e3730c003f85cb88a0211d new file mode 100644 index 0000000000..301f66b2d4 --- /dev/null +++ b/txscript/data/taproot-ref/bb4cc97eb2c8303964e3730c003f85cb88a0211d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bb7141b532ed1aa0b98bd58bc84ec2e08f2e47c0 b/txscript/data/taproot-ref/bb7141b532ed1aa0b98bd58bc84ec2e08f2e47c0 new file mode 100644 index 0000000000..a75fab1e83 --- /dev/null +++ b/txscript/data/taproot-ref/bb7141b532ed1aa0b98bd58bc84ec2e08f2e47c0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bb7fc95bb6e35ae77514934a3e4ffa53a6516e13 b/txscript/data/taproot-ref/bb7fc95bb6e35ae77514934a3e4ffa53a6516e13 new file mode 100644 index 0000000000..2c20ee9185 --- /dev/null +++ b/txscript/data/taproot-ref/bb7fc95bb6e35ae77514934a3e4ffa53a6516e13 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bb85f9b909ffd0ec974d57b8e96a0afe8031c95f b/txscript/data/taproot-ref/bb85f9b909ffd0ec974d57b8e96a0afe8031c95f new file mode 100644 index 0000000000..7c6dd2c7e2 --- /dev/null +++ b/txscript/data/taproot-ref/bb85f9b909ffd0ec974d57b8e96a0afe8031c95f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bbb302be328567aed2f8a9548699284ede429dc6 b/txscript/data/taproot-ref/bbb302be328567aed2f8a9548699284ede429dc6 new file mode 100644 index 0000000000..e62fc7bb24 --- /dev/null +++ b/txscript/data/taproot-ref/bbb302be328567aed2f8a9548699284ede429dc6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bbc60e9c8fe20335286b1b4c11f2554bf44bde1c b/txscript/data/taproot-ref/bbc60e9c8fe20335286b1b4c11f2554bf44bde1c new file mode 100644 index 0000000000..669b2c507e --- /dev/null +++ b/txscript/data/taproot-ref/bbc60e9c8fe20335286b1b4c11f2554bf44bde1c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bbd6a4aa19b13347c78851a8c39dc87ba2c6cc26 b/txscript/data/taproot-ref/bbd6a4aa19b13347c78851a8c39dc87ba2c6cc26 new file mode 100644 index 0000000000..71a77f5f1b --- /dev/null +++ b/txscript/data/taproot-ref/bbd6a4aa19b13347c78851a8c39dc87ba2c6cc26 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bc18a41aa534670b3eb06ea552eeaa43a8bf670b b/txscript/data/taproot-ref/bc18a41aa534670b3eb06ea552eeaa43a8bf670b new file mode 100644 index 0000000000..c0a32ca172 --- /dev/null +++ b/txscript/data/taproot-ref/bc18a41aa534670b3eb06ea552eeaa43a8bf670b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bc44929f9083ce895cef6e68e78c51d907624850 b/txscript/data/taproot-ref/bc44929f9083ce895cef6e68e78c51d907624850 new file mode 100644 index 0000000000..2af5f31e93 --- /dev/null +++ b/txscript/data/taproot-ref/bc44929f9083ce895cef6e68e78c51d907624850 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bc61d16fcfe7499f1dda3e1aebd61701783f32bb b/txscript/data/taproot-ref/bc61d16fcfe7499f1dda3e1aebd61701783f32bb new file mode 100644 index 0000000000..2433261588 --- /dev/null +++ b/txscript/data/taproot-ref/bc61d16fcfe7499f1dda3e1aebd61701783f32bb @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/bc63fef6a6e1da11f5ad9cdc8c82557d301f7f93 b/txscript/data/taproot-ref/bc63fef6a6e1da11f5ad9cdc8c82557d301f7f93 new file mode 100644 index 0000000000..3cfe6ea91c --- /dev/null +++ b/txscript/data/taproot-ref/bc63fef6a6e1da11f5ad9cdc8c82557d301f7f93 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bc94c09d187af83d11bc158ffad91041ae1cccf5 b/txscript/data/taproot-ref/bc94c09d187af83d11bc158ffad91041ae1cccf5 new file mode 100644 index 0000000000..b70e7b42a3 --- /dev/null +++ b/txscript/data/taproot-ref/bc94c09d187af83d11bc158ffad91041ae1cccf5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bcd93267863bf6c12c490fdca519c9a6fb257676 b/txscript/data/taproot-ref/bcd93267863bf6c12c490fdca519c9a6fb257676 new file mode 100644 index 0000000000..8f49d77a88 --- /dev/null +++ b/txscript/data/taproot-ref/bcd93267863bf6c12c490fdca519c9a6fb257676 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bcdee1bf1b6f002a01bcb15b07e1ceef6be9c962 b/txscript/data/taproot-ref/bcdee1bf1b6f002a01bcb15b07e1ceef6be9c962 new file mode 100644 index 0000000000..6009aa296b --- /dev/null +++ b/txscript/data/taproot-ref/bcdee1bf1b6f002a01bcb15b07e1ceef6be9c962 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bcfbb863f9751dbc9e52565fa18f52d7cfc28dc0 b/txscript/data/taproot-ref/bcfbb863f9751dbc9e52565fa18f52d7cfc28dc0 new file mode 100644 index 0000000000..2a5624da8d --- /dev/null +++ b/txscript/data/taproot-ref/bcfbb863f9751dbc9e52565fa18f52d7cfc28dc0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bd06f79eb234682d1b026c5b614cea268261d69b b/txscript/data/taproot-ref/bd06f79eb234682d1b026c5b614cea268261d69b new file mode 100644 index 0000000000..1c068a07b9 --- /dev/null +++ b/txscript/data/taproot-ref/bd06f79eb234682d1b026c5b614cea268261d69b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bd10e29dccdef5c1bc2693b295ca9c3ee1a5e9fb b/txscript/data/taproot-ref/bd10e29dccdef5c1bc2693b295ca9c3ee1a5e9fb new file mode 100644 index 0000000000..95165104d2 --- /dev/null +++ b/txscript/data/taproot-ref/bd10e29dccdef5c1bc2693b295ca9c3ee1a5e9fb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bd4570befca425281b554426e78e723b29b91aeb b/txscript/data/taproot-ref/bd4570befca425281b554426e78e723b29b91aeb new file mode 100644 index 0000000000..babb00e6b4 --- /dev/null +++ b/txscript/data/taproot-ref/bd4570befca425281b554426e78e723b29b91aeb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bd4b0d5ede1b9b28ba821e22b21d2e67eb35fb46 b/txscript/data/taproot-ref/bd4b0d5ede1b9b28ba821e22b21d2e67eb35fb46 new file mode 100644 index 0000000000..3087c426c6 --- /dev/null +++ b/txscript/data/taproot-ref/bd4b0d5ede1b9b28ba821e22b21d2e67eb35fb46 @@ -0,0 +1 @@ +{"tx": "020000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703f010000008417bf8f02fd950f000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a66f040000", "prevouts": ["1d8a12000000000017a914b202aa31930f9cb7b85a632f41f1539f30714abf87"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "225d202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "witness": ["2f3970c4d5172c246e2ea982a8bb87c9305b9cbf15d84bfd540d941f6f122ebe2ef3c3501030089b489936ea72e2e92c2663ed2b20a02369ba745daddc80a6f2", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/bd5b6bd1cba3b3c9511abe6e7ba85869cc7271a8 b/txscript/data/taproot-ref/bd5b6bd1cba3b3c9511abe6e7ba85869cc7271a8 new file mode 100644 index 0000000000..b9060f9ba3 --- /dev/null +++ b/txscript/data/taproot-ref/bd5b6bd1cba3b3c9511abe6e7ba85869cc7271a8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bd647eceba7eb445528903854da69225eb46a33b b/txscript/data/taproot-ref/bd647eceba7eb445528903854da69225eb46a33b new file mode 100644 index 0000000000..1707c1be31 --- /dev/null +++ b/txscript/data/taproot-ref/bd647eceba7eb445528903854da69225eb46a33b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bd806dc6dd950acd2fb4799772f9284b52b3eefd b/txscript/data/taproot-ref/bd806dc6dd950acd2fb4799772f9284b52b3eefd new file mode 100644 index 0000000000..b9e3d342bf --- /dev/null +++ b/txscript/data/taproot-ref/bd806dc6dd950acd2fb4799772f9284b52b3eefd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bd90aa727c6f46c0b214029c4cc55665db207ed4 b/txscript/data/taproot-ref/bd90aa727c6f46c0b214029c4cc55665db207ed4 new file mode 100644 index 0000000000..6ffe2559b3 --- /dev/null +++ b/txscript/data/taproot-ref/bd90aa727c6f46c0b214029c4cc55665db207ed4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bdb75495237a21c1632a1d8002a2de43c75cbece b/txscript/data/taproot-ref/bdb75495237a21c1632a1d8002a2de43c75cbece new file mode 100644 index 0000000000..7143f19b27 --- /dev/null +++ b/txscript/data/taproot-ref/bdb75495237a21c1632a1d8002a2de43c75cbece @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/be342f285479f59388d4ad299b262298ea0a194a b/txscript/data/taproot-ref/be342f285479f59388d4ad299b262298ea0a194a new file mode 100644 index 0000000000..98682f34f3 --- /dev/null +++ b/txscript/data/taproot-ref/be342f285479f59388d4ad299b262298ea0a194a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/be4056e6d4621f67f649cc023b36d0616763fb74 b/txscript/data/taproot-ref/be4056e6d4621f67f649cc023b36d0616763fb74 new file mode 100644 index 0000000000..6bdb0165b9 --- /dev/null +++ b/txscript/data/taproot-ref/be4056e6d4621f67f649cc023b36d0616763fb74 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/be5fa21ede21c3ae07d18916186307eb0dbd0b20 b/txscript/data/taproot-ref/be5fa21ede21c3ae07d18916186307eb0dbd0b20 new file mode 100644 index 0000000000..925528c431 --- /dev/null +++ b/txscript/data/taproot-ref/be5fa21ede21c3ae07d18916186307eb0dbd0b20 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/be6dd32445672ad01a41728099573f056d19f11b b/txscript/data/taproot-ref/be6dd32445672ad01a41728099573f056d19f11b new file mode 100644 index 0000000000..eb22035fdf --- /dev/null +++ b/txscript/data/taproot-ref/be6dd32445672ad01a41728099573f056d19f11b @@ -0,0 +1 @@ +{"tx": "01000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d00100000061bcd71c8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46200000000492c8d5abcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfde0000000026f8a34302b303e60000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87ab000000", "prevouts": ["6f8234000000000021551f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b", "b983310000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b", "c2d5810000000000225120ac0f4213e8783833c45f3d5eb7ad9dd617b78266b96dfb5473a425c0f67cf18a"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["f14e5905ca8541b51d405c71cf3b707b00110c385335fc5149daa88a2cbdee9bf8e885b0d23f4d2d1febc8c047ff70d3e28c87b150df581dfeac0436f45256a3"]}}, diff --git a/txscript/data/taproot-ref/beaac08761cf0537284bd2fb73e52c21bf944e0e b/txscript/data/taproot-ref/beaac08761cf0537284bd2fb73e52c21bf944e0e new file mode 100644 index 0000000000..90a1a0d333 --- /dev/null +++ b/txscript/data/taproot-ref/beaac08761cf0537284bd2fb73e52c21bf944e0e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bebcb9f288f4fe614ba1fcc940d72dd3a2e9182c b/txscript/data/taproot-ref/bebcb9f288f4fe614ba1fcc940d72dd3a2e9182c new file mode 100644 index 0000000000..c01c11d971 --- /dev/null +++ b/txscript/data/taproot-ref/bebcb9f288f4fe614ba1fcc940d72dd3a2e9182c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bf0031c6d9edfce82c4f7c49f277cbf11c628084 b/txscript/data/taproot-ref/bf0031c6d9edfce82c4f7c49f277cbf11c628084 new file mode 100644 index 0000000000..dda9ea1ea8 --- /dev/null +++ b/txscript/data/taproot-ref/bf0031c6d9edfce82c4f7c49f277cbf11c628084 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/bf1ad139661581e23e01c40061ebbcbdbce507e7 b/txscript/data/taproot-ref/bf1ad139661581e23e01c40061ebbcbdbce507e7 new file mode 100644 index 0000000000..019dcd17b4 --- /dev/null +++ b/txscript/data/taproot-ref/bf1ad139661581e23e01c40061ebbcbdbce507e7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bf2b441671494bdd813cbde459c3f201b5dc132d b/txscript/data/taproot-ref/bf2b441671494bdd813cbde459c3f201b5dc132d new file mode 100644 index 0000000000..ef0b8f1919 --- /dev/null +++ b/txscript/data/taproot-ref/bf2b441671494bdd813cbde459c3f201b5dc132d @@ -0,0 +1 @@ +{"tx": "02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4620100000077ad6e89bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2002000000f77fe99c020797ad00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac10010000", "prevouts": ["0b6c38000000000022512003f4235cf93ae95226c79f4ac7e76f24996218ade11a16913609a6e39f31ad9a", "12fb7700000000001657142540f27e90740933c99d4f17ab2dfc6c82951cfb"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["f680ed04b947655837744bfb290282b3ede1b1c03b28e020f9570c073aea52469f618a73356d310f01231c0f2514a2e3ea11b3e86f75eeb186369e46407f1b54"]}}, diff --git a/txscript/data/taproot-ref/bf34c8983707b06356e258d949ea5d5b386f793c b/txscript/data/taproot-ref/bf34c8983707b06356e258d949ea5d5b386f793c new file mode 100644 index 0000000000..a045088914 --- /dev/null +++ b/txscript/data/taproot-ref/bf34c8983707b06356e258d949ea5d5b386f793c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bf699d29a3431d6314083edeeb34fd0d30d0e88a b/txscript/data/taproot-ref/bf699d29a3431d6314083edeeb34fd0d30d0e88a new file mode 100644 index 0000000000..246fe204fa --- /dev/null +++ b/txscript/data/taproot-ref/bf699d29a3431d6314083edeeb34fd0d30d0e88a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bf79de65a5198ccae719f56cd87e06ebfa963388 b/txscript/data/taproot-ref/bf79de65a5198ccae719f56cd87e06ebfa963388 new file mode 100644 index 0000000000..2f24c9389b --- /dev/null +++ b/txscript/data/taproot-ref/bf79de65a5198ccae719f56cd87e06ebfa963388 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/bf8f7dfface9a3a19ae105b018ef9c8464a7766a b/txscript/data/taproot-ref/bf8f7dfface9a3a19ae105b018ef9c8464a7766a new file mode 100644 index 0000000000..b639c486ac --- /dev/null +++ b/txscript/data/taproot-ref/bf8f7dfface9a3a19ae105b018ef9c8464a7766a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/bff5be66a4aacf336f6a1a8aabdf35a37bd49c75 b/txscript/data/taproot-ref/bff5be66a4aacf336f6a1a8aabdf35a37bd49c75 new file mode 100644 index 0000000000..d27a402f95 --- /dev/null +++ b/txscript/data/taproot-ref/bff5be66a4aacf336f6a1a8aabdf35a37bd49c75 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c0039aba73061b1e9d1b5673c11d9a6fec6c2d2b b/txscript/data/taproot-ref/c0039aba73061b1e9d1b5673c11d9a6fec6c2d2b new file mode 100644 index 0000000000..fb1b688e53 --- /dev/null +++ b/txscript/data/taproot-ref/c0039aba73061b1e9d1b5673c11d9a6fec6c2d2b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c0201387de1a365edea3ae462c8e87757ac56e21 b/txscript/data/taproot-ref/c0201387de1a365edea3ae462c8e87757ac56e21 new file mode 100644 index 0000000000..6f283a7e52 --- /dev/null +++ b/txscript/data/taproot-ref/c0201387de1a365edea3ae462c8e87757ac56e21 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c0264fc040cf13b7e91a6413eb4b7c76c194b45c b/txscript/data/taproot-ref/c0264fc040cf13b7e91a6413eb4b7c76c194b45c new file mode 100644 index 0000000000..fb0a581602 --- /dev/null +++ b/txscript/data/taproot-ref/c0264fc040cf13b7e91a6413eb4b7c76c194b45c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c02fa738eb666819f177a296b855df242f3744a5 b/txscript/data/taproot-ref/c02fa738eb666819f177a296b855df242f3744a5 new file mode 100644 index 0000000000..02c0ea5791 --- /dev/null +++ b/txscript/data/taproot-ref/c02fa738eb666819f177a296b855df242f3744a5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c04290c4f9037a6b82b7d2392c6c80c1ae11f80c b/txscript/data/taproot-ref/c04290c4f9037a6b82b7d2392c6c80c1ae11f80c new file mode 100644 index 0000000000..6c957abda5 --- /dev/null +++ b/txscript/data/taproot-ref/c04290c4f9037a6b82b7d2392c6c80c1ae11f80c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c066693ba1a2191967ded9338dab201a79f31370 b/txscript/data/taproot-ref/c066693ba1a2191967ded9338dab201a79f31370 new file mode 100644 index 0000000000..2dc3d6790a --- /dev/null +++ b/txscript/data/taproot-ref/c066693ba1a2191967ded9338dab201a79f31370 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c06e8cd4278bfe18806835f29e8892fe38588b77 b/txscript/data/taproot-ref/c06e8cd4278bfe18806835f29e8892fe38588b77 new file mode 100644 index 0000000000..06f6ec5a04 --- /dev/null +++ b/txscript/data/taproot-ref/c06e8cd4278bfe18806835f29e8892fe38588b77 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c09fc10086b95973815a1c9f85b9e89af0b68a27 b/txscript/data/taproot-ref/c09fc10086b95973815a1c9f85b9e89af0b68a27 new file mode 100644 index 0000000000..d5def469fa --- /dev/null +++ b/txscript/data/taproot-ref/c09fc10086b95973815a1c9f85b9e89af0b68a27 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c0c65b781da778eab58a96c85067f90b2d4d1f4c b/txscript/data/taproot-ref/c0c65b781da778eab58a96c85067f90b2d4d1f4c new file mode 100644 index 0000000000..68b3689ebc --- /dev/null +++ b/txscript/data/taproot-ref/c0c65b781da778eab58a96c85067f90b2d4d1f4c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c0d2b1edf6f56cba1a8e2d0b100cb918fd7f803d b/txscript/data/taproot-ref/c0d2b1edf6f56cba1a8e2d0b100cb918fd7f803d new file mode 100644 index 0000000000..c48c9231ba --- /dev/null +++ b/txscript/data/taproot-ref/c0d2b1edf6f56cba1a8e2d0b100cb918fd7f803d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c0d30a73338909cf56a6d97fed0221e78bb7731d b/txscript/data/taproot-ref/c0d30a73338909cf56a6d97fed0221e78bb7731d new file mode 100644 index 0000000000..78837e1900 --- /dev/null +++ b/txscript/data/taproot-ref/c0d30a73338909cf56a6d97fed0221e78bb7731d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c0ea13628224c7cfa08a24dfe6cac5360c02d61f b/txscript/data/taproot-ref/c0ea13628224c7cfa08a24dfe6cac5360c02d61f new file mode 100644 index 0000000000..541b9fc93c --- /dev/null +++ b/txscript/data/taproot-ref/c0ea13628224c7cfa08a24dfe6cac5360c02d61f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c0f5b91a651c2d181d2e204758d6556b2d362c11 b/txscript/data/taproot-ref/c0f5b91a651c2d181d2e204758d6556b2d362c11 new file mode 100644 index 0000000000..e6201a4208 --- /dev/null +++ b/txscript/data/taproot-ref/c0f5b91a651c2d181d2e204758d6556b2d362c11 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c128857e0f643e229c430eb8ef7d3f5aaad861fb b/txscript/data/taproot-ref/c128857e0f643e229c430eb8ef7d3f5aaad861fb new file mode 100644 index 0000000000..b9173ed7c5 --- /dev/null +++ b/txscript/data/taproot-ref/c128857e0f643e229c430eb8ef7d3f5aaad861fb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c12b71a60e309ebef55284d493cfd3665116ac35 b/txscript/data/taproot-ref/c12b71a60e309ebef55284d493cfd3665116ac35 new file mode 100644 index 0000000000..298f74b9f7 --- /dev/null +++ b/txscript/data/taproot-ref/c12b71a60e309ebef55284d493cfd3665116ac35 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c146489c520399688a56c27fa5210f00c10e9e5b b/txscript/data/taproot-ref/c146489c520399688a56c27fa5210f00c10e9e5b new file mode 100644 index 0000000000..b2fdcba3be --- /dev/null +++ b/txscript/data/taproot-ref/c146489c520399688a56c27fa5210f00c10e9e5b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c180a8fea16357ccb1c9e9a5b1fcde5e0137ba39 b/txscript/data/taproot-ref/c180a8fea16357ccb1c9e9a5b1fcde5e0137ba39 new file mode 100644 index 0000000000..4ecb535a70 --- /dev/null +++ b/txscript/data/taproot-ref/c180a8fea16357ccb1c9e9a5b1fcde5e0137ba39 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c195e2cf967dde5160c0de3b6a514dbb2ff8485c b/txscript/data/taproot-ref/c195e2cf967dde5160c0de3b6a514dbb2ff8485c new file mode 100644 index 0000000000..c56c728414 --- /dev/null +++ b/txscript/data/taproot-ref/c195e2cf967dde5160c0de3b6a514dbb2ff8485c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c19c13729ac0ec5c7e396da5494a3f513d31d8e8 b/txscript/data/taproot-ref/c19c13729ac0ec5c7e396da5494a3f513d31d8e8 new file mode 100644 index 0000000000..3ab3d99910 --- /dev/null +++ b/txscript/data/taproot-ref/c19c13729ac0ec5c7e396da5494a3f513d31d8e8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c1b84b02f4cf106428923ebb095dd6888ae0ac50 b/txscript/data/taproot-ref/c1b84b02f4cf106428923ebb095dd6888ae0ac50 new file mode 100644 index 0000000000..6915b404cc --- /dev/null +++ b/txscript/data/taproot-ref/c1b84b02f4cf106428923ebb095dd6888ae0ac50 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c1bff9e88ae4e9b8bfd1976fa22c1802e6db3962 b/txscript/data/taproot-ref/c1bff9e88ae4e9b8bfd1976fa22c1802e6db3962 new file mode 100644 index 0000000000..0f55af5536 --- /dev/null +++ b/txscript/data/taproot-ref/c1bff9e88ae4e9b8bfd1976fa22c1802e6db3962 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c1e5922d5f60798c78f4d0d669795bdad1a0801b b/txscript/data/taproot-ref/c1e5922d5f60798c78f4d0d669795bdad1a0801b new file mode 100644 index 0000000000..04d11f5609 --- /dev/null +++ b/txscript/data/taproot-ref/c1e5922d5f60798c78f4d0d669795bdad1a0801b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c1eeed88c600ab669ef89bb18d5ef6a6830d4f0e b/txscript/data/taproot-ref/c1eeed88c600ab669ef89bb18d5ef6a6830d4f0e new file mode 100644 index 0000000000..9999814bd0 --- /dev/null +++ b/txscript/data/taproot-ref/c1eeed88c600ab669ef89bb18d5ef6a6830d4f0e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c21065afa4b19740633e3c552a080169d12b4afb b/txscript/data/taproot-ref/c21065afa4b19740633e3c552a080169d12b4afb new file mode 100644 index 0000000000..20036e5455 --- /dev/null +++ b/txscript/data/taproot-ref/c21065afa4b19740633e3c552a080169d12b4afb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c2268af10452034a5d5f9268c6f6797ab805a459 b/txscript/data/taproot-ref/c2268af10452034a5d5f9268c6f6797ab805a459 new file mode 100644 index 0000000000..5443a00a86 --- /dev/null +++ b/txscript/data/taproot-ref/c2268af10452034a5d5f9268c6f6797ab805a459 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c22963b5f52cca482bd79213fd1c9fd9819b85dc b/txscript/data/taproot-ref/c22963b5f52cca482bd79213fd1c9fd9819b85dc new file mode 100644 index 0000000000..676ea02453 --- /dev/null +++ b/txscript/data/taproot-ref/c22963b5f52cca482bd79213fd1c9fd9819b85dc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c23bb15b95f0283493b5e9660535131e08c4b442 b/txscript/data/taproot-ref/c23bb15b95f0283493b5e9660535131e08c4b442 new file mode 100644 index 0000000000..ffad9f19a3 --- /dev/null +++ b/txscript/data/taproot-ref/c23bb15b95f0283493b5e9660535131e08c4b442 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c23dc3dee1bab058e9dda39e357268464aff6993 b/txscript/data/taproot-ref/c23dc3dee1bab058e9dda39e357268464aff6993 new file mode 100644 index 0000000000..abbc96548a --- /dev/null +++ b/txscript/data/taproot-ref/c23dc3dee1bab058e9dda39e357268464aff6993 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c259be6e071636a46f638dc71fbf337480a65d62 b/txscript/data/taproot-ref/c259be6e071636a46f638dc71fbf337480a65d62 new file mode 100644 index 0000000000..495252c51b --- /dev/null +++ b/txscript/data/taproot-ref/c259be6e071636a46f638dc71fbf337480a65d62 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c2606a81031cc7d45d665ff29e83009cdaeb09b4 b/txscript/data/taproot-ref/c2606a81031cc7d45d665ff29e83009cdaeb09b4 new file mode 100644 index 0000000000..c387d8358f --- /dev/null +++ b/txscript/data/taproot-ref/c2606a81031cc7d45d665ff29e83009cdaeb09b4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c2615fefcd8c48ae15d7cdf715cb7cbe15365bb4 b/txscript/data/taproot-ref/c2615fefcd8c48ae15d7cdf715cb7cbe15365bb4 new file mode 100644 index 0000000000..6d861bfd68 --- /dev/null +++ b/txscript/data/taproot-ref/c2615fefcd8c48ae15d7cdf715cb7cbe15365bb4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c274fc041bc18ec36b6fc361335ee8c903ba6539 b/txscript/data/taproot-ref/c274fc041bc18ec36b6fc361335ee8c903ba6539 new file mode 100644 index 0000000000..96738b2219 --- /dev/null +++ b/txscript/data/taproot-ref/c274fc041bc18ec36b6fc361335ee8c903ba6539 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c2b521f99f9142ffd0f06f35fdbf0a1e6db3b411 b/txscript/data/taproot-ref/c2b521f99f9142ffd0f06f35fdbf0a1e6db3b411 new file mode 100644 index 0000000000..9b4bc68ba6 --- /dev/null +++ b/txscript/data/taproot-ref/c2b521f99f9142ffd0f06f35fdbf0a1e6db3b411 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c2bc316e1620048c72dc6375bd6c4de0d175594b b/txscript/data/taproot-ref/c2bc316e1620048c72dc6375bd6c4de0d175594b new file mode 100644 index 0000000000..cbe1b04d3b --- /dev/null +++ b/txscript/data/taproot-ref/c2bc316e1620048c72dc6375bd6c4de0d175594b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c2ccbe9e06e6c7ce6e43c0b381322fc7dc10a2c2 b/txscript/data/taproot-ref/c2ccbe9e06e6c7ce6e43c0b381322fc7dc10a2c2 new file mode 100644 index 0000000000..2e2d439bf3 --- /dev/null +++ b/txscript/data/taproot-ref/c2ccbe9e06e6c7ce6e43c0b381322fc7dc10a2c2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c2cdbf0cad554855e5a2c77ade2426042fd077d0 b/txscript/data/taproot-ref/c2cdbf0cad554855e5a2c77ade2426042fd077d0 new file mode 100644 index 0000000000..a6f6f56451 --- /dev/null +++ b/txscript/data/taproot-ref/c2cdbf0cad554855e5a2c77ade2426042fd077d0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c2fc3139b18939587fa9376d426b5ed6e5a7d384 b/txscript/data/taproot-ref/c2fc3139b18939587fa9376d426b5ed6e5a7d384 new file mode 100644 index 0000000000..b2539a2659 --- /dev/null +++ b/txscript/data/taproot-ref/c2fc3139b18939587fa9376d426b5ed6e5a7d384 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c30440e2e36842767c6880d3419ffd67d8fc65e5 b/txscript/data/taproot-ref/c30440e2e36842767c6880d3419ffd67d8fc65e5 new file mode 100644 index 0000000000..f66a6a4557 --- /dev/null +++ b/txscript/data/taproot-ref/c30440e2e36842767c6880d3419ffd67d8fc65e5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c30828b92e910f121013ae0e7e80f112ff29c40a b/txscript/data/taproot-ref/c30828b92e910f121013ae0e7e80f112ff29c40a new file mode 100644 index 0000000000..dc29ae2e88 --- /dev/null +++ b/txscript/data/taproot-ref/c30828b92e910f121013ae0e7e80f112ff29c40a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c30e1db5cebdf16c793ac3774df5940ba0cbd27f b/txscript/data/taproot-ref/c30e1db5cebdf16c793ac3774df5940ba0cbd27f new file mode 100644 index 0000000000..1a16550b22 --- /dev/null +++ b/txscript/data/taproot-ref/c30e1db5cebdf16c793ac3774df5940ba0cbd27f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c34e8364c057d48255c31d4626eee97cb90971f7 b/txscript/data/taproot-ref/c34e8364c057d48255c31d4626eee97cb90971f7 new file mode 100644 index 0000000000..d6cb2b5b99 --- /dev/null +++ b/txscript/data/taproot-ref/c34e8364c057d48255c31d4626eee97cb90971f7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c34ea38700b3874b1fc56b98fba764e26e442bbf b/txscript/data/taproot-ref/c34ea38700b3874b1fc56b98fba764e26e442bbf new file mode 100644 index 0000000000..a10fe95911 --- /dev/null +++ b/txscript/data/taproot-ref/c34ea38700b3874b1fc56b98fba764e26e442bbf @@ -0,0 +1 @@ +{"tx": "0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1800000000ddf5b1838bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4780000000089a2312a02051d56000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acb49fde2f", "prevouts": ["49f925000000000021541f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b", "afa3320000000000225120371978f5545190cd02a51377bbff85a41bb9eff83258c615791f81074881249a"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["f3d1ed496c94623ac0a726e91f1ebdf8d2f1f8fcc969396465b5fd55d0a712c470db6ad280ddedd08026910fb3b73f38cc204ea712a73f0461c35e266bcc793b", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/c36f9ecac75a1f8369062bd659d7be8116d9426f b/txscript/data/taproot-ref/c36f9ecac75a1f8369062bd659d7be8116d9426f new file mode 100644 index 0000000000..52358b726f --- /dev/null +++ b/txscript/data/taproot-ref/c36f9ecac75a1f8369062bd659d7be8116d9426f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c3759872dcc57d4041c64cfe3164f0beae9647dd b/txscript/data/taproot-ref/c3759872dcc57d4041c64cfe3164f0beae9647dd new file mode 100644 index 0000000000..929cbf6ccf --- /dev/null +++ b/txscript/data/taproot-ref/c3759872dcc57d4041c64cfe3164f0beae9647dd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c37b0f05074e165869fb4e36093d5d05e7f5cd58 b/txscript/data/taproot-ref/c37b0f05074e165869fb4e36093d5d05e7f5cd58 new file mode 100644 index 0000000000..e7561b0624 --- /dev/null +++ b/txscript/data/taproot-ref/c37b0f05074e165869fb4e36093d5d05e7f5cd58 @@ -0,0 +1 @@ +{"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", ""]}}, diff --git a/txscript/data/taproot-ref/c38df517f192e8ee8b749587f2286408e1add7af b/txscript/data/taproot-ref/c38df517f192e8ee8b749587f2286408e1add7af new file mode 100644 index 0000000000..9846d9e719 --- /dev/null +++ b/txscript/data/taproot-ref/c38df517f192e8ee8b749587f2286408e1add7af @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c3a855f0999c9f0c734c21ec479b4a2de052c197 b/txscript/data/taproot-ref/c3a855f0999c9f0c734c21ec479b4a2de052c197 new file mode 100644 index 0000000000..6386cccdba --- /dev/null +++ b/txscript/data/taproot-ref/c3a855f0999c9f0c734c21ec479b4a2de052c197 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c3ca44e765c59aef19ebc14444cb23801ff338d4 b/txscript/data/taproot-ref/c3ca44e765c59aef19ebc14444cb23801ff338d4 new file mode 100644 index 0000000000..2d3834ebc2 --- /dev/null +++ b/txscript/data/taproot-ref/c3ca44e765c59aef19ebc14444cb23801ff338d4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c3f3469ae6022ba9a824d15d3e5c6966ecd2729f b/txscript/data/taproot-ref/c3f3469ae6022ba9a824d15d3e5c6966ecd2729f new file mode 100644 index 0000000000..7a3982e272 --- /dev/null +++ b/txscript/data/taproot-ref/c3f3469ae6022ba9a824d15d3e5c6966ecd2729f @@ -0,0 +1 @@ +{"tx": "0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b930100000044a29d078bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40600000000ce8be267bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acffd000000004601938b033b82dc0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac33000000", "prevouts": ["0ba127000000000017a914e014b0ed75ce4306970c9f63e88b08a5a7bb4d0f87", "44813e0000000000225120bb7c940411adc6c3ebf9039e294ad28122b4469bbe77b36f9a131b3cbe33d3d3", "691a790000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "2358212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "witness": ["8f6e30f3e56f652139cfd8158d375f33d485dd0df08e2f04d20e3a4c8483122635fa195cd56cae46f25bf0f0a5697ea06506b59d758f9fc437dcb656cdd1652e"]}}, diff --git a/txscript/data/taproot-ref/c42ba6332f5103b6c07a6d7b7c7a96e1345fcad3 b/txscript/data/taproot-ref/c42ba6332f5103b6c07a6d7b7c7a96e1345fcad3 new file mode 100644 index 0000000000..f26409fcee --- /dev/null +++ b/txscript/data/taproot-ref/c42ba6332f5103b6c07a6d7b7c7a96e1345fcad3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c4499beb83fe2bbc215490890a252106247a0d03 b/txscript/data/taproot-ref/c4499beb83fe2bbc215490890a252106247a0d03 new file mode 100644 index 0000000000..4771461e0e --- /dev/null +++ b/txscript/data/taproot-ref/c4499beb83fe2bbc215490890a252106247a0d03 @@ -0,0 +1 @@ +{"tx": "88a47fd8028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c442000000001eaf11b1bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf21020000000137c7d2049d1696000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc370c5044", "prevouts": ["466038000000000017a914525ca05541c81a105639c2efb802eaf5596cfe0187", "94b8600000000000225120554d9dd7197117aaa4d7426c37fed7dc5f4b29ff7dce4879497bcc4232903b0f"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "21521f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b", "witness": ["81cf41ac01a8d340559ec283da8639f3fff7a149b72f7168ecf7c03f4414197cc498af8b0c059c0e1181f6662b53f98c1fcc8d007d3e425884e23a06c8de5ffb"]}}, diff --git a/txscript/data/taproot-ref/c46f7002e386e4c4fd5c63195b15a2720dc604c6 b/txscript/data/taproot-ref/c46f7002e386e4c4fd5c63195b15a2720dc604c6 new file mode 100644 index 0000000000..1095aa4e59 --- /dev/null +++ b/txscript/data/taproot-ref/c46f7002e386e4c4fd5c63195b15a2720dc604c6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c4b2c2074e18699523a8e60939dabe323e8cfcc8 b/txscript/data/taproot-ref/c4b2c2074e18699523a8e60939dabe323e8cfcc8 new file mode 100644 index 0000000000..02de777b06 --- /dev/null +++ b/txscript/data/taproot-ref/c4b2c2074e18699523a8e60939dabe323e8cfcc8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c4c19d4cee5d79334aa9c0ff61f19d321cc3941e b/txscript/data/taproot-ref/c4c19d4cee5d79334aa9c0ff61f19d321cc3941e new file mode 100644 index 0000000000..8f46ddde5a --- /dev/null +++ b/txscript/data/taproot-ref/c4c19d4cee5d79334aa9c0ff61f19d321cc3941e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c4e28343af816c29311d37b8559a05b14d797dd9 b/txscript/data/taproot-ref/c4e28343af816c29311d37b8559a05b14d797dd9 new file mode 100644 index 0000000000..7e4bb864ed --- /dev/null +++ b/txscript/data/taproot-ref/c4e28343af816c29311d37b8559a05b14d797dd9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c5c550da4ca7e932cdd65a9656f2f7c611148d24 b/txscript/data/taproot-ref/c5c550da4ca7e932cdd65a9656f2f7c611148d24 new file mode 100644 index 0000000000..650dbbe13a --- /dev/null +++ b/txscript/data/taproot-ref/c5c550da4ca7e932cdd65a9656f2f7c611148d24 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c62a6dec1ec0c7508b82a35dfbcc1d66455eb241 b/txscript/data/taproot-ref/c62a6dec1ec0c7508b82a35dfbcc1d66455eb241 new file mode 100644 index 0000000000..6364250e5e --- /dev/null +++ b/txscript/data/taproot-ref/c62a6dec1ec0c7508b82a35dfbcc1d66455eb241 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c62d08fa40199eb68353dc3045f6c961f21f080c b/txscript/data/taproot-ref/c62d08fa40199eb68353dc3045f6c961f21f080c new file mode 100644 index 0000000000..53f5365e5d --- /dev/null +++ b/txscript/data/taproot-ref/c62d08fa40199eb68353dc3045f6c961f21f080c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c63b3815a0dae098fa0dce37acfd79f213436d49 b/txscript/data/taproot-ref/c63b3815a0dae098fa0dce37acfd79f213436d49 new file mode 100644 index 0000000000..7954471e12 --- /dev/null +++ b/txscript/data/taproot-ref/c63b3815a0dae098fa0dce37acfd79f213436d49 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c63fa7c5e9f3cfa3be54296de8fcb8c5bae42ab6 b/txscript/data/taproot-ref/c63fa7c5e9f3cfa3be54296de8fcb8c5bae42ab6 new file mode 100644 index 0000000000..721116375f --- /dev/null +++ b/txscript/data/taproot-ref/c63fa7c5e9f3cfa3be54296de8fcb8c5bae42ab6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c66c43a4b77a41b0bcafd8714216e0e515ea32c1 b/txscript/data/taproot-ref/c66c43a4b77a41b0bcafd8714216e0e515ea32c1 new file mode 100644 index 0000000000..bad39b44cb --- /dev/null +++ b/txscript/data/taproot-ref/c66c43a4b77a41b0bcafd8714216e0e515ea32c1 @@ -0,0 +1 @@ +{"tx": "010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127076010000009e98a7e2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb70000000033ac90db0331e2690000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f878995083a", "prevouts": ["2bc7120000000000165a142540f27e90740933c99d4f17ab2dfc6c82951cfb", "e0b558000000000017a914d574841bde7bf0817694c799002118e85acf040e87"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "235d212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "witness": ["5d53555bf050efc78515fc7cb41c96d7a5577eda299f538f278e08d430aea10e705ebf7db220e1af5856af41294d05b57012e168300ed505ba92d690f812f174"]}}, diff --git a/txscript/data/taproot-ref/c671d0d61110d22335aeeff604afc7a78832a1f0 b/txscript/data/taproot-ref/c671d0d61110d22335aeeff604afc7a78832a1f0 new file mode 100644 index 0000000000..bacc74ee14 --- /dev/null +++ b/txscript/data/taproot-ref/c671d0d61110d22335aeeff604afc7a78832a1f0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c684723b339ed9a247b5fe843d2111fcb009cbf2 b/txscript/data/taproot-ref/c684723b339ed9a247b5fe843d2111fcb009cbf2 new file mode 100644 index 0000000000..9b70410987 --- /dev/null +++ b/txscript/data/taproot-ref/c684723b339ed9a247b5fe843d2111fcb009cbf2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c6911c815fc4eb1fdd0b9ab9cd09d3f6af2c6188 b/txscript/data/taproot-ref/c6911c815fc4eb1fdd0b9ab9cd09d3f6af2c6188 new file mode 100644 index 0000000000..bef8dcb178 --- /dev/null +++ b/txscript/data/taproot-ref/c6911c815fc4eb1fdd0b9ab9cd09d3f6af2c6188 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c69155ad942486c3313ec96fba99eb4b629b0b7e b/txscript/data/taproot-ref/c69155ad942486c3313ec96fba99eb4b629b0b7e new file mode 100644 index 0000000000..2990e2bbc7 --- /dev/null +++ b/txscript/data/taproot-ref/c69155ad942486c3313ec96fba99eb4b629b0b7e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c694a3b9670b92c47faef2482e1c373a96c84b7b b/txscript/data/taproot-ref/c694a3b9670b92c47faef2482e1c373a96c84b7b new file mode 100644 index 0000000000..0d1f968bdd --- /dev/null +++ b/txscript/data/taproot-ref/c694a3b9670b92c47faef2482e1c373a96c84b7b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c6a2dc24e570bc2a810731231121944aa2c4a595 b/txscript/data/taproot-ref/c6a2dc24e570bc2a810731231121944aa2c4a595 new file mode 100644 index 0000000000..95357da61e --- /dev/null +++ b/txscript/data/taproot-ref/c6a2dc24e570bc2a810731231121944aa2c4a595 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c6fa56d9a3cfa039c883bb5289ea577b65e788ce b/txscript/data/taproot-ref/c6fa56d9a3cfa039c883bb5289ea577b65e788ce new file mode 100644 index 0000000000..c67d320cd0 --- /dev/null +++ b/txscript/data/taproot-ref/c6fa56d9a3cfa039c883bb5289ea577b65e788ce @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c709197b022538558c64745e06cce6340703a73d b/txscript/data/taproot-ref/c709197b022538558c64745e06cce6340703a73d new file mode 100644 index 0000000000..b088e7df7e --- /dev/null +++ b/txscript/data/taproot-ref/c709197b022538558c64745e06cce6340703a73d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c70d23ebccdc1ea73e6448b1df58f62d71582adf b/txscript/data/taproot-ref/c70d23ebccdc1ea73e6448b1df58f62d71582adf new file mode 100644 index 0000000000..f9ebba57df --- /dev/null +++ b/txscript/data/taproot-ref/c70d23ebccdc1ea73e6448b1df58f62d71582adf @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c71d9516b42225f3514b4d1df627c022e4817ee0 b/txscript/data/taproot-ref/c71d9516b42225f3514b4d1df627c022e4817ee0 new file mode 100644 index 0000000000..6bd7def036 --- /dev/null +++ b/txscript/data/taproot-ref/c71d9516b42225f3514b4d1df627c022e4817ee0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c7252d6f48851dc47f8c3177537e12abe69a084c b/txscript/data/taproot-ref/c7252d6f48851dc47f8c3177537e12abe69a084c new file mode 100644 index 0000000000..618ac9224a --- /dev/null +++ b/txscript/data/taproot-ref/c7252d6f48851dc47f8c3177537e12abe69a084c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c75d0a897f9c6981d81da8b49be331ba03439313 b/txscript/data/taproot-ref/c75d0a897f9c6981d81da8b49be331ba03439313 new file mode 100644 index 0000000000..1564748881 --- /dev/null +++ b/txscript/data/taproot-ref/c75d0a897f9c6981d81da8b49be331ba03439313 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c761e8c4c51ea45aa6c56b949fdc22e5d4c60cf1 b/txscript/data/taproot-ref/c761e8c4c51ea45aa6c56b949fdc22e5d4c60cf1 new file mode 100644 index 0000000000..a7302601f1 --- /dev/null +++ b/txscript/data/taproot-ref/c761e8c4c51ea45aa6c56b949fdc22e5d4c60cf1 @@ -0,0 +1 @@ +{"tx": "02000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41c01000000818e558c025e5e3400000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac27020000", "prevouts": ["622f3700000000002259202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["e63904a1aaf4a9aebf1f82d156b1ef26f7e6b8586b945d1c33a8575bf074195bd38c7743a15ef171cd8fdf6519c1ed314604b3d15b0cd80f7dacc5b26f871c60"]}}, diff --git a/txscript/data/taproot-ref/c763c8080d8e8e78651eaf9140b7aa3fef1d52d4 b/txscript/data/taproot-ref/c763c8080d8e8e78651eaf9140b7aa3fef1d52d4 new file mode 100644 index 0000000000..9db50b49f4 --- /dev/null +++ b/txscript/data/taproot-ref/c763c8080d8e8e78651eaf9140b7aa3fef1d52d4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c77f06b7f82e62ac50865f5ee4163ae369969020 b/txscript/data/taproot-ref/c77f06b7f82e62ac50865f5ee4163ae369969020 new file mode 100644 index 0000000000..b96157f87a --- /dev/null +++ b/txscript/data/taproot-ref/c77f06b7f82e62ac50865f5ee4163ae369969020 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c785d388c9a15886ab980f88b666d4945c7ee4a6 b/txscript/data/taproot-ref/c785d388c9a15886ab980f88b666d4945c7ee4a6 new file mode 100644 index 0000000000..8be04c8cab --- /dev/null +++ b/txscript/data/taproot-ref/c785d388c9a15886ab980f88b666d4945c7ee4a6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c79333ec6723390b7f1563f388c7a50d86f860b2 b/txscript/data/taproot-ref/c79333ec6723390b7f1563f388c7a50d86f860b2 new file mode 100644 index 0000000000..b75cbc5730 --- /dev/null +++ b/txscript/data/taproot-ref/c79333ec6723390b7f1563f388c7a50d86f860b2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c7946ca286a4c1e04861f5fe7ff7982618728e8f b/txscript/data/taproot-ref/c7946ca286a4c1e04861f5fe7ff7982618728e8f new file mode 100644 index 0000000000..7ea8266f9f --- /dev/null +++ b/txscript/data/taproot-ref/c7946ca286a4c1e04861f5fe7ff7982618728e8f @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/c7a2d84c0203fa2c48f932ed3cdb57e9bc3d4cd3 b/txscript/data/taproot-ref/c7a2d84c0203fa2c48f932ed3cdb57e9bc3d4cd3 new file mode 100644 index 0000000000..2e14e59363 --- /dev/null +++ b/txscript/data/taproot-ref/c7a2d84c0203fa2c48f932ed3cdb57e9bc3d4cd3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c7aa7f6d958c6e29a221a767f1d7b3c103fe86b2 b/txscript/data/taproot-ref/c7aa7f6d958c6e29a221a767f1d7b3c103fe86b2 new file mode 100644 index 0000000000..98bc1675c2 --- /dev/null +++ b/txscript/data/taproot-ref/c7aa7f6d958c6e29a221a767f1d7b3c103fe86b2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c7b48c2518d6d2a2a5acd628f2fb397cad2ac0ea b/txscript/data/taproot-ref/c7b48c2518d6d2a2a5acd628f2fb397cad2ac0ea new file mode 100644 index 0000000000..b7f5c89ec8 --- /dev/null +++ b/txscript/data/taproot-ref/c7b48c2518d6d2a2a5acd628f2fb397cad2ac0ea @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c814f8c932eb8ff0b1b54d8a85929406a22a72f6 b/txscript/data/taproot-ref/c814f8c932eb8ff0b1b54d8a85929406a22a72f6 new file mode 100644 index 0000000000..368a484ef1 --- /dev/null +++ b/txscript/data/taproot-ref/c814f8c932eb8ff0b1b54d8a85929406a22a72f6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c8172ac90dca46ddecfcb6abf992c70d492bdaf0 b/txscript/data/taproot-ref/c8172ac90dca46ddecfcb6abf992c70d492bdaf0 new file mode 100644 index 0000000000..a0b68a330a --- /dev/null +++ b/txscript/data/taproot-ref/c8172ac90dca46ddecfcb6abf992c70d492bdaf0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c8203a41b6f45793c2150ed5554ab5bf5c7eae94 b/txscript/data/taproot-ref/c8203a41b6f45793c2150ed5554ab5bf5c7eae94 new file mode 100644 index 0000000000..9e97e11d1e --- /dev/null +++ b/txscript/data/taproot-ref/c8203a41b6f45793c2150ed5554ab5bf5c7eae94 @@ -0,0 +1 @@ +{"tx": "01000000011221809fa938f2ef41f6621f6e6a0e75e05349f5a7d7094926420abdf536093c010000000070ad45a90433d150b310000000160014ca9858c362545bc83a3b93e73b12b27a9b3ca00358020000000000001976a91472fb0c729bce8fb851f92a5ad48d3d4231beda4988ac58020000000000001600144bcade4cacdd490a6aa7afbb8ba77ed6898137ac58020000000000001600143f886f8feaf75ad7bedd5713d4d148e7c97c113409010000", "prevouts": ["2e6353b31000000022512034153a16ef8458ec2412ba42dd5be0fabd8b4c2f532d179dc958fc1fca3cae43"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY", "comment": "inactive/keypath_empty", "success": {"scriptSig": "", "witness": []}}, diff --git a/txscript/data/taproot-ref/c82943e824916226a82dbcda450c1cf3f21df1da b/txscript/data/taproot-ref/c82943e824916226a82dbcda450c1cf3f21df1da new file mode 100644 index 0000000000..0bf3fc1903 --- /dev/null +++ b/txscript/data/taproot-ref/c82943e824916226a82dbcda450c1cf3f21df1da @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/c83f86babe52fc934414d829d4969407bdaa8de9 b/txscript/data/taproot-ref/c83f86babe52fc934414d829d4969407bdaa8de9 new file mode 100644 index 0000000000..1d6dc6cfa1 --- /dev/null +++ b/txscript/data/taproot-ref/c83f86babe52fc934414d829d4969407bdaa8de9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c85880f71216bacfb5f45a917040c76a5b933f5e b/txscript/data/taproot-ref/c85880f71216bacfb5f45a917040c76a5b933f5e new file mode 100644 index 0000000000..027edd4bba --- /dev/null +++ b/txscript/data/taproot-ref/c85880f71216bacfb5f45a917040c76a5b933f5e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c85ec330c8ffb17623ec929fd4a198c3b768811a b/txscript/data/taproot-ref/c85ec330c8ffb17623ec929fd4a198c3b768811a new file mode 100644 index 0000000000..9fc12d6910 --- /dev/null +++ b/txscript/data/taproot-ref/c85ec330c8ffb17623ec929fd4a198c3b768811a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c86c77b200bac67eba1a81988b36e0764528deef b/txscript/data/taproot-ref/c86c77b200bac67eba1a81988b36e0764528deef new file mode 100644 index 0000000000..fc1b27c730 --- /dev/null +++ b/txscript/data/taproot-ref/c86c77b200bac67eba1a81988b36e0764528deef @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c8e586d3f61c1ad22568794bbfcb69f57cb8b000 b/txscript/data/taproot-ref/c8e586d3f61c1ad22568794bbfcb69f57cb8b000 new file mode 100644 index 0000000000..890c457187 --- /dev/null +++ b/txscript/data/taproot-ref/c8e586d3f61c1ad22568794bbfcb69f57cb8b000 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c8ef39151618f6cc8716604cb9c29f93559b5a3d b/txscript/data/taproot-ref/c8ef39151618f6cc8716604cb9c29f93559b5a3d new file mode 100644 index 0000000000..8dddd58d91 --- /dev/null +++ b/txscript/data/taproot-ref/c8ef39151618f6cc8716604cb9c29f93559b5a3d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c908a5304c6a71d150881ee923df19a58e37c8e9 b/txscript/data/taproot-ref/c908a5304c6a71d150881ee923df19a58e37c8e9 new file mode 100644 index 0000000000..013d01447b --- /dev/null +++ b/txscript/data/taproot-ref/c908a5304c6a71d150881ee923df19a58e37c8e9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c91a0b63271792838de6f8620c116c19028be7d3 b/txscript/data/taproot-ref/c91a0b63271792838de6f8620c116c19028be7d3 new file mode 100644 index 0000000000..d92af07f13 --- /dev/null +++ b/txscript/data/taproot-ref/c91a0b63271792838de6f8620c116c19028be7d3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c92d0b7830a59c91b7478b9bc6537abc9104ab24 b/txscript/data/taproot-ref/c92d0b7830a59c91b7478b9bc6537abc9104ab24 new file mode 100644 index 0000000000..e3ee3209ac --- /dev/null +++ b/txscript/data/taproot-ref/c92d0b7830a59c91b7478b9bc6537abc9104ab24 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c94bf93a205b5120777d3d7dedacadaf6c732df5 b/txscript/data/taproot-ref/c94bf93a205b5120777d3d7dedacadaf6c732df5 new file mode 100644 index 0000000000..335828f4b4 --- /dev/null +++ b/txscript/data/taproot-ref/c94bf93a205b5120777d3d7dedacadaf6c732df5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c95a348b7638eb340903fe3cc3532859ffe5403f b/txscript/data/taproot-ref/c95a348b7638eb340903fe3cc3532859ffe5403f new file mode 100644 index 0000000000..6f50980525 --- /dev/null +++ b/txscript/data/taproot-ref/c95a348b7638eb340903fe3cc3532859ffe5403f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c965920ad9808bd3f6a009ce5335213895163c4a b/txscript/data/taproot-ref/c965920ad9808bd3f6a009ce5335213895163c4a new file mode 100644 index 0000000000..26a424540b --- /dev/null +++ b/txscript/data/taproot-ref/c965920ad9808bd3f6a009ce5335213895163c4a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c968d693525b4f56eb70b070dbf41555841fa170 b/txscript/data/taproot-ref/c968d693525b4f56eb70b070dbf41555841fa170 new file mode 100644 index 0000000000..4474cc7e37 --- /dev/null +++ b/txscript/data/taproot-ref/c968d693525b4f56eb70b070dbf41555841fa170 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/c97c22cac658b5a97d90aab28ef2a0126a80ce6e b/txscript/data/taproot-ref/c97c22cac658b5a97d90aab28ef2a0126a80ce6e new file mode 100644 index 0000000000..e4ee6b231a --- /dev/null +++ b/txscript/data/taproot-ref/c97c22cac658b5a97d90aab28ef2a0126a80ce6e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c9810cb06137edb22aba29ce495e0f5e87073b06 b/txscript/data/taproot-ref/c9810cb06137edb22aba29ce495e0f5e87073b06 new file mode 100644 index 0000000000..1008cae481 --- /dev/null +++ b/txscript/data/taproot-ref/c9810cb06137edb22aba29ce495e0f5e87073b06 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c9888f4ae613d1778de5399e9c17e6e517df9292 b/txscript/data/taproot-ref/c9888f4ae613d1778de5399e9c17e6e517df9292 new file mode 100644 index 0000000000..d977293252 --- /dev/null +++ b/txscript/data/taproot-ref/c9888f4ae613d1778de5399e9c17e6e517df9292 @@ -0,0 +1 @@ +{"tx": "5e99ba8803bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7500000000df8a91a8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3f000000005c7bc9e9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0d02000000a28c08c40314b9e600000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75c6ed459", "prevouts": ["48417900000000002258202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "685e2300000000002251205e14f4853651bdc12bc00c912e88f09aa7f67557a17e07f4e10b78cd4d829738", "f0a04c0000000000235c212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900"], "index": 2, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["faa0a1b1251aef70c3685bfc73637131763e34d62b9aa33bb5780f7131ce8dc197dca2c1059cdaa8026c06e2d3296033eeac23bd31f342ab2bf7999193848c96"]}}, diff --git a/txscript/data/taproot-ref/c9a84f25b1d55cfc33df56ee356e86772a479352 b/txscript/data/taproot-ref/c9a84f25b1d55cfc33df56ee356e86772a479352 new file mode 100644 index 0000000000..3fcc79a5a0 --- /dev/null +++ b/txscript/data/taproot-ref/c9a84f25b1d55cfc33df56ee356e86772a479352 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c9addf4f9fd1a956c97c9babd5981d0c8295e152 b/txscript/data/taproot-ref/c9addf4f9fd1a956c97c9babd5981d0c8295e152 new file mode 100644 index 0000000000..30d7540cc6 --- /dev/null +++ b/txscript/data/taproot-ref/c9addf4f9fd1a956c97c9babd5981d0c8295e152 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c9b398e28803f0f2e675448f50d7f4d8c39e8991 b/txscript/data/taproot-ref/c9b398e28803f0f2e675448f50d7f4d8c39e8991 new file mode 100644 index 0000000000..9c26e323b0 --- /dev/null +++ b/txscript/data/taproot-ref/c9b398e28803f0f2e675448f50d7f4d8c39e8991 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c9d4c34b8cbf8c16d5b1e01af0f0541cdd36456b b/txscript/data/taproot-ref/c9d4c34b8cbf8c16d5b1e01af0f0541cdd36456b new file mode 100644 index 0000000000..d4621e4d6d --- /dev/null +++ b/txscript/data/taproot-ref/c9d4c34b8cbf8c16d5b1e01af0f0541cdd36456b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c9dd51e291d1902fcc5389ef9f70290ea166e35b b/txscript/data/taproot-ref/c9dd51e291d1902fcc5389ef9f70290ea166e35b new file mode 100644 index 0000000000..12fd402262 --- /dev/null +++ b/txscript/data/taproot-ref/c9dd51e291d1902fcc5389ef9f70290ea166e35b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c9ed258ea27321037ce42d665a00191863c1ddce b/txscript/data/taproot-ref/c9ed258ea27321037ce42d665a00191863c1ddce new file mode 100644 index 0000000000..52823f6361 --- /dev/null +++ b/txscript/data/taproot-ref/c9ed258ea27321037ce42d665a00191863c1ddce @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c9f4f38c06357e5794c082ee3a691a02193ff1e2 b/txscript/data/taproot-ref/c9f4f38c06357e5794c082ee3a691a02193ff1e2 new file mode 100644 index 0000000000..a574ca6d08 --- /dev/null +++ b/txscript/data/taproot-ref/c9f4f38c06357e5794c082ee3a691a02193ff1e2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/c9ff164d902f41698dc1714ef130057761a13f8c b/txscript/data/taproot-ref/c9ff164d902f41698dc1714ef130057761a13f8c new file mode 100644 index 0000000000..1e6b638032 --- /dev/null +++ b/txscript/data/taproot-ref/c9ff164d902f41698dc1714ef130057761a13f8c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ca067c02b5a5e0209c277a0cea71db50a16d380f b/txscript/data/taproot-ref/ca067c02b5a5e0209c277a0cea71db50a16d380f new file mode 100644 index 0000000000..58fa21152e --- /dev/null +++ b/txscript/data/taproot-ref/ca067c02b5a5e0209c277a0cea71db50a16d380f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ca0a2329b586ff39d07383acaecfac1982afe0df b/txscript/data/taproot-ref/ca0a2329b586ff39d07383acaecfac1982afe0df new file mode 100644 index 0000000000..081db8d898 --- /dev/null +++ b/txscript/data/taproot-ref/ca0a2329b586ff39d07383acaecfac1982afe0df @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ca10907ed5b956b8d7c600609307e951fa48d8e6 b/txscript/data/taproot-ref/ca10907ed5b956b8d7c600609307e951fa48d8e6 new file mode 100644 index 0000000000..7c4c4e4254 --- /dev/null +++ b/txscript/data/taproot-ref/ca10907ed5b956b8d7c600609307e951fa48d8e6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ca10ab334b15fc1a219962a002ba20266142420e b/txscript/data/taproot-ref/ca10ab334b15fc1a219962a002ba20266142420e new file mode 100644 index 0000000000..4b5de6cf52 --- /dev/null +++ b/txscript/data/taproot-ref/ca10ab334b15fc1a219962a002ba20266142420e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ca3a2137d38c1e9a98dd585fbb1e5e6483a855d0 b/txscript/data/taproot-ref/ca3a2137d38c1e9a98dd585fbb1e5e6483a855d0 new file mode 100644 index 0000000000..f84011a743 --- /dev/null +++ b/txscript/data/taproot-ref/ca3a2137d38c1e9a98dd585fbb1e5e6483a855d0 @@ -0,0 +1 @@ +{"tx": "49871be601dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb301000000721231a4010d471900000000001600149d38710eb90e420b159c7a9263994c88e6810bc780010000", "prevouts": ["b2472000000000002356212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["571c7b7dc40213dca493216192ace957d503428885c314dbde509aff240517098ac878b539c1e639d59320025659a8295a91ab756c9aa8af233f8ece7b4c2ca5"]}}, diff --git a/txscript/data/taproot-ref/ca4f72eced8e3ace4cb06faea7d35e7831c1e5ce b/txscript/data/taproot-ref/ca4f72eced8e3ace4cb06faea7d35e7831c1e5ce new file mode 100644 index 0000000000..5ae7d5903f --- /dev/null +++ b/txscript/data/taproot-ref/ca4f72eced8e3ace4cb06faea7d35e7831c1e5ce @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ca4f932e8cc3a4b016fedf455e955c89cd7237bf b/txscript/data/taproot-ref/ca4f932e8cc3a4b016fedf455e955c89cd7237bf new file mode 100644 index 0000000000..413c2d3ae6 --- /dev/null +++ b/txscript/data/taproot-ref/ca4f932e8cc3a4b016fedf455e955c89cd7237bf @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ca67aeff72a1ca354129ea9f32b49e63219b5d98 b/txscript/data/taproot-ref/ca67aeff72a1ca354129ea9f32b49e63219b5d98 new file mode 100644 index 0000000000..1fc100664a --- /dev/null +++ b/txscript/data/taproot-ref/ca67aeff72a1ca354129ea9f32b49e63219b5d98 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ca8e90d773aaf3a6cc447fa963353434f82c0e50 b/txscript/data/taproot-ref/ca8e90d773aaf3a6cc447fa963353434f82c0e50 new file mode 100644 index 0000000000..45bf018727 --- /dev/null +++ b/txscript/data/taproot-ref/ca8e90d773aaf3a6cc447fa963353434f82c0e50 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ca8ead844b2d1ee6d2526ed1a548996bc943ea68 b/txscript/data/taproot-ref/ca8ead844b2d1ee6d2526ed1a548996bc943ea68 new file mode 100644 index 0000000000..99e743f215 --- /dev/null +++ b/txscript/data/taproot-ref/ca8ead844b2d1ee6d2526ed1a548996bc943ea68 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ca9fc42da81222da6dec277f6346109bf564fefb b/txscript/data/taproot-ref/ca9fc42da81222da6dec277f6346109bf564fefb new file mode 100644 index 0000000000..416ceae361 --- /dev/null +++ b/txscript/data/taproot-ref/ca9fc42da81222da6dec277f6346109bf564fefb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cab98434bc48379e0a365fff01d6b79bf577457a b/txscript/data/taproot-ref/cab98434bc48379e0a365fff01d6b79bf577457a new file mode 100644 index 0000000000..e09ea1c335 --- /dev/null +++ b/txscript/data/taproot-ref/cab98434bc48379e0a365fff01d6b79bf577457a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cab9a4b9aa0799313bf8c71e90011d910fd2eca4 b/txscript/data/taproot-ref/cab9a4b9aa0799313bf8c71e90011d910fd2eca4 new file mode 100644 index 0000000000..96db64245d --- /dev/null +++ b/txscript/data/taproot-ref/cab9a4b9aa0799313bf8c71e90011d910fd2eca4 @@ -0,0 +1 @@ +{"tx": "0200000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff801000000b0c13d8502d4c3730000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a66c020000", "prevouts": ["f03676000000000017a9140917710a6236c7a08b54f54b004ee705f2913e3087"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "235f212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "witness": ["37d5a197074413e5cfff18078c7c380d852f8aa839695132f190dfc1e266dcb4022523404abfb40d63a3c077cca5e8f4717bc99d7098e6032665c433962bd459"]}}, diff --git a/txscript/data/taproot-ref/cabd7d24e6498c820ccd2a79a03cc481607909e5 b/txscript/data/taproot-ref/cabd7d24e6498c820ccd2a79a03cc481607909e5 new file mode 100644 index 0000000000..f11edc25e6 --- /dev/null +++ b/txscript/data/taproot-ref/cabd7d24e6498c820ccd2a79a03cc481607909e5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cafd0a9a6dab6200dcb88ecbf7e265de1ad5d317 b/txscript/data/taproot-ref/cafd0a9a6dab6200dcb88ecbf7e265de1ad5d317 new file mode 100644 index 0000000000..11037f9343 --- /dev/null +++ b/txscript/data/taproot-ref/cafd0a9a6dab6200dcb88ecbf7e265de1ad5d317 @@ -0,0 +1 @@ +{"tx": "02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c491000000007392a7f260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707500000000579abf8d03798c4b000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4876b000000", "prevouts": ["f7dc3e000000000021581f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b", "ee930f000000000017a914c9840c38196e75dd475876fc1e51c080e92b574c87"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["222c69bbe3f4f1673e8cf45df278568891b3a7d6fcffd5abc410b2b797aa1927f2d6ff83effa9adf6d3ef712d53a5534bb3fd91915849ae9fb719034ebf80b1d", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/cb181959ea829e3c8e81c95a1bbce81b35f8d2fd b/txscript/data/taproot-ref/cb181959ea829e3c8e81c95a1bbce81b35f8d2fd new file mode 100644 index 0000000000..5138e934ea --- /dev/null +++ b/txscript/data/taproot-ref/cb181959ea829e3c8e81c95a1bbce81b35f8d2fd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cb1b57e08db865390f1b4cf22118530463b721aa b/txscript/data/taproot-ref/cb1b57e08db865390f1b4cf22118530463b721aa new file mode 100644 index 0000000000..1ea1e384eb --- /dev/null +++ b/txscript/data/taproot-ref/cb1b57e08db865390f1b4cf22118530463b721aa @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cb5cd2d881a8e8202863c29e2d692b6245167dd1 b/txscript/data/taproot-ref/cb5cd2d881a8e8202863c29e2d692b6245167dd1 new file mode 100644 index 0000000000..b6b8f03202 --- /dev/null +++ b/txscript/data/taproot-ref/cb5cd2d881a8e8202863c29e2d692b6245167dd1 @@ -0,0 +1 @@ +{"tx": "010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a801000000aa951bf3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bac010000001c53bd7ebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe9010000001c47564f026e879f0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88aca040a226", "prevouts": ["0c261000000000002258202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "8c5a260000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b", "7f456b00000000002251207c2a27667caa5d47bc631b21441672d615738889d76e34100e2309c093e91351"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["aa7f169ca09b5112de5218fd2061e9503480eb8c97f5a6094e304468cd47b3358daf879617418a2d2041960835dffa29e30966714b97b3855702656bcbc75a5c"]}}, diff --git a/txscript/data/taproot-ref/cb7c58b77b079764dd1fdd95626fced2ad539c7c b/txscript/data/taproot-ref/cb7c58b77b079764dd1fdd95626fced2ad539c7c new file mode 100644 index 0000000000..dbc7bf79aa --- /dev/null +++ b/txscript/data/taproot-ref/cb7c58b77b079764dd1fdd95626fced2ad539c7c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cbdd9f9ee3d06ce2cdfe2000194d0fa14bb03cb0 b/txscript/data/taproot-ref/cbdd9f9ee3d06ce2cdfe2000194d0fa14bb03cb0 new file mode 100644 index 0000000000..388a03f9a8 --- /dev/null +++ b/txscript/data/taproot-ref/cbdd9f9ee3d06ce2cdfe2000194d0fa14bb03cb0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cbe16c2c588c6bc7000fbb04188632167236d008 b/txscript/data/taproot-ref/cbe16c2c588c6bc7000fbb04188632167236d008 new file mode 100644 index 0000000000..84afb210be --- /dev/null +++ b/txscript/data/taproot-ref/cbe16c2c588c6bc7000fbb04188632167236d008 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cbfe3b47d8728af1b60451af99e980f90dc89668 b/txscript/data/taproot-ref/cbfe3b47d8728af1b60451af99e980f90dc89668 new file mode 100644 index 0000000000..0fdc32b0cf --- /dev/null +++ b/txscript/data/taproot-ref/cbfe3b47d8728af1b60451af99e980f90dc89668 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cc06cd6c0a43860436758eaf21a715c3ecebb6f4 b/txscript/data/taproot-ref/cc06cd6c0a43860436758eaf21a715c3ecebb6f4 new file mode 100644 index 0000000000..618d448b53 --- /dev/null +++ b/txscript/data/taproot-ref/cc06cd6c0a43860436758eaf21a715c3ecebb6f4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cc13210738ed00cc6f24c6bdcc72bc63f13783e2 b/txscript/data/taproot-ref/cc13210738ed00cc6f24c6bdcc72bc63f13783e2 new file mode 100644 index 0000000000..0b796a6c95 --- /dev/null +++ b/txscript/data/taproot-ref/cc13210738ed00cc6f24c6bdcc72bc63f13783e2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cc3fcfad22ff1374fc57610045f054311fc92f6d b/txscript/data/taproot-ref/cc3fcfad22ff1374fc57610045f054311fc92f6d new file mode 100644 index 0000000000..8191f95605 --- /dev/null +++ b/txscript/data/taproot-ref/cc3fcfad22ff1374fc57610045f054311fc92f6d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ccb6fc2bd7df140d0acaa9fa4f6c64be65339a60 b/txscript/data/taproot-ref/ccb6fc2bd7df140d0acaa9fa4f6c64be65339a60 new file mode 100644 index 0000000000..c51cccf1e9 --- /dev/null +++ b/txscript/data/taproot-ref/ccb6fc2bd7df140d0acaa9fa4f6c64be65339a60 @@ -0,0 +1 @@ +{"tx": "f33c648a02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1801000000efe045ba8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a4000000002db817c60273f54f000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688aca3000000", "prevouts": ["3d7d1e000000000021511f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b", "c54b3300000000002251207e677ee6e0a9f5a7b76d32fc490de736680fedcc1b5666802b0cdd6035d1f989"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["d274921aecbeb3031c4325f0ef8a23adff0ed7989377ee835ac54787b8fdc4f2e7295329ab844153de271583114b354e1e43309c3042e16794fa1975c037eba8"]}}, diff --git a/txscript/data/taproot-ref/cd083f5472e5c5b1f0a2910e5400ed9fb0e38379 b/txscript/data/taproot-ref/cd083f5472e5c5b1f0a2910e5400ed9fb0e38379 new file mode 100644 index 0000000000..d6254a96d2 --- /dev/null +++ b/txscript/data/taproot-ref/cd083f5472e5c5b1f0a2910e5400ed9fb0e38379 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cd2bb450b14d6d4aeb2383f17d0b52532a6d60bc b/txscript/data/taproot-ref/cd2bb450b14d6d4aeb2383f17d0b52532a6d60bc new file mode 100644 index 0000000000..bb2dd36d62 --- /dev/null +++ b/txscript/data/taproot-ref/cd2bb450b14d6d4aeb2383f17d0b52532a6d60bc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cd2f80cd83fdc9c096ed0c6e1e02112a0e62dd16 b/txscript/data/taproot-ref/cd2f80cd83fdc9c096ed0c6e1e02112a0e62dd16 new file mode 100644 index 0000000000..cdcbf0827f --- /dev/null +++ b/txscript/data/taproot-ref/cd2f80cd83fdc9c096ed0c6e1e02112a0e62dd16 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cd4a620abc44efff9ec16d12232d21d35383be02 b/txscript/data/taproot-ref/cd4a620abc44efff9ec16d12232d21d35383be02 new file mode 100644 index 0000000000..7302c4c4fe --- /dev/null +++ b/txscript/data/taproot-ref/cd4a620abc44efff9ec16d12232d21d35383be02 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cd536df731fdebe8bbafa86ebef1f6c819648a78 b/txscript/data/taproot-ref/cd536df731fdebe8bbafa86ebef1f6c819648a78 new file mode 100644 index 0000000000..19c138d9f6 --- /dev/null +++ b/txscript/data/taproot-ref/cd536df731fdebe8bbafa86ebef1f6c819648a78 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cd553bbac6c8bd33ad432ca2077facbf41604f68 b/txscript/data/taproot-ref/cd553bbac6c8bd33ad432ca2077facbf41604f68 new file mode 100644 index 0000000000..29039d5384 --- /dev/null +++ b/txscript/data/taproot-ref/cd553bbac6c8bd33ad432ca2077facbf41604f68 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cd8b40b4ffe13dc923550924d4133d5ac918ecc4 b/txscript/data/taproot-ref/cd8b40b4ffe13dc923550924d4133d5ac918ecc4 new file mode 100644 index 0000000000..f695b99fb8 --- /dev/null +++ b/txscript/data/taproot-ref/cd8b40b4ffe13dc923550924d4133d5ac918ecc4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cd8ca448ef6a3c3fa7536eee563579389b399c7f b/txscript/data/taproot-ref/cd8ca448ef6a3c3fa7536eee563579389b399c7f new file mode 100644 index 0000000000..a1008f8dd1 --- /dev/null +++ b/txscript/data/taproot-ref/cd8ca448ef6a3c3fa7536eee563579389b399c7f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cd935e81f7b958dc94cbb682f2c926e1e63fc213 b/txscript/data/taproot-ref/cd935e81f7b958dc94cbb682f2c926e1e63fc213 new file mode 100644 index 0000000000..1eafe41714 --- /dev/null +++ b/txscript/data/taproot-ref/cd935e81f7b958dc94cbb682f2c926e1e63fc213 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cd9562d304291faf33b2752268819af3d9fdd593 b/txscript/data/taproot-ref/cd9562d304291faf33b2752268819af3d9fdd593 new file mode 100644 index 0000000000..db615af2df --- /dev/null +++ b/txscript/data/taproot-ref/cd9562d304291faf33b2752268819af3d9fdd593 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cda64a68115a3ca8971a2747b360b387fbe1d1ec b/txscript/data/taproot-ref/cda64a68115a3ca8971a2747b360b387fbe1d1ec new file mode 100644 index 0000000000..c5fb940871 --- /dev/null +++ b/txscript/data/taproot-ref/cda64a68115a3ca8971a2747b360b387fbe1d1ec @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cdaa800ed715e873d65a75ff494c085689777769 b/txscript/data/taproot-ref/cdaa800ed715e873d65a75ff494c085689777769 new file mode 100644 index 0000000000..4b471be592 --- /dev/null +++ b/txscript/data/taproot-ref/cdaa800ed715e873d65a75ff494c085689777769 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cdae175fecf9783890ad4364fcdb7e9a26312c86 b/txscript/data/taproot-ref/cdae175fecf9783890ad4364fcdb7e9a26312c86 new file mode 100644 index 0000000000..72d049b286 --- /dev/null +++ b/txscript/data/taproot-ref/cdae175fecf9783890ad4364fcdb7e9a26312c86 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cdbb9c9c88d727637e88c5e5f34b796e03a77c9a b/txscript/data/taproot-ref/cdbb9c9c88d727637e88c5e5f34b796e03a77c9a new file mode 100644 index 0000000000..ec08472ea2 --- /dev/null +++ b/txscript/data/taproot-ref/cdbb9c9c88d727637e88c5e5f34b796e03a77c9a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cdd70dfc5c39ec02e5e48d747003dccc345d9c35 b/txscript/data/taproot-ref/cdd70dfc5c39ec02e5e48d747003dccc345d9c35 new file mode 100644 index 0000000000..f12623e5c2 --- /dev/null +++ b/txscript/data/taproot-ref/cdd70dfc5c39ec02e5e48d747003dccc345d9c35 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ce08102de2f440a689645ebc57829a604424b751 b/txscript/data/taproot-ref/ce08102de2f440a689645ebc57829a604424b751 new file mode 100644 index 0000000000..0e6a07c724 --- /dev/null +++ b/txscript/data/taproot-ref/ce08102de2f440a689645ebc57829a604424b751 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ce29a0262edb0e4c4a3905e19cb08c9a4e8318ba b/txscript/data/taproot-ref/ce29a0262edb0e4c4a3905e19cb08c9a4e8318ba new file mode 100644 index 0000000000..cd812bd879 --- /dev/null +++ b/txscript/data/taproot-ref/ce29a0262edb0e4c4a3905e19cb08c9a4e8318ba @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ce4f3f6725a58e41e3545de8f93475f0f9402a52 b/txscript/data/taproot-ref/ce4f3f6725a58e41e3545de8f93475f0f9402a52 new file mode 100644 index 0000000000..69f265607f --- /dev/null +++ b/txscript/data/taproot-ref/ce4f3f6725a58e41e3545de8f93475f0f9402a52 @@ -0,0 +1 @@ +{"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": [""]}}, diff --git a/txscript/data/taproot-ref/ce5a6e30faecc2d2f249b1bb1b0a21cbffc46674 b/txscript/data/taproot-ref/ce5a6e30faecc2d2f249b1bb1b0a21cbffc46674 new file mode 100644 index 0000000000..d8a6795cd4 --- /dev/null +++ b/txscript/data/taproot-ref/ce5a6e30faecc2d2f249b1bb1b0a21cbffc46674 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ce5c007dab411a6a225c1b09181578eaf6edf364 b/txscript/data/taproot-ref/ce5c007dab411a6a225c1b09181578eaf6edf364 new file mode 100644 index 0000000000..79d6f7df82 --- /dev/null +++ b/txscript/data/taproot-ref/ce5c007dab411a6a225c1b09181578eaf6edf364 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cea069b190b73ea7c41e48275d6d0841d7fdd8f3 b/txscript/data/taproot-ref/cea069b190b73ea7c41e48275d6d0841d7fdd8f3 new file mode 100644 index 0000000000..6e951eaad9 --- /dev/null +++ b/txscript/data/taproot-ref/cea069b190b73ea7c41e48275d6d0841d7fdd8f3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cec62d6028ecb0885e4adbb89b0c33222ed71d55 b/txscript/data/taproot-ref/cec62d6028ecb0885e4adbb89b0c33222ed71d55 new file mode 100644 index 0000000000..bee3b718e8 --- /dev/null +++ b/txscript/data/taproot-ref/cec62d6028ecb0885e4adbb89b0c33222ed71d55 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cedf97481d67a8a89199abfe8c15570cd253967d b/txscript/data/taproot-ref/cedf97481d67a8a89199abfe8c15570cd253967d new file mode 100644 index 0000000000..899aa2890b --- /dev/null +++ b/txscript/data/taproot-ref/cedf97481d67a8a89199abfe8c15570cd253967d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cef118940d5799540be8721e2453120639fbe14e b/txscript/data/taproot-ref/cef118940d5799540be8721e2453120639fbe14e new file mode 100644 index 0000000000..33722a7f2f --- /dev/null +++ b/txscript/data/taproot-ref/cef118940d5799540be8721e2453120639fbe14e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cef395bb5063aba1aeaafde86a8bfd4c3ae80b8f b/txscript/data/taproot-ref/cef395bb5063aba1aeaafde86a8bfd4c3ae80b8f new file mode 100644 index 0000000000..101a562f63 --- /dev/null +++ b/txscript/data/taproot-ref/cef395bb5063aba1aeaafde86a8bfd4c3ae80b8f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cf1726d92ba0a57e5cb508f7f38cf8c30c31572a b/txscript/data/taproot-ref/cf1726d92ba0a57e5cb508f7f38cf8c30c31572a new file mode 100644 index 0000000000..1434e6c6a4 --- /dev/null +++ b/txscript/data/taproot-ref/cf1726d92ba0a57e5cb508f7f38cf8c30c31572a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cf19361572439227ba12b4d90a84b45c9c77a6dd b/txscript/data/taproot-ref/cf19361572439227ba12b4d90a84b45c9c77a6dd new file mode 100644 index 0000000000..7fe05d20fe --- /dev/null +++ b/txscript/data/taproot-ref/cf19361572439227ba12b4d90a84b45c9c77a6dd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cf1b9fbc48a705e782d90e0caefa83731663957e b/txscript/data/taproot-ref/cf1b9fbc48a705e782d90e0caefa83731663957e new file mode 100644 index 0000000000..b12feb9261 --- /dev/null +++ b/txscript/data/taproot-ref/cf1b9fbc48a705e782d90e0caefa83731663957e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cf3ddc0d11192bb67b1d1a9c46dba9cb99e1ab37 b/txscript/data/taproot-ref/cf3ddc0d11192bb67b1d1a9c46dba9cb99e1ab37 new file mode 100644 index 0000000000..dff67c8a70 --- /dev/null +++ b/txscript/data/taproot-ref/cf3ddc0d11192bb67b1d1a9c46dba9cb99e1ab37 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cf87f1c7fe8d84db93cab39e5ec4fc004b0daf45 b/txscript/data/taproot-ref/cf87f1c7fe8d84db93cab39e5ec4fc004b0daf45 new file mode 100644 index 0000000000..ba44f20c43 --- /dev/null +++ b/txscript/data/taproot-ref/cf87f1c7fe8d84db93cab39e5ec4fc004b0daf45 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/cf99a5aabda5c420d162ea57e1d44c83b4a5f444 b/txscript/data/taproot-ref/cf99a5aabda5c420d162ea57e1d44c83b4a5f444 new file mode 100644 index 0000000000..3756373750 --- /dev/null +++ b/txscript/data/taproot-ref/cf99a5aabda5c420d162ea57e1d44c83b4a5f444 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d01804b3f650a230ba4caf6f35710074094ef4bc b/txscript/data/taproot-ref/d01804b3f650a230ba4caf6f35710074094ef4bc new file mode 100644 index 0000000000..da8df8b48b --- /dev/null +++ b/txscript/data/taproot-ref/d01804b3f650a230ba4caf6f35710074094ef4bc @@ -0,0 +1 @@ +{"tx": "0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2800000000ffe4807d60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705201000000dbb069df02474e31000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7bdf76d22", "prevouts": ["1acc2000000000002351212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "f970120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["42ee508d18775b48c94fd207b2626ef394875aa76ea60442ce21a9f0a0fd97bfd705eaf6f95c9eaa6ac9bd6caaf5b9dd6f001d593c2e73b9c5a614dddd582546"]}}, diff --git a/txscript/data/taproot-ref/d018c44a4a260f0faa1c368b22e6fd2da47b4279 b/txscript/data/taproot-ref/d018c44a4a260f0faa1c368b22e6fd2da47b4279 new file mode 100644 index 0000000000..40d03c4e21 --- /dev/null +++ b/txscript/data/taproot-ref/d018c44a4a260f0faa1c368b22e6fd2da47b4279 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d023d686290f14c19a40f74a18a2c183ac38c02f b/txscript/data/taproot-ref/d023d686290f14c19a40f74a18a2c183ac38c02f new file mode 100644 index 0000000000..4286736acf --- /dev/null +++ b/txscript/data/taproot-ref/d023d686290f14c19a40f74a18a2c183ac38c02f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d07029fee875ecd9778957b1eb1b6ed3ba90c94a b/txscript/data/taproot-ref/d07029fee875ecd9778957b1eb1b6ed3ba90c94a new file mode 100644 index 0000000000..6a78adcda9 --- /dev/null +++ b/txscript/data/taproot-ref/d07029fee875ecd9778957b1eb1b6ed3ba90c94a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d076c78276e47d5f2551df88390966202a644ad4 b/txscript/data/taproot-ref/d076c78276e47d5f2551df88390966202a644ad4 new file mode 100644 index 0000000000..41b87948f0 --- /dev/null +++ b/txscript/data/taproot-ref/d076c78276e47d5f2551df88390966202a644ad4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d0a5a7631c5914f69f44abe8d926e7ec265b3853 b/txscript/data/taproot-ref/d0a5a7631c5914f69f44abe8d926e7ec265b3853 new file mode 100644 index 0000000000..1aa2031843 --- /dev/null +++ b/txscript/data/taproot-ref/d0a5a7631c5914f69f44abe8d926e7ec265b3853 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d0b362a6e10e2e3ca3df573c3918408d11230109 b/txscript/data/taproot-ref/d0b362a6e10e2e3ca3df573c3918408d11230109 new file mode 100644 index 0000000000..d269574ca6 --- /dev/null +++ b/txscript/data/taproot-ref/d0b362a6e10e2e3ca3df573c3918408d11230109 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d0c14f7b59f5b7c5e2348a842c4f17589992edef b/txscript/data/taproot-ref/d0c14f7b59f5b7c5e2348a842c4f17589992edef new file mode 100644 index 0000000000..4884f83cc9 --- /dev/null +++ b/txscript/data/taproot-ref/d0c14f7b59f5b7c5e2348a842c4f17589992edef @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d0d80b81785e11a47eb4778cde0392ceee57d442 b/txscript/data/taproot-ref/d0d80b81785e11a47eb4778cde0392ceee57d442 new file mode 100644 index 0000000000..cd07207af7 --- /dev/null +++ b/txscript/data/taproot-ref/d0d80b81785e11a47eb4778cde0392ceee57d442 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d10cc817535fbf7ed3ccccfffd59542e31fd811c b/txscript/data/taproot-ref/d10cc817535fbf7ed3ccccfffd59542e31fd811c new file mode 100644 index 0000000000..315adbd66b --- /dev/null +++ b/txscript/data/taproot-ref/d10cc817535fbf7ed3ccccfffd59542e31fd811c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d120192543d7524d72dbae6640c1fd01b655ba8b b/txscript/data/taproot-ref/d120192543d7524d72dbae6640c1fd01b655ba8b new file mode 100644 index 0000000000..3bab54a9da --- /dev/null +++ b/txscript/data/taproot-ref/d120192543d7524d72dbae6640c1fd01b655ba8b @@ -0,0 +1 @@ +{"tx": "02000000017cacf58c1885ec7a53b7658a58e4f1dee7e8d7a954fb736b3a502279c0be18ef0000000000823ec9e901aef6adca0d000000160014bf1a19526352877c6b170dd8786dc91b1610ae1cfadcf14c", "prevouts": ["87dd816c1100000022512034153a16ef8458ec2412ba42dd5be0fabd8b4c2f532d179dc958fc1fca3cae43"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY", "comment": "inactive/scriptpath_valid_opsuccess", "success": {"scriptSig": "", "witness": ["8c62f256a1571e9f48b1901c6193c928ad34746ea514f6d6b11a2ef54c82ad150e244978614c20e9aa60a3270dd7fbdb230e6b28fe98190090fa42ca691bacf2", "20cb0ba18c127bd01c824f94fd2578ac4109c167b40bd92fd4f8ede9600f7f41f3ac00635068", "c0cb0ba18c127bd01c824f94fd2578ac4109c167b40bd92fd4f8ede9600f7f41f370d37925ebbaa58968ca2d1c370a50dc7325130308285a7d9868d3ad5a34267b01c94ae67cd857f8f23543b618b38154b6c0432568bb8cf7638fb55d4cc0a24e"]}}, diff --git a/txscript/data/taproot-ref/d13e9dcbf612e2b605c913bf461a40c14c78981c b/txscript/data/taproot-ref/d13e9dcbf612e2b605c913bf461a40c14c78981c new file mode 100644 index 0000000000..933e2d3a97 --- /dev/null +++ b/txscript/data/taproot-ref/d13e9dcbf612e2b605c913bf461a40c14c78981c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d145e690ead8e8b91dcf655a058473fba40e05c4 b/txscript/data/taproot-ref/d145e690ead8e8b91dcf655a058473fba40e05c4 new file mode 100644 index 0000000000..31bb8d7968 --- /dev/null +++ b/txscript/data/taproot-ref/d145e690ead8e8b91dcf655a058473fba40e05c4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d1624ab2e4dceb28dc1e7d8f042d85271b474f44 b/txscript/data/taproot-ref/d1624ab2e4dceb28dc1e7d8f042d85271b474f44 new file mode 100644 index 0000000000..3668ba0fbc --- /dev/null +++ b/txscript/data/taproot-ref/d1624ab2e4dceb28dc1e7d8f042d85271b474f44 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d17443611cb2c74ecfda516700477ecdd4ccd1e8 b/txscript/data/taproot-ref/d17443611cb2c74ecfda516700477ecdd4ccd1e8 new file mode 100644 index 0000000000..0d014720f7 --- /dev/null +++ b/txscript/data/taproot-ref/d17443611cb2c74ecfda516700477ecdd4ccd1e8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d17802655b5504bb0405ee7934ae6e14c9c2f6af b/txscript/data/taproot-ref/d17802655b5504bb0405ee7934ae6e14c9c2f6af new file mode 100644 index 0000000000..3711f62a91 --- /dev/null +++ b/txscript/data/taproot-ref/d17802655b5504bb0405ee7934ae6e14c9c2f6af @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d17b2da02d1d622d7b71dade71d9adc392999c5b b/txscript/data/taproot-ref/d17b2da02d1d622d7b71dade71d9adc392999c5b new file mode 100644 index 0000000000..170ca7041f --- /dev/null +++ b/txscript/data/taproot-ref/d17b2da02d1d622d7b71dade71d9adc392999c5b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d17e92c55da82ddc95d75ddd15779fff2868ff46 b/txscript/data/taproot-ref/d17e92c55da82ddc95d75ddd15779fff2868ff46 new file mode 100644 index 0000000000..6bbfef6ce3 --- /dev/null +++ b/txscript/data/taproot-ref/d17e92c55da82ddc95d75ddd15779fff2868ff46 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d209841a9bb6b9ed3a4954465f454a0d304ef888 b/txscript/data/taproot-ref/d209841a9bb6b9ed3a4954465f454a0d304ef888 new file mode 100644 index 0000000000..a7cfef78da --- /dev/null +++ b/txscript/data/taproot-ref/d209841a9bb6b9ed3a4954465f454a0d304ef888 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d263cabcd95f3dae465820283cf9b428e89c02f6 b/txscript/data/taproot-ref/d263cabcd95f3dae465820283cf9b428e89c02f6 new file mode 100644 index 0000000000..e32a9d0c3b --- /dev/null +++ b/txscript/data/taproot-ref/d263cabcd95f3dae465820283cf9b428e89c02f6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d27d3711e16baa8c89ff9c90b6ed0622ca86ff8e b/txscript/data/taproot-ref/d27d3711e16baa8c89ff9c90b6ed0622ca86ff8e new file mode 100644 index 0000000000..e9b3f4e6f5 --- /dev/null +++ b/txscript/data/taproot-ref/d27d3711e16baa8c89ff9c90b6ed0622ca86ff8e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d2957d9af2c85119d0e66bf643c7eb85bda86170 b/txscript/data/taproot-ref/d2957d9af2c85119d0e66bf643c7eb85bda86170 new file mode 100644 index 0000000000..ce4b20d932 --- /dev/null +++ b/txscript/data/taproot-ref/d2957d9af2c85119d0e66bf643c7eb85bda86170 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d2c7c0da2861f14114f11766107a7b8aa6efd73b b/txscript/data/taproot-ref/d2c7c0da2861f14114f11766107a7b8aa6efd73b new file mode 100644 index 0000000000..7536410af2 --- /dev/null +++ b/txscript/data/taproot-ref/d2c7c0da2861f14114f11766107a7b8aa6efd73b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d2d896106278d4a3d97f13f67d9366baca387121 b/txscript/data/taproot-ref/d2d896106278d4a3d97f13f67d9366baca387121 new file mode 100644 index 0000000000..5d5c1bbeb3 --- /dev/null +++ b/txscript/data/taproot-ref/d2d896106278d4a3d97f13f67d9366baca387121 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d2e69860ee1527c081669b81f428a0dee46fe218 b/txscript/data/taproot-ref/d2e69860ee1527c081669b81f428a0dee46fe218 new file mode 100644 index 0000000000..f7e76f97a5 --- /dev/null +++ b/txscript/data/taproot-ref/d2e69860ee1527c081669b81f428a0dee46fe218 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d2f56cc722b3fc0ac3792e7c09a53592a22039af b/txscript/data/taproot-ref/d2f56cc722b3fc0ac3792e7c09a53592a22039af new file mode 100644 index 0000000000..135ebe6f85 --- /dev/null +++ b/txscript/data/taproot-ref/d2f56cc722b3fc0ac3792e7c09a53592a22039af @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d2f8f204891c46f5ba28af13b77da60a054ed30f b/txscript/data/taproot-ref/d2f8f204891c46f5ba28af13b77da60a054ed30f new file mode 100644 index 0000000000..5111921a66 --- /dev/null +++ b/txscript/data/taproot-ref/d2f8f204891c46f5ba28af13b77da60a054ed30f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d33cb0c2e7c01d420f375159f3d266e71d9c3bcf b/txscript/data/taproot-ref/d33cb0c2e7c01d420f375159f3d266e71d9c3bcf new file mode 100644 index 0000000000..cc98e0c477 --- /dev/null +++ b/txscript/data/taproot-ref/d33cb0c2e7c01d420f375159f3d266e71d9c3bcf @@ -0,0 +1 @@ +{"tx": "0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be200000000ee786e5160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270bd000000003fc93dccbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5c00000000b8e3e08703aa61a2000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a678fb6231", "prevouts": ["1b322300000000002251202361d91ff13391fd25020ba7e60c60643b5255f5adbfbdf7f0353592847fec4a", "217511000000000017a9141a56e0fb41afaf4b9e6feff1797087c69015162687", "f93a700000000000225120ef3d9168d15fec7bf262c68665e35843469e387edd931854cfe5c2fa2f3223f0"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "225e202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "witness": ["755a1b2196fc9c98ce064f8d5237f4299cf20054ab4b74433647e559cd0c73c7b05c9f639d371958d478df28de23c020a099ec8c9bd52e67e377df64c336a43c"]}}, diff --git a/txscript/data/taproot-ref/d34c8b66d9e51e1f51b9432c19d0d95ce51aa297 b/txscript/data/taproot-ref/d34c8b66d9e51e1f51b9432c19d0d95ce51aa297 new file mode 100644 index 0000000000..29d8b0bb07 --- /dev/null +++ b/txscript/data/taproot-ref/d34c8b66d9e51e1f51b9432c19d0d95ce51aa297 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d35d96943b798f0362dee33b1c9dd9f5ce520bf7 b/txscript/data/taproot-ref/d35d96943b798f0362dee33b1c9dd9f5ce520bf7 new file mode 100644 index 0000000000..012b9b5c25 --- /dev/null +++ b/txscript/data/taproot-ref/d35d96943b798f0362dee33b1c9dd9f5ce520bf7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d386337a1d0705a7cc519dc2e044e51c1831c3f8 b/txscript/data/taproot-ref/d386337a1d0705a7cc519dc2e044e51c1831c3f8 new file mode 100644 index 0000000000..22524d07e7 --- /dev/null +++ b/txscript/data/taproot-ref/d386337a1d0705a7cc519dc2e044e51c1831c3f8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d3918bf85a56fd7561082f401a5ebd4a0d642f87 b/txscript/data/taproot-ref/d3918bf85a56fd7561082f401a5ebd4a0d642f87 new file mode 100644 index 0000000000..8060e1c864 --- /dev/null +++ b/txscript/data/taproot-ref/d3918bf85a56fd7561082f401a5ebd4a0d642f87 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d3abb997507d97ede96a2ca419dd8554e22db558 b/txscript/data/taproot-ref/d3abb997507d97ede96a2ca419dd8554e22db558 new file mode 100644 index 0000000000..2c39bcf012 --- /dev/null +++ b/txscript/data/taproot-ref/d3abb997507d97ede96a2ca419dd8554e22db558 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d3ad578f5f3076aa52c4e35e8a0002582433fef9 b/txscript/data/taproot-ref/d3ad578f5f3076aa52c4e35e8a0002582433fef9 new file mode 100644 index 0000000000..7a0a186e3a --- /dev/null +++ b/txscript/data/taproot-ref/d3ad578f5f3076aa52c4e35e8a0002582433fef9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d3ae88e79c1801c2da2ca48244ec5455bb3abe76 b/txscript/data/taproot-ref/d3ae88e79c1801c2da2ca48244ec5455bb3abe76 new file mode 100644 index 0000000000..394e303e6d --- /dev/null +++ b/txscript/data/taproot-ref/d3ae88e79c1801c2da2ca48244ec5455bb3abe76 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d3d3e2a151a062b9f319dd5ba2d382d38c8c95d4 b/txscript/data/taproot-ref/d3d3e2a151a062b9f319dd5ba2d382d38c8c95d4 new file mode 100644 index 0000000000..28a638d469 --- /dev/null +++ b/txscript/data/taproot-ref/d3d3e2a151a062b9f319dd5ba2d382d38c8c95d4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d3e5ffbc18b1ff4b1db6426ef3962f8c9cf5cdf0 b/txscript/data/taproot-ref/d3e5ffbc18b1ff4b1db6426ef3962f8c9cf5cdf0 new file mode 100644 index 0000000000..830d8adb70 --- /dev/null +++ b/txscript/data/taproot-ref/d3e5ffbc18b1ff4b1db6426ef3962f8c9cf5cdf0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d411fdd25ef73e64648572aee57803f358cf4bb2 b/txscript/data/taproot-ref/d411fdd25ef73e64648572aee57803f358cf4bb2 new file mode 100644 index 0000000000..7d206ea865 --- /dev/null +++ b/txscript/data/taproot-ref/d411fdd25ef73e64648572aee57803f358cf4bb2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d4208a5824d1318820b3784412f424db595f35ae b/txscript/data/taproot-ref/d4208a5824d1318820b3784412f424db595f35ae new file mode 100644 index 0000000000..f0f73f2b72 --- /dev/null +++ b/txscript/data/taproot-ref/d4208a5824d1318820b3784412f424db595f35ae @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d42eec126dd7b1e4c2c574ddba68f4d0228c3d09 b/txscript/data/taproot-ref/d42eec126dd7b1e4c2c574ddba68f4d0228c3d09 new file mode 100644 index 0000000000..9713048806 --- /dev/null +++ b/txscript/data/taproot-ref/d42eec126dd7b1e4c2c574ddba68f4d0228c3d09 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d48d445fdf8825eb982e112320fe51da22271d30 b/txscript/data/taproot-ref/d48d445fdf8825eb982e112320fe51da22271d30 new file mode 100644 index 0000000000..350cfed3cf --- /dev/null +++ b/txscript/data/taproot-ref/d48d445fdf8825eb982e112320fe51da22271d30 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d49f2424f7e47981e92cdca8a120fad3b5b46351 b/txscript/data/taproot-ref/d49f2424f7e47981e92cdca8a120fad3b5b46351 new file mode 100644 index 0000000000..2cc9c5441d --- /dev/null +++ b/txscript/data/taproot-ref/d49f2424f7e47981e92cdca8a120fad3b5b46351 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d4a61c1883d529642358ce1ad476eae28f347140 b/txscript/data/taproot-ref/d4a61c1883d529642358ce1ad476eae28f347140 new file mode 100644 index 0000000000..914ce10aeb --- /dev/null +++ b/txscript/data/taproot-ref/d4a61c1883d529642358ce1ad476eae28f347140 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d4b2d30318741bf9642c79ca255322762ff5a669 b/txscript/data/taproot-ref/d4b2d30318741bf9642c79ca255322762ff5a669 new file mode 100644 index 0000000000..719070a46f --- /dev/null +++ b/txscript/data/taproot-ref/d4b2d30318741bf9642c79ca255322762ff5a669 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d4bdc84c656fc906c865b5369626edd1bc0d575d b/txscript/data/taproot-ref/d4bdc84c656fc906c865b5369626edd1bc0d575d new file mode 100644 index 0000000000..bb5ffdac13 --- /dev/null +++ b/txscript/data/taproot-ref/d4bdc84c656fc906c865b5369626edd1bc0d575d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d4bfa057df6de164cf5907d1054f7b8f37dc55ca b/txscript/data/taproot-ref/d4bfa057df6de164cf5907d1054f7b8f37dc55ca new file mode 100644 index 0000000000..38177e002e --- /dev/null +++ b/txscript/data/taproot-ref/d4bfa057df6de164cf5907d1054f7b8f37dc55ca @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d4d9f5cbd1cf9b75c9821d5d4746491e46efecb0 b/txscript/data/taproot-ref/d4d9f5cbd1cf9b75c9821d5d4746491e46efecb0 new file mode 100644 index 0000000000..7d834ad9df --- /dev/null +++ b/txscript/data/taproot-ref/d4d9f5cbd1cf9b75c9821d5d4746491e46efecb0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d4eb08a9f93ac1b16665f4266fcd570b760e0b41 b/txscript/data/taproot-ref/d4eb08a9f93ac1b16665f4266fcd570b760e0b41 new file mode 100644 index 0000000000..3ccaeca9c1 --- /dev/null +++ b/txscript/data/taproot-ref/d4eb08a9f93ac1b16665f4266fcd570b760e0b41 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d4f11edc0601915ee85baffdd4721b1d1b3b60d0 b/txscript/data/taproot-ref/d4f11edc0601915ee85baffdd4721b1d1b3b60d0 new file mode 100644 index 0000000000..c0336f4cba --- /dev/null +++ b/txscript/data/taproot-ref/d4f11edc0601915ee85baffdd4721b1d1b3b60d0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d4f65e281be1feebd4750e113b05138a9c44f486 b/txscript/data/taproot-ref/d4f65e281be1feebd4750e113b05138a9c44f486 new file mode 100644 index 0000000000..6b9e44cfb8 --- /dev/null +++ b/txscript/data/taproot-ref/d4f65e281be1feebd4750e113b05138a9c44f486 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/d5048f880c8259302815a101c17c687a6ddbb1d7 b/txscript/data/taproot-ref/d5048f880c8259302815a101c17c687a6ddbb1d7 new file mode 100644 index 0000000000..a6fe25965b --- /dev/null +++ b/txscript/data/taproot-ref/d5048f880c8259302815a101c17c687a6ddbb1d7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d52e561715cddf6ccf811873e1d9570a5b25b677 b/txscript/data/taproot-ref/d52e561715cddf6ccf811873e1d9570a5b25b677 new file mode 100644 index 0000000000..ec1bd47753 --- /dev/null +++ b/txscript/data/taproot-ref/d52e561715cddf6ccf811873e1d9570a5b25b677 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d5466e451d61467e6bd45f66d7608457be8a656f b/txscript/data/taproot-ref/d5466e451d61467e6bd45f66d7608457be8a656f new file mode 100644 index 0000000000..12fa0527cd --- /dev/null +++ b/txscript/data/taproot-ref/d5466e451d61467e6bd45f66d7608457be8a656f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d54c6961bb95000149d7cffd738f1f34eaf1d825 b/txscript/data/taproot-ref/d54c6961bb95000149d7cffd738f1f34eaf1d825 new file mode 100644 index 0000000000..94ab975741 --- /dev/null +++ b/txscript/data/taproot-ref/d54c6961bb95000149d7cffd738f1f34eaf1d825 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d54fe454199d96dd8e1ab2d0069417d2b9be7cf7 b/txscript/data/taproot-ref/d54fe454199d96dd8e1ab2d0069417d2b9be7cf7 new file mode 100644 index 0000000000..385a864ebd --- /dev/null +++ b/txscript/data/taproot-ref/d54fe454199d96dd8e1ab2d0069417d2b9be7cf7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d573fa9122441a358ecf4c86ea6af4d26e08d93a b/txscript/data/taproot-ref/d573fa9122441a358ecf4c86ea6af4d26e08d93a new file mode 100644 index 0000000000..521e7c2bbe --- /dev/null +++ b/txscript/data/taproot-ref/d573fa9122441a358ecf4c86ea6af4d26e08d93a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d5892cc02088b2b7e11febc39b2d7cd9ed96fec6 b/txscript/data/taproot-ref/d5892cc02088b2b7e11febc39b2d7cd9ed96fec6 new file mode 100644 index 0000000000..9d46276026 --- /dev/null +++ b/txscript/data/taproot-ref/d5892cc02088b2b7e11febc39b2d7cd9ed96fec6 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/d58b0cd6e4cd0f7d08d8c5cd8f64fb89bc6c77b3 b/txscript/data/taproot-ref/d58b0cd6e4cd0f7d08d8c5cd8f64fb89bc6c77b3 new file mode 100644 index 0000000000..01f27c00d3 --- /dev/null +++ b/txscript/data/taproot-ref/d58b0cd6e4cd0f7d08d8c5cd8f64fb89bc6c77b3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d5ad81a47205ca9893336dfcc66e370ee84776ce b/txscript/data/taproot-ref/d5ad81a47205ca9893336dfcc66e370ee84776ce new file mode 100644 index 0000000000..c6975ba828 --- /dev/null +++ b/txscript/data/taproot-ref/d5ad81a47205ca9893336dfcc66e370ee84776ce @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d5f073d2ccb1d4bc1f4bb2d64971cda535f3abc4 b/txscript/data/taproot-ref/d5f073d2ccb1d4bc1f4bb2d64971cda535f3abc4 new file mode 100644 index 0000000000..8cddb3ba44 --- /dev/null +++ b/txscript/data/taproot-ref/d5f073d2ccb1d4bc1f4bb2d64971cda535f3abc4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d60ddd04ef59ce7655ce0640bb9f05a050c50572 b/txscript/data/taproot-ref/d60ddd04ef59ce7655ce0640bb9f05a050c50572 new file mode 100644 index 0000000000..97d6920125 --- /dev/null +++ b/txscript/data/taproot-ref/d60ddd04ef59ce7655ce0640bb9f05a050c50572 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d6114c41966cf276af2ac91a43b0dcfdde3ff6ec b/txscript/data/taproot-ref/d6114c41966cf276af2ac91a43b0dcfdde3ff6ec new file mode 100644 index 0000000000..82d45ccf9b --- /dev/null +++ b/txscript/data/taproot-ref/d6114c41966cf276af2ac91a43b0dcfdde3ff6ec @@ -0,0 +1 @@ +{"tx": "0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4001000000f6f17dea60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701902000000d12b24b1025b3564000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787911ee449", "prevouts": ["6b4456000000000017a914269f407e1403e9e55237bbaed7146c0fbc0fe6c987", "b6a71000000000002251201649567eb00a0fbdde29b894a99c9dfb586a4dcbbedf9e66ed23f8b13544bc3c"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "225a202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "witness": ["996a028585cad8e678304597bd54ce9798c74f6462b9feefb83c1e89c082f298852c39340930c5dcc9f33fbc63ae68f778283660b365deb431d667da2f8da5c5"]}}, diff --git a/txscript/data/taproot-ref/d64045b67fe7d9bbac6b1955c9709dc8f62c2574 b/txscript/data/taproot-ref/d64045b67fe7d9bbac6b1955c9709dc8f62c2574 new file mode 100644 index 0000000000..3b92677df7 --- /dev/null +++ b/txscript/data/taproot-ref/d64045b67fe7d9bbac6b1955c9709dc8f62c2574 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d65a0ff7ac01950da5c822d87cd1f1b94663c71f b/txscript/data/taproot-ref/d65a0ff7ac01950da5c822d87cd1f1b94663c71f new file mode 100644 index 0000000000..27a1683f5f --- /dev/null +++ b/txscript/data/taproot-ref/d65a0ff7ac01950da5c822d87cd1f1b94663c71f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d66bdc15b3bc47537708b688679685d7823933ec b/txscript/data/taproot-ref/d66bdc15b3bc47537708b688679685d7823933ec new file mode 100644 index 0000000000..aefaf04d40 --- /dev/null +++ b/txscript/data/taproot-ref/d66bdc15b3bc47537708b688679685d7823933ec @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d6a9e0d913d7e024afc093007237124f4a34364c b/txscript/data/taproot-ref/d6a9e0d913d7e024afc093007237124f4a34364c new file mode 100644 index 0000000000..36cfd1850c --- /dev/null +++ b/txscript/data/taproot-ref/d6a9e0d913d7e024afc093007237124f4a34364c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d6bb41e59dad21fc3ff2d5bb0c784b27307ee4d3 b/txscript/data/taproot-ref/d6bb41e59dad21fc3ff2d5bb0c784b27307ee4d3 new file mode 100644 index 0000000000..d0591cfa2e --- /dev/null +++ b/txscript/data/taproot-ref/d6bb41e59dad21fc3ff2d5bb0c784b27307ee4d3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d6e668abcd05531d83ec0bdff606bec2368882a8 b/txscript/data/taproot-ref/d6e668abcd05531d83ec0bdff606bec2368882a8 new file mode 100644 index 0000000000..ecfa4e888b --- /dev/null +++ b/txscript/data/taproot-ref/d6e668abcd05531d83ec0bdff606bec2368882a8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d6e9b28f9645fdf80b2547f4a875bc298680a83f b/txscript/data/taproot-ref/d6e9b28f9645fdf80b2547f4a875bc298680a83f new file mode 100644 index 0000000000..f5665bf0db --- /dev/null +++ b/txscript/data/taproot-ref/d6e9b28f9645fdf80b2547f4a875bc298680a83f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d70c950a9b6157fdddbd8eb01fed07f12638844f b/txscript/data/taproot-ref/d70c950a9b6157fdddbd8eb01fed07f12638844f new file mode 100644 index 0000000000..ddb2d85b7b --- /dev/null +++ b/txscript/data/taproot-ref/d70c950a9b6157fdddbd8eb01fed07f12638844f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d71a3d01673ec097d7272cd0fcf4fc12f19a90e8 b/txscript/data/taproot-ref/d71a3d01673ec097d7272cd0fcf4fc12f19a90e8 new file mode 100644 index 0000000000..8400678164 --- /dev/null +++ b/txscript/data/taproot-ref/d71a3d01673ec097d7272cd0fcf4fc12f19a90e8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d72363609fde245d8d04d59c1d9e2386e97f61ec b/txscript/data/taproot-ref/d72363609fde245d8d04d59c1d9e2386e97f61ec new file mode 100644 index 0000000000..1fc4a7deac --- /dev/null +++ b/txscript/data/taproot-ref/d72363609fde245d8d04d59c1d9e2386e97f61ec @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d73e808e6fe07bbd4cac3998bbd227cb333f3860 b/txscript/data/taproot-ref/d73e808e6fe07bbd4cac3998bbd227cb333f3860 new file mode 100644 index 0000000000..8c398c9caf --- /dev/null +++ b/txscript/data/taproot-ref/d73e808e6fe07bbd4cac3998bbd227cb333f3860 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d7435dd29bb609d8a757deda3c46bae9522fafb0 b/txscript/data/taproot-ref/d7435dd29bb609d8a757deda3c46bae9522fafb0 new file mode 100644 index 0000000000..cfdf6eab09 --- /dev/null +++ b/txscript/data/taproot-ref/d7435dd29bb609d8a757deda3c46bae9522fafb0 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/d747c65611d3195e76faeea3dbaca70f0255d690 b/txscript/data/taproot-ref/d747c65611d3195e76faeea3dbaca70f0255d690 new file mode 100644 index 0000000000..07de01f12f --- /dev/null +++ b/txscript/data/taproot-ref/d747c65611d3195e76faeea3dbaca70f0255d690 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d7482427db68b72ab957e74167dbc8c28842b070 b/txscript/data/taproot-ref/d7482427db68b72ab957e74167dbc8c28842b070 new file mode 100644 index 0000000000..fb07f9fb66 --- /dev/null +++ b/txscript/data/taproot-ref/d7482427db68b72ab957e74167dbc8c28842b070 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d7491a450345ac8fd8bd2da583d6974224917a83 b/txscript/data/taproot-ref/d7491a450345ac8fd8bd2da583d6974224917a83 new file mode 100644 index 0000000000..4773adf767 --- /dev/null +++ b/txscript/data/taproot-ref/d7491a450345ac8fd8bd2da583d6974224917a83 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d750ca1379d7933d2b0750e621fad549663516ca b/txscript/data/taproot-ref/d750ca1379d7933d2b0750e621fad549663516ca new file mode 100644 index 0000000000..7d9c383e1e --- /dev/null +++ b/txscript/data/taproot-ref/d750ca1379d7933d2b0750e621fad549663516ca @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/d762cef9eb8735ca5282dea549336970c32f0470 b/txscript/data/taproot-ref/d762cef9eb8735ca5282dea549336970c32f0470 new file mode 100644 index 0000000000..a2bdb6ca81 --- /dev/null +++ b/txscript/data/taproot-ref/d762cef9eb8735ca5282dea549336970c32f0470 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d784977d5fa21c31f0f510f5a1e2d50f7815c63e b/txscript/data/taproot-ref/d784977d5fa21c31f0f510f5a1e2d50f7815c63e new file mode 100644 index 0000000000..365dc1e5e3 --- /dev/null +++ b/txscript/data/taproot-ref/d784977d5fa21c31f0f510f5a1e2d50f7815c63e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d78a59aa9fae45d7cbfb5d42a6d57744818f4f3c b/txscript/data/taproot-ref/d78a59aa9fae45d7cbfb5d42a6d57744818f4f3c new file mode 100644 index 0000000000..0abe869050 --- /dev/null +++ b/txscript/data/taproot-ref/d78a59aa9fae45d7cbfb5d42a6d57744818f4f3c @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/d78b2cc4912fce258a371b34976f623504f00bf5 b/txscript/data/taproot-ref/d78b2cc4912fce258a371b34976f623504f00bf5 new file mode 100644 index 0000000000..023dc1f7fb --- /dev/null +++ b/txscript/data/taproot-ref/d78b2cc4912fce258a371b34976f623504f00bf5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d796184dcd2791587af889f67ff0bd146da22bf6 b/txscript/data/taproot-ref/d796184dcd2791587af889f67ff0bd146da22bf6 new file mode 100644 index 0000000000..b5429f05b4 --- /dev/null +++ b/txscript/data/taproot-ref/d796184dcd2791587af889f67ff0bd146da22bf6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d7a0524afa7b58f919577fc272101adacde12154 b/txscript/data/taproot-ref/d7a0524afa7b58f919577fc272101adacde12154 new file mode 100644 index 0000000000..82f5b9a1ee --- /dev/null +++ b/txscript/data/taproot-ref/d7a0524afa7b58f919577fc272101adacde12154 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d7ae7546c73cd724ed329a7e111b1874f3fad3a3 b/txscript/data/taproot-ref/d7ae7546c73cd724ed329a7e111b1874f3fad3a3 new file mode 100644 index 0000000000..5bfec08c3e --- /dev/null +++ b/txscript/data/taproot-ref/d7ae7546c73cd724ed329a7e111b1874f3fad3a3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d7c12a570bce792607b3d5f23fc34ef6392109de b/txscript/data/taproot-ref/d7c12a570bce792607b3d5f23fc34ef6392109de new file mode 100644 index 0000000000..c0b3579efe --- /dev/null +++ b/txscript/data/taproot-ref/d7c12a570bce792607b3d5f23fc34ef6392109de @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d7d1782dc0b7c5e12cccab548a33619bf58a1db8 b/txscript/data/taproot-ref/d7d1782dc0b7c5e12cccab548a33619bf58a1db8 new file mode 100644 index 0000000000..94ae53cab2 --- /dev/null +++ b/txscript/data/taproot-ref/d7d1782dc0b7c5e12cccab548a33619bf58a1db8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d7ed3928aecf2d3acbca2fb8d2ee7775f7f52ccf b/txscript/data/taproot-ref/d7ed3928aecf2d3acbca2fb8d2ee7775f7f52ccf new file mode 100644 index 0000000000..9588a724d7 --- /dev/null +++ b/txscript/data/taproot-ref/d7ed3928aecf2d3acbca2fb8d2ee7775f7f52ccf @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d7f54f75c60667b7fd883f34d666d917d0b88809 b/txscript/data/taproot-ref/d7f54f75c60667b7fd883f34d666d917d0b88809 new file mode 100644 index 0000000000..e14fb1a3a1 --- /dev/null +++ b/txscript/data/taproot-ref/d7f54f75c60667b7fd883f34d666d917d0b88809 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d80fa30ad1a0824f0da7b212e606ac5496c0715c b/txscript/data/taproot-ref/d80fa30ad1a0824f0da7b212e606ac5496c0715c new file mode 100644 index 0000000000..c443190e65 --- /dev/null +++ b/txscript/data/taproot-ref/d80fa30ad1a0824f0da7b212e606ac5496c0715c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d86ea65d288be1fd03e9e19e503b17612c637374 b/txscript/data/taproot-ref/d86ea65d288be1fd03e9e19e503b17612c637374 new file mode 100644 index 0000000000..797df5eed7 --- /dev/null +++ b/txscript/data/taproot-ref/d86ea65d288be1fd03e9e19e503b17612c637374 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d8ac2a246d17295baa73602fa55f5ef1d6edd095 b/txscript/data/taproot-ref/d8ac2a246d17295baa73602fa55f5ef1d6edd095 new file mode 100644 index 0000000000..31b6f15c9f --- /dev/null +++ b/txscript/data/taproot-ref/d8ac2a246d17295baa73602fa55f5ef1d6edd095 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d8d54db51b8f8299982f8136c6058c9e8063811b b/txscript/data/taproot-ref/d8d54db51b8f8299982f8136c6058c9e8063811b new file mode 100644 index 0000000000..74423f0123 --- /dev/null +++ b/txscript/data/taproot-ref/d8d54db51b8f8299982f8136c6058c9e8063811b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d8def6ae46c2ae1d19b457603e2015ddad467ad3 b/txscript/data/taproot-ref/d8def6ae46c2ae1d19b457603e2015ddad467ad3 new file mode 100644 index 0000000000..2781bb2777 --- /dev/null +++ b/txscript/data/taproot-ref/d8def6ae46c2ae1d19b457603e2015ddad467ad3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d8df811ed2f11c79fe945f4943ea3299a251ecb0 b/txscript/data/taproot-ref/d8df811ed2f11c79fe945f4943ea3299a251ecb0 new file mode 100644 index 0000000000..c429421dde --- /dev/null +++ b/txscript/data/taproot-ref/d8df811ed2f11c79fe945f4943ea3299a251ecb0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d8e4caa314d508c3062410f0d680eb589488140f b/txscript/data/taproot-ref/d8e4caa314d508c3062410f0d680eb589488140f new file mode 100644 index 0000000000..f0ffa4921e --- /dev/null +++ b/txscript/data/taproot-ref/d8e4caa314d508c3062410f0d680eb589488140f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d8f77e44fa8aab802aa9131ae9f319611a054835 b/txscript/data/taproot-ref/d8f77e44fa8aab802aa9131ae9f319611a054835 new file mode 100644 index 0000000000..90e8cbba11 --- /dev/null +++ b/txscript/data/taproot-ref/d8f77e44fa8aab802aa9131ae9f319611a054835 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d915944728f949574638f5527cabdee757340ecc b/txscript/data/taproot-ref/d915944728f949574638f5527cabdee757340ecc new file mode 100644 index 0000000000..68ae813b62 --- /dev/null +++ b/txscript/data/taproot-ref/d915944728f949574638f5527cabdee757340ecc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d92c58e19437f5a57d606edb988ebe5449b4db1d b/txscript/data/taproot-ref/d92c58e19437f5a57d606edb988ebe5449b4db1d new file mode 100644 index 0000000000..3bacffa1ba --- /dev/null +++ b/txscript/data/taproot-ref/d92c58e19437f5a57d606edb988ebe5449b4db1d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d93387aa595f09f4e40642c715176275012422f9 b/txscript/data/taproot-ref/d93387aa595f09f4e40642c715176275012422f9 new file mode 100644 index 0000000000..815d93fc66 --- /dev/null +++ b/txscript/data/taproot-ref/d93387aa595f09f4e40642c715176275012422f9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d93dd1d6d2d9b39d77cd72571effaec51dad73cf b/txscript/data/taproot-ref/d93dd1d6d2d9b39d77cd72571effaec51dad73cf new file mode 100644 index 0000000000..2fb099eb52 --- /dev/null +++ b/txscript/data/taproot-ref/d93dd1d6d2d9b39d77cd72571effaec51dad73cf @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d9462d451520aea896848f14167cad63f8eb631b b/txscript/data/taproot-ref/d9462d451520aea896848f14167cad63f8eb631b new file mode 100644 index 0000000000..c06d3cae70 --- /dev/null +++ b/txscript/data/taproot-ref/d9462d451520aea896848f14167cad63f8eb631b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d9632d4e4f8d7cc9db523291bb7442332d7c588c b/txscript/data/taproot-ref/d9632d4e4f8d7cc9db523291bb7442332d7c588c new file mode 100644 index 0000000000..8cd0e32729 --- /dev/null +++ b/txscript/data/taproot-ref/d9632d4e4f8d7cc9db523291bb7442332d7c588c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d96eb1935933e5d8a16bab96d06d05f8b1ab6619 b/txscript/data/taproot-ref/d96eb1935933e5d8a16bab96d06d05f8b1ab6619 new file mode 100644 index 0000000000..aaca7a6e23 --- /dev/null +++ b/txscript/data/taproot-ref/d96eb1935933e5d8a16bab96d06d05f8b1ab6619 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d9721f612be2c4596ef2507879885c69a5e6e58d b/txscript/data/taproot-ref/d9721f612be2c4596ef2507879885c69a5e6e58d new file mode 100644 index 0000000000..4d42231cb1 --- /dev/null +++ b/txscript/data/taproot-ref/d9721f612be2c4596ef2507879885c69a5e6e58d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d975fa857300c644b1b8b86b9e5579116325e3b6 b/txscript/data/taproot-ref/d975fa857300c644b1b8b86b9e5579116325e3b6 new file mode 100644 index 0000000000..eefbec47f5 --- /dev/null +++ b/txscript/data/taproot-ref/d975fa857300c644b1b8b86b9e5579116325e3b6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d97fad7ecab4d8f234efc71d9e0019d3cd6866be b/txscript/data/taproot-ref/d97fad7ecab4d8f234efc71d9e0019d3cd6866be new file mode 100644 index 0000000000..b42ceabfdd --- /dev/null +++ b/txscript/data/taproot-ref/d97fad7ecab4d8f234efc71d9e0019d3cd6866be @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/d9d8525ff675d165e7bd245edb10bef8ffbabf37 b/txscript/data/taproot-ref/d9d8525ff675d165e7bd245edb10bef8ffbabf37 new file mode 100644 index 0000000000..3effcdeb85 --- /dev/null +++ b/txscript/data/taproot-ref/d9d8525ff675d165e7bd245edb10bef8ffbabf37 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/da15d30445dcabf73491b38ff9b7fd6ebf09fabb b/txscript/data/taproot-ref/da15d30445dcabf73491b38ff9b7fd6ebf09fabb new file mode 100644 index 0000000000..7567bc1cab --- /dev/null +++ b/txscript/data/taproot-ref/da15d30445dcabf73491b38ff9b7fd6ebf09fabb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/da20174fe1299204fdf8cca351a424cf681308a2 b/txscript/data/taproot-ref/da20174fe1299204fdf8cca351a424cf681308a2 new file mode 100644 index 0000000000..e18f5445ad --- /dev/null +++ b/txscript/data/taproot-ref/da20174fe1299204fdf8cca351a424cf681308a2 @@ -0,0 +1 @@ +{"tx": "020000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127041010000001720b19702a1341000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388acac33b72b", "prevouts": ["32c9110000000000165f142540f27e90740933c99d4f17ab2dfc6c82951cfb"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["e397277edb9892f8bacbdcb6543289fb0df076055a91ea7e74f59d361d35c07b375a39ee6d07249e82169004b19323f96057fdeaa6b91474614cc9ea8b65e71a", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/da3eafaf969feb19889dd744b3407db1aa866e06 b/txscript/data/taproot-ref/da3eafaf969feb19889dd744b3407db1aa866e06 new file mode 100644 index 0000000000..baddc2299c --- /dev/null +++ b/txscript/data/taproot-ref/da3eafaf969feb19889dd744b3407db1aa866e06 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/da802c4897e37a5e51f367edd23444c11faa33aa b/txscript/data/taproot-ref/da802c4897e37a5e51f367edd23444c11faa33aa new file mode 100644 index 0000000000..b799cd97bc --- /dev/null +++ b/txscript/data/taproot-ref/da802c4897e37a5e51f367edd23444c11faa33aa @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/da8a14b376513348d7ee34b10ff6883f15cc6fd5 b/txscript/data/taproot-ref/da8a14b376513348d7ee34b10ff6883f15cc6fd5 new file mode 100644 index 0000000000..d13ce6578c --- /dev/null +++ b/txscript/data/taproot-ref/da8a14b376513348d7ee34b10ff6883f15cc6fd5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/da91d607fd954405726ab36fa5677e8163634ff7 b/txscript/data/taproot-ref/da91d607fd954405726ab36fa5677e8163634ff7 new file mode 100644 index 0000000000..cde0a53bbf --- /dev/null +++ b/txscript/data/taproot-ref/da91d607fd954405726ab36fa5677e8163634ff7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/daad29bf36401da76f1b83f5cd1cc0335bf5c14f b/txscript/data/taproot-ref/daad29bf36401da76f1b83f5cd1cc0335bf5c14f new file mode 100644 index 0000000000..9f88916a2a --- /dev/null +++ b/txscript/data/taproot-ref/daad29bf36401da76f1b83f5cd1cc0335bf5c14f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dacc869b2d12c823c9a4bb00e5edcd51d35c5978 b/txscript/data/taproot-ref/dacc869b2d12c823c9a4bb00e5edcd51d35c5978 new file mode 100644 index 0000000000..7d40505818 --- /dev/null +++ b/txscript/data/taproot-ref/dacc869b2d12c823c9a4bb00e5edcd51d35c5978 @@ -0,0 +1 @@ +{"tx": "02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4fd010000003193dfcfdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b54010000005b35cfa901599734000000000017a914719f78084af863e000acd618ba76df979722368987f8010000", "prevouts": ["5c99400000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b", "bf2620000000000017a9147e06846ce22cd5e23f7e03391c0538498e0e18ed87"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "215c1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b", "witness": ["81460df501ef435ba685c790d0e36c12bc849c884a1d74cbd9cb660662cde4ab52904a5773b01fb806c06221f2a2cff19cc19c63dd306fb6ad8a66565e62d4b8"]}}, diff --git a/txscript/data/taproot-ref/dacf3352a5bdd39737fb53affdf284ce61f4e97e b/txscript/data/taproot-ref/dacf3352a5bdd39737fb53affdf284ce61f4e97e new file mode 100644 index 0000000000..231bc034b6 --- /dev/null +++ b/txscript/data/taproot-ref/dacf3352a5bdd39737fb53affdf284ce61f4e97e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dadf4bbba1d78a438712afd4e84df10275987f0a b/txscript/data/taproot-ref/dadf4bbba1d78a438712afd4e84df10275987f0a new file mode 100644 index 0000000000..f551539b97 --- /dev/null +++ b/txscript/data/taproot-ref/dadf4bbba1d78a438712afd4e84df10275987f0a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/daf266d227dfb92686b3d8cb80cb4d2c4e849468 b/txscript/data/taproot-ref/daf266d227dfb92686b3d8cb80cb4d2c4e849468 new file mode 100644 index 0000000000..4d61d75288 --- /dev/null +++ b/txscript/data/taproot-ref/daf266d227dfb92686b3d8cb80cb4d2c4e849468 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dafea52d56a314eff0b38df4ddd35be40d4f6d24 b/txscript/data/taproot-ref/dafea52d56a314eff0b38df4ddd35be40d4f6d24 new file mode 100644 index 0000000000..55edb91cb8 --- /dev/null +++ b/txscript/data/taproot-ref/dafea52d56a314eff0b38df4ddd35be40d4f6d24 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/db01c81c34e5e86ae44bef70289a143173916fb4 b/txscript/data/taproot-ref/db01c81c34e5e86ae44bef70289a143173916fb4 new file mode 100644 index 0000000000..b80c1783bb --- /dev/null +++ b/txscript/data/taproot-ref/db01c81c34e5e86ae44bef70289a143173916fb4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/db06c61fa468b40855c83db915cf67df55dddeb9 b/txscript/data/taproot-ref/db06c61fa468b40855c83db915cf67df55dddeb9 new file mode 100644 index 0000000000..7241357f75 --- /dev/null +++ b/txscript/data/taproot-ref/db06c61fa468b40855c83db915cf67df55dddeb9 @@ -0,0 +1 @@ +{"tx": "0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1500000000e2737d19dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b03000000005a250c9e0284fb83000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e71e000000", "prevouts": ["2d5f6600000000002352212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "6b0a200000000000225120a4d11f9ab8dc6b61afd987f8e15499b9970edef61488d41b5de77b1846913dba"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["3090bbd9de73322484fe270a1a5006987b8a5c5a65561f363b9082a8a4d72247aa6e1a20569ca99586eb0faf55052c786c3f42a9a0c66427f716bc6a713525b3", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/db191d70ebee38a520718fe3a295896a1840f111 b/txscript/data/taproot-ref/db191d70ebee38a520718fe3a295896a1840f111 new file mode 100644 index 0000000000..cfaf3152f9 --- /dev/null +++ b/txscript/data/taproot-ref/db191d70ebee38a520718fe3a295896a1840f111 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/db2f754795e1478498a59b3071a7852a32a70b8e b/txscript/data/taproot-ref/db2f754795e1478498a59b3071a7852a32a70b8e new file mode 100644 index 0000000000..78d857afaf --- /dev/null +++ b/txscript/data/taproot-ref/db2f754795e1478498a59b3071a7852a32a70b8e @@ -0,0 +1 @@ +{"tx": "02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46d00000000e4e24797bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd0010000006cf86596dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bbe0000000039bf39d9014d7b6700000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5e010000", "prevouts": ["b9ba3900000000002251204e92f58f07bd1c983dce937cb6ff2655b495f5bbe642bc389d13f2d55749a90b", "cd767b00000000002251209907b2e5a8727f92d01ee9564efd2935f4d16cad3aca9531ec5054e94bf8eff6", "7a8f2100000000002357212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900"], "index": 2, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["eaa4642f4330fa159cd36e1f76f94f0db6b32781d14b9657ec806a3f15c9a354be453a1673ceeb5e892325b8164dd70df71151f21c618e823cfa0efb4e5c2667"]}}, diff --git a/txscript/data/taproot-ref/db41febcaac001cb453d4a2ca2a285784d5a9cd8 b/txscript/data/taproot-ref/db41febcaac001cb453d4a2ca2a285784d5a9cd8 new file mode 100644 index 0000000000..627c6932e1 --- /dev/null +++ b/txscript/data/taproot-ref/db41febcaac001cb453d4a2ca2a285784d5a9cd8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/db5b9f12551bfc0e07e9c89d6d5971df6e4eea17 b/txscript/data/taproot-ref/db5b9f12551bfc0e07e9c89d6d5971df6e4eea17 new file mode 100644 index 0000000000..3e9b6f5a17 --- /dev/null +++ b/txscript/data/taproot-ref/db5b9f12551bfc0e07e9c89d6d5971df6e4eea17 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/db715816bbafa4a288124a98d0cb4df6a364cb3e b/txscript/data/taproot-ref/db715816bbafa4a288124a98d0cb4df6a364cb3e new file mode 100644 index 0000000000..3acbdb62c5 --- /dev/null +++ b/txscript/data/taproot-ref/db715816bbafa4a288124a98d0cb4df6a364cb3e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/db81d6ad0913097959d953bb6c2e7d576f846a11 b/txscript/data/taproot-ref/db81d6ad0913097959d953bb6c2e7d576f846a11 new file mode 100644 index 0000000000..0b6761831d --- /dev/null +++ b/txscript/data/taproot-ref/db81d6ad0913097959d953bb6c2e7d576f846a11 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/db9eba0b2b563ba067b7fd8e8ee5ddad9b770dce b/txscript/data/taproot-ref/db9eba0b2b563ba067b7fd8e8ee5ddad9b770dce new file mode 100644 index 0000000000..48f10ef140 --- /dev/null +++ b/txscript/data/taproot-ref/db9eba0b2b563ba067b7fd8e8ee5ddad9b770dce @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dba31a12d1adba28878c2a0b52b782a5c72d9972 b/txscript/data/taproot-ref/dba31a12d1adba28878c2a0b52b782a5c72d9972 new file mode 100644 index 0000000000..af2e2fb757 --- /dev/null +++ b/txscript/data/taproot-ref/dba31a12d1adba28878c2a0b52b782a5c72d9972 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dbef858a545baf2d110f1d0e917e4ad258acf993 b/txscript/data/taproot-ref/dbef858a545baf2d110f1d0e917e4ad258acf993 new file mode 100644 index 0000000000..4df4ddfd1b --- /dev/null +++ b/txscript/data/taproot-ref/dbef858a545baf2d110f1d0e917e4ad258acf993 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dc01bbbcdac6b5bb939e4be9ca56e5b8c3d165af b/txscript/data/taproot-ref/dc01bbbcdac6b5bb939e4be9ca56e5b8c3d165af new file mode 100644 index 0000000000..94002a32dd --- /dev/null +++ b/txscript/data/taproot-ref/dc01bbbcdac6b5bb939e4be9ca56e5b8c3d165af @@ -0,0 +1 @@ +{"tx": "78fb85ab02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7e01000000c5e6ddac60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708e0100000019cdf7a804af2e3400000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acb51aa824", "prevouts": ["0c31250000000000225120f6ebc972e8b9359a70abca9662ec0add7397530b2d8a533f3315a928b489401f", "2b311100000000002259202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["a85efc3365bad0b94f18bee63a98e02288e29fc22eb62c5f052f41b29f60279c153a5df2b7f313b969c88a1208137dcbfb528cd2393ad2a1364a332debbfcc43", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/dc0806f74a893b88a54642a35cd820535fde3ed1 b/txscript/data/taproot-ref/dc0806f74a893b88a54642a35cd820535fde3ed1 new file mode 100644 index 0000000000..80876f5cbf --- /dev/null +++ b/txscript/data/taproot-ref/dc0806f74a893b88a54642a35cd820535fde3ed1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dc161355dcd6047181d0cf4e25b6a5525f6fe50e b/txscript/data/taproot-ref/dc161355dcd6047181d0cf4e25b6a5525f6fe50e new file mode 100644 index 0000000000..d5e313c187 --- /dev/null +++ b/txscript/data/taproot-ref/dc161355dcd6047181d0cf4e25b6a5525f6fe50e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dc3539d6d3a6a1eaf48ce5185a088eb43b9e383e b/txscript/data/taproot-ref/dc3539d6d3a6a1eaf48ce5185a088eb43b9e383e new file mode 100644 index 0000000000..c0c20e86ca --- /dev/null +++ b/txscript/data/taproot-ref/dc3539d6d3a6a1eaf48ce5185a088eb43b9e383e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dc480267e0ef9ce538b42b77872f2b3532c35322 b/txscript/data/taproot-ref/dc480267e0ef9ce538b42b77872f2b3532c35322 new file mode 100644 index 0000000000..adc9d61c64 --- /dev/null +++ b/txscript/data/taproot-ref/dc480267e0ef9ce538b42b77872f2b3532c35322 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dc57d8ffab2a6632708a04cb288629b09aa5c82e b/txscript/data/taproot-ref/dc57d8ffab2a6632708a04cb288629b09aa5c82e new file mode 100644 index 0000000000..cbf5878db3 --- /dev/null +++ b/txscript/data/taproot-ref/dc57d8ffab2a6632708a04cb288629b09aa5c82e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dc593bc1e5ac44230400eae2d39c99148ad34e4b b/txscript/data/taproot-ref/dc593bc1e5ac44230400eae2d39c99148ad34e4b new file mode 100644 index 0000000000..cadf31d6b5 --- /dev/null +++ b/txscript/data/taproot-ref/dc593bc1e5ac44230400eae2d39c99148ad34e4b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dc6dcb26e66c42982855aa1a52a31fd33b250e19 b/txscript/data/taproot-ref/dc6dcb26e66c42982855aa1a52a31fd33b250e19 new file mode 100644 index 0000000000..854556bf4e --- /dev/null +++ b/txscript/data/taproot-ref/dc6dcb26e66c42982855aa1a52a31fd33b250e19 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dc9395f17d85f800578e0d6e8bf89ad9746befb7 b/txscript/data/taproot-ref/dc9395f17d85f800578e0d6e8bf89ad9746befb7 new file mode 100644 index 0000000000..946142125e --- /dev/null +++ b/txscript/data/taproot-ref/dc9395f17d85f800578e0d6e8bf89ad9746befb7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dc9899ac6fe73116d5e9f16eb5d414386eaf20b6 b/txscript/data/taproot-ref/dc9899ac6fe73116d5e9f16eb5d414386eaf20b6 new file mode 100644 index 0000000000..1000afb983 --- /dev/null +++ b/txscript/data/taproot-ref/dc9899ac6fe73116d5e9f16eb5d414386eaf20b6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dc99d264d246e0de31744757d56e34f81e69221e b/txscript/data/taproot-ref/dc99d264d246e0de31744757d56e34f81e69221e new file mode 100644 index 0000000000..0e1d0c88bc --- /dev/null +++ b/txscript/data/taproot-ref/dc99d264d246e0de31744757d56e34f81e69221e @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/dca299a0e651d9aa555003ff4a5031f3fccf9743 b/txscript/data/taproot-ref/dca299a0e651d9aa555003ff4a5031f3fccf9743 new file mode 100644 index 0000000000..3f88d32140 --- /dev/null +++ b/txscript/data/taproot-ref/dca299a0e651d9aa555003ff4a5031f3fccf9743 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dcaa02212efb1b1d7b35ccd1cd382be6b3e66e71 b/txscript/data/taproot-ref/dcaa02212efb1b1d7b35ccd1cd382be6b3e66e71 new file mode 100644 index 0000000000..e19dd80f08 --- /dev/null +++ b/txscript/data/taproot-ref/dcaa02212efb1b1d7b35ccd1cd382be6b3e66e71 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dcbd31842dac9e7cdaf7ca65e510582bfd1d1a9b b/txscript/data/taproot-ref/dcbd31842dac9e7cdaf7ca65e510582bfd1d1a9b new file mode 100644 index 0000000000..87553ac9ef --- /dev/null +++ b/txscript/data/taproot-ref/dcbd31842dac9e7cdaf7ca65e510582bfd1d1a9b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dccaf2fc47adc1a3b05f03d5fac2a95f989db10c b/txscript/data/taproot-ref/dccaf2fc47adc1a3b05f03d5fac2a95f989db10c new file mode 100644 index 0000000000..4da3d28993 --- /dev/null +++ b/txscript/data/taproot-ref/dccaf2fc47adc1a3b05f03d5fac2a95f989db10c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dccd7c4272928f022003ea9c7aaa12dcc004a54c b/txscript/data/taproot-ref/dccd7c4272928f022003ea9c7aaa12dcc004a54c new file mode 100644 index 0000000000..b2e437034c --- /dev/null +++ b/txscript/data/taproot-ref/dccd7c4272928f022003ea9c7aaa12dcc004a54c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dcd041ba07357566b4ee1ed3cbca6574c6154f10 b/txscript/data/taproot-ref/dcd041ba07357566b4ee1ed3cbca6574c6154f10 new file mode 100644 index 0000000000..6eed590c9d --- /dev/null +++ b/txscript/data/taproot-ref/dcd041ba07357566b4ee1ed3cbca6574c6154f10 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dcf7577a80ecef6f3ca732dc2e3adaa48e682fdb b/txscript/data/taproot-ref/dcf7577a80ecef6f3ca732dc2e3adaa48e682fdb new file mode 100644 index 0000000000..64ad8ad0ea --- /dev/null +++ b/txscript/data/taproot-ref/dcf7577a80ecef6f3ca732dc2e3adaa48e682fdb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dd000d20a2f313c18520373a1f18e05ed9a150e2 b/txscript/data/taproot-ref/dd000d20a2f313c18520373a1f18e05ed9a150e2 new file mode 100644 index 0000000000..ef661bb9fe --- /dev/null +++ b/txscript/data/taproot-ref/dd000d20a2f313c18520373a1f18e05ed9a150e2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dd0b6ef4b264cf0858480a3460b856a1c8f6dc1d b/txscript/data/taproot-ref/dd0b6ef4b264cf0858480a3460b856a1c8f6dc1d new file mode 100644 index 0000000000..8317233251 --- /dev/null +++ b/txscript/data/taproot-ref/dd0b6ef4b264cf0858480a3460b856a1c8f6dc1d @@ -0,0 +1 @@ +{"tx": "8bbbb434028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f7010000001a4f028560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a5010000007c0d8cd903a9a243000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc79e010000", "prevouts": ["bcb73500000000002251201aac33169e9e7c3154d6a008d33b220a63d8a9ebf4646c8ee915f75ae7529b5f", "7f111000000000002254202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["0b29c03cd81df73a2b574156c0daea3474ec5851a59a011a7d667c3a3646addc88edb1946575a4f48e3b2c20e66d9cdda77515ec287f3b5e972d0c7858810a34", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/dd51571565035f293d86c40ad779317f87aedf8a b/txscript/data/taproot-ref/dd51571565035f293d86c40ad779317f87aedf8a new file mode 100644 index 0000000000..09442da743 --- /dev/null +++ b/txscript/data/taproot-ref/dd51571565035f293d86c40ad779317f87aedf8a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dd6e129061e453f9a72be030e9baeee3e56fcf0f b/txscript/data/taproot-ref/dd6e129061e453f9a72be030e9baeee3e56fcf0f new file mode 100644 index 0000000000..11712ff558 --- /dev/null +++ b/txscript/data/taproot-ref/dd6e129061e453f9a72be030e9baeee3e56fcf0f @@ -0,0 +1 @@ +{"tx": "01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4280000000012c312408bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44b00000000ca4d1b9204be1e7100000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc70b020000", "prevouts": ["7eca39000000000022512091a4836ea80f7ca2c21897583e26dd6f79eeaeac6399c549c1cbaa135e7e4bc1", "85e938000000000021551f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["7ee4a8652a801c81f21832a7f20b2aeeac576839e9f39d404e47e760404363a752189c2e02859c0b294e9c8d33bc582084722dcf67aefbe0d7c9864b0815deaf", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/dd8c174c7b3d3ef26b6db13442b39a50c7f55222 b/txscript/data/taproot-ref/dd8c174c7b3d3ef26b6db13442b39a50c7f55222 new file mode 100644 index 0000000000..5cc48ab3c7 --- /dev/null +++ b/txscript/data/taproot-ref/dd8c174c7b3d3ef26b6db13442b39a50c7f55222 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dda325195c906944f23de872fa78b2af88631c09 b/txscript/data/taproot-ref/dda325195c906944f23de872fa78b2af88631c09 new file mode 100644 index 0000000000..46f0eeadce --- /dev/null +++ b/txscript/data/taproot-ref/dda325195c906944f23de872fa78b2af88631c09 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ddaf37dc11a8574b722f076f36e746bc7c60e215 b/txscript/data/taproot-ref/ddaf37dc11a8574b722f076f36e746bc7c60e215 new file mode 100644 index 0000000000..58944f5a5e --- /dev/null +++ b/txscript/data/taproot-ref/ddaf37dc11a8574b722f076f36e746bc7c60e215 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ddd4994f43b538ffca8eb9b28ca5fb499238d0b9 b/txscript/data/taproot-ref/ddd4994f43b538ffca8eb9b28ca5fb499238d0b9 new file mode 100644 index 0000000000..3b3076b605 --- /dev/null +++ b/txscript/data/taproot-ref/ddd4994f43b538ffca8eb9b28ca5fb499238d0b9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dde699e331a7df59bcdada620624b5ba61dc5dd0 b/txscript/data/taproot-ref/dde699e331a7df59bcdada620624b5ba61dc5dd0 new file mode 100644 index 0000000000..9715e72660 --- /dev/null +++ b/txscript/data/taproot-ref/dde699e331a7df59bcdada620624b5ba61dc5dd0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ddebb704471c13ddfaf31413aae6c013515a3717 b/txscript/data/taproot-ref/ddebb704471c13ddfaf31413aae6c013515a3717 new file mode 100644 index 0000000000..79cb9ea6bb --- /dev/null +++ b/txscript/data/taproot-ref/ddebb704471c13ddfaf31413aae6c013515a3717 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ddedd372fed9df45da4d1a59cf4f5cb35009e49f b/txscript/data/taproot-ref/ddedd372fed9df45da4d1a59cf4f5cb35009e49f new file mode 100644 index 0000000000..99a5ead75a --- /dev/null +++ b/txscript/data/taproot-ref/ddedd372fed9df45da4d1a59cf4f5cb35009e49f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ddf80ae28fa37fbe9cd6a838ae2c428932ef3961 b/txscript/data/taproot-ref/ddf80ae28fa37fbe9cd6a838ae2c428932ef3961 new file mode 100644 index 0000000000..b9ac3285b4 --- /dev/null +++ b/txscript/data/taproot-ref/ddf80ae28fa37fbe9cd6a838ae2c428932ef3961 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/de08cbb895403680951a2ebc90561ac53b1a1f4e b/txscript/data/taproot-ref/de08cbb895403680951a2ebc90561ac53b1a1f4e new file mode 100644 index 0000000000..b971dcaf5a --- /dev/null +++ b/txscript/data/taproot-ref/de08cbb895403680951a2ebc90561ac53b1a1f4e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/de2a5caabe3e3b0b1b01533e95ed8f482c6ba0fc b/txscript/data/taproot-ref/de2a5caabe3e3b0b1b01533e95ed8f482c6ba0fc new file mode 100644 index 0000000000..1263e31164 --- /dev/null +++ b/txscript/data/taproot-ref/de2a5caabe3e3b0b1b01533e95ed8f482c6ba0fc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/de4f89a55a6d907d16952ca4e4166a5979c39c8b b/txscript/data/taproot-ref/de4f89a55a6d907d16952ca4e4166a5979c39c8b new file mode 100644 index 0000000000..ef9ec66a89 --- /dev/null +++ b/txscript/data/taproot-ref/de4f89a55a6d907d16952ca4e4166a5979c39c8b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/de5a7c1447572e08c6b28e753fe662ac083fd6d1 b/txscript/data/taproot-ref/de5a7c1447572e08c6b28e753fe662ac083fd6d1 new file mode 100644 index 0000000000..d2d6e2bd6c --- /dev/null +++ b/txscript/data/taproot-ref/de5a7c1447572e08c6b28e753fe662ac083fd6d1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/de5adc575b18b1c34a68e95cecf166f402e523ff b/txscript/data/taproot-ref/de5adc575b18b1c34a68e95cecf166f402e523ff new file mode 100644 index 0000000000..16ed3ac84a --- /dev/null +++ b/txscript/data/taproot-ref/de5adc575b18b1c34a68e95cecf166f402e523ff @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/de5af33427175b7548895fa5441e430afe11d1d5 b/txscript/data/taproot-ref/de5af33427175b7548895fa5441e430afe11d1d5 new file mode 100644 index 0000000000..45a48a6be8 --- /dev/null +++ b/txscript/data/taproot-ref/de5af33427175b7548895fa5441e430afe11d1d5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/de6875a737b7c8020f44b1c99b70c4853e661ecf b/txscript/data/taproot-ref/de6875a737b7c8020f44b1c99b70c4853e661ecf new file mode 100644 index 0000000000..2490e7ed64 --- /dev/null +++ b/txscript/data/taproot-ref/de6875a737b7c8020f44b1c99b70c4853e661ecf @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/de6cf2f6180404aa31b1db7d09cf2baddd601d44 b/txscript/data/taproot-ref/de6cf2f6180404aa31b1db7d09cf2baddd601d44 new file mode 100644 index 0000000000..f340451914 --- /dev/null +++ b/txscript/data/taproot-ref/de6cf2f6180404aa31b1db7d09cf2baddd601d44 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/de8a035daf19e89e29ba0bbdd71dffd1f9cadc5c b/txscript/data/taproot-ref/de8a035daf19e89e29ba0bbdd71dffd1f9cadc5c new file mode 100644 index 0000000000..86fb49cac4 --- /dev/null +++ b/txscript/data/taproot-ref/de8a035daf19e89e29ba0bbdd71dffd1f9cadc5c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dea753eea55e305608844a4f00655549302ce7dd b/txscript/data/taproot-ref/dea753eea55e305608844a4f00655549302ce7dd new file mode 100644 index 0000000000..a841273cf8 --- /dev/null +++ b/txscript/data/taproot-ref/dea753eea55e305608844a4f00655549302ce7dd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/decd88daf9600a38bc143777492f37dad4565eaf b/txscript/data/taproot-ref/decd88daf9600a38bc143777492f37dad4565eaf new file mode 100644 index 0000000000..e11f3c545f --- /dev/null +++ b/txscript/data/taproot-ref/decd88daf9600a38bc143777492f37dad4565eaf @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ded66ffb0cbf19f233f516bd3c63fe712650ef33 b/txscript/data/taproot-ref/ded66ffb0cbf19f233f516bd3c63fe712650ef33 new file mode 100644 index 0000000000..7fb357970b --- /dev/null +++ b/txscript/data/taproot-ref/ded66ffb0cbf19f233f516bd3c63fe712650ef33 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ded72412b30434c168fa06e48b7e054269d006c0 b/txscript/data/taproot-ref/ded72412b30434c168fa06e48b7e054269d006c0 new file mode 100644 index 0000000000..4089a026a4 --- /dev/null +++ b/txscript/data/taproot-ref/ded72412b30434c168fa06e48b7e054269d006c0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dedc75c0c2ee756e9070605ce546167cacfbcaca b/txscript/data/taproot-ref/dedc75c0c2ee756e9070605ce546167cacfbcaca new file mode 100644 index 0000000000..a2b67c89c4 --- /dev/null +++ b/txscript/data/taproot-ref/dedc75c0c2ee756e9070605ce546167cacfbcaca @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dee101172e339916048ad363fb6995306d7dd142 b/txscript/data/taproot-ref/dee101172e339916048ad363fb6995306d7dd142 new file mode 100644 index 0000000000..3e8a9e8a23 --- /dev/null +++ b/txscript/data/taproot-ref/dee101172e339916048ad363fb6995306d7dd142 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/def37ff0a6957f0a571488b66a768f20f7079048 b/txscript/data/taproot-ref/def37ff0a6957f0a571488b66a768f20f7079048 new file mode 100644 index 0000000000..e27808a85e --- /dev/null +++ b/txscript/data/taproot-ref/def37ff0a6957f0a571488b66a768f20f7079048 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/def74495863bbdf9d1af666161152708f2ba582d b/txscript/data/taproot-ref/def74495863bbdf9d1af666161152708f2ba582d new file mode 100644 index 0000000000..164f0003df --- /dev/null +++ b/txscript/data/taproot-ref/def74495863bbdf9d1af666161152708f2ba582d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/df029e9ebb9e83aace8f0071d2840c27c3ceda07 b/txscript/data/taproot-ref/df029e9ebb9e83aace8f0071d2840c27c3ceda07 new file mode 100644 index 0000000000..4a37cd07c6 --- /dev/null +++ b/txscript/data/taproot-ref/df029e9ebb9e83aace8f0071d2840c27c3ceda07 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/df085e9114f63f74c86f24312e70f7b5318ad9fc b/txscript/data/taproot-ref/df085e9114f63f74c86f24312e70f7b5318ad9fc new file mode 100644 index 0000000000..2d9af9b9a6 --- /dev/null +++ b/txscript/data/taproot-ref/df085e9114f63f74c86f24312e70f7b5318ad9fc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/df12a4966bab2fafa4ffe3a2ffbbbe8d697046c2 b/txscript/data/taproot-ref/df12a4966bab2fafa4ffe3a2ffbbbe8d697046c2 new file mode 100644 index 0000000000..b9d932425e --- /dev/null +++ b/txscript/data/taproot-ref/df12a4966bab2fafa4ffe3a2ffbbbe8d697046c2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/df16a0297efbbe308fa83a0f3e6ad417689b028b b/txscript/data/taproot-ref/df16a0297efbbe308fa83a0f3e6ad417689b028b new file mode 100644 index 0000000000..d3a9d47da9 --- /dev/null +++ b/txscript/data/taproot-ref/df16a0297efbbe308fa83a0f3e6ad417689b028b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/df865486869273fb5f7adede25fcadcb18ce2221 b/txscript/data/taproot-ref/df865486869273fb5f7adede25fcadcb18ce2221 new file mode 100644 index 0000000000..1ab24e894c --- /dev/null +++ b/txscript/data/taproot-ref/df865486869273fb5f7adede25fcadcb18ce2221 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/df8de808e45c8839831abd0deb0cabf9143753a4 b/txscript/data/taproot-ref/df8de808e45c8839831abd0deb0cabf9143753a4 new file mode 100644 index 0000000000..6f789bd684 --- /dev/null +++ b/txscript/data/taproot-ref/df8de808e45c8839831abd0deb0cabf9143753a4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/df8e03791d82b6610c2c15664032e32589ea35a8 b/txscript/data/taproot-ref/df8e03791d82b6610c2c15664032e32589ea35a8 new file mode 100644 index 0000000000..53e3440b5c --- /dev/null +++ b/txscript/data/taproot-ref/df8e03791d82b6610c2c15664032e32589ea35a8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dfa3c5fef1b463d98f523033ec70daf8d4bf8803 b/txscript/data/taproot-ref/dfa3c5fef1b463d98f523033ec70daf8d4bf8803 new file mode 100644 index 0000000000..6f77a1617d --- /dev/null +++ b/txscript/data/taproot-ref/dfa3c5fef1b463d98f523033ec70daf8d4bf8803 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dfb36ff8904f4e8107d8ba666de3e5f94f741bfe b/txscript/data/taproot-ref/dfb36ff8904f4e8107d8ba666de3e5f94f741bfe new file mode 100644 index 0000000000..f8dd052903 --- /dev/null +++ b/txscript/data/taproot-ref/dfb36ff8904f4e8107d8ba666de3e5f94f741bfe @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dfca4159ab78bba17ae0d77f088b5aaeb3144266 b/txscript/data/taproot-ref/dfca4159ab78bba17ae0d77f088b5aaeb3144266 new file mode 100644 index 0000000000..36583ab97c --- /dev/null +++ b/txscript/data/taproot-ref/dfca4159ab78bba17ae0d77f088b5aaeb3144266 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/dfe3a4307a38993f68b0c2518ea2e3e590b0c9d1 b/txscript/data/taproot-ref/dfe3a4307a38993f68b0c2518ea2e3e590b0c9d1 new file mode 100644 index 0000000000..285bef3a8d --- /dev/null +++ b/txscript/data/taproot-ref/dfe3a4307a38993f68b0c2518ea2e3e590b0c9d1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e0128963856adfa8520b26e571a93610b5355887 b/txscript/data/taproot-ref/e0128963856adfa8520b26e571a93610b5355887 new file mode 100644 index 0000000000..88925e11c2 --- /dev/null +++ b/txscript/data/taproot-ref/e0128963856adfa8520b26e571a93610b5355887 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e03443f852b194c164bc4732fb9c5cc86effe4f6 b/txscript/data/taproot-ref/e03443f852b194c164bc4732fb9c5cc86effe4f6 new file mode 100644 index 0000000000..f747a9e6d2 --- /dev/null +++ b/txscript/data/taproot-ref/e03443f852b194c164bc4732fb9c5cc86effe4f6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e0588caa737bfbd960ff3fd219ca062193aa6bf0 b/txscript/data/taproot-ref/e0588caa737bfbd960ff3fd219ca062193aa6bf0 new file mode 100644 index 0000000000..a4128d3133 --- /dev/null +++ b/txscript/data/taproot-ref/e0588caa737bfbd960ff3fd219ca062193aa6bf0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e0aaba61fbc722b30669314cc389d44b8f989110 b/txscript/data/taproot-ref/e0aaba61fbc722b30669314cc389d44b8f989110 new file mode 100644 index 0000000000..6aaaefea87 --- /dev/null +++ b/txscript/data/taproot-ref/e0aaba61fbc722b30669314cc389d44b8f989110 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e0bbbcbab18f481daf5b315491e268254f4983fb b/txscript/data/taproot-ref/e0bbbcbab18f481daf5b315491e268254f4983fb new file mode 100644 index 0000000000..eecb76762f --- /dev/null +++ b/txscript/data/taproot-ref/e0bbbcbab18f481daf5b315491e268254f4983fb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e0da4e0fe645f0a953ac5735fde4706cca9e1197 b/txscript/data/taproot-ref/e0da4e0fe645f0a953ac5735fde4706cca9e1197 new file mode 100644 index 0000000000..2a2365fe07 --- /dev/null +++ b/txscript/data/taproot-ref/e0da4e0fe645f0a953ac5735fde4706cca9e1197 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e0ebae4900e11a9672f2ae78e61178aa6247650c b/txscript/data/taproot-ref/e0ebae4900e11a9672f2ae78e61178aa6247650c new file mode 100644 index 0000000000..ea2d4fbd64 --- /dev/null +++ b/txscript/data/taproot-ref/e0ebae4900e11a9672f2ae78e61178aa6247650c @@ -0,0 +1 @@ +{"tx": "0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c200200000056d3cc57dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf501000000a74f649460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270020200000040bd4f300326debf000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac82010000", "prevouts": ["1dfc5f000000000017a91480e36171416c0f598c1c20ba17ab3a3cf10a438e87", "34075000000000002251203dc2472455090bb3a6b10d2b5a6f86a9b76268c5f2a3511c1c846486e45d4259", "95c61200000000002251206830c8b1ebe925261a77111fca109651f909c8747b4715cea67841710683246d"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "2359212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "witness": ["106a7e3049dc2c6347306abcffd6f8c8b3f26d4b7ee65ebb24d0fa41c8692b957b5654e881ef324dce199491145286cfa20a23ee05d277712bf9841942e08319"]}}, diff --git a/txscript/data/taproot-ref/e1087672834b43c44e37cba854b5b9c9f7179a84 b/txscript/data/taproot-ref/e1087672834b43c44e37cba854b5b9c9f7179a84 new file mode 100644 index 0000000000..3255e85af9 --- /dev/null +++ b/txscript/data/taproot-ref/e1087672834b43c44e37cba854b5b9c9f7179a84 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e10bddf4873386e1fe3f6dc0f2b20f5c151c89e1 b/txscript/data/taproot-ref/e10bddf4873386e1fe3f6dc0f2b20f5c151c89e1 new file mode 100644 index 0000000000..7e74ecc84e --- /dev/null +++ b/txscript/data/taproot-ref/e10bddf4873386e1fe3f6dc0f2b20f5c151c89e1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e11d98e0003ce918a6fad19f550ea0702a879911 b/txscript/data/taproot-ref/e11d98e0003ce918a6fad19f550ea0702a879911 new file mode 100644 index 0000000000..f8d35330db --- /dev/null +++ b/txscript/data/taproot-ref/e11d98e0003ce918a6fad19f550ea0702a879911 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/e1326c178bf8e7b80cda8ea9f9dd86938329c849 b/txscript/data/taproot-ref/e1326c178bf8e7b80cda8ea9f9dd86938329c849 new file mode 100644 index 0000000000..d77737053d --- /dev/null +++ b/txscript/data/taproot-ref/e1326c178bf8e7b80cda8ea9f9dd86938329c849 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e147111796d5b53a6bf6dc9458c50027b4d09f87 b/txscript/data/taproot-ref/e147111796d5b53a6bf6dc9458c50027b4d09f87 new file mode 100644 index 0000000000..e250ffe405 --- /dev/null +++ b/txscript/data/taproot-ref/e147111796d5b53a6bf6dc9458c50027b4d09f87 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e14960a185290ebe95ae6279b9e869e837251710 b/txscript/data/taproot-ref/e14960a185290ebe95ae6279b9e869e837251710 new file mode 100644 index 0000000000..1a200ab7bd --- /dev/null +++ b/txscript/data/taproot-ref/e14960a185290ebe95ae6279b9e869e837251710 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e170c4afc7cf3aa9e0e5c2670686778994fa4f11 b/txscript/data/taproot-ref/e170c4afc7cf3aa9e0e5c2670686778994fa4f11 new file mode 100644 index 0000000000..b76c7f3bc8 --- /dev/null +++ b/txscript/data/taproot-ref/e170c4afc7cf3aa9e0e5c2670686778994fa4f11 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e184bc711398d7c0c1fa6934192fda6c555a1cb3 b/txscript/data/taproot-ref/e184bc711398d7c0c1fa6934192fda6c555a1cb3 new file mode 100644 index 0000000000..b0f3669544 --- /dev/null +++ b/txscript/data/taproot-ref/e184bc711398d7c0c1fa6934192fda6c555a1cb3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e1b11848fd01dfa0ba32bf126463d9d364ab4313 b/txscript/data/taproot-ref/e1b11848fd01dfa0ba32bf126463d9d364ab4313 new file mode 100644 index 0000000000..9b41c3223c --- /dev/null +++ b/txscript/data/taproot-ref/e1b11848fd01dfa0ba32bf126463d9d364ab4313 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e1ba585df080f7b1a7f8f2c7db5dd610f19174de b/txscript/data/taproot-ref/e1ba585df080f7b1a7f8f2c7db5dd610f19174de new file mode 100644 index 0000000000..eae9f1edda --- /dev/null +++ b/txscript/data/taproot-ref/e1ba585df080f7b1a7f8f2c7db5dd610f19174de @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e1d952db862331ca79b0a9c72c162374fb1857d7 b/txscript/data/taproot-ref/e1d952db862331ca79b0a9c72c162374fb1857d7 new file mode 100644 index 0000000000..0229fcc7a7 --- /dev/null +++ b/txscript/data/taproot-ref/e1d952db862331ca79b0a9c72c162374fb1857d7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e1e49dcfb28496b89f4ea5ce3dc0d76d880076e4 b/txscript/data/taproot-ref/e1e49dcfb28496b89f4ea5ce3dc0d76d880076e4 new file mode 100644 index 0000000000..183ebfb38f --- /dev/null +++ b/txscript/data/taproot-ref/e1e49dcfb28496b89f4ea5ce3dc0d76d880076e4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e1f0807d7b3a4bba613963e80beb7c74850d5c28 b/txscript/data/taproot-ref/e1f0807d7b3a4bba613963e80beb7c74850d5c28 new file mode 100644 index 0000000000..5b77ca7456 --- /dev/null +++ b/txscript/data/taproot-ref/e1f0807d7b3a4bba613963e80beb7c74850d5c28 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e22480aebb82f3343403252198ba68a247b6d046 b/txscript/data/taproot-ref/e22480aebb82f3343403252198ba68a247b6d046 new file mode 100644 index 0000000000..b93a842091 --- /dev/null +++ b/txscript/data/taproot-ref/e22480aebb82f3343403252198ba68a247b6d046 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e24851678d123d31e1507cb51348f5b1dc101d4c b/txscript/data/taproot-ref/e24851678d123d31e1507cb51348f5b1dc101d4c new file mode 100644 index 0000000000..c2ea7a9553 --- /dev/null +++ b/txscript/data/taproot-ref/e24851678d123d31e1507cb51348f5b1dc101d4c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e2496a88dd988d4f3ef82308c3cca33a874d45aa b/txscript/data/taproot-ref/e2496a88dd988d4f3ef82308c3cca33a874d45aa new file mode 100644 index 0000000000..ad4c0f973e --- /dev/null +++ b/txscript/data/taproot-ref/e2496a88dd988d4f3ef82308c3cca33a874d45aa @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e255d1877a2010d7fcfc04ed18a7a010df14a2c0 b/txscript/data/taproot-ref/e255d1877a2010d7fcfc04ed18a7a010df14a2c0 new file mode 100644 index 0000000000..34ce67f94c --- /dev/null +++ b/txscript/data/taproot-ref/e255d1877a2010d7fcfc04ed18a7a010df14a2c0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e25fb2f6402ada66247ba900b01f074eb85ba330 b/txscript/data/taproot-ref/e25fb2f6402ada66247ba900b01f074eb85ba330 new file mode 100644 index 0000000000..a7cf72d12f --- /dev/null +++ b/txscript/data/taproot-ref/e25fb2f6402ada66247ba900b01f074eb85ba330 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e279990fd5d183e1d8b4f404ff9bb849d49c365a b/txscript/data/taproot-ref/e279990fd5d183e1d8b4f404ff9bb849d49c365a new file mode 100644 index 0000000000..ab62fe30e4 --- /dev/null +++ b/txscript/data/taproot-ref/e279990fd5d183e1d8b4f404ff9bb849d49c365a @@ -0,0 +1 @@ +{"tx": "6feaa06102bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf13000000008c1dfd8060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709b010000005302e8d802def79200000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6bbd63d48", "prevouts": ["853382000000000017a914a8c07d8aa161ec0fed82ac1dc93d81dd0a92012687", "53ae120000000000225120473417efae73fd5e93fcc212950b9b19ee652cc977c17e6edd4b3172c741ca78"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "235b212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "witness": ["a89bf0e7e51d916bacac8530956b4a105bb87b458404335cff97cebc187bc4d2ff6ede95852665dbba540f70fcca1837a4dad11db9c39d91dbccce39527bef7e"]}}, diff --git a/txscript/data/taproot-ref/e2d5ca40d2c53fc997406f6b09aab24c3df0d72c b/txscript/data/taproot-ref/e2d5ca40d2c53fc997406f6b09aab24c3df0d72c new file mode 100644 index 0000000000..0957d8c81a --- /dev/null +++ b/txscript/data/taproot-ref/e2d5ca40d2c53fc997406f6b09aab24c3df0d72c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e2eeef8ece1fd34ca3dc565f6c64e1e27ffe4394 b/txscript/data/taproot-ref/e2eeef8ece1fd34ca3dc565f6c64e1e27ffe4394 new file mode 100644 index 0000000000..333370fbe4 --- /dev/null +++ b/txscript/data/taproot-ref/e2eeef8ece1fd34ca3dc565f6c64e1e27ffe4394 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e3196566970071a5ddde94e45545b255dbb827b6 b/txscript/data/taproot-ref/e3196566970071a5ddde94e45545b255dbb827b6 new file mode 100644 index 0000000000..b4bf4bb2a8 --- /dev/null +++ b/txscript/data/taproot-ref/e3196566970071a5ddde94e45545b255dbb827b6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e31f0de61f44c1cdc4d261d497cf718662ce97d4 b/txscript/data/taproot-ref/e31f0de61f44c1cdc4d261d497cf718662ce97d4 new file mode 100644 index 0000000000..a00418cdbe --- /dev/null +++ b/txscript/data/taproot-ref/e31f0de61f44c1cdc4d261d497cf718662ce97d4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e3201e6cef5abb4e32884e254d83db6c48c0c98e b/txscript/data/taproot-ref/e3201e6cef5abb4e32884e254d83db6c48c0c98e new file mode 100644 index 0000000000..529582764b --- /dev/null +++ b/txscript/data/taproot-ref/e3201e6cef5abb4e32884e254d83db6c48c0c98e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e3588db1c621c20dd15839f0a47a91d2b3a7c779 b/txscript/data/taproot-ref/e3588db1c621c20dd15839f0a47a91d2b3a7c779 new file mode 100644 index 0000000000..172bcfaca2 --- /dev/null +++ b/txscript/data/taproot-ref/e3588db1c621c20dd15839f0a47a91d2b3a7c779 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e35adac42c2fa3fac81b5b56415001d9ef213aa9 b/txscript/data/taproot-ref/e35adac42c2fa3fac81b5b56415001d9ef213aa9 new file mode 100644 index 0000000000..2f26f91837 --- /dev/null +++ b/txscript/data/taproot-ref/e35adac42c2fa3fac81b5b56415001d9ef213aa9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e36c31c772e822a277d29a41f45a505e97121618 b/txscript/data/taproot-ref/e36c31c772e822a277d29a41f45a505e97121618 new file mode 100644 index 0000000000..c67e0f4e25 --- /dev/null +++ b/txscript/data/taproot-ref/e36c31c772e822a277d29a41f45a505e97121618 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e37bd80d8483f80595f8de680651a88967e6b765 b/txscript/data/taproot-ref/e37bd80d8483f80595f8de680651a88967e6b765 new file mode 100644 index 0000000000..22cba05303 --- /dev/null +++ b/txscript/data/taproot-ref/e37bd80d8483f80595f8de680651a88967e6b765 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e385046269e21e18e9615b10675db2b779814ea6 b/txscript/data/taproot-ref/e385046269e21e18e9615b10675db2b779814ea6 new file mode 100644 index 0000000000..92f30f9b23 --- /dev/null +++ b/txscript/data/taproot-ref/e385046269e21e18e9615b10675db2b779814ea6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e3cb84cf87cf0a5a0e394a62331f15e54cde54f5 b/txscript/data/taproot-ref/e3cb84cf87cf0a5a0e394a62331f15e54cde54f5 new file mode 100644 index 0000000000..9f7fc42812 --- /dev/null +++ b/txscript/data/taproot-ref/e3cb84cf87cf0a5a0e394a62331f15e54cde54f5 @@ -0,0 +1 @@ +{"tx": "2bba28450160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f3010000004fa5d0840202ee0c0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac49000000", "prevouts": ["25880f0000000000215d1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["8b73e459b89a1d7a6b88e5dcd2cb404d25a635453075b8226871cb5f22c54414eb1214c006685a6b83d7048a59fb5a2969fedfe791fc3d4331e98c48e2a3fc3f"]}}, diff --git a/txscript/data/taproot-ref/e3e431ac9b495d6b12f584909dd0891e732ef378 b/txscript/data/taproot-ref/e3e431ac9b495d6b12f584909dd0891e732ef378 new file mode 100644 index 0000000000..c4e3471e0c --- /dev/null +++ b/txscript/data/taproot-ref/e3e431ac9b495d6b12f584909dd0891e732ef378 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e3e86951be6edc4911741f8779b8b81f8e19669e b/txscript/data/taproot-ref/e3e86951be6edc4911741f8779b8b81f8e19669e new file mode 100644 index 0000000000..3e8d4ce2c6 --- /dev/null +++ b/txscript/data/taproot-ref/e3e86951be6edc4911741f8779b8b81f8e19669e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e3ee89b296eda3cdf6b73af88989c9879d826a5c b/txscript/data/taproot-ref/e3ee89b296eda3cdf6b73af88989c9879d826a5c new file mode 100644 index 0000000000..072fc1714a --- /dev/null +++ b/txscript/data/taproot-ref/e3ee89b296eda3cdf6b73af88989c9879d826a5c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e43e0f4dd6d04ff5cb7feb566ac7effde65eabaf b/txscript/data/taproot-ref/e43e0f4dd6d04ff5cb7feb566ac7effde65eabaf new file mode 100644 index 0000000000..108ce2c4a4 --- /dev/null +++ b/txscript/data/taproot-ref/e43e0f4dd6d04ff5cb7feb566ac7effde65eabaf @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e4400ed471cfae79f01e699c1535a927cd7db111 b/txscript/data/taproot-ref/e4400ed471cfae79f01e699c1535a927cd7db111 new file mode 100644 index 0000000000..4d64df14fd --- /dev/null +++ b/txscript/data/taproot-ref/e4400ed471cfae79f01e699c1535a927cd7db111 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e4403314230ec5266c263c14b3167d0495467abb b/txscript/data/taproot-ref/e4403314230ec5266c263c14b3167d0495467abb new file mode 100644 index 0000000000..fabb598110 --- /dev/null +++ b/txscript/data/taproot-ref/e4403314230ec5266c263c14b3167d0495467abb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e4476c9611f68d7aed1329b54ac787a7dc19d3c1 b/txscript/data/taproot-ref/e4476c9611f68d7aed1329b54ac787a7dc19d3c1 new file mode 100644 index 0000000000..38b613b57d --- /dev/null +++ b/txscript/data/taproot-ref/e4476c9611f68d7aed1329b54ac787a7dc19d3c1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e4549906b6821c9cfd2bdad13fcedc9f2ce44c8f b/txscript/data/taproot-ref/e4549906b6821c9cfd2bdad13fcedc9f2ce44c8f new file mode 100644 index 0000000000..b978cb6f03 --- /dev/null +++ b/txscript/data/taproot-ref/e4549906b6821c9cfd2bdad13fcedc9f2ce44c8f @@ -0,0 +1 @@ +{"tx": "01000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46e01000000aca912a00381e13900000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac82010000", "prevouts": ["a8e93b000000000017a91437a5c76a04bb604ad99785877003310ab74c7e2b87"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "165c142540f27e90740933c99d4f17ab2dfc6c82951cfb", "witness": ["80b334005ae104106759e292d674d3c28f902644005e258094b870c5c188475a4d383eebf6d0674734689ed679337c48c7e9e5b3670c4a14848905637136d946", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/e46150bc653c31e407e6428aa1a6ebf50bf84aea b/txscript/data/taproot-ref/e46150bc653c31e407e6428aa1a6ebf50bf84aea new file mode 100644 index 0000000000..e9050e74a6 --- /dev/null +++ b/txscript/data/taproot-ref/e46150bc653c31e407e6428aa1a6ebf50bf84aea @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e4a1dbfb8711c43befec064b8fd396058b0c54af b/txscript/data/taproot-ref/e4a1dbfb8711c43befec064b8fd396058b0c54af new file mode 100644 index 0000000000..5c1cbd7396 --- /dev/null +++ b/txscript/data/taproot-ref/e4a1dbfb8711c43befec064b8fd396058b0c54af @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e4ac1ef7380b8d2111b6763169a1743b27f8990e b/txscript/data/taproot-ref/e4ac1ef7380b8d2111b6763169a1743b27f8990e new file mode 100644 index 0000000000..ab2fd7eb9e --- /dev/null +++ b/txscript/data/taproot-ref/e4ac1ef7380b8d2111b6763169a1743b27f8990e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e4be0b4404267bdc3cff4674612fa0aafae17da8 b/txscript/data/taproot-ref/e4be0b4404267bdc3cff4674612fa0aafae17da8 new file mode 100644 index 0000000000..204997173c --- /dev/null +++ b/txscript/data/taproot-ref/e4be0b4404267bdc3cff4674612fa0aafae17da8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e4ed5b23d5de1068cbbde995bd4acee64e91aa7e b/txscript/data/taproot-ref/e4ed5b23d5de1068cbbde995bd4acee64e91aa7e new file mode 100644 index 0000000000..b4e23d30d5 --- /dev/null +++ b/txscript/data/taproot-ref/e4ed5b23d5de1068cbbde995bd4acee64e91aa7e @@ -0,0 +1 @@ +{"tx": "010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705100000000fbf40f81dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be10100000028107fd004ce692f000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688aceb524132", "prevouts": ["aafc0f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b", "43d42100000000002255202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["bf12b3ce410208e8d45324bc449e14020662d67526263b8e81eb7a746fe6fcf0a151b2f58e36ed3b57ed3d1aee1ecdfd43cb0fce5e33bf3a750433f4d93c9dcb"]}}, diff --git a/txscript/data/taproot-ref/e4f857e19db4cfd96f2d5054dbf40b5a9e492dff b/txscript/data/taproot-ref/e4f857e19db4cfd96f2d5054dbf40b5a9e492dff new file mode 100644 index 0000000000..8d0636f2d9 --- /dev/null +++ b/txscript/data/taproot-ref/e4f857e19db4cfd96f2d5054dbf40b5a9e492dff @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e4f9951077eb874d4585b5156eb27d51d2efbfd3 b/txscript/data/taproot-ref/e4f9951077eb874d4585b5156eb27d51d2efbfd3 new file mode 100644 index 0000000000..c09296d485 --- /dev/null +++ b/txscript/data/taproot-ref/e4f9951077eb874d4585b5156eb27d51d2efbfd3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e50744f139df817035a18b49f300ba44cb0343d3 b/txscript/data/taproot-ref/e50744f139df817035a18b49f300ba44cb0343d3 new file mode 100644 index 0000000000..ef751cf6d9 --- /dev/null +++ b/txscript/data/taproot-ref/e50744f139df817035a18b49f300ba44cb0343d3 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/e50e205a1d18fcdba7e8e5fcee9033cc4707f9c7 b/txscript/data/taproot-ref/e50e205a1d18fcdba7e8e5fcee9033cc4707f9c7 new file mode 100644 index 0000000000..a059c5f487 --- /dev/null +++ b/txscript/data/taproot-ref/e50e205a1d18fcdba7e8e5fcee9033cc4707f9c7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e52cfe3453de9b1d75444df456949cb75040b8b6 b/txscript/data/taproot-ref/e52cfe3453de9b1d75444df456949cb75040b8b6 new file mode 100644 index 0000000000..1743137d5a --- /dev/null +++ b/txscript/data/taproot-ref/e52cfe3453de9b1d75444df456949cb75040b8b6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e531badf585946f2d8e4ca711ad08bfab23b255d b/txscript/data/taproot-ref/e531badf585946f2d8e4ca711ad08bfab23b255d new file mode 100644 index 0000000000..c15c3d7302 --- /dev/null +++ b/txscript/data/taproot-ref/e531badf585946f2d8e4ca711ad08bfab23b255d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e556fbc1cbc098965abc9f19de4e699a65701b97 b/txscript/data/taproot-ref/e556fbc1cbc098965abc9f19de4e699a65701b97 new file mode 100644 index 0000000000..e85b7098ee --- /dev/null +++ b/txscript/data/taproot-ref/e556fbc1cbc098965abc9f19de4e699a65701b97 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e5a06372794c8a0907ebcab73767cf918aac39aa b/txscript/data/taproot-ref/e5a06372794c8a0907ebcab73767cf918aac39aa new file mode 100644 index 0000000000..ed2643e923 --- /dev/null +++ b/txscript/data/taproot-ref/e5a06372794c8a0907ebcab73767cf918aac39aa @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e5c2adb3e9fbf1cd914078ec2a63b5eb9a6e3abe b/txscript/data/taproot-ref/e5c2adb3e9fbf1cd914078ec2a63b5eb9a6e3abe new file mode 100644 index 0000000000..df10ac65b5 --- /dev/null +++ b/txscript/data/taproot-ref/e5c2adb3e9fbf1cd914078ec2a63b5eb9a6e3abe @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e5d4d4aeaf98b811a93af7c9329c6daf9589e991 b/txscript/data/taproot-ref/e5d4d4aeaf98b811a93af7c9329c6daf9589e991 new file mode 100644 index 0000000000..7c0abaa311 --- /dev/null +++ b/txscript/data/taproot-ref/e5d4d4aeaf98b811a93af7c9329c6daf9589e991 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e5d756b155e51281410e56562a664673b0c34fcd b/txscript/data/taproot-ref/e5d756b155e51281410e56562a664673b0c34fcd new file mode 100644 index 0000000000..4880599579 --- /dev/null +++ b/txscript/data/taproot-ref/e5d756b155e51281410e56562a664673b0c34fcd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e60ac2a186190f5f41d0f98adb9107b436491c32 b/txscript/data/taproot-ref/e60ac2a186190f5f41d0f98adb9107b436491c32 new file mode 100644 index 0000000000..a1b8163959 --- /dev/null +++ b/txscript/data/taproot-ref/e60ac2a186190f5f41d0f98adb9107b436491c32 @@ -0,0 +1 @@ +{"tx": "91f42efc01dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c84000000001f7a65f003c7cb5a000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914719f78084af863e000acd618ba76df97972236898726000000", "prevouts": ["c47a5c000000000017a914525ca05541c81a105639c2efb802eaf5596cfe0187"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "21521f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b", "witness": ["69223f2e1a925dc7c5c485a09fd8f6062cc12da6766059d7d491ee86c66f018695f6f914479e07f220c6674e287fde9eabb44ee085615328446a1b09e8b1c1c2", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/e617e275740cca2c1002733c0b62505410149814 b/txscript/data/taproot-ref/e617e275740cca2c1002733c0b62505410149814 new file mode 100644 index 0000000000..0030e4c90c --- /dev/null +++ b/txscript/data/taproot-ref/e617e275740cca2c1002733c0b62505410149814 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e62e88a5e5a9d90dbb6072f7ccea09b105b0f310 b/txscript/data/taproot-ref/e62e88a5e5a9d90dbb6072f7ccea09b105b0f310 new file mode 100644 index 0000000000..66bcb9fbba --- /dev/null +++ b/txscript/data/taproot-ref/e62e88a5e5a9d90dbb6072f7ccea09b105b0f310 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e638e75f42344b0c3f6564246955fb5d040cf293 b/txscript/data/taproot-ref/e638e75f42344b0c3f6564246955fb5d040cf293 new file mode 100644 index 0000000000..ea92f61c14 --- /dev/null +++ b/txscript/data/taproot-ref/e638e75f42344b0c3f6564246955fb5d040cf293 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e649d79b9010e5f76ed8c6e317e55e0e91802bac b/txscript/data/taproot-ref/e649d79b9010e5f76ed8c6e317e55e0e91802bac new file mode 100644 index 0000000000..4fad8780ed --- /dev/null +++ b/txscript/data/taproot-ref/e649d79b9010e5f76ed8c6e317e55e0e91802bac @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e660a993ca6c73039fade4ba3407920ada89923e b/txscript/data/taproot-ref/e660a993ca6c73039fade4ba3407920ada89923e new file mode 100644 index 0000000000..34a4eb1dfd --- /dev/null +++ b/txscript/data/taproot-ref/e660a993ca6c73039fade4ba3407920ada89923e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e66bd9898efc98f464bdb5ece0b4f62d602dc737 b/txscript/data/taproot-ref/e66bd9898efc98f464bdb5ece0b4f62d602dc737 new file mode 100644 index 0000000000..333c18cd63 --- /dev/null +++ b/txscript/data/taproot-ref/e66bd9898efc98f464bdb5ece0b4f62d602dc737 @@ -0,0 +1 @@ +{"tx": "10ea334502bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8b00000000fb9e01a48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41402000000a58a699c023885b700000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487eb020000", "prevouts": ["761e7c000000000017a914124ce61ffefcd78a2e382c17cb257bb0bdd741e387", "7e153d000000000017a914b202aa31930f9cb7b85a632f41f1539f30714abf87"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "225d202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "witness": ["f21859a748d58a120b039827bc9f62d58b657c5eba5d59c9910395a6444373d32e691c8d6c874e8a48c7c3accb5eb868c1dcb19634bd3bb0153d21d09d4693e1"]}}, diff --git a/txscript/data/taproot-ref/e677ad001a80f4218fcb1f38a8705f1d1caeb999 b/txscript/data/taproot-ref/e677ad001a80f4218fcb1f38a8705f1d1caeb999 new file mode 100644 index 0000000000..f868238522 --- /dev/null +++ b/txscript/data/taproot-ref/e677ad001a80f4218fcb1f38a8705f1d1caeb999 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e68c741fb9f3bd4beb774a6295165f0719b15942 b/txscript/data/taproot-ref/e68c741fb9f3bd4beb774a6295165f0719b15942 new file mode 100644 index 0000000000..e39ac27422 --- /dev/null +++ b/txscript/data/taproot-ref/e68c741fb9f3bd4beb774a6295165f0719b15942 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e69ec7f55ad3c08cfcb37946cda5c9e8bd2f23d4 b/txscript/data/taproot-ref/e69ec7f55ad3c08cfcb37946cda5c9e8bd2f23d4 new file mode 100644 index 0000000000..5edf2583a1 --- /dev/null +++ b/txscript/data/taproot-ref/e69ec7f55ad3c08cfcb37946cda5c9e8bd2f23d4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e69f704fabb54c278ef86ba0a840cc8b462fd273 b/txscript/data/taproot-ref/e69f704fabb54c278ef86ba0a840cc8b462fd273 new file mode 100644 index 0000000000..563d76c926 --- /dev/null +++ b/txscript/data/taproot-ref/e69f704fabb54c278ef86ba0a840cc8b462fd273 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e6a0539a6bf9730e9f7197aac29cee83936137c2 b/txscript/data/taproot-ref/e6a0539a6bf9730e9f7197aac29cee83936137c2 new file mode 100644 index 0000000000..76a87f023a --- /dev/null +++ b/txscript/data/taproot-ref/e6a0539a6bf9730e9f7197aac29cee83936137c2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e6beac0076a3f98639e16833588cb1f7c3630b56 b/txscript/data/taproot-ref/e6beac0076a3f98639e16833588cb1f7c3630b56 new file mode 100644 index 0000000000..4e3e25e593 --- /dev/null +++ b/txscript/data/taproot-ref/e6beac0076a3f98639e16833588cb1f7c3630b56 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e6c4139fc79b0036b50c35d40646356790b47698 b/txscript/data/taproot-ref/e6c4139fc79b0036b50c35d40646356790b47698 new file mode 100644 index 0000000000..41c15f0f22 --- /dev/null +++ b/txscript/data/taproot-ref/e6c4139fc79b0036b50c35d40646356790b47698 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e6d6a1ae86f60f1e63f309397a0008e6d4943d50 b/txscript/data/taproot-ref/e6d6a1ae86f60f1e63f309397a0008e6d4943d50 new file mode 100644 index 0000000000..d1e7b42215 --- /dev/null +++ b/txscript/data/taproot-ref/e6d6a1ae86f60f1e63f309397a0008e6d4943d50 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e6f3612a73d29882780cefe3d036f68100cf0c7b b/txscript/data/taproot-ref/e6f3612a73d29882780cefe3d036f68100cf0c7b new file mode 100644 index 0000000000..9eb06cd818 --- /dev/null +++ b/txscript/data/taproot-ref/e6f3612a73d29882780cefe3d036f68100cf0c7b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e721205c821d1cfd009e603052b5cee6c677c52a b/txscript/data/taproot-ref/e721205c821d1cfd009e603052b5cee6c677c52a new file mode 100644 index 0000000000..7077166792 --- /dev/null +++ b/txscript/data/taproot-ref/e721205c821d1cfd009e603052b5cee6c677c52a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e72d5da834d577e08d8919888da3491b1cfc2395 b/txscript/data/taproot-ref/e72d5da834d577e08d8919888da3491b1cfc2395 new file mode 100644 index 0000000000..ffdf00058d --- /dev/null +++ b/txscript/data/taproot-ref/e72d5da834d577e08d8919888da3491b1cfc2395 @@ -0,0 +1 @@ +{"tx": "020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270dd00000000e98bdfcfbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8a010000001e3b31c4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf10000000006ffb29ef043b09130100000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acd0000000", "prevouts": ["f1ac0e000000000017a914ff6a0b1cf86e786bc6de2387f1927f71fd08cd0c87", "cda7830000000000225120f855ac1dd07b462ddddee29099c3eda9b5eca4e8470208f3b94e6aab9d37482c", "20568200000000002251208acf7a61bb45458dd86d3c9f45a9fce258820fbbf84c7164c88d41367f6e76b9"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "165d142540f27e90740933c99d4f17ab2dfc6c82951cfb", "witness": ["1d11ff9e6594593cbb3db3d706e5329836b53d7b1047452a5869d53e1e3c549c28e59d7a782b615eb017decb90ffe64a5567a5514f624bc899c426cfa3c229c3"]}}, diff --git a/txscript/data/taproot-ref/e73715f248773b481cfeb2552aceaf18e4b03797 b/txscript/data/taproot-ref/e73715f248773b481cfeb2552aceaf18e4b03797 new file mode 100644 index 0000000000..613544fc23 --- /dev/null +++ b/txscript/data/taproot-ref/e73715f248773b481cfeb2552aceaf18e4b03797 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e7865be06886b6e888fd9d883d55c5faee586ef4 b/txscript/data/taproot-ref/e7865be06886b6e888fd9d883d55c5faee586ef4 new file mode 100644 index 0000000000..881d0394e6 --- /dev/null +++ b/txscript/data/taproot-ref/e7865be06886b6e888fd9d883d55c5faee586ef4 @@ -0,0 +1 @@ +{"tx": "0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1901000000f2b706a8dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb701000000d5414634042e88c0000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487c6010000", "prevouts": ["2f50740000000000225120554d9dd7197117aaa4d7426c37fed7dc5f4b29ff7dce4879497bcc4232903b0f", "994d4e000000000017a914a68ade9e67dbb5e8acf044461cfd5bd8dcf592c387"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "1652142540f27e90740933c99d4f17ab2dfc6c82951cfb", "witness": ["77f72fcb63f4b3ee909677bb7ca7023720d1d4ed165ce3976dd8898c9b2dc24d781d3439d220f0403fa0dabc6eed1007f1e2332502d61e6af736e38ef9587c08"]}}, diff --git a/txscript/data/taproot-ref/e7a375809c225d5450a212abb59a2046d1b5e007 b/txscript/data/taproot-ref/e7a375809c225d5450a212abb59a2046d1b5e007 new file mode 100644 index 0000000000..901ae0b293 --- /dev/null +++ b/txscript/data/taproot-ref/e7a375809c225d5450a212abb59a2046d1b5e007 @@ -0,0 +1 @@ +{"tx": "0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfeb0100000087f4e5fe8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41101000000bf8e4fc9046e05b1000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47878e020000", "prevouts": ["9ae07700000000002251208ba879939f2c6ad8b8ece6e7af2596449dcd53da6e9921656ed46c920282904d", "0c683b000000000021581f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["8429a4229b24b38dc77d9f95f72ca2d0ed52126309f69eefee92d5f8f8a8a1b7a6f8cc54c9b2918e742352ad35d793ef376e6c30766c9de854f951d1cd88406e"]}}, diff --git a/txscript/data/taproot-ref/e7c4905ac16a9774e7e810abf68b112d641b2d9e b/txscript/data/taproot-ref/e7c4905ac16a9774e7e810abf68b112d641b2d9e new file mode 100644 index 0000000000..7824d04dc1 --- /dev/null +++ b/txscript/data/taproot-ref/e7c4905ac16a9774e7e810abf68b112d641b2d9e @@ -0,0 +1 @@ +{"tx": "0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7a0000000049367eecdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb401000000a94652fe02ebd56900000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac3c355049", "prevouts": ["00244800000000002251204e4a8cfe4f68f657f81d61368182a9dc3b463ed6fb97449e34c0870f4967da87", "b705240000000000215b1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["f85913f1b9c9175497e63ff3fe4937cd61dbdc806165848d02e5a64f871aedd45b5d1212cfb7047204ada9057a4be48c2c6f5ce87a05578bda43662f72114f97", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/e7c5c79c85fb153f7749dd5dcfa97ac1401ef95c b/txscript/data/taproot-ref/e7c5c79c85fb153f7749dd5dcfa97ac1401ef95c new file mode 100644 index 0000000000..2ed71e9f24 --- /dev/null +++ b/txscript/data/taproot-ref/e7c5c79c85fb153f7749dd5dcfa97ac1401ef95c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e7ccede981bb4c65fa47e7fa310a9348a7109ba3 b/txscript/data/taproot-ref/e7ccede981bb4c65fa47e7fa310a9348a7109ba3 new file mode 100644 index 0000000000..adbe09588c --- /dev/null +++ b/txscript/data/taproot-ref/e7ccede981bb4c65fa47e7fa310a9348a7109ba3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e7d9419f6cc1411629e9a09076e350aef3f0adbb b/txscript/data/taproot-ref/e7d9419f6cc1411629e9a09076e350aef3f0adbb new file mode 100644 index 0000000000..13de4acbb6 --- /dev/null +++ b/txscript/data/taproot-ref/e7d9419f6cc1411629e9a09076e350aef3f0adbb @@ -0,0 +1 @@ +{"tx": "7d81ada40260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ab00000000a5db64b8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf970000000016aebcde0482f29200000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79663000000", "prevouts": ["bef7110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b", "bca582000000000021521f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["e852cfaa079c741f4515ed79da14c225d7b03a58e519cbec8eed2b9f348fb7af8f04275ce86156ce1f7cf928a482c97ed207ab38aea691780a93b26f97168cf0", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/e7e9f1bdab686670c7fd4b590aaad6feacbbeb73 b/txscript/data/taproot-ref/e7e9f1bdab686670c7fd4b590aaad6feacbbeb73 new file mode 100644 index 0000000000..b9135ef0d2 --- /dev/null +++ b/txscript/data/taproot-ref/e7e9f1bdab686670c7fd4b590aaad6feacbbeb73 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e7fc7fe2e56e39aff52a6c1a3f3ddb20c48651d6 b/txscript/data/taproot-ref/e7fc7fe2e56e39aff52a6c1a3f3ddb20c48651d6 new file mode 100644 index 0000000000..99c421fc10 --- /dev/null +++ b/txscript/data/taproot-ref/e7fc7fe2e56e39aff52a6c1a3f3ddb20c48651d6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e81dc94c8743dc71b11667a65c76c5ef0e8eaef8 b/txscript/data/taproot-ref/e81dc94c8743dc71b11667a65c76c5ef0e8eaef8 new file mode 100644 index 0000000000..05927b2714 --- /dev/null +++ b/txscript/data/taproot-ref/e81dc94c8743dc71b11667a65c76c5ef0e8eaef8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e81ee8a9a2165602a74cee1bdc447e2da39ab762 b/txscript/data/taproot-ref/e81ee8a9a2165602a74cee1bdc447e2da39ab762 new file mode 100644 index 0000000000..710c38e929 --- /dev/null +++ b/txscript/data/taproot-ref/e81ee8a9a2165602a74cee1bdc447e2da39ab762 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e84308cd3dc05d65738bf940c73e11c1342f53dd b/txscript/data/taproot-ref/e84308cd3dc05d65738bf940c73e11c1342f53dd new file mode 100644 index 0000000000..2ceb68782d --- /dev/null +++ b/txscript/data/taproot-ref/e84308cd3dc05d65738bf940c73e11c1342f53dd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e8597fda210c9006c4eb35f55099dd53f0804f47 b/txscript/data/taproot-ref/e8597fda210c9006c4eb35f55099dd53f0804f47 new file mode 100644 index 0000000000..6665834633 --- /dev/null +++ b/txscript/data/taproot-ref/e8597fda210c9006c4eb35f55099dd53f0804f47 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e85ebbbabefe13b277bdb7bb290e81d48aaae843 b/txscript/data/taproot-ref/e85ebbbabefe13b277bdb7bb290e81d48aaae843 new file mode 100644 index 0000000000..c852537693 --- /dev/null +++ b/txscript/data/taproot-ref/e85ebbbabefe13b277bdb7bb290e81d48aaae843 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e87e2014a5a0695a3cdffdfe859201eb8beb9fb0 b/txscript/data/taproot-ref/e87e2014a5a0695a3cdffdfe859201eb8beb9fb0 new file mode 100644 index 0000000000..ce4c118a9d --- /dev/null +++ b/txscript/data/taproot-ref/e87e2014a5a0695a3cdffdfe859201eb8beb9fb0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e8ac301abd5dee5dd4ef8cb0670844bca13f0323 b/txscript/data/taproot-ref/e8ac301abd5dee5dd4ef8cb0670844bca13f0323 new file mode 100644 index 0000000000..f7fb620ff3 --- /dev/null +++ b/txscript/data/taproot-ref/e8ac301abd5dee5dd4ef8cb0670844bca13f0323 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e8de8be751822aa2e8bcf086b89ae6ca68052255 b/txscript/data/taproot-ref/e8de8be751822aa2e8bcf086b89ae6ca68052255 new file mode 100644 index 0000000000..de9b3dd108 --- /dev/null +++ b/txscript/data/taproot-ref/e8de8be751822aa2e8bcf086b89ae6ca68052255 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e91b8692e5e50d7452d085b3580b9cdd1676e122 b/txscript/data/taproot-ref/e91b8692e5e50d7452d085b3580b9cdd1676e122 new file mode 100644 index 0000000000..687d501eca --- /dev/null +++ b/txscript/data/taproot-ref/e91b8692e5e50d7452d085b3580b9cdd1676e122 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e93758815f2e92fcae33eeb424961ee124cec2c7 b/txscript/data/taproot-ref/e93758815f2e92fcae33eeb424961ee124cec2c7 new file mode 100644 index 0000000000..d2a30b4135 --- /dev/null +++ b/txscript/data/taproot-ref/e93758815f2e92fcae33eeb424961ee124cec2c7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e9501001531cf5569b3b23daa63df0825b2e06f3 b/txscript/data/taproot-ref/e9501001531cf5569b3b23daa63df0825b2e06f3 new file mode 100644 index 0000000000..c6a3ef3c8c --- /dev/null +++ b/txscript/data/taproot-ref/e9501001531cf5569b3b23daa63df0825b2e06f3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e98353914c5de48ee650dfff9741c1285bf29368 b/txscript/data/taproot-ref/e98353914c5de48ee650dfff9741c1285bf29368 new file mode 100644 index 0000000000..266cc868cd --- /dev/null +++ b/txscript/data/taproot-ref/e98353914c5de48ee650dfff9741c1285bf29368 @@ -0,0 +1 @@ +{"tx": "010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270bf000000003562bfc98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45b000000002c898a1201ae153c00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac3607604e", "prevouts": ["fcdc1200000000002251203066114b40f5bd33eccc7991d35f41784b4d14ee4746b37c559802b9f69c1e67", "58eb3500000000001656142540f27e90740933c99d4f17ab2dfc6c82951cfb"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["1778e6788727fd076d7ad6b184d1c3b78ce26ec25463ec8a133f9d2380a680e0e6c65743b86b754004089f8e9f44fb643ea7ca18f4f397cf9a7576e515133e95", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/e9a85210b1a1018e7666d51f88430bb5d8bfdb3e b/txscript/data/taproot-ref/e9a85210b1a1018e7666d51f88430bb5d8bfdb3e new file mode 100644 index 0000000000..7be16770e5 --- /dev/null +++ b/txscript/data/taproot-ref/e9a85210b1a1018e7666d51f88430bb5d8bfdb3e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e9b76d10a6eebe9f37aaf17e3c71921c02524b86 b/txscript/data/taproot-ref/e9b76d10a6eebe9f37aaf17e3c71921c02524b86 new file mode 100644 index 0000000000..6a5ce1013b --- /dev/null +++ b/txscript/data/taproot-ref/e9b76d10a6eebe9f37aaf17e3c71921c02524b86 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e9bf6e5a4cbd00e35ecd77dc39c1f9264b9f4dc1 b/txscript/data/taproot-ref/e9bf6e5a4cbd00e35ecd77dc39c1f9264b9f4dc1 new file mode 100644 index 0000000000..bab1117b39 --- /dev/null +++ b/txscript/data/taproot-ref/e9bf6e5a4cbd00e35ecd77dc39c1f9264b9f4dc1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e9c730fdf2c5807b82dd1e4d042e404651d4c118 b/txscript/data/taproot-ref/e9c730fdf2c5807b82dd1e4d042e404651d4c118 new file mode 100644 index 0000000000..0806a17dec --- /dev/null +++ b/txscript/data/taproot-ref/e9c730fdf2c5807b82dd1e4d042e404651d4c118 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e9d4196818fdc0fa92415cb4a2aff1b96c783b8b b/txscript/data/taproot-ref/e9d4196818fdc0fa92415cb4a2aff1b96c783b8b new file mode 100644 index 0000000000..8821f8fceb --- /dev/null +++ b/txscript/data/taproot-ref/e9d4196818fdc0fa92415cb4a2aff1b96c783b8b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e9dbacbd2e05c550b025911cfa3ca5803dae805e b/txscript/data/taproot-ref/e9dbacbd2e05c550b025911cfa3ca5803dae805e new file mode 100644 index 0000000000..c3e32a1d26 --- /dev/null +++ b/txscript/data/taproot-ref/e9dbacbd2e05c550b025911cfa3ca5803dae805e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/e9ddf35ff01ae9bc71730f02a17a6079411fde98 b/txscript/data/taproot-ref/e9ddf35ff01ae9bc71730f02a17a6079411fde98 new file mode 100644 index 0000000000..ebb86432ce --- /dev/null +++ b/txscript/data/taproot-ref/e9ddf35ff01ae9bc71730f02a17a6079411fde98 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ea1fa2cb1864ebe376683d33d94b64f0f54a43dd b/txscript/data/taproot-ref/ea1fa2cb1864ebe376683d33d94b64f0f54a43dd new file mode 100644 index 0000000000..b6c8626702 --- /dev/null +++ b/txscript/data/taproot-ref/ea1fa2cb1864ebe376683d33d94b64f0f54a43dd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ea224ce2e986d690db2a198af3f98a8408cdb30e b/txscript/data/taproot-ref/ea224ce2e986d690db2a198af3f98a8408cdb30e new file mode 100644 index 0000000000..59f51b3045 --- /dev/null +++ b/txscript/data/taproot-ref/ea224ce2e986d690db2a198af3f98a8408cdb30e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ea3247c42e38f93b6d8af0e43d7f34cc4bc25070 b/txscript/data/taproot-ref/ea3247c42e38f93b6d8af0e43d7f34cc4bc25070 new file mode 100644 index 0000000000..a6ea6e57c0 --- /dev/null +++ b/txscript/data/taproot-ref/ea3247c42e38f93b6d8af0e43d7f34cc4bc25070 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ea3a67eab454450f7603fe0cd98a27c731eb5d00 b/txscript/data/taproot-ref/ea3a67eab454450f7603fe0cd98a27c731eb5d00 new file mode 100644 index 0000000000..2e3e7f5869 --- /dev/null +++ b/txscript/data/taproot-ref/ea3a67eab454450f7603fe0cd98a27c731eb5d00 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ea3f5822d3ff42dc536ca2f868583167e04fcb24 b/txscript/data/taproot-ref/ea3f5822d3ff42dc536ca2f868583167e04fcb24 new file mode 100644 index 0000000000..f0c9f6b888 --- /dev/null +++ b/txscript/data/taproot-ref/ea3f5822d3ff42dc536ca2f868583167e04fcb24 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ea9383c734b03a942fd3c33b4cd6172b0c606aeb b/txscript/data/taproot-ref/ea9383c734b03a942fd3c33b4cd6172b0c606aeb new file mode 100644 index 0000000000..199e998808 --- /dev/null +++ b/txscript/data/taproot-ref/ea9383c734b03a942fd3c33b4cd6172b0c606aeb @@ -0,0 +1 @@ +{"tx": "0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bfc000000001e5111c0bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf720000000083aefab460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270490000000053752fdd0376fea8000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914719f78084af863e000acd618ba76df979722368987cb000000", "prevouts": ["de10240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b", "8c427700000000002251200b5dd6f00fbd30bf243b0d8b333be0f43818e467cea4a7bf1010683a4a4290b8", "5ba60f000000000017a914a2a8d85df2f20a0aaff7224012fc4cee13e29cb987"], "index": 2, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "215f1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b", "witness": ["e92b57286193ec8e221ee627b752db89b05173ea63f7bcb01b59aac63359c00bb799c86be0b19a2a62d88f80e8c71158d3d6e6de1692be63f452f9e42fcc640f"]}}, diff --git a/txscript/data/taproot-ref/eaa2ec29b35602bac1202162cc43997d10f21ed3 b/txscript/data/taproot-ref/eaa2ec29b35602bac1202162cc43997d10f21ed3 new file mode 100644 index 0000000000..3ae45e31e5 --- /dev/null +++ b/txscript/data/taproot-ref/eaa2ec29b35602bac1202162cc43997d10f21ed3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/eaa7b118760debbe1d5a3d4a62d81d966ab89097 b/txscript/data/taproot-ref/eaa7b118760debbe1d5a3d4a62d81d966ab89097 new file mode 100644 index 0000000000..8d1e7c0ba4 --- /dev/null +++ b/txscript/data/taproot-ref/eaa7b118760debbe1d5a3d4a62d81d966ab89097 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/eab77792be235dec9f3313676498d907e560b5cc b/txscript/data/taproot-ref/eab77792be235dec9f3313676498d907e560b5cc new file mode 100644 index 0000000000..eadb168914 --- /dev/null +++ b/txscript/data/taproot-ref/eab77792be235dec9f3313676498d907e560b5cc @@ -0,0 +1 @@ +{"tx": "02000000031980a99ad1eac101c8fe3dd9b7c19f4e81dda5a690601a9eedc2ce713d9132e5000000000007acc88a492909e056fa5c0ef2af542be68aba07da39583e95b43e24484150891b1d532301000000001ad6d4dc1980a99ad1eac101c8fe3dd9b7c19f4e81dda5a690601a9eedc2ce713d9132e5010000000079e1bbdd02ac0b058b320000001600146d764276c66fec1127e5074db5bff3aa6c52553358020000000000001976a9147d8c30278dcbf5bd88310a3c91abbeb33651906c88acd137773e", "prevouts": ["7371c1150f000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664", "b7e4d4f711000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664", "6689717d11000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664"], "index": 2, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY", "comment": "inactive/keypath_empty", "success": {"scriptSig": "", "witness": []}}, diff --git a/txscript/data/taproot-ref/eae489d9b326b6e764166ddf53140f5ddb3b425c b/txscript/data/taproot-ref/eae489d9b326b6e764166ddf53140f5ddb3b425c new file mode 100644 index 0000000000..8e81cc7693 --- /dev/null +++ b/txscript/data/taproot-ref/eae489d9b326b6e764166ddf53140f5ddb3b425c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/eae7770e2a494f15bf0e76460740c8d2e1cbd22e b/txscript/data/taproot-ref/eae7770e2a494f15bf0e76460740c8d2e1cbd22e new file mode 100644 index 0000000000..0a8d71d1d2 --- /dev/null +++ b/txscript/data/taproot-ref/eae7770e2a494f15bf0e76460740c8d2e1cbd22e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/eaee09f4a0e178165105cf2ccf81513fc80541b9 b/txscript/data/taproot-ref/eaee09f4a0e178165105cf2ccf81513fc80541b9 new file mode 100644 index 0000000000..ea57cf382b --- /dev/null +++ b/txscript/data/taproot-ref/eaee09f4a0e178165105cf2ccf81513fc80541b9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/eaee80bfbe65037b08eeecc39e40e2b8276a958d b/txscript/data/taproot-ref/eaee80bfbe65037b08eeecc39e40e2b8276a958d new file mode 100644 index 0000000000..5283649e20 --- /dev/null +++ b/txscript/data/taproot-ref/eaee80bfbe65037b08eeecc39e40e2b8276a958d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/eb0e20fe944dc77d38b2fc2582d02c80d3d9628f b/txscript/data/taproot-ref/eb0e20fe944dc77d38b2fc2582d02c80d3d9628f new file mode 100644 index 0000000000..deee2387a1 --- /dev/null +++ b/txscript/data/taproot-ref/eb0e20fe944dc77d38b2fc2582d02c80d3d9628f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/eb372b84ca640e23188861d0efa04be45ee5f243 b/txscript/data/taproot-ref/eb372b84ca640e23188861d0efa04be45ee5f243 new file mode 100644 index 0000000000..8603e79b81 --- /dev/null +++ b/txscript/data/taproot-ref/eb372b84ca640e23188861d0efa04be45ee5f243 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/eba9b48ee4b2ed1d213ff803ba46409241800f53 b/txscript/data/taproot-ref/eba9b48ee4b2ed1d213ff803ba46409241800f53 new file mode 100644 index 0000000000..06331a9d2d --- /dev/null +++ b/txscript/data/taproot-ref/eba9b48ee4b2ed1d213ff803ba46409241800f53 @@ -0,0 +1 @@ +{"tx": "02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4de0000000065ee38b08bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42b01000000779fbafc031c5471000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914719f78084af863e000acd618ba76df979722368987fc040000", "prevouts": ["a15c3f000000000017a9144582b7676ffb8c3a2735b8e71e172a272e3e33c087", "af4434000000000017a91405311b2c9f444185bafbe03a9610c5d95324a8c587"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "215a1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b", "witness": ["008cca768bb80d31843d8ca0979e53192231a3c965cd8573f4fb822896e85d7ad2957dca3b910c03486750e7923d63faaff2223f617f604bcef4d53f1f51186d"]}}, diff --git a/txscript/data/taproot-ref/ebaab3cbf799854c56be5ea1c8570b79e12530d3 b/txscript/data/taproot-ref/ebaab3cbf799854c56be5ea1c8570b79e12530d3 new file mode 100644 index 0000000000..8151a63e87 --- /dev/null +++ b/txscript/data/taproot-ref/ebaab3cbf799854c56be5ea1c8570b79e12530d3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ec0558d3bd9826dcf5a547231702b26bb029d5b3 b/txscript/data/taproot-ref/ec0558d3bd9826dcf5a547231702b26bb029d5b3 new file mode 100644 index 0000000000..dbf2582eb7 --- /dev/null +++ b/txscript/data/taproot-ref/ec0558d3bd9826dcf5a547231702b26bb029d5b3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ec11e48dae90b65ac226a309a6ab974cfc87474a b/txscript/data/taproot-ref/ec11e48dae90b65ac226a309a6ab974cfc87474a new file mode 100644 index 0000000000..b47341871c --- /dev/null +++ b/txscript/data/taproot-ref/ec11e48dae90b65ac226a309a6ab974cfc87474a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ec236a1ba693a15d7cd145cb072b03a9edafd25d b/txscript/data/taproot-ref/ec236a1ba693a15d7cd145cb072b03a9edafd25d new file mode 100644 index 0000000000..4f5726ff72 --- /dev/null +++ b/txscript/data/taproot-ref/ec236a1ba693a15d7cd145cb072b03a9edafd25d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ec2d9171350303a508d3a35306e1da95e2d45a8c b/txscript/data/taproot-ref/ec2d9171350303a508d3a35306e1da95e2d45a8c new file mode 100644 index 0000000000..2141241fbb --- /dev/null +++ b/txscript/data/taproot-ref/ec2d9171350303a508d3a35306e1da95e2d45a8c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ec3dc1b7325240192c1e37e75c29831fa68e98d4 b/txscript/data/taproot-ref/ec3dc1b7325240192c1e37e75c29831fa68e98d4 new file mode 100644 index 0000000000..e09a66e44d --- /dev/null +++ b/txscript/data/taproot-ref/ec3dc1b7325240192c1e37e75c29831fa68e98d4 @@ -0,0 +1 @@ +{"tx": "020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270350000000098af0dd360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701f00000000ce699485013f66180000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e77b030000", "prevouts": ["54ae1000000000002251202361d91ff13391fd25020ba7e60c60643b5255f5adbfbdf7f0353592847fec4a", "fe110f00000000002253202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["ec706e6205a2d2f4858924a5688a6a1063f32ceab6133572aaa27d1da6be3d420df0d865f9aabc3f9efa2ca71feaf638b96c1c3a5c2e66d4474fbfe5471820d4", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/ec4c99541792d43b2c11d31a995e9d4e6494735e b/txscript/data/taproot-ref/ec4c99541792d43b2c11d31a995e9d4e6494735e new file mode 100644 index 0000000000..da5e5c3c27 --- /dev/null +++ b/txscript/data/taproot-ref/ec4c99541792d43b2c11d31a995e9d4e6494735e @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/ec5f10d715ff4121c9af8001b65d91bde62f884b b/txscript/data/taproot-ref/ec5f10d715ff4121c9af8001b65d91bde62f884b new file mode 100644 index 0000000000..347634aee7 --- /dev/null +++ b/txscript/data/taproot-ref/ec5f10d715ff4121c9af8001b65d91bde62f884b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ec7ac5952f631f170c9cf5ab7afb10a2800e3be7 b/txscript/data/taproot-ref/ec7ac5952f631f170c9cf5ab7afb10a2800e3be7 new file mode 100644 index 0000000000..d52e402cad --- /dev/null +++ b/txscript/data/taproot-ref/ec7ac5952f631f170c9cf5ab7afb10a2800e3be7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ecc052cec3d69b0b941945fcfee7fcca160fee0f b/txscript/data/taproot-ref/ecc052cec3d69b0b941945fcfee7fcca160fee0f new file mode 100644 index 0000000000..c56090d149 --- /dev/null +++ b/txscript/data/taproot-ref/ecc052cec3d69b0b941945fcfee7fcca160fee0f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ed414b2d37754fddb26883baa6399318c130524f b/txscript/data/taproot-ref/ed414b2d37754fddb26883baa6399318c130524f new file mode 100644 index 0000000000..d34b2630f4 --- /dev/null +++ b/txscript/data/taproot-ref/ed414b2d37754fddb26883baa6399318c130524f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ed5648d424b5a21a684d02bc55bdcfab06ec276e b/txscript/data/taproot-ref/ed5648d424b5a21a684d02bc55bdcfab06ec276e new file mode 100644 index 0000000000..26154edec6 --- /dev/null +++ b/txscript/data/taproot-ref/ed5648d424b5a21a684d02bc55bdcfab06ec276e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/edb0a385324372442f7d831b7fa747c2a2ba5d40 b/txscript/data/taproot-ref/edb0a385324372442f7d831b7fa747c2a2ba5d40 new file mode 100644 index 0000000000..1364ef5f22 --- /dev/null +++ b/txscript/data/taproot-ref/edb0a385324372442f7d831b7fa747c2a2ba5d40 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ede245d24c4ccbe651f556667d1de8b18984e6bf b/txscript/data/taproot-ref/ede245d24c4ccbe651f556667d1de8b18984e6bf new file mode 100644 index 0000000000..86aad37fa3 --- /dev/null +++ b/txscript/data/taproot-ref/ede245d24c4ccbe651f556667d1de8b18984e6bf @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/edf48d71ea536f47f2ebae0ef4c1a54805cfd2bf b/txscript/data/taproot-ref/edf48d71ea536f47f2ebae0ef4c1a54805cfd2bf new file mode 100644 index 0000000000..20f839dfe7 --- /dev/null +++ b/txscript/data/taproot-ref/edf48d71ea536f47f2ebae0ef4c1a54805cfd2bf @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ee216fd86ba1f2f2eecc6892dba069f1fa7e2566 b/txscript/data/taproot-ref/ee216fd86ba1f2f2eecc6892dba069f1fa7e2566 new file mode 100644 index 0000000000..c92bd64675 --- /dev/null +++ b/txscript/data/taproot-ref/ee216fd86ba1f2f2eecc6892dba069f1fa7e2566 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ee227dd2c697b5ad500c732edea24bd9f2ec08a7 b/txscript/data/taproot-ref/ee227dd2c697b5ad500c732edea24bd9f2ec08a7 new file mode 100644 index 0000000000..f0478cfb27 --- /dev/null +++ b/txscript/data/taproot-ref/ee227dd2c697b5ad500c732edea24bd9f2ec08a7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ee39d37f93b56b4c318cb83ca60e411ee5c1abbb b/txscript/data/taproot-ref/ee39d37f93b56b4c318cb83ca60e411ee5c1abbb new file mode 100644 index 0000000000..f2240b1bdd --- /dev/null +++ b/txscript/data/taproot-ref/ee39d37f93b56b4c318cb83ca60e411ee5c1abbb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ee4391649d8b6cf1ed2a18eef419b54a19d2f481 b/txscript/data/taproot-ref/ee4391649d8b6cf1ed2a18eef419b54a19d2f481 new file mode 100644 index 0000000000..f9f283c7ac --- /dev/null +++ b/txscript/data/taproot-ref/ee4391649d8b6cf1ed2a18eef419b54a19d2f481 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ee4b75d279f94af5208664797cc453ca45044806 b/txscript/data/taproot-ref/ee4b75d279f94af5208664797cc453ca45044806 new file mode 100644 index 0000000000..87e4b22329 --- /dev/null +++ b/txscript/data/taproot-ref/ee4b75d279f94af5208664797cc453ca45044806 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ee537050d4b74465e99c77d79aec50879344edb4 b/txscript/data/taproot-ref/ee537050d4b74465e99c77d79aec50879344edb4 new file mode 100644 index 0000000000..f6c1b0bd5f --- /dev/null +++ b/txscript/data/taproot-ref/ee537050d4b74465e99c77d79aec50879344edb4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ee666d81fc0411dbdbf38406d49ba05685bee495 b/txscript/data/taproot-ref/ee666d81fc0411dbdbf38406d49ba05685bee495 new file mode 100644 index 0000000000..060c1c790d --- /dev/null +++ b/txscript/data/taproot-ref/ee666d81fc0411dbdbf38406d49ba05685bee495 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ee92d4d96303e7296f561d5b3efe262b3993bc85 b/txscript/data/taproot-ref/ee92d4d96303e7296f561d5b3efe262b3993bc85 new file mode 100644 index 0000000000..17a6d1d9b4 --- /dev/null +++ b/txscript/data/taproot-ref/ee92d4d96303e7296f561d5b3efe262b3993bc85 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/eeb6e1a4eebe04ce7814c38efaf8b5b7e910296f b/txscript/data/taproot-ref/eeb6e1a4eebe04ce7814c38efaf8b5b7e910296f new file mode 100644 index 0000000000..dd86ad10f0 --- /dev/null +++ b/txscript/data/taproot-ref/eeb6e1a4eebe04ce7814c38efaf8b5b7e910296f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/eef8d1a1e8c3a9566015b3ae089052a50d3c3ddb b/txscript/data/taproot-ref/eef8d1a1e8c3a9566015b3ae089052a50d3c3ddb new file mode 100644 index 0000000000..67f7d6ba42 --- /dev/null +++ b/txscript/data/taproot-ref/eef8d1a1e8c3a9566015b3ae089052a50d3c3ddb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ef1b9627be8307d947f73d84910a2d343187898a b/txscript/data/taproot-ref/ef1b9627be8307d947f73d84910a2d343187898a new file mode 100644 index 0000000000..43d34542c5 --- /dev/null +++ b/txscript/data/taproot-ref/ef1b9627be8307d947f73d84910a2d343187898a @@ -0,0 +1 @@ +{"tx": "0100000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc20100000010e708c30198f04c00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac7b000000", "prevouts": ["ea217f000000000017a91437a5c76a04bb604ad99785877003310ab74c7e2b87"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "165c142540f27e90740933c99d4f17ab2dfc6c82951cfb", "witness": ["32b47c5333ab0bdb401ef0771e332fae7cbe19fb0f1fd61b1ee0ba8d9e764104377679372d1753ab1662eeed7e7162abbe9daee6672e3f3b4096e69f23a3cb7a"]}}, diff --git a/txscript/data/taproot-ref/ef34d2a06ed043b1d7aa5c55d07e649a98e022d0 b/txscript/data/taproot-ref/ef34d2a06ed043b1d7aa5c55d07e649a98e022d0 new file mode 100644 index 0000000000..000c89e072 --- /dev/null +++ b/txscript/data/taproot-ref/ef34d2a06ed043b1d7aa5c55d07e649a98e022d0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ef5018ccc4d868e150c22f85faea02a352f124d9 b/txscript/data/taproot-ref/ef5018ccc4d868e150c22f85faea02a352f124d9 new file mode 100644 index 0000000000..03f9d83bb8 --- /dev/null +++ b/txscript/data/taproot-ref/ef5018ccc4d868e150c22f85faea02a352f124d9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ef588660a2f4df9f52c4f476036ae92b435dd8be b/txscript/data/taproot-ref/ef588660a2f4df9f52c4f476036ae92b435dd8be new file mode 100644 index 0000000000..feec4cdf53 --- /dev/null +++ b/txscript/data/taproot-ref/ef588660a2f4df9f52c4f476036ae92b435dd8be @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ef7b84160b7025ab4d29b8bb32de27500874c4e0 b/txscript/data/taproot-ref/ef7b84160b7025ab4d29b8bb32de27500874c4e0 new file mode 100644 index 0000000000..a6a4b09bb6 --- /dev/null +++ b/txscript/data/taproot-ref/ef7b84160b7025ab4d29b8bb32de27500874c4e0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/efab9adce18cdbdd285db520ec08c755b0916a2f b/txscript/data/taproot-ref/efab9adce18cdbdd285db520ec08c755b0916a2f new file mode 100644 index 0000000000..fa65b35bf5 --- /dev/null +++ b/txscript/data/taproot-ref/efab9adce18cdbdd285db520ec08c755b0916a2f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/efb25951d890dbd071c4a3811042fdb8e0bc4326 b/txscript/data/taproot-ref/efb25951d890dbd071c4a3811042fdb8e0bc4326 new file mode 100644 index 0000000000..a7182ac811 --- /dev/null +++ b/txscript/data/taproot-ref/efb25951d890dbd071c4a3811042fdb8e0bc4326 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/efb757b9644c060f72a7441ae9f0dbb05935ddee b/txscript/data/taproot-ref/efb757b9644c060f72a7441ae9f0dbb05935ddee new file mode 100644 index 0000000000..f62431e032 --- /dev/null +++ b/txscript/data/taproot-ref/efb757b9644c060f72a7441ae9f0dbb05935ddee @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/efbdf30300adcc55d7c50d4ec76a75496d6d7b7d b/txscript/data/taproot-ref/efbdf30300adcc55d7c50d4ec76a75496d6d7b7d new file mode 100644 index 0000000000..4e5f2a44e7 --- /dev/null +++ b/txscript/data/taproot-ref/efbdf30300adcc55d7c50d4ec76a75496d6d7b7d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/efc4b323ebe3c0b9e2f2fd7168ab4437570a54e8 b/txscript/data/taproot-ref/efc4b323ebe3c0b9e2f2fd7168ab4437570a54e8 new file mode 100644 index 0000000000..f8c19f442e --- /dev/null +++ b/txscript/data/taproot-ref/efc4b323ebe3c0b9e2f2fd7168ab4437570a54e8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/efce2a5687afc47a9a7951b0d14a86559eccd8af b/txscript/data/taproot-ref/efce2a5687afc47a9a7951b0d14a86559eccd8af new file mode 100644 index 0000000000..b0dfa1ea4f --- /dev/null +++ b/txscript/data/taproot-ref/efce2a5687afc47a9a7951b0d14a86559eccd8af @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/f00c95582e31d9827eabb236ee8b4b776907a667 b/txscript/data/taproot-ref/f00c95582e31d9827eabb236ee8b4b776907a667 new file mode 100644 index 0000000000..dec034a32a --- /dev/null +++ b/txscript/data/taproot-ref/f00c95582e31d9827eabb236ee8b4b776907a667 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f015ec4058e4e7ae0d1a64823882e2e3fe9f8bbd b/txscript/data/taproot-ref/f015ec4058e4e7ae0d1a64823882e2e3fe9f8bbd new file mode 100644 index 0000000000..56d6c98dbe --- /dev/null +++ b/txscript/data/taproot-ref/f015ec4058e4e7ae0d1a64823882e2e3fe9f8bbd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f04d521c21ed8372ae0bcf98ee15b6ca83c85bc2 b/txscript/data/taproot-ref/f04d521c21ed8372ae0bcf98ee15b6ca83c85bc2 new file mode 100644 index 0000000000..bf68de8929 --- /dev/null +++ b/txscript/data/taproot-ref/f04d521c21ed8372ae0bcf98ee15b6ca83c85bc2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f052250556f0a305782ffc367c106bf8213e5199 b/txscript/data/taproot-ref/f052250556f0a305782ffc367c106bf8213e5199 new file mode 100644 index 0000000000..3880ae0b9c --- /dev/null +++ b/txscript/data/taproot-ref/f052250556f0a305782ffc367c106bf8213e5199 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f0b8804a6b3fa0ab08fb2e07758480377e212f0b b/txscript/data/taproot-ref/f0b8804a6b3fa0ab08fb2e07758480377e212f0b new file mode 100644 index 0000000000..dfd0101232 --- /dev/null +++ b/txscript/data/taproot-ref/f0b8804a6b3fa0ab08fb2e07758480377e212f0b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f0f31b265d33a5adb67af2f1fec8248f8855469e b/txscript/data/taproot-ref/f0f31b265d33a5adb67af2f1fec8248f8855469e new file mode 100644 index 0000000000..26fd0c20e3 --- /dev/null +++ b/txscript/data/taproot-ref/f0f31b265d33a5adb67af2f1fec8248f8855469e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f111543d0f442f268353dbbbf00ebe24c21f930e b/txscript/data/taproot-ref/f111543d0f442f268353dbbbf00ebe24c21f930e new file mode 100644 index 0000000000..9df0e6612c --- /dev/null +++ b/txscript/data/taproot-ref/f111543d0f442f268353dbbbf00ebe24c21f930e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f1439b2e5f242df93c3d5fd61e367f850098495b b/txscript/data/taproot-ref/f1439b2e5f242df93c3d5fd61e367f850098495b new file mode 100644 index 0000000000..4cee6ddcd2 --- /dev/null +++ b/txscript/data/taproot-ref/f1439b2e5f242df93c3d5fd61e367f850098495b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f150268fcc20d8c1e1607d773fe9c2af148e9e8e b/txscript/data/taproot-ref/f150268fcc20d8c1e1607d773fe9c2af148e9e8e new file mode 100644 index 0000000000..8717682577 --- /dev/null +++ b/txscript/data/taproot-ref/f150268fcc20d8c1e1607d773fe9c2af148e9e8e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f1728d0e4771e35b1cb1998adc82e22eb67a65c9 b/txscript/data/taproot-ref/f1728d0e4771e35b1cb1998adc82e22eb67a65c9 new file mode 100644 index 0000000000..043f2b3668 --- /dev/null +++ b/txscript/data/taproot-ref/f1728d0e4771e35b1cb1998adc82e22eb67a65c9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f172e0269b4ce4678ade6f0ac95a9448d2453792 b/txscript/data/taproot-ref/f172e0269b4ce4678ade6f0ac95a9448d2453792 new file mode 100644 index 0000000000..4523519453 --- /dev/null +++ b/txscript/data/taproot-ref/f172e0269b4ce4678ade6f0ac95a9448d2453792 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f17ba688055f4e28c6c763a1a67b55ffd27ab22b b/txscript/data/taproot-ref/f17ba688055f4e28c6c763a1a67b55ffd27ab22b new file mode 100644 index 0000000000..16b29473ab --- /dev/null +++ b/txscript/data/taproot-ref/f17ba688055f4e28c6c763a1a67b55ffd27ab22b @@ -0,0 +1 @@ +{"tx": "05439dcf03dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce400000000e23122ffbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2801000000445b0faddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5e00000000b41645be01b3ac85000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487d2010000", "prevouts": ["5f875f000000000022512081fe6bd81c93a76bc00ce825f56a69a98e925b76c72731e1070d37ac4d963490", "f27f6200000000001651142540f27e90740933c99d4f17ab2dfc6c82951cfb", "90775b000000000022512045a6403ae49be683b272d9a42ea0a940324a318f771f036a6a11d0e9905b97e4"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["6af7ee47b9fea2ed853d010eb737fc8ad260ee45bdb324eb6b890516a33267f7949a5cc4d847c4791c38caa75bc9b539b6ca6c3bc1b944a31ded162618a89211"]}}, diff --git a/txscript/data/taproot-ref/f18786606f38657d15f1d007fa2934ea6034a605 b/txscript/data/taproot-ref/f18786606f38657d15f1d007fa2934ea6034a605 new file mode 100644 index 0000000000..55fabc6f65 --- /dev/null +++ b/txscript/data/taproot-ref/f18786606f38657d15f1d007fa2934ea6034a605 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f1ab87a390b003a1f262909e41e5d3853c0dee70 b/txscript/data/taproot-ref/f1ab87a390b003a1f262909e41e5d3853c0dee70 new file mode 100644 index 0000000000..738ac0cced --- /dev/null +++ b/txscript/data/taproot-ref/f1ab87a390b003a1f262909e41e5d3853c0dee70 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f1ac308d98f3a982e3c86ebf022541b3c7a53857 b/txscript/data/taproot-ref/f1ac308d98f3a982e3c86ebf022541b3c7a53857 new file mode 100644 index 0000000000..c943b8027b --- /dev/null +++ b/txscript/data/taproot-ref/f1ac308d98f3a982e3c86ebf022541b3c7a53857 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f1b42b68e02cd3503158c2cedbad9f43b4a782fc b/txscript/data/taproot-ref/f1b42b68e02cd3503158c2cedbad9f43b4a782fc new file mode 100644 index 0000000000..275bff81ac --- /dev/null +++ b/txscript/data/taproot-ref/f1b42b68e02cd3503158c2cedbad9f43b4a782fc @@ -0,0 +1 @@ +{"tx": "edcfcdd702d9befb1e9c529d7d9073823d42f590d5d83a9ae9e8205a58b2deac400aa179de0000000000aed2b9bbd9befb1e9c529d7d9073823d42f590d5d83a9ae9e8205a58b2deac400aa179de0100000000c9ef9ecf037bb08b0f2100000017a91417076ced824a76f7f00aa0b9ce412f8713d9a8a68758020000000000001976a914798a0f34de6d8f95c4b7ca7c79a0cd208c63fb0888ac580200000000000017a9146e2b0fcc2c4086d85becf46dae6d7af8c0bb07518738d6ea54", "prevouts": ["d453c1ad13000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664", "8032cc610d000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY", "comment": "inactive/keypath_invalidsig", "success": {"scriptSig": "", "witness": ["faaf5f50af119edd122012c71f8cfae4ac508d740074eb7b756a30677ff9a98956fe107f93c3ead41c0d3254684125c1d48ec3a75f9c689a5ca6108cc2c81248"]}}, diff --git a/txscript/data/taproot-ref/f1b9e75c583d069af4d354379ec7cbf02e95c41d b/txscript/data/taproot-ref/f1b9e75c583d069af4d354379ec7cbf02e95c41d new file mode 100644 index 0000000000..ad07cd57af --- /dev/null +++ b/txscript/data/taproot-ref/f1b9e75c583d069af4d354379ec7cbf02e95c41d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f1cfa6ecbcc68ba081804e6b531a970f6cc70cee b/txscript/data/taproot-ref/f1cfa6ecbcc68ba081804e6b531a970f6cc70cee new file mode 100644 index 0000000000..10cd21d336 --- /dev/null +++ b/txscript/data/taproot-ref/f1cfa6ecbcc68ba081804e6b531a970f6cc70cee @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f1d42d84bf3c0ea75c9ac6babfdb06afac572bfa b/txscript/data/taproot-ref/f1d42d84bf3c0ea75c9ac6babfdb06afac572bfa new file mode 100644 index 0000000000..a7446f472b --- /dev/null +++ b/txscript/data/taproot-ref/f1d42d84bf3c0ea75c9ac6babfdb06afac572bfa @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f1e479e1e2ba063168c4201bc568c60b601c98f8 b/txscript/data/taproot-ref/f1e479e1e2ba063168c4201bc568c60b601c98f8 new file mode 100644 index 0000000000..ea764344ae --- /dev/null +++ b/txscript/data/taproot-ref/f1e479e1e2ba063168c4201bc568c60b601c98f8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f20f49c8c8a09c2b68a66d3640886588c1e95299 b/txscript/data/taproot-ref/f20f49c8c8a09c2b68a66d3640886588c1e95299 new file mode 100644 index 0000000000..27b5356c7e --- /dev/null +++ b/txscript/data/taproot-ref/f20f49c8c8a09c2b68a66d3640886588c1e95299 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f281cfc9b564fceae1f18905886e1a2ea6a79f8f b/txscript/data/taproot-ref/f281cfc9b564fceae1f18905886e1a2ea6a79f8f new file mode 100644 index 0000000000..b395b7873a --- /dev/null +++ b/txscript/data/taproot-ref/f281cfc9b564fceae1f18905886e1a2ea6a79f8f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f29cde4e4d18f502a83e953d7e6aafc162b49fb0 b/txscript/data/taproot-ref/f29cde4e4d18f502a83e953d7e6aafc162b49fb0 new file mode 100644 index 0000000000..26d23d88b5 --- /dev/null +++ b/txscript/data/taproot-ref/f29cde4e4d18f502a83e953d7e6aafc162b49fb0 @@ -0,0 +1 @@ +{"tx": "0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf05010000006c94ab778bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40c01000000a9aa24900176de0a000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a603010000", "prevouts": ["46617a00000000002257202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "f7ef3b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["80a38889277e6769c53ac3422cd17a5b04684959263ae1d4267f5e5d3300267c24c4f79d99ced191a71b09d34b0c3e867be45d2aac0ab8bf37496c932ecd79a6"]}}, diff --git a/txscript/data/taproot-ref/f2a7b6785e4184b100bb118d537c3e1fe7deed13 b/txscript/data/taproot-ref/f2a7b6785e4184b100bb118d537c3e1fe7deed13 new file mode 100644 index 0000000000..fe6f03e213 --- /dev/null +++ b/txscript/data/taproot-ref/f2a7b6785e4184b100bb118d537c3e1fe7deed13 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f2aed5fc63d1322cbfa59dc10fc63c5c13905bad b/txscript/data/taproot-ref/f2aed5fc63d1322cbfa59dc10fc63c5c13905bad new file mode 100644 index 0000000000..52136dc124 --- /dev/null +++ b/txscript/data/taproot-ref/f2aed5fc63d1322cbfa59dc10fc63c5c13905bad @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f2b01b12b747c63ff84c1d178f5cd881a09d61d3 b/txscript/data/taproot-ref/f2b01b12b747c63ff84c1d178f5cd881a09d61d3 new file mode 100644 index 0000000000..637d2dc654 --- /dev/null +++ b/txscript/data/taproot-ref/f2b01b12b747c63ff84c1d178f5cd881a09d61d3 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f2cf8fc04a84276827038c4814930bd1166dcb83 b/txscript/data/taproot-ref/f2cf8fc04a84276827038c4814930bd1166dcb83 new file mode 100644 index 0000000000..f0f5aeea7c --- /dev/null +++ b/txscript/data/taproot-ref/f2cf8fc04a84276827038c4814930bd1166dcb83 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f306f010650c1ce3662a988f2d5c8848a114b742 b/txscript/data/taproot-ref/f306f010650c1ce3662a988f2d5c8848a114b742 new file mode 100644 index 0000000000..4987268a83 --- /dev/null +++ b/txscript/data/taproot-ref/f306f010650c1ce3662a988f2d5c8848a114b742 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f311f3194f27d91bd26c7ac20214d331ade7f1c9 b/txscript/data/taproot-ref/f311f3194f27d91bd26c7ac20214d331ade7f1c9 new file mode 100644 index 0000000000..592bd25a8a --- /dev/null +++ b/txscript/data/taproot-ref/f311f3194f27d91bd26c7ac20214d331ade7f1c9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f32541dee791305368453ac147924b5c2d9dfff7 b/txscript/data/taproot-ref/f32541dee791305368453ac147924b5c2d9dfff7 new file mode 100644 index 0000000000..3cdd99ad4f --- /dev/null +++ b/txscript/data/taproot-ref/f32541dee791305368453ac147924b5c2d9dfff7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f34aa9739565ceed4d2a67fa8e24e1cffda032d0 b/txscript/data/taproot-ref/f34aa9739565ceed4d2a67fa8e24e1cffda032d0 new file mode 100644 index 0000000000..294085bdfc --- /dev/null +++ b/txscript/data/taproot-ref/f34aa9739565ceed4d2a67fa8e24e1cffda032d0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f36797074db1a3316cf9f79b8cedbea196a94883 b/txscript/data/taproot-ref/f36797074db1a3316cf9f79b8cedbea196a94883 new file mode 100644 index 0000000000..338d7beea2 --- /dev/null +++ b/txscript/data/taproot-ref/f36797074db1a3316cf9f79b8cedbea196a94883 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f3a1124f0e210f773fcb446a4c6325838f796dcd b/txscript/data/taproot-ref/f3a1124f0e210f773fcb446a4c6325838f796dcd new file mode 100644 index 0000000000..719c02e3d5 --- /dev/null +++ b/txscript/data/taproot-ref/f3a1124f0e210f773fcb446a4c6325838f796dcd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f3abe34a0b2b561230223ebd55fa58c1abfa4752 b/txscript/data/taproot-ref/f3abe34a0b2b561230223ebd55fa58c1abfa4752 new file mode 100644 index 0000000000..6f023a9317 --- /dev/null +++ b/txscript/data/taproot-ref/f3abe34a0b2b561230223ebd55fa58c1abfa4752 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f3aefeaaf417737c9b08ddb588ac8f34f1bfd7c0 b/txscript/data/taproot-ref/f3aefeaaf417737c9b08ddb588ac8f34f1bfd7c0 new file mode 100644 index 0000000000..3a6d6ad9e1 --- /dev/null +++ b/txscript/data/taproot-ref/f3aefeaaf417737c9b08ddb588ac8f34f1bfd7c0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f3b9a054bd33583afbecffad0407dcd117b60cb8 b/txscript/data/taproot-ref/f3b9a054bd33583afbecffad0407dcd117b60cb8 new file mode 100644 index 0000000000..ac262e9902 --- /dev/null +++ b/txscript/data/taproot-ref/f3b9a054bd33583afbecffad0407dcd117b60cb8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f3c37d9c9bc7bbacd5acc05ecfa2dd6b3e4079be b/txscript/data/taproot-ref/f3c37d9c9bc7bbacd5acc05ecfa2dd6b3e4079be new file mode 100644 index 0000000000..f9343ee852 --- /dev/null +++ b/txscript/data/taproot-ref/f3c37d9c9bc7bbacd5acc05ecfa2dd6b3e4079be @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f3dbd1cd81a692630c41a036e51a108069161d76 b/txscript/data/taproot-ref/f3dbd1cd81a692630c41a036e51a108069161d76 new file mode 100644 index 0000000000..a08729e6dd --- /dev/null +++ b/txscript/data/taproot-ref/f3dbd1cd81a692630c41a036e51a108069161d76 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f41b245dc4b63227dcd52bf8df204c69ef2c632d b/txscript/data/taproot-ref/f41b245dc4b63227dcd52bf8df204c69ef2c632d new file mode 100644 index 0000000000..39468dd425 --- /dev/null +++ b/txscript/data/taproot-ref/f41b245dc4b63227dcd52bf8df204c69ef2c632d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f43a467e1ed501e4fae97b23c7ac5f51943b4a60 b/txscript/data/taproot-ref/f43a467e1ed501e4fae97b23c7ac5f51943b4a60 new file mode 100644 index 0000000000..792e2f6e81 --- /dev/null +++ b/txscript/data/taproot-ref/f43a467e1ed501e4fae97b23c7ac5f51943b4a60 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f4466a6264c406cffaf61cd062c6954b8145b827 b/txscript/data/taproot-ref/f4466a6264c406cffaf61cd062c6954b8145b827 new file mode 100644 index 0000000000..94e0e5e587 --- /dev/null +++ b/txscript/data/taproot-ref/f4466a6264c406cffaf61cd062c6954b8145b827 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f45bfc326aa2978cf872bbd25ac92e74c51b222c b/txscript/data/taproot-ref/f45bfc326aa2978cf872bbd25ac92e74c51b222c new file mode 100644 index 0000000000..f11c43506a --- /dev/null +++ b/txscript/data/taproot-ref/f45bfc326aa2978cf872bbd25ac92e74c51b222c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f4604f24ef1262cff35502c140d3a3ab09e62650 b/txscript/data/taproot-ref/f4604f24ef1262cff35502c140d3a3ab09e62650 new file mode 100644 index 0000000000..c71ba1c69d --- /dev/null +++ b/txscript/data/taproot-ref/f4604f24ef1262cff35502c140d3a3ab09e62650 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f47e1dd86121d4d47b5e315b8bc8f941d5c890ba b/txscript/data/taproot-ref/f47e1dd86121d4d47b5e315b8bc8f941d5c890ba new file mode 100644 index 0000000000..558e534e4a --- /dev/null +++ b/txscript/data/taproot-ref/f47e1dd86121d4d47b5e315b8bc8f941d5c890ba @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f49204f8e85d64be3490b7843476939194bca10c b/txscript/data/taproot-ref/f49204f8e85d64be3490b7843476939194bca10c new file mode 100644 index 0000000000..a9dadee231 --- /dev/null +++ b/txscript/data/taproot-ref/f49204f8e85d64be3490b7843476939194bca10c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f4cc235e3a3e0f11b34f866c952d52ba470ce96c b/txscript/data/taproot-ref/f4cc235e3a3e0f11b34f866c952d52ba470ce96c new file mode 100644 index 0000000000..12fb7960c6 --- /dev/null +++ b/txscript/data/taproot-ref/f4cc235e3a3e0f11b34f866c952d52ba470ce96c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f4e60bca3a955a55d00e4186db841023ceef4e20 b/txscript/data/taproot-ref/f4e60bca3a955a55d00e4186db841023ceef4e20 new file mode 100644 index 0000000000..9c679c28c0 --- /dev/null +++ b/txscript/data/taproot-ref/f4e60bca3a955a55d00e4186db841023ceef4e20 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/f50995c18b1bea7d6e8f78c8db8139687517a781 b/txscript/data/taproot-ref/f50995c18b1bea7d6e8f78c8db8139687517a781 new file mode 100644 index 0000000000..52642e2dd4 --- /dev/null +++ b/txscript/data/taproot-ref/f50995c18b1bea7d6e8f78c8db8139687517a781 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f50bbc9cda906042a1e0c756df37b20c36a36df6 b/txscript/data/taproot-ref/f50bbc9cda906042a1e0c756df37b20c36a36df6 new file mode 100644 index 0000000000..1bb4cbf15d --- /dev/null +++ b/txscript/data/taproot-ref/f50bbc9cda906042a1e0c756df37b20c36a36df6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f54e6bed090f658f483733605be1def47c4a00f1 b/txscript/data/taproot-ref/f54e6bed090f658f483733605be1def47c4a00f1 new file mode 100644 index 0000000000..4e95b1fd84 --- /dev/null +++ b/txscript/data/taproot-ref/f54e6bed090f658f483733605be1def47c4a00f1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f5584e332423dfd006828addcbd73f040328b087 b/txscript/data/taproot-ref/f5584e332423dfd006828addcbd73f040328b087 new file mode 100644 index 0000000000..830fe3f92d --- /dev/null +++ b/txscript/data/taproot-ref/f5584e332423dfd006828addcbd73f040328b087 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f558bde45b06e08703659c22eb17a9b25f4941d1 b/txscript/data/taproot-ref/f558bde45b06e08703659c22eb17a9b25f4941d1 new file mode 100644 index 0000000000..2b000c60a0 --- /dev/null +++ b/txscript/data/taproot-ref/f558bde45b06e08703659c22eb17a9b25f4941d1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f560ba3291103bb7f5cc015586c6946d5f9e8857 b/txscript/data/taproot-ref/f560ba3291103bb7f5cc015586c6946d5f9e8857 new file mode 100644 index 0000000000..4646985b4f --- /dev/null +++ b/txscript/data/taproot-ref/f560ba3291103bb7f5cc015586c6946d5f9e8857 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f58c6d8117f18e36e7e31efdf23c18aea2a31b7c b/txscript/data/taproot-ref/f58c6d8117f18e36e7e31efdf23c18aea2a31b7c new file mode 100644 index 0000000000..558f043d90 --- /dev/null +++ b/txscript/data/taproot-ref/f58c6d8117f18e36e7e31efdf23c18aea2a31b7c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f5a0c3cda376e7bd8f7a27caa053bef8617f451b b/txscript/data/taproot-ref/f5a0c3cda376e7bd8f7a27caa053bef8617f451b new file mode 100644 index 0000000000..30502ebdfc --- /dev/null +++ b/txscript/data/taproot-ref/f5a0c3cda376e7bd8f7a27caa053bef8617f451b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f5a0cbe081c8037a7f36d438e758b6bcd92abcbc b/txscript/data/taproot-ref/f5a0cbe081c8037a7f36d438e758b6bcd92abcbc new file mode 100644 index 0000000000..fb4492a9e0 --- /dev/null +++ b/txscript/data/taproot-ref/f5a0cbe081c8037a7f36d438e758b6bcd92abcbc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f5a7ff2dc8ee9ec1ef36b73c60de71d7978d3d27 b/txscript/data/taproot-ref/f5a7ff2dc8ee9ec1ef36b73c60de71d7978d3d27 new file mode 100644 index 0000000000..480b62f930 --- /dev/null +++ b/txscript/data/taproot-ref/f5a7ff2dc8ee9ec1ef36b73c60de71d7978d3d27 @@ -0,0 +1 @@ +{"tx": "0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c900100000041cd9365dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb300000000928020b40148ac3f0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e734010000", "prevouts": ["e292480000000000225120d09696ea45889505661e270865d17ca69a086fe0d8b7bd5ea027866d2c9b9156", "0e52270000000000215f1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["75cb4bd766694d40394530cd857fe437a01fcddde654f7ed68e78fb2bb074efe7598f030701efdb0578b746a828aaff9ace293ebfd9965fdf5c286a0e8d69774", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/f5b5807a9afa7c7b8351abe9a32cdd85d696c15e b/txscript/data/taproot-ref/f5b5807a9afa7c7b8351abe9a32cdd85d696c15e new file mode 100644 index 0000000000..b57b18bc4a --- /dev/null +++ b/txscript/data/taproot-ref/f5b5807a9afa7c7b8351abe9a32cdd85d696c15e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f5bbca8f5a7339d3dab2b5f758f426cdb744dd6d b/txscript/data/taproot-ref/f5bbca8f5a7339d3dab2b5f758f426cdb744dd6d new file mode 100644 index 0000000000..fd1ee5aeee --- /dev/null +++ b/txscript/data/taproot-ref/f5bbca8f5a7339d3dab2b5f758f426cdb744dd6d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f5bcbe0530388a9d1b0ddeb9fd52bbf9553589c1 b/txscript/data/taproot-ref/f5bcbe0530388a9d1b0ddeb9fd52bbf9553589c1 new file mode 100644 index 0000000000..df0ded82ae --- /dev/null +++ b/txscript/data/taproot-ref/f5bcbe0530388a9d1b0ddeb9fd52bbf9553589c1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f5d29c01f03e55e2269af62ed6364a98353003af b/txscript/data/taproot-ref/f5d29c01f03e55e2269af62ed6364a98353003af new file mode 100644 index 0000000000..635ab931a7 --- /dev/null +++ b/txscript/data/taproot-ref/f5d29c01f03e55e2269af62ed6364a98353003af @@ -0,0 +1 @@ +{"tx": "010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705800000000d62312c4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1e01000000c89799be02be4f63000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88aca4226936", "prevouts": ["69e00e0000000000235d212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "ced55600000000001976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["733a1760be1f718a81519e8b535437be910cf1951b19f7e07a21b5c046cea637584007bc94113149d72c0e4bfc05429159f5901dbe1d33e766cfe3842df2545b"]}}, diff --git a/txscript/data/taproot-ref/f5d9f6f2aa6f7e44a24ecb63e2ccbe34ba6eecfe b/txscript/data/taproot-ref/f5d9f6f2aa6f7e44a24ecb63e2ccbe34ba6eecfe new file mode 100644 index 0000000000..5545b8df90 --- /dev/null +++ b/txscript/data/taproot-ref/f5d9f6f2aa6f7e44a24ecb63e2ccbe34ba6eecfe @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f5f01b555c46d9d86c043b50cdf0dc05ea4c3d08 b/txscript/data/taproot-ref/f5f01b555c46d9d86c043b50cdf0dc05ea4c3d08 new file mode 100644 index 0000000000..eeb213d153 --- /dev/null +++ b/txscript/data/taproot-ref/f5f01b555c46d9d86c043b50cdf0dc05ea4c3d08 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f5f4bc663f8ff671a51d503c89c7a5659c0c37ab b/txscript/data/taproot-ref/f5f4bc663f8ff671a51d503c89c7a5659c0c37ab new file mode 100644 index 0000000000..d46b85708e --- /dev/null +++ b/txscript/data/taproot-ref/f5f4bc663f8ff671a51d503c89c7a5659c0c37ab @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f614cb3aadb14fc4cea6a3fa949cf1c4a5aa490a b/txscript/data/taproot-ref/f614cb3aadb14fc4cea6a3fa949cf1c4a5aa490a new file mode 100644 index 0000000000..0fea298de8 --- /dev/null +++ b/txscript/data/taproot-ref/f614cb3aadb14fc4cea6a3fa949cf1c4a5aa490a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f62efd7cbffa78cde24f12d7daf90b120c6b3e5f b/txscript/data/taproot-ref/f62efd7cbffa78cde24f12d7daf90b120c6b3e5f new file mode 100644 index 0000000000..2914006092 --- /dev/null +++ b/txscript/data/taproot-ref/f62efd7cbffa78cde24f12d7daf90b120c6b3e5f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f6389882692a6a18e427b73ca3a0a34f645e476b b/txscript/data/taproot-ref/f6389882692a6a18e427b73ca3a0a34f645e476b new file mode 100644 index 0000000000..034af92c36 --- /dev/null +++ b/txscript/data/taproot-ref/f6389882692a6a18e427b73ca3a0a34f645e476b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f63afc3910d5b449d7d26586af8681218677fd6d b/txscript/data/taproot-ref/f63afc3910d5b449d7d26586af8681218677fd6d new file mode 100644 index 0000000000..5d5defb63a --- /dev/null +++ b/txscript/data/taproot-ref/f63afc3910d5b449d7d26586af8681218677fd6d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f64c19e45d11b07f585d65dd6f72bcd502d95a0a b/txscript/data/taproot-ref/f64c19e45d11b07f585d65dd6f72bcd502d95a0a new file mode 100644 index 0000000000..8e7b8c59b5 --- /dev/null +++ b/txscript/data/taproot-ref/f64c19e45d11b07f585d65dd6f72bcd502d95a0a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f6514adef6dcf766ba7179320ec6c88126688614 b/txscript/data/taproot-ref/f6514adef6dcf766ba7179320ec6c88126688614 new file mode 100644 index 0000000000..4275ff6985 --- /dev/null +++ b/txscript/data/taproot-ref/f6514adef6dcf766ba7179320ec6c88126688614 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f6765d4b30feb17d15d4bd81601ea5788d8d26ed b/txscript/data/taproot-ref/f6765d4b30feb17d15d4bd81601ea5788d8d26ed new file mode 100644 index 0000000000..a77a584b3e --- /dev/null +++ b/txscript/data/taproot-ref/f6765d4b30feb17d15d4bd81601ea5788d8d26ed @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f678ee4a403b466dde13be7e941db7ff7684a932 b/txscript/data/taproot-ref/f678ee4a403b466dde13be7e941db7ff7684a932 new file mode 100644 index 0000000000..cf2601d23f --- /dev/null +++ b/txscript/data/taproot-ref/f678ee4a403b466dde13be7e941db7ff7684a932 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f67b572dbad35568f4ec9ba53cafa2997991340e b/txscript/data/taproot-ref/f67b572dbad35568f4ec9ba53cafa2997991340e new file mode 100644 index 0000000000..180ebc1dcd --- /dev/null +++ b/txscript/data/taproot-ref/f67b572dbad35568f4ec9ba53cafa2997991340e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f6840c641bb58cad923fc4f9c092164413ff4ce6 b/txscript/data/taproot-ref/f6840c641bb58cad923fc4f9c092164413ff4ce6 new file mode 100644 index 0000000000..f929909a37 --- /dev/null +++ b/txscript/data/taproot-ref/f6840c641bb58cad923fc4f9c092164413ff4ce6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f6907b785c509927b03981052c87de1c9ae5f772 b/txscript/data/taproot-ref/f6907b785c509927b03981052c87de1c9ae5f772 new file mode 100644 index 0000000000..f070aa8d31 --- /dev/null +++ b/txscript/data/taproot-ref/f6907b785c509927b03981052c87de1c9ae5f772 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f69458974b285f9c2ac48a1bd10b3dff2d042a8d b/txscript/data/taproot-ref/f69458974b285f9c2ac48a1bd10b3dff2d042a8d new file mode 100644 index 0000000000..21bcead94a --- /dev/null +++ b/txscript/data/taproot-ref/f69458974b285f9c2ac48a1bd10b3dff2d042a8d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f6a06f14f3641278ceae3733db1a7eff71fb3629 b/txscript/data/taproot-ref/f6a06f14f3641278ceae3733db1a7eff71fb3629 new file mode 100644 index 0000000000..f869c57103 --- /dev/null +++ b/txscript/data/taproot-ref/f6a06f14f3641278ceae3733db1a7eff71fb3629 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f6c823a2b3203faddc06a15a61e6f0e3f3e7fe8e b/txscript/data/taproot-ref/f6c823a2b3203faddc06a15a61e6f0e3f3e7fe8e new file mode 100644 index 0000000000..1a9b5a402f --- /dev/null +++ b/txscript/data/taproot-ref/f6c823a2b3203faddc06a15a61e6f0e3f3e7fe8e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f6d3771166a0c4e00527b2be21466030fb499521 b/txscript/data/taproot-ref/f6d3771166a0c4e00527b2be21466030fb499521 new file mode 100644 index 0000000000..e2b64a5680 --- /dev/null +++ b/txscript/data/taproot-ref/f6d3771166a0c4e00527b2be21466030fb499521 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f6d618ef7f588f9fc237b18f4ad42a84337ec67e b/txscript/data/taproot-ref/f6d618ef7f588f9fc237b18f4ad42a84337ec67e new file mode 100644 index 0000000000..60da220a55 --- /dev/null +++ b/txscript/data/taproot-ref/f6d618ef7f588f9fc237b18f4ad42a84337ec67e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f6e85bce5c033f269bbb51eb480ff58e9d814ed5 b/txscript/data/taproot-ref/f6e85bce5c033f269bbb51eb480ff58e9d814ed5 new file mode 100644 index 0000000000..3144494a62 --- /dev/null +++ b/txscript/data/taproot-ref/f6e85bce5c033f269bbb51eb480ff58e9d814ed5 @@ -0,0 +1 @@ +{"tx": "0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8701000000bf8067dedff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca100000000d2a15cb9029568c300000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47876b040000", "prevouts": ["d3fe700000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b", "e24b550000000000165e142540f27e90740933c99d4f17ab2dfc6c82951cfb"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["77294239263c63cefaee8399c5c256965186c29241155919927710f05cfc7ab085a3c7586e312813f4daf6b24586e46458d0c39ec1aa96a749e9e0c8388113fc", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/f6f146c32b1b724af896fdd11df580e1dc8f0e35 b/txscript/data/taproot-ref/f6f146c32b1b724af896fdd11df580e1dc8f0e35 new file mode 100644 index 0000000000..04b0446984 --- /dev/null +++ b/txscript/data/taproot-ref/f6f146c32b1b724af896fdd11df580e1dc8f0e35 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f70b704bb277d70481b756371e4d92b9dadb2d85 b/txscript/data/taproot-ref/f70b704bb277d70481b756371e4d92b9dadb2d85 new file mode 100644 index 0000000000..79303ce56d --- /dev/null +++ b/txscript/data/taproot-ref/f70b704bb277d70481b756371e4d92b9dadb2d85 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f747e1181b2e9303715bc0aea1cfca3babf00705 b/txscript/data/taproot-ref/f747e1181b2e9303715bc0aea1cfca3babf00705 new file mode 100644 index 0000000000..60401427d4 --- /dev/null +++ b/txscript/data/taproot-ref/f747e1181b2e9303715bc0aea1cfca3babf00705 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f75c71bf10464658e79f72142b2c327cd6ca3347 b/txscript/data/taproot-ref/f75c71bf10464658e79f72142b2c327cd6ca3347 new file mode 100644 index 0000000000..0e984cb418 --- /dev/null +++ b/txscript/data/taproot-ref/f75c71bf10464658e79f72142b2c327cd6ca3347 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f77abd655150de8bda3b775fd291d5b2bf27a1e6 b/txscript/data/taproot-ref/f77abd655150de8bda3b775fd291d5b2bf27a1e6 new file mode 100644 index 0000000000..2dd5921e87 --- /dev/null +++ b/txscript/data/taproot-ref/f77abd655150de8bda3b775fd291d5b2bf27a1e6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f77e7d751660a7149e80488c8245aeb9be6eeb1d b/txscript/data/taproot-ref/f77e7d751660a7149e80488c8245aeb9be6eeb1d new file mode 100644 index 0000000000..7390d992b7 --- /dev/null +++ b/txscript/data/taproot-ref/f77e7d751660a7149e80488c8245aeb9be6eeb1d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f796e5b0c5ce67017c553a21907fd6a51a1058eb b/txscript/data/taproot-ref/f796e5b0c5ce67017c553a21907fd6a51a1058eb new file mode 100644 index 0000000000..dbf7dcc2d7 --- /dev/null +++ b/txscript/data/taproot-ref/f796e5b0c5ce67017c553a21907fd6a51a1058eb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f798f952feda25e6fc4b37a429dc368f73d0d158 b/txscript/data/taproot-ref/f798f952feda25e6fc4b37a429dc368f73d0d158 new file mode 100644 index 0000000000..ac46b54c68 --- /dev/null +++ b/txscript/data/taproot-ref/f798f952feda25e6fc4b37a429dc368f73d0d158 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f7a5375d5d273e7eda804ac9335745a3fcc568ae b/txscript/data/taproot-ref/f7a5375d5d273e7eda804ac9335745a3fcc568ae new file mode 100644 index 0000000000..9ee16812c4 --- /dev/null +++ b/txscript/data/taproot-ref/f7a5375d5d273e7eda804ac9335745a3fcc568ae @@ -0,0 +1 @@ +{"tx": "0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5d000000006fb370c1bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa501000000e51bbcae03ddc2c000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc7ee3e34d", "prevouts": ["52205d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b", "6c5565000000000017a914ca8d66b8079fd8386ff3ae1d10b869f5605e693b87"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "1651142540f27e90740933c99d4f17ab2dfc6c82951cfb", "witness": ["0a3bb896097a419e1dd2142d15ca29cdce58ca25683519d007c0375247923e3e112da8695311c8ace1290f454cdf8fa643597d91a8702a4515891dc6f5689f73"]}}, diff --git a/txscript/data/taproot-ref/f7ab44a4e73a9b24bfff6a263c608abce5696639 b/txscript/data/taproot-ref/f7ab44a4e73a9b24bfff6a263c608abce5696639 new file mode 100644 index 0000000000..3934897e40 --- /dev/null +++ b/txscript/data/taproot-ref/f7ab44a4e73a9b24bfff6a263c608abce5696639 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f7b76430a96ffa6355eaf12167d0ef405e2669d8 b/txscript/data/taproot-ref/f7b76430a96ffa6355eaf12167d0ef405e2669d8 new file mode 100644 index 0000000000..74f7b3cfad --- /dev/null +++ b/txscript/data/taproot-ref/f7b76430a96ffa6355eaf12167d0ef405e2669d8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f7bc805d350c55cd8e24def5b79ca3b2fe88ae80 b/txscript/data/taproot-ref/f7bc805d350c55cd8e24def5b79ca3b2fe88ae80 new file mode 100644 index 0000000000..74df361e64 --- /dev/null +++ b/txscript/data/taproot-ref/f7bc805d350c55cd8e24def5b79ca3b2fe88ae80 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f7c02de0b4f89c043a3ebcb28bcb0e1396fe0e23 b/txscript/data/taproot-ref/f7c02de0b4f89c043a3ebcb28bcb0e1396fe0e23 new file mode 100644 index 0000000000..7d6d342f98 --- /dev/null +++ b/txscript/data/taproot-ref/f7c02de0b4f89c043a3ebcb28bcb0e1396fe0e23 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f7c0db2c2ed3c1e6f19acace4e10c0a99df88018 b/txscript/data/taproot-ref/f7c0db2c2ed3c1e6f19acace4e10c0a99df88018 new file mode 100644 index 0000000000..196e31a18e --- /dev/null +++ b/txscript/data/taproot-ref/f7c0db2c2ed3c1e6f19acace4e10c0a99df88018 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f7dad92963bb917f67c0a5d9a11c7a623157603e b/txscript/data/taproot-ref/f7dad92963bb917f67c0a5d9a11c7a623157603e new file mode 100644 index 0000000000..ac28b3b0c8 --- /dev/null +++ b/txscript/data/taproot-ref/f7dad92963bb917f67c0a5d9a11c7a623157603e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f7e399c76d4ec4bad55a5e054f90aaefbbefd54a b/txscript/data/taproot-ref/f7e399c76d4ec4bad55a5e054f90aaefbbefd54a new file mode 100644 index 0000000000..8fd5b2a529 --- /dev/null +++ b/txscript/data/taproot-ref/f7e399c76d4ec4bad55a5e054f90aaefbbefd54a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f7eb97d1c42b9d53be75b54f5a30490ace43fa77 b/txscript/data/taproot-ref/f7eb97d1c42b9d53be75b54f5a30490ace43fa77 new file mode 100644 index 0000000000..5f04e2e7e3 --- /dev/null +++ b/txscript/data/taproot-ref/f7eb97d1c42b9d53be75b54f5a30490ace43fa77 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f7f77a67d9bea0dcf7942ed62f29985930122ff0 b/txscript/data/taproot-ref/f7f77a67d9bea0dcf7942ed62f29985930122ff0 new file mode 100644 index 0000000000..b15dfc58a6 --- /dev/null +++ b/txscript/data/taproot-ref/f7f77a67d9bea0dcf7942ed62f29985930122ff0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f803ece8ba109526994448413d0b5389e89fec0b b/txscript/data/taproot-ref/f803ece8ba109526994448413d0b5389e89fec0b new file mode 100644 index 0000000000..408629dccd --- /dev/null +++ b/txscript/data/taproot-ref/f803ece8ba109526994448413d0b5389e89fec0b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f808813d157995b8d10c3cffd1f2616528fdad1f b/txscript/data/taproot-ref/f808813d157995b8d10c3cffd1f2616528fdad1f new file mode 100644 index 0000000000..a5f3ecd08e --- /dev/null +++ b/txscript/data/taproot-ref/f808813d157995b8d10c3cffd1f2616528fdad1f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f8136e4e492396052082b2d3eb7f45ce735b580e b/txscript/data/taproot-ref/f8136e4e492396052082b2d3eb7f45ce735b580e new file mode 100644 index 0000000000..0a2673ecc7 --- /dev/null +++ b/txscript/data/taproot-ref/f8136e4e492396052082b2d3eb7f45ce735b580e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f82150120ceb9a7b6d24c8144a2fc40fca6c7ded b/txscript/data/taproot-ref/f82150120ceb9a7b6d24c8144a2fc40fca6c7ded new file mode 100644 index 0000000000..614dae6e6b --- /dev/null +++ b/txscript/data/taproot-ref/f82150120ceb9a7b6d24c8144a2fc40fca6c7ded @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f846835025106a0f7d7d18630b87f4321e626835 b/txscript/data/taproot-ref/f846835025106a0f7d7d18630b87f4321e626835 new file mode 100644 index 0000000000..57d4ed38b6 --- /dev/null +++ b/txscript/data/taproot-ref/f846835025106a0f7d7d18630b87f4321e626835 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f84d4edb22fee2109b5e00fd5ac471e49c15e25c b/txscript/data/taproot-ref/f84d4edb22fee2109b5e00fd5ac471e49c15e25c new file mode 100644 index 0000000000..35d78b1d25 --- /dev/null +++ b/txscript/data/taproot-ref/f84d4edb22fee2109b5e00fd5ac471e49c15e25c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f86da2aa3ec8718d5308b84e38864225dfeb6819 b/txscript/data/taproot-ref/f86da2aa3ec8718d5308b84e38864225dfeb6819 new file mode 100644 index 0000000000..cf33c37b57 --- /dev/null +++ b/txscript/data/taproot-ref/f86da2aa3ec8718d5308b84e38864225dfeb6819 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f880da185f238333598d20ee2e139229db739f94 b/txscript/data/taproot-ref/f880da185f238333598d20ee2e139229db739f94 new file mode 100644 index 0000000000..09a33229d9 --- /dev/null +++ b/txscript/data/taproot-ref/f880da185f238333598d20ee2e139229db739f94 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f881895a273c1bb8b76313a9f0ff65520ad27975 b/txscript/data/taproot-ref/f881895a273c1bb8b76313a9f0ff65520ad27975 new file mode 100644 index 0000000000..62c8c83082 --- /dev/null +++ b/txscript/data/taproot-ref/f881895a273c1bb8b76313a9f0ff65520ad27975 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f8835febdb55dca918a36795f2203f4ee4a6b841 b/txscript/data/taproot-ref/f8835febdb55dca918a36795f2203f4ee4a6b841 new file mode 100644 index 0000000000..6e074162e6 --- /dev/null +++ b/txscript/data/taproot-ref/f8835febdb55dca918a36795f2203f4ee4a6b841 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f8930f55c55efa927ccec4a3a273d7af679fe190 b/txscript/data/taproot-ref/f8930f55c55efa927ccec4a3a273d7af679fe190 new file mode 100644 index 0000000000..60e7d61bcb --- /dev/null +++ b/txscript/data/taproot-ref/f8930f55c55efa927ccec4a3a273d7af679fe190 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f8d8d11d95153ea9449df09e90a108d0d46dd36a b/txscript/data/taproot-ref/f8d8d11d95153ea9449df09e90a108d0d46dd36a new file mode 100644 index 0000000000..46861277b4 --- /dev/null +++ b/txscript/data/taproot-ref/f8d8d11d95153ea9449df09e90a108d0d46dd36a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f8e2668d6408cd99bb9b4144dccc869b5b5c3995 b/txscript/data/taproot-ref/f8e2668d6408cd99bb9b4144dccc869b5b5c3995 new file mode 100644 index 0000000000..dad045acef --- /dev/null +++ b/txscript/data/taproot-ref/f8e2668d6408cd99bb9b4144dccc869b5b5c3995 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f8f8928329f1f5ae3c966fb5ec2113e076eafcfe b/txscript/data/taproot-ref/f8f8928329f1f5ae3c966fb5ec2113e076eafcfe new file mode 100644 index 0000000000..2c8f6705dc --- /dev/null +++ b/txscript/data/taproot-ref/f8f8928329f1f5ae3c966fb5ec2113e076eafcfe @@ -0,0 +1 @@ +{"tx": "0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c40000000009d51e232dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c42000000001c11fa30025f6fa30000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48730f47c39", "prevouts": ["9532570000000000225f202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "3d794e0000000000215a1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["549e585f569f0029b8ad233f810536bcc592cd03bafd9d4c76138b19f70f397e613e6db527ac4442db3e49e1f760d605b74d5c253e16ced5f48ac06e5c47c8bf", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/f8f9451ddef15046ebb34b8ada8344e100e77c6b b/txscript/data/taproot-ref/f8f9451ddef15046ebb34b8ada8344e100e77c6b new file mode 100644 index 0000000000..6fd3b3bc2a --- /dev/null +++ b/txscript/data/taproot-ref/f8f9451ddef15046ebb34b8ada8344e100e77c6b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f90c809fa2d5593e55f0033ebff4eb6de3bf7a4d b/txscript/data/taproot-ref/f90c809fa2d5593e55f0033ebff4eb6de3bf7a4d new file mode 100644 index 0000000000..d78c060a17 --- /dev/null +++ b/txscript/data/taproot-ref/f90c809fa2d5593e55f0033ebff4eb6de3bf7a4d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f92ae6d39d23d890f0a4bbb1700628cf97bfd5a6 b/txscript/data/taproot-ref/f92ae6d39d23d890f0a4bbb1700628cf97bfd5a6 new file mode 100644 index 0000000000..d4549d2afb --- /dev/null +++ b/txscript/data/taproot-ref/f92ae6d39d23d890f0a4bbb1700628cf97bfd5a6 @@ -0,0 +1 @@ +{"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": []}}, diff --git a/txscript/data/taproot-ref/f92ff19d417dd30243bf0048d8947d33b4bf7064 b/txscript/data/taproot-ref/f92ff19d417dd30243bf0048d8947d33b4bf7064 new file mode 100644 index 0000000000..d2730958cb --- /dev/null +++ b/txscript/data/taproot-ref/f92ff19d417dd30243bf0048d8947d33b4bf7064 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f950057a3fe68206273e224b1a0c92d75bf4cffd b/txscript/data/taproot-ref/f950057a3fe68206273e224b1a0c92d75bf4cffd new file mode 100644 index 0000000000..512fd0b641 --- /dev/null +++ b/txscript/data/taproot-ref/f950057a3fe68206273e224b1a0c92d75bf4cffd @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f9527f53e0c01295c939d322769c4900690eac47 b/txscript/data/taproot-ref/f9527f53e0c01295c939d322769c4900690eac47 new file mode 100644 index 0000000000..72516836a7 --- /dev/null +++ b/txscript/data/taproot-ref/f9527f53e0c01295c939d322769c4900690eac47 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f953c76798af4534303b789774638f6750bf064f b/txscript/data/taproot-ref/f953c76798af4534303b789774638f6750bf064f new file mode 100644 index 0000000000..42d597929a --- /dev/null +++ b/txscript/data/taproot-ref/f953c76798af4534303b789774638f6750bf064f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f95a0a2fc49acea853b2fa634e154189153c8e19 b/txscript/data/taproot-ref/f95a0a2fc49acea853b2fa634e154189153c8e19 new file mode 100644 index 0000000000..18f7314d75 --- /dev/null +++ b/txscript/data/taproot-ref/f95a0a2fc49acea853b2fa634e154189153c8e19 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f9ae968bede9072e9913f275110691863b21d704 b/txscript/data/taproot-ref/f9ae968bede9072e9913f275110691863b21d704 new file mode 100644 index 0000000000..7b834042be --- /dev/null +++ b/txscript/data/taproot-ref/f9ae968bede9072e9913f275110691863b21d704 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f9e9604adf8a8fa70a8a2d8699243ba825c4c268 b/txscript/data/taproot-ref/f9e9604adf8a8fa70a8a2d8699243ba825c4c268 new file mode 100644 index 0000000000..fe93f045a7 --- /dev/null +++ b/txscript/data/taproot-ref/f9e9604adf8a8fa70a8a2d8699243ba825c4c268 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f9f75f9ba55d66c16536a85bc2406112ffaef2ff b/txscript/data/taproot-ref/f9f75f9ba55d66c16536a85bc2406112ffaef2ff new file mode 100644 index 0000000000..3575abcf1f --- /dev/null +++ b/txscript/data/taproot-ref/f9f75f9ba55d66c16536a85bc2406112ffaef2ff @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f9fc9e2a4f2af623fc883937402f30bb39d7194c b/txscript/data/taproot-ref/f9fc9e2a4f2af623fc883937402f30bb39d7194c new file mode 100644 index 0000000000..9b941588da --- /dev/null +++ b/txscript/data/taproot-ref/f9fc9e2a4f2af623fc883937402f30bb39d7194c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/f9fe421cb9a3952dc45c8d26a7ddd2f53b952533 b/txscript/data/taproot-ref/f9fe421cb9a3952dc45c8d26a7ddd2f53b952533 new file mode 100644 index 0000000000..1d40e6290d --- /dev/null +++ b/txscript/data/taproot-ref/f9fe421cb9a3952dc45c8d26a7ddd2f53b952533 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fa167d1943fe2df543ef85cf25a11984cbd5a5a2 b/txscript/data/taproot-ref/fa167d1943fe2df543ef85cf25a11984cbd5a5a2 new file mode 100644 index 0000000000..1fd0a50f6d --- /dev/null +++ b/txscript/data/taproot-ref/fa167d1943fe2df543ef85cf25a11984cbd5a5a2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fa18264203439b69d71bc0bf47eb42c09a0276b5 b/txscript/data/taproot-ref/fa18264203439b69d71bc0bf47eb42c09a0276b5 new file mode 100644 index 0000000000..427feaf7b6 --- /dev/null +++ b/txscript/data/taproot-ref/fa18264203439b69d71bc0bf47eb42c09a0276b5 @@ -0,0 +1 @@ +{"tx": "02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4be000000007e34d8a360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704c000000009d55639704a6b64b000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6f14dd35d", "prevouts": ["34853e00000000002359212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900", "86520f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b"], "index": 0, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/scriptpath", "success": {"scriptSig": "", "witness": ["7e6d39cf53a6e18ed0d941a7377d313afcdb97dda6f3349e2246f7b995ddb3951d82f4e74bc0ac5e599dbe27a1645d2d26358c876b70e9cd431e6e277197cbdf", "207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac", "c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa"]}}, diff --git a/txscript/data/taproot-ref/fa2f957cce50a9e152ca7a429346901042de9fc5 b/txscript/data/taproot-ref/fa2f957cce50a9e152ca7a429346901042de9fc5 new file mode 100644 index 0000000000..5e282bf339 --- /dev/null +++ b/txscript/data/taproot-ref/fa2f957cce50a9e152ca7a429346901042de9fc5 @@ -0,0 +1 @@ +{"tx": "b8a0e6aa02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7401000000992304cfdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b58010000007f10f6d10409577100000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7abce484b", "prevouts": ["81ea510000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b", "74d5210000000000215b1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "", "witness": ["badc8b1e93286f5cf5bb033f2b9660d704d1f7e6d4208b141e049bd781d7a0c41e1dda72e7ea98c1acc7d2125d2ec1142afbff8f8bd1473a60d6114908dcce48"]}}, diff --git a/txscript/data/taproot-ref/fa49e364b5b789a639515d469e423d52b4437393 b/txscript/data/taproot-ref/fa49e364b5b789a639515d469e423d52b4437393 new file mode 100644 index 0000000000..ad242e1c7a --- /dev/null +++ b/txscript/data/taproot-ref/fa49e364b5b789a639515d469e423d52b4437393 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fa4c5cdf26645ea0534a498e6eed0980cfb7a7c8 b/txscript/data/taproot-ref/fa4c5cdf26645ea0534a498e6eed0980cfb7a7c8 new file mode 100644 index 0000000000..eee2a929a6 --- /dev/null +++ b/txscript/data/taproot-ref/fa4c5cdf26645ea0534a498e6eed0980cfb7a7c8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fa597ee663f096b76cd93b293bc4d7f7aaefc262 b/txscript/data/taproot-ref/fa597ee663f096b76cd93b293bc4d7f7aaefc262 new file mode 100644 index 0000000000..58ea1bdc51 --- /dev/null +++ b/txscript/data/taproot-ref/fa597ee663f096b76cd93b293bc4d7f7aaefc262 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fa5f468e5077c7552905d4b235d938ba656a8956 b/txscript/data/taproot-ref/fa5f468e5077c7552905d4b235d938ba656a8956 new file mode 100644 index 0000000000..c386df7ddc --- /dev/null +++ b/txscript/data/taproot-ref/fa5f468e5077c7552905d4b235d938ba656a8956 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fa6ab5df5a5d808c4d736244d69510fa6e17f904 b/txscript/data/taproot-ref/fa6ab5df5a5d808c4d736244d69510fa6e17f904 new file mode 100644 index 0000000000..6c515f88f7 --- /dev/null +++ b/txscript/data/taproot-ref/fa6ab5df5a5d808c4d736244d69510fa6e17f904 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fa7d0a81564418a5df2eae24548c51be6486a4aa b/txscript/data/taproot-ref/fa7d0a81564418a5df2eae24548c51be6486a4aa new file mode 100644 index 0000000000..9d0c25808c --- /dev/null +++ b/txscript/data/taproot-ref/fa7d0a81564418a5df2eae24548c51be6486a4aa @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fa862d772ea0c551e8a2b2e955c3a314343a9249 b/txscript/data/taproot-ref/fa862d772ea0c551e8a2b2e955c3a314343a9249 new file mode 100644 index 0000000000..27c7d5967f --- /dev/null +++ b/txscript/data/taproot-ref/fa862d772ea0c551e8a2b2e955c3a314343a9249 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fa8814b8ee8c8c0b59933c5df3e62bc70882f43c b/txscript/data/taproot-ref/fa8814b8ee8c8c0b59933c5df3e62bc70882f43c new file mode 100644 index 0000000000..38935df6da --- /dev/null +++ b/txscript/data/taproot-ref/fa8814b8ee8c8c0b59933c5df3e62bc70882f43c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fa90b9f27b4ef61835f27c23a72f15ab0bc2f8d4 b/txscript/data/taproot-ref/fa90b9f27b4ef61835f27c23a72f15ab0bc2f8d4 new file mode 100644 index 0000000000..fb525716e6 --- /dev/null +++ b/txscript/data/taproot-ref/fa90b9f27b4ef61835f27c23a72f15ab0bc2f8d4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fab23300d1e8e0ac77217a22517738b6de5afead b/txscript/data/taproot-ref/fab23300d1e8e0ac77217a22517738b6de5afead new file mode 100644 index 0000000000..5a5e7484ba --- /dev/null +++ b/txscript/data/taproot-ref/fab23300d1e8e0ac77217a22517738b6de5afead @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fac25d9ab05e1c85b45aa41798674daebf462237 b/txscript/data/taproot-ref/fac25d9ab05e1c85b45aa41798674daebf462237 new file mode 100644 index 0000000000..2547e36dd6 --- /dev/null +++ b/txscript/data/taproot-ref/fac25d9ab05e1c85b45aa41798674daebf462237 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fad3ceab7d42e3ad2e07e8e88420e42ecf4dd0b8 b/txscript/data/taproot-ref/fad3ceab7d42e3ad2e07e8e88420e42ecf4dd0b8 new file mode 100644 index 0000000000..aa8ee08c51 --- /dev/null +++ b/txscript/data/taproot-ref/fad3ceab7d42e3ad2e07e8e88420e42ecf4dd0b8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fae57409d88f4b4a8521c3bbd0560991c2a8986b b/txscript/data/taproot-ref/fae57409d88f4b4a8521c3bbd0560991c2a8986b new file mode 100644 index 0000000000..ccde46a8f7 --- /dev/null +++ b/txscript/data/taproot-ref/fae57409d88f4b4a8521c3bbd0560991c2a8986b @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fb0c60f40b98f2127746a9a359165bc8d41dcb8c b/txscript/data/taproot-ref/fb0c60f40b98f2127746a9a359165bc8d41dcb8c new file mode 100644 index 0000000000..6b1e736834 --- /dev/null +++ b/txscript/data/taproot-ref/fb0c60f40b98f2127746a9a359165bc8d41dcb8c @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fb18611c9ee4a416896469762bdeb28572310087 b/txscript/data/taproot-ref/fb18611c9ee4a416896469762bdeb28572310087 new file mode 100644 index 0000000000..305f81baa0 --- /dev/null +++ b/txscript/data/taproot-ref/fb18611c9ee4a416896469762bdeb28572310087 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fb193ee81245f14d9b19cacbf56cbcb01dec02be b/txscript/data/taproot-ref/fb193ee81245f14d9b19cacbf56cbcb01dec02be new file mode 100644 index 0000000000..7c47457789 --- /dev/null +++ b/txscript/data/taproot-ref/fb193ee81245f14d9b19cacbf56cbcb01dec02be @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fb3a40b01dd182dc32fd94d86be6aeec9cfda7dc b/txscript/data/taproot-ref/fb3a40b01dd182dc32fd94d86be6aeec9cfda7dc new file mode 100644 index 0000000000..b43f08c3d8 --- /dev/null +++ b/txscript/data/taproot-ref/fb3a40b01dd182dc32fd94d86be6aeec9cfda7dc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fb3feed4650211ed4fd84c29e022288219979e4a b/txscript/data/taproot-ref/fb3feed4650211ed4fd84c29e022288219979e4a new file mode 100644 index 0000000000..c6808f089b --- /dev/null +++ b/txscript/data/taproot-ref/fb3feed4650211ed4fd84c29e022288219979e4a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fb47b82833fbb82a6a9844bcfa75012bfc49c9cf b/txscript/data/taproot-ref/fb47b82833fbb82a6a9844bcfa75012bfc49c9cf new file mode 100644 index 0000000000..5b49a991e0 --- /dev/null +++ b/txscript/data/taproot-ref/fb47b82833fbb82a6a9844bcfa75012bfc49c9cf @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fb56305966435f548db004e141dd614dcb71150d b/txscript/data/taproot-ref/fb56305966435f548db004e141dd614dcb71150d new file mode 100644 index 0000000000..8deaff9e2c --- /dev/null +++ b/txscript/data/taproot-ref/fb56305966435f548db004e141dd614dcb71150d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fb6bbbb8192f592ebde7d1bb37924cade63c96c8 b/txscript/data/taproot-ref/fb6bbbb8192f592ebde7d1bb37924cade63c96c8 new file mode 100644 index 0000000000..f0299de841 --- /dev/null +++ b/txscript/data/taproot-ref/fb6bbbb8192f592ebde7d1bb37924cade63c96c8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fb803c7f3034af611f6dd19c6cd55245f319dd86 b/txscript/data/taproot-ref/fb803c7f3034af611f6dd19c6cd55245f319dd86 new file mode 100644 index 0000000000..1847bc9e28 --- /dev/null +++ b/txscript/data/taproot-ref/fb803c7f3034af611f6dd19c6cd55245f319dd86 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fb84f0eaf5bbab71df0de66b8e502f2e52604fac b/txscript/data/taproot-ref/fb84f0eaf5bbab71df0de66b8e502f2e52604fac new file mode 100644 index 0000000000..a1209a3d0f --- /dev/null +++ b/txscript/data/taproot-ref/fb84f0eaf5bbab71df0de66b8e502f2e52604fac @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fb964d7fe5e195fa98766d8c4058c8258646e95a b/txscript/data/taproot-ref/fb964d7fe5e195fa98766d8c4058c8258646e95a new file mode 100644 index 0000000000..d9dce65251 --- /dev/null +++ b/txscript/data/taproot-ref/fb964d7fe5e195fa98766d8c4058c8258646e95a @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fb9e6ec52fad74ca4a775818f110ba219adaadbb b/txscript/data/taproot-ref/fb9e6ec52fad74ca4a775818f110ba219adaadbb new file mode 100644 index 0000000000..bbb615ad7b --- /dev/null +++ b/txscript/data/taproot-ref/fb9e6ec52fad74ca4a775818f110ba219adaadbb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fba8bb171f6333a2f8f8099ed7061ca7507012bc b/txscript/data/taproot-ref/fba8bb171f6333a2f8f8099ed7061ca7507012bc new file mode 100644 index 0000000000..cf9eaa108a --- /dev/null +++ b/txscript/data/taproot-ref/fba8bb171f6333a2f8f8099ed7061ca7507012bc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fbae541afc8fd2842b660a15ba61db2dbd26dca5 b/txscript/data/taproot-ref/fbae541afc8fd2842b660a15ba61db2dbd26dca5 new file mode 100644 index 0000000000..69f10786a3 --- /dev/null +++ b/txscript/data/taproot-ref/fbae541afc8fd2842b660a15ba61db2dbd26dca5 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fbd1df6484bc96485135c2b29c3b125355c62848 b/txscript/data/taproot-ref/fbd1df6484bc96485135c2b29c3b125355c62848 new file mode 100644 index 0000000000..c6f45a1130 --- /dev/null +++ b/txscript/data/taproot-ref/fbd1df6484bc96485135c2b29c3b125355c62848 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fbeb89304a55a7ab8a338b807ad02b8dd2ab9c28 b/txscript/data/taproot-ref/fbeb89304a55a7ab8a338b807ad02b8dd2ab9c28 new file mode 100644 index 0000000000..83f0a9803a --- /dev/null +++ b/txscript/data/taproot-ref/fbeb89304a55a7ab8a338b807ad02b8dd2ab9c28 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fc1908d2145aa6f1cf830f6aeb9bf24470454805 b/txscript/data/taproot-ref/fc1908d2145aa6f1cf830f6aeb9bf24470454805 new file mode 100644 index 0000000000..8e47ef4975 --- /dev/null +++ b/txscript/data/taproot-ref/fc1908d2145aa6f1cf830f6aeb9bf24470454805 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fc6ad6441d0d3ba1260efa94e68b4af0576bf63f b/txscript/data/taproot-ref/fc6ad6441d0d3ba1260efa94e68b4af0576bf63f new file mode 100644 index 0000000000..ba293501f5 --- /dev/null +++ b/txscript/data/taproot-ref/fc6ad6441d0d3ba1260efa94e68b4af0576bf63f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fc6e7fbd1048ad4d4f9eadb18d79a7ddaddee244 b/txscript/data/taproot-ref/fc6e7fbd1048ad4d4f9eadb18d79a7ddaddee244 new file mode 100644 index 0000000000..d2222415cd --- /dev/null +++ b/txscript/data/taproot-ref/fc6e7fbd1048ad4d4f9eadb18d79a7ddaddee244 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fc72b1ff88ff0bb9a8e7a27d860b1e727bc825b0 b/txscript/data/taproot-ref/fc72b1ff88ff0bb9a8e7a27d860b1e727bc825b0 new file mode 100644 index 0000000000..9239401d5b --- /dev/null +++ b/txscript/data/taproot-ref/fc72b1ff88ff0bb9a8e7a27d860b1e727bc825b0 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fc833899bb452572fe6f3e84efd6737cca4eb786 b/txscript/data/taproot-ref/fc833899bb452572fe6f3e84efd6737cca4eb786 new file mode 100644 index 0000000000..be3abe6fd3 --- /dev/null +++ b/txscript/data/taproot-ref/fc833899bb452572fe6f3e84efd6737cca4eb786 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fc9c2ac36745e20f981008bf5f85f146b9c9dbb1 b/txscript/data/taproot-ref/fc9c2ac36745e20f981008bf5f85f146b9c9dbb1 new file mode 100644 index 0000000000..76b23bca87 --- /dev/null +++ b/txscript/data/taproot-ref/fc9c2ac36745e20f981008bf5f85f146b9c9dbb1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fcc3f72c08a026d3c0f4cc50227793a26fc3efeb b/txscript/data/taproot-ref/fcc3f72c08a026d3c0f4cc50227793a26fc3efeb new file mode 100644 index 0000000000..84d87d5d4a --- /dev/null +++ b/txscript/data/taproot-ref/fcc3f72c08a026d3c0f4cc50227793a26fc3efeb @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fcd03d953e3452f116e4035d2029de953e62334d b/txscript/data/taproot-ref/fcd03d953e3452f116e4035d2029de953e62334d new file mode 100644 index 0000000000..429aee637d --- /dev/null +++ b/txscript/data/taproot-ref/fcd03d953e3452f116e4035d2029de953e62334d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fcd91aa7ad2c0011f8f2516f5687f9e91aa76b71 b/txscript/data/taproot-ref/fcd91aa7ad2c0011f8f2516f5687f9e91aa76b71 new file mode 100644 index 0000000000..81241ed856 --- /dev/null +++ b/txscript/data/taproot-ref/fcd91aa7ad2c0011f8f2516f5687f9e91aa76b71 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fcda2ec36cb7652d368098a0c2ac64665164601f b/txscript/data/taproot-ref/fcda2ec36cb7652d368098a0c2ac64665164601f new file mode 100644 index 0000000000..df8b0f4333 --- /dev/null +++ b/txscript/data/taproot-ref/fcda2ec36cb7652d368098a0c2ac64665164601f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fd03276208dbd6219a958f47d888d22fa303e89e b/txscript/data/taproot-ref/fd03276208dbd6219a958f47d888d22fa303e89e new file mode 100644 index 0000000000..6e7dc0fd0d --- /dev/null +++ b/txscript/data/taproot-ref/fd03276208dbd6219a958f47d888d22fa303e89e @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fd14286e8c496b3f62dea79de42d57a7b02b22fc b/txscript/data/taproot-ref/fd14286e8c496b3f62dea79de42d57a7b02b22fc new file mode 100644 index 0000000000..827d558b99 --- /dev/null +++ b/txscript/data/taproot-ref/fd14286e8c496b3f62dea79de42d57a7b02b22fc @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fd1a057fd69f2113eeeafc133d9d51c7cded9125 b/txscript/data/taproot-ref/fd1a057fd69f2113eeeafc133d9d51c7cded9125 new file mode 100644 index 0000000000..53b3298c25 --- /dev/null +++ b/txscript/data/taproot-ref/fd1a057fd69f2113eeeafc133d9d51c7cded9125 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fd1c6cdb67bcc23e0920c0b2724591695d7e88b1 b/txscript/data/taproot-ref/fd1c6cdb67bcc23e0920c0b2724591695d7e88b1 new file mode 100644 index 0000000000..5e9f806f35 --- /dev/null +++ b/txscript/data/taproot-ref/fd1c6cdb67bcc23e0920c0b2724591695d7e88b1 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fd1d4fb758440d51c0db63f8a401ad4f7dd1ba6d b/txscript/data/taproot-ref/fd1d4fb758440d51c0db63f8a401ad4f7dd1ba6d new file mode 100644 index 0000000000..81db8a6cbf --- /dev/null +++ b/txscript/data/taproot-ref/fd1d4fb758440d51c0db63f8a401ad4f7dd1ba6d @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fd1f6bb68c1a0317e7fb3e9c65ce2b765717f38f b/txscript/data/taproot-ref/fd1f6bb68c1a0317e7fb3e9c65ce2b765717f38f new file mode 100644 index 0000000000..b18f31334e --- /dev/null +++ b/txscript/data/taproot-ref/fd1f6bb68c1a0317e7fb3e9c65ce2b765717f38f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fd275d920066468018b3ec78708e01bbf4634f89 b/txscript/data/taproot-ref/fd275d920066468018b3ec78708e01bbf4634f89 new file mode 100644 index 0000000000..40dc82ceb7 --- /dev/null +++ b/txscript/data/taproot-ref/fd275d920066468018b3ec78708e01bbf4634f89 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fd30d1fabe3c70d63ebf6eb08fcc889f2062dd96 b/txscript/data/taproot-ref/fd30d1fabe3c70d63ebf6eb08fcc889f2062dd96 new file mode 100644 index 0000000000..f80858e599 --- /dev/null +++ b/txscript/data/taproot-ref/fd30d1fabe3c70d63ebf6eb08fcc889f2062dd96 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fd4b486776c7fc4e964a57db37f46b6fb893446f b/txscript/data/taproot-ref/fd4b486776c7fc4e964a57db37f46b6fb893446f new file mode 100644 index 0000000000..06d8951a60 --- /dev/null +++ b/txscript/data/taproot-ref/fd4b486776c7fc4e964a57db37f46b6fb893446f @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fde4e348195fef4158d57bce09b8132261e53404 b/txscript/data/taproot-ref/fde4e348195fef4158d57bce09b8132261e53404 new file mode 100644 index 0000000000..1b29467033 --- /dev/null +++ b/txscript/data/taproot-ref/fde4e348195fef4158d57bce09b8132261e53404 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fe3a254545ba65877f7f12c1957e6983a9540725 b/txscript/data/taproot-ref/fe3a254545ba65877f7f12c1957e6983a9540725 new file mode 100644 index 0000000000..b0c2e7bb13 --- /dev/null +++ b/txscript/data/taproot-ref/fe3a254545ba65877f7f12c1957e6983a9540725 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fe4991f96a4078203ed82f3dc9d57b0f5c8d7c31 b/txscript/data/taproot-ref/fe4991f96a4078203ed82f3dc9d57b0f5c8d7c31 new file mode 100644 index 0000000000..e8b68fd18c --- /dev/null +++ b/txscript/data/taproot-ref/fe4991f96a4078203ed82f3dc9d57b0f5c8d7c31 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fe5a94896e814e80a5d4f0d17825ea303d136807 b/txscript/data/taproot-ref/fe5a94896e814e80a5d4f0d17825ea303d136807 new file mode 100644 index 0000000000..b4abf12d3b --- /dev/null +++ b/txscript/data/taproot-ref/fe5a94896e814e80a5d4f0d17825ea303d136807 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fe754dfb4207b538736ac33f4d6d3a8b39ed7eb8 b/txscript/data/taproot-ref/fe754dfb4207b538736ac33f4d6d3a8b39ed7eb8 new file mode 100644 index 0000000000..a4296b9918 --- /dev/null +++ b/txscript/data/taproot-ref/fe754dfb4207b538736ac33f4d6d3a8b39ed7eb8 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fe8a403b551fce23551c1a364c5d7a9bdf4082b4 b/txscript/data/taproot-ref/fe8a403b551fce23551c1a364c5d7a9bdf4082b4 new file mode 100644 index 0000000000..15810fd4e3 --- /dev/null +++ b/txscript/data/taproot-ref/fe8a403b551fce23551c1a364c5d7a9bdf4082b4 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fead4cb9efe769ed34fc79a6f7f7c301fa44b950 b/txscript/data/taproot-ref/fead4cb9efe769ed34fc79a6f7f7c301fa44b950 new file mode 100644 index 0000000000..225043a2df --- /dev/null +++ b/txscript/data/taproot-ref/fead4cb9efe769ed34fc79a6f7f7c301fa44b950 @@ -0,0 +1 @@ +{"tx": "0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8801000000c8c8d8b88bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ad010000004c9346de03c1f76000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc731010000", "prevouts": ["4b5d270000000000225120795828cbdd13db8bfd99175dd96610ae8d272a9240d5c9e537830514248aeee7", "c51a3c000000000017a9146f2d26adc5ad58653becfc45ce03a0b1167b1b7e87"], "index": 1, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "applic/keypath", "success": {"scriptSig": "225f202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89", "witness": ["73d8d5d8ed532f0f53c3e0f5a4fd64ce0dd9b9af52c8ee51179644ed0386a7e56acd541b49bef09466b789571a82c78c95f3dd46bd51b44f513d4a8f7cf182af"]}}, diff --git a/txscript/data/taproot-ref/fec0428a7d5b4dd2f894abbef22a4fd55b125e79 b/txscript/data/taproot-ref/fec0428a7d5b4dd2f894abbef22a4fd55b125e79 new file mode 100644 index 0000000000..85f4a0eff4 --- /dev/null +++ b/txscript/data/taproot-ref/fec0428a7d5b4dd2f894abbef22a4fd55b125e79 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/fed7b4e8b0ffa8ba7ee920409e365993f8f23423 b/txscript/data/taproot-ref/fed7b4e8b0ffa8ba7ee920409e365993f8f23423 new file mode 100644 index 0000000000..d64ac2a65a --- /dev/null +++ b/txscript/data/taproot-ref/fed7b4e8b0ffa8ba7ee920409e365993f8f23423 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ff02cab52406b52d736534063539b815a83e9ec9 b/txscript/data/taproot-ref/ff02cab52406b52d736534063539b815a83e9ec9 new file mode 100644 index 0000000000..5980156986 --- /dev/null +++ b/txscript/data/taproot-ref/ff02cab52406b52d736534063539b815a83e9ec9 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ff0c9a3fa047cac34488cf6902e39ceb0b31a1f2 b/txscript/data/taproot-ref/ff0c9a3fa047cac34488cf6902e39ceb0b31a1f2 new file mode 100644 index 0000000000..69baf697e1 --- /dev/null +++ b/txscript/data/taproot-ref/ff0c9a3fa047cac34488cf6902e39ceb0b31a1f2 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ff0ecc250f060fadb2dfbc788f027f6c46ef6c40 b/txscript/data/taproot-ref/ff0ecc250f060fadb2dfbc788f027f6c46ef6c40 new file mode 100644 index 0000000000..ae2c711bd8 --- /dev/null +++ b/txscript/data/taproot-ref/ff0ecc250f060fadb2dfbc788f027f6c46ef6c40 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ff269c4192d92ee1330ca6cb368ffaf3dec65d44 b/txscript/data/taproot-ref/ff269c4192d92ee1330ca6cb368ffaf3dec65d44 new file mode 100644 index 0000000000..6caa2b6eec --- /dev/null +++ b/txscript/data/taproot-ref/ff269c4192d92ee1330ca6cb368ffaf3dec65d44 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ffba9a51f35e6cfeb9726e3eb3551989a55a2ab6 b/txscript/data/taproot-ref/ffba9a51f35e6cfeb9726e3eb3551989a55a2ab6 new file mode 100644 index 0000000000..5f15505f4e --- /dev/null +++ b/txscript/data/taproot-ref/ffba9a51f35e6cfeb9726e3eb3551989a55a2ab6 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ffbfc4371313a95615a944ca1fb473bf2569d7aa b/txscript/data/taproot-ref/ffbfc4371313a95615a944ca1fb473bf2569d7aa new file mode 100644 index 0000000000..0524a69dc8 --- /dev/null +++ b/txscript/data/taproot-ref/ffbfc4371313a95615a944ca1fb473bf2569d7aa @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/taproot-ref/ffc6076c34629ad5d440389f97bac8efcd2db5b7 b/txscript/data/taproot-ref/ffc6076c34629ad5d440389f97bac8efcd2db5b7 new file mode 100644 index 0000000000..b5542e27ce --- /dev/null +++ b/txscript/data/taproot-ref/ffc6076c34629ad5d440389f97bac8efcd2db5b7 @@ -0,0 +1 @@ +{"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"]}}, diff --git a/txscript/data/tx_invalid.json b/txscript/data/tx_invalid.json index db465109aa..9985014e9f 100644 --- a/txscript/data/tx_invalid.json +++ b/txscript/data/tx_invalid.json @@ -199,7 +199,7 @@ [[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4259839 CHECKSEQUENCEVERIFY 1"]], "020000000100010000000000000000000000000000000000000000000000000000000000000000000000feff40000100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"], -["By-time locks, with argument just beyond txin.nSequence (but within numerical boundries)"], +["By-time locks, with argument just beyond txin.nSequence (but within numerical boundaries)"], [[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4194305 CHECKSEQUENCEVERIFY 1"]], "020000000100010000000000000000000000000000000000000000000000000000000000000000000000000040000100000000000000000000000000", "P2SH,CHECKSEQUENCEVERIFY"], [[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4259839 CHECKSEQUENCEVERIFY 1"]], @@ -333,6 +333,32 @@ ["BIP143: wrong sighash (with FindAndDelete) = 17c50ec2181ecdfdc85ca081174b248199ba81fff730794d4f69b8ec031f2dce"], [[["9628667ad48219a169b41b020800162287d2c0f713c04157e95c484a8dcb7592", 7500, "0x00 0x20 0x9b66c15b4e0b4eb49fa877982cafded24859fe5b0e2dbfbe4f0df1de7743fd52", 200000]], "010000000001019275cb8d4a485ce95741c013f7c0d28722160008021bb469a11982d47a6628964c1d000000ffffffff0101000000000000000007004830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c03959601010221023cb6055f4b57a1580c5a753e19610cafaedf7e0ff377731c77837fd666eae1712102c1b1db303ac232ffa8e5e7cc2cf5f96c6e40d3e6914061204c0541cb2043a0969552af4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c039596017500000000", "P2SH,WITNESS"], +[[["bc7fd132fcf817918334822ee6d9bd95c889099c96e07ca2c1eb2cc70db63224", 0, "CODESEPARATOR 0x21 0x038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041 CHECKSIG"]], +"01000000012432b60dc72cebc1a27ce0969c0989c895bdd9e62e8234839117f8fc32d17fbc000000004a493046022100a576b52051962c25e642c0fd3d77ee6c92487048e5d90818bcf5b51abaccd7900221008204f8fb121be4ec3b24483b1f92d89b1b0548513a134e345c5442e86e8617a501ffffffff010000000000000000016a00000000", "P2SH,CONST_SCRIPTCODE"], +[[["83e194f90b6ef21fa2e3a365b63794fb5daa844bdc9b25de30899fcfe7b01047", 0, "CODESEPARATOR CODESEPARATOR 0x21 0x038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041 CHECKSIG"]], +"01000000014710b0e7cf9f8930de259bdc4b84aa5dfb9437b665a3e3a21ff26e0bf994e183000000004a493046022100a166121a61b4eeb19d8f922b978ff6ab58ead8a5a5552bf9be73dc9c156873ea02210092ad9bc43ee647da4f6652c320800debcf08ec20a094a0aaf085f63ecb37a17201ffffffff010000000000000000016a00000000", "P2SH,CONST_SCRIPTCODE"], +[[["326882a7f22b5191f1a0cc9962ca4b878cd969cf3b3a70887aece4d801a0ba5e", 0, "0x21 0x038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041 CODESEPARATOR CHECKSIG"]], +"01000000015ebaa001d8e4ec7a88703a3bcf69d98c874bca6299cca0f191512bf2a7826832000000004948304502203bf754d1c6732fbf87c5dcd81258aefd30f2060d7bd8ac4a5696f7927091dad1022100f5bcb726c4cf5ed0ed34cc13dadeedf628ae1045b7cb34421bc60b89f4cecae701ffffffff010000000000000000016a00000000", "P2SH,CONST_SCRIPTCODE"], +[[["a955032f4d6b0c9bfe8cad8f00a8933790b9c1dc28c82e0f48e75b35da0e4944", 0, "0x21 0x038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041 CHECKSIGVERIFY CODESEPARATOR 0x21 0x038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041 CHECKSIGVERIFY CODESEPARATOR 1"]], +"010000000144490eda355be7480f2ec828dcc1b9903793a8008fad8cfe9b0c6b4d2f0355a900000000924830450221009c0a27f886a1d8cb87f6f595fbc3163d28f7a81ec3c4b252ee7f3ac77fd13ffa02203caa8dfa09713c8c4d7ef575c75ed97812072405d932bd11e6a1593a98b679370148304502201e3861ef39a526406bad1e20ecad06be7375ad40ddb582c9be42d26c3a0d7b240221009d0a3985e96522e59635d19cc4448547477396ce0ef17a58e7d74c3ef464292301ffffffff010000000000000000016a00000000", "P2SH,CONST_SCRIPTCODE"], +[[["a955032f4d6b0c9bfe8cad8f00a8933790b9c1dc28c82e0f48e75b35da0e4944", 0, "IF CODESEPARATOR ENDIF 0x21 0x0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71 CHECKSIGVERIFY CODESEPARATOR 1"]], +"010000000144490eda355be7480f2ec828dcc1b9903793a8008fad8cfe9b0c6b4d2f0355a9000000004a48304502207a6974a77c591fa13dff60cabbb85a0de9e025c09c65a4b2285e47ce8e22f761022100f0efaac9ff8ac36b10721e0aae1fb975c90500b50c56e8a0cc52b0403f0425dd0100ffffffff010000000000000000016a00000000", "P2SH,CONST_SCRIPTCODE"], +[[["a955032f4d6b0c9bfe8cad8f00a8933790b9c1dc28c82e0f48e75b35da0e4944", 0, "IF CODESEPARATOR ENDIF 0x21 0x0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71 CHECKSIGVERIFY CODESEPARATOR 1"]], +"010000000144490eda355be7480f2ec828dcc1b9903793a8008fad8cfe9b0c6b4d2f0355a9000000004a483045022100fa4a74ba9fd59c59f46c3960cf90cbe0d2b743c471d24a3d5d6db6002af5eebb02204d70ec490fd0f7055a7c45f86514336e3a7f03503dacecabb247fc23f15c83510151ffffffff010000000000000000016a00000000", "P2SH,CONST_SCRIPTCODE"], +[[["ccf7f4053a02e653c36ac75c891b7496d0dc5ce5214f6c913d9cf8f1329ebee0", 0, "DUP HASH160 0x14 0xee5a6aa40facefb2655ac23c0c28c57c65c41f9b EQUALVERIFY CHECKSIG"]], +"0100000001e0be9e32f1f89c3d916c4f21e55cdcd096741b895cc76ac353e6023a05f4f7cc00000000d86149304602210086e5f736a2c3622ebb62bd9d93d8e5d76508b98be922b97160edc3dcca6d8c47022100b23c312ac232a4473f19d2aeb95ab7bdf2b65518911a0d72d50e38b5dd31dc820121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ac4730440220508fa761865c8abd81244a168392876ee1d94e8ed83897066b5e2df2400dad24022043f5ee7538e87e9c6aef7ef55133d3e51da7cc522830a9c4d736977a76ef755c0121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ffffffff010000000000000000016a00000000", "P2SH,CONST_SCRIPTCODE"], +[[["10c9f0effe83e97f80f067de2b11c6a00c3088a4bce42c5ae761519af9306f3c", 1, "DUP HASH160 0x14 0xee5a6aa40facefb2655ac23c0c28c57c65c41f9b EQUALVERIFY CHECKSIG"]], +"01000000013c6f30f99a5161e75a2ce4bca488300ca0c6112bde67f0807fe983feeff0c91001000000e608646561646265656675ab61493046022100ce18d384221a731c993939015e3d1bcebafb16e8c0b5b5d14097ec8177ae6f28022100bcab227af90bab33c3fe0a9abfee03ba976ee25dc6ce542526e9b2e56e14b7f10121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ac493046022100c3b93edcc0fd6250eb32f2dd8a0bba1754b0f6c3be8ed4100ed582f3db73eba2022100bf75b5bd2eff4d6bf2bda2e34a40fcc07d4aa3cf862ceaa77b47b81eff829f9a01ab21038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ffffffff010000000000000000016a00000000", "P2SH,CONST_SCRIPTCODE"], +[[["6056ebd549003b10cbbd915cea0d82209fe40b8617104be917a26fa92cbe3d6f", 0, "DUP HASH160 0x14 0xee5a6aa40facefb2655ac23c0c28c57c65c41f9b EQUALVERIFY CHECKSIG"]], +"01000000016f3dbe2ca96fa217e94b1017860be49f20820dea5c91bdcb103b0049d5eb566000000000fd1d0147304402203989ac8f9ad36b5d0919d97fa0a7f70c5272abee3b14477dc646288a8b976df5022027d19da84a066af9053ad3d1d7459d171b7e3a80bc6c4ef7a330677a6be548140147304402203989ac8f9ad36b5d0919d97fa0a7f70c5272abee3b14477dc646288a8b976df5022027d19da84a066af9053ad3d1d7459d171b7e3a80bc6c4ef7a330677a6be548140121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ac47304402203757e937ba807e4a5da8534c17f9d121176056406a6465054bdd260457515c1a02200f02eccf1bec0f3a0d65df37889143c2e88ab7acec61a7b6f5aa264139141a2b0121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ffffffff010000000000000000016a00000000", "P2SH,CONST_SCRIPTCODE"], +[[["5a6b0021a6042a686b6b94abc36b387bef9109847774e8b1e51eb8cc55c53921", 1, "DUP HASH160 0x14 0xee5a6aa40facefb2655ac23c0c28c57c65c41f9b EQUALVERIFY CHECKSIG"]], +"01000000012139c555ccb81ee5b1e87477840991ef7b386bc3ab946b6b682a04a621006b5a01000000fdb40148304502201723e692e5f409a7151db386291b63524c5eb2030df652b1f53022fd8207349f022100b90d9bbf2f3366ce176e5e780a00433da67d9e5c79312c6388312a296a5800390148304502201723e692e5f409a7151db386291b63524c5eb2030df652b1f53022fd8207349f022100b90d9bbf2f3366ce176e5e780a00433da67d9e5c79312c6388312a296a5800390121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f2204148304502201723e692e5f409a7151db386291b63524c5eb2030df652b1f53022fd8207349f022100b90d9bbf2f3366ce176e5e780a00433da67d9e5c79312c6388312a296a5800390175ac4830450220646b72c35beeec51f4d5bc1cbae01863825750d7f490864af354e6ea4f625e9c022100f04b98432df3a9641719dbced53393022e7249fb59db993af1118539830aab870148304502201723e692e5f409a7151db386291b63524c5eb2030df652b1f53022fd8207349f022100b90d9bbf2f3366ce176e5e780a00433da67d9e5c79312c6388312a296a580039017521038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ffffffff010000000000000000016a00000000", "P2SH,CONST_SCRIPTCODE"], +[[["b5b598de91787439afd5938116654e0b16b7a0d0f82742ba37564219c5afcbf9", 0, "DUP HASH160 0x14 0xf6f365c40f0739b61de827a44751e5e99032ed8f EQUALVERIFY CHECKSIG"], +["ab9805c6d57d7070d9a42c5176e47bb705023e6b67249fb6760880548298e742", 0, "HASH160 0x14 0xd8dacdadb7462ae15cd906f1878706d0da8660e6 EQUAL"]], +"0100000002f9cbafc519425637ba4227f8d0a0b7160b4e65168193d5af39747891de98b5b5000000006b4830450221008dd619c563e527c47d9bd53534a770b102e40faa87f61433580e04e271ef2f960220029886434e18122b53d5decd25f1f4acb2480659fea20aabd856987ba3c3907e0121022b78b756e2258af13779c1a1f37ea6800259716ca4b7f0b87610e0bf3ab52a01ffffffff42e7988254800876b69f24676b3e0205b77be476512ca4d970707dd5c60598ab00000000fd260100483045022015bd0139bcccf990a6af6ec5c1c52ed8222e03a0d51c334df139968525d2fcd20221009f9efe325476eb64c3958e4713e9eefe49bf1d820ed58d2112721b134e2a1a53034930460221008431bdfa72bc67f9d41fe72e94c88fb8f359ffa30b33c72c121c5a877d922e1002210089ef5fc22dd8bfc6bf9ffdb01a9862d27687d424d1fefbab9e9c7176844a187a014c9052483045022015bd0139bcccf990a6af6ec5c1c52ed8222e03a0d51c334df139968525d2fcd20221009f9efe325476eb64c3958e4713e9eefe49bf1d820ed58d2112721b134e2a1a5303210378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71210378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c7153aeffffffff01a08601000000000017a914d8dacdadb7462ae15cd906f1878706d0da8660e68700000000", "P2SH,CONST_SCRIPTCODE"], +[[["ceafe58e0f6e7d67c0409fbbf673c84c166e3c5d3c24af58f7175b18df3bb3db", 0, "DUP HASH160 0x14 0xf6f365c40f0739b61de827a44751e5e99032ed8f EQUALVERIFY CHECKSIG"], +["ceafe58e0f6e7d67c0409fbbf673c84c166e3c5d3c24af58f7175b18df3bb3db", 1, "2 0x48 0x3045022015bd0139bcccf990a6af6ec5c1c52ed8222e03a0d51c334df139968525d2fcd20221009f9efe325476eb64c3958e4713e9eefe49bf1d820ed58d2112721b134e2a1a5303 0x21 0x0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71 0x21 0x0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71 3 CHECKMULTISIG"]], +"0100000002dbb33bdf185b17f758af243c5d3c6e164cc873f6bb9f40c0677d6e0f8ee5afce000000006b4830450221009627444320dc5ef8d7f68f35010b4c050a6ed0d96b67a84db99fda9c9de58b1e02203e4b4aaa019e012e65d69b487fdf8719df72f488fa91506a80c49a33929f1fd50121022b78b756e2258af13779c1a1f37ea6800259716ca4b7f0b87610e0bf3ab52a01ffffffffdbb33bdf185b17f758af243c5d3c6e164cc873f6bb9f40c0677d6e0f8ee5afce010000009300483045022015bd0139bcccf990a6af6ec5c1c52ed8222e03a0d51c334df139968525d2fcd20221009f9efe325476eb64c3958e4713e9eefe49bf1d820ed58d2112721b134e2a1a5303483045022015bd0139bcccf990a6af6ec5c1c52ed8222e03a0d51c334df139968525d2fcd20221009f9efe325476eb64c3958e4713e9eefe49bf1d820ed58d2112721b134e2a1a5303ffffffff01a0860100000000001976a9149bc0bbdd3024da4d0c38ed1aecf5c68dd1d3fa1288ac00000000", "P2SH,CONST_SCRIPTCODE"], ["Make diffs cleaner by leaving a comment here without comma at the end"] ] diff --git a/txscript/data/tx_valid.json b/txscript/data/tx_valid.json index d70fa54333..a2de155383 100644 --- a/txscript/data/tx_valid.json +++ b/txscript/data/tx_valid.json @@ -471,17 +471,17 @@ ["BIP143 example: P2WSH with OP_CODESEPARATOR and out-of-range SIGHASH_SINGLE."], [[["6eb316926b1c5d567cd6f5e6a84fec606fc53d7b474526d1fff3948020c93dfe", 0, "0x21 0x036d5c20fa14fb2f635474c1dc4ef5909d4568e5569b79fc94d3448486e14685f8 CHECKSIG", 156250000], ["f825690aee1b3dc247da796cacb12687a5e802429fd291cfd63e010f02cf1508", 0, "0x00 0x20 0x5d1b56b63d714eebe542309525f484b7e9d6f686b3781b6f61ef925d66d6f6a0", 4900000000]], -"01000000000102fe3dc9208094f3ffd12645477b3dc56f60ec4fa8e6f5d67c565d1c6b9216b36e000000004847304402200af4e47c9b9629dbecc21f73af989bdaa911f7e6f6c2e9394588a3aa68f81e9902204f3fcf6ade7e5abb1295b6774c8e0abd94ae62217367096bc02ee5e435b67da201ffffffff0815cf020f013ed6cf91d29f4202e8a58726b1ac6c79da47c23d1bee0a6925f80000000000ffffffff0100f2052a010000001976a914a30741f8145e5acadf23f751864167f32e0963f788ac000347304402200de66acf4527789bfda55fc5459e214fa6083f936b430a762c629656216805ac0220396f550692cd347171cbc1ef1f51e15282e837bb2b30860dc77c8f78bc8501e503473044022027dc95ad6b740fe5129e7e62a75dd00f291a2aeb1200b84b09d9e3789406b6c002201a9ecd315dd6a0e632ab20bbb98948bc0c6fb204f2c286963bb48517a7058e27034721026dccc749adc2a9d0d89497ac511f760f45c47dc5ed9cf352a58ac706453880aeadab210255a9626aebf5e29c0e6538428ba0d1dcf6ca98ffdf086aa8ced5e0d0215ea465ac00000000", "P2SH,WITNESS"], +"01000000000102fe3dc9208094f3ffd12645477b3dc56f60ec4fa8e6f5d67c565d1c6b9216b36e000000004847304402200af4e47c9b9629dbecc21f73af989bdaa911f7e6f6c2e9394588a3aa68f81e9902204f3fcf6ade7e5abb1295b6774c8e0abd94ae62217367096bc02ee5e435b67da201ffffffff0815cf020f013ed6cf91d29f4202e8a58726b1ac6c79da47c23d1bee0a6925f80000000000ffffffff0100f2052a010000001976a914a30741f8145e5acadf23f751864167f32e0963f788ac000347304402200de66acf4527789bfda55fc5459e214fa6083f936b430a762c629656216805ac0220396f550692cd347171cbc1ef1f51e15282e837bb2b30860dc77c8f78bc8501e503473044022027dc95ad6b740fe5129e7e62a75dd00f291a2aeb1200b84b09d9e3789406b6c002201a9ecd315dd6a0e632ab20bbb98948bc0c6fb204f2c286963bb48517a7058e27034721026dccc749adc2a9d0d89497ac511f760f45c47dc5ed9cf352a58ac706453880aeadab210255a9626aebf5e29c0e6538428ba0d1dcf6ca98ffdf086aa8ced5e0d0215ea465ac00000000", "P2SH,WITNESS,CONST_SCRIPTCODE"], ["BIP143 example: P2WSH with unexecuted OP_CODESEPARATOR and SINGLE|ANYONECANPAY"], [[["01c0cf7fba650638e55eb91261b183251fbb466f90dff17f10086817c542b5e9", 0, "0x00 0x20 0xba468eea561b26301e4cf69fa34bde4ad60c81e70f059f045ca9a79931004a4d", 16777215], ["1b2a9a426ba603ba357ce7773cb5805cb9c7c2b386d100d1fc9263513188e680", 0, "0x00 0x20 0xd9bbfbe56af7c4b7f960a70d7ea107156913d9e5a26b0a71429df5e097ca6537", 16777215]], -"01000000000102e9b542c5176808107ff1df906f46bb1f2583b16112b95ee5380665ba7fcfc0010000000000ffffffff80e68831516392fcd100d186b3c2c7b95c80b53c77e77c35ba03a66b429a2a1b0000000000ffffffff0280969800000000001976a914de4b231626ef508c9a74a8517e6783c0546d6b2888ac80969800000000001976a9146648a8cd4531e1ec47f35916de8e259237294d1e88ac02483045022100f6a10b8604e6dc910194b79ccfc93e1bc0ec7c03453caaa8987f7d6c3413566002206216229ede9b4d6ec2d325be245c5b508ff0339bf1794078e20bfe0babc7ffe683270063ab68210392972e2eb617b2388771abe27235fd5ac44af8e61693261550447a4c3e39da98ac024730440220032521802a76ad7bf74d0e2c218b72cf0cbc867066e2e53db905ba37f130397e02207709e2188ed7f08f4c952d9d13986da504502b8c3be59617e043552f506c46ff83275163ab68210392972e2eb617b2388771abe27235fd5ac44af8e61693261550447a4c3e39da98ac00000000", "P2SH,WITNESS"], +"01000000000102e9b542c5176808107ff1df906f46bb1f2583b16112b95ee5380665ba7fcfc0010000000000ffffffff80e68831516392fcd100d186b3c2c7b95c80b53c77e77c35ba03a66b429a2a1b0000000000ffffffff0280969800000000001976a914de4b231626ef508c9a74a8517e6783c0546d6b2888ac80969800000000001976a9146648a8cd4531e1ec47f35916de8e259237294d1e88ac02483045022100f6a10b8604e6dc910194b79ccfc93e1bc0ec7c03453caaa8987f7d6c3413566002206216229ede9b4d6ec2d325be245c5b508ff0339bf1794078e20bfe0babc7ffe683270063ab68210392972e2eb617b2388771abe27235fd5ac44af8e61693261550447a4c3e39da98ac024730440220032521802a76ad7bf74d0e2c218b72cf0cbc867066e2e53db905ba37f130397e02207709e2188ed7f08f4c952d9d13986da504502b8c3be59617e043552f506c46ff83275163ab68210392972e2eb617b2388771abe27235fd5ac44af8e61693261550447a4c3e39da98ac00000000", "P2SH,WITNESS,CONST_SCRIPTCODE"], ["BIP143 example: Same as the previous example with input-output pairs swapped"], [[["1b2a9a426ba603ba357ce7773cb5805cb9c7c2b386d100d1fc9263513188e680", 0, "0x00 0x20 0xd9bbfbe56af7c4b7f960a70d7ea107156913d9e5a26b0a71429df5e097ca6537", 16777215], ["01c0cf7fba650638e55eb91261b183251fbb466f90dff17f10086817c542b5e9", 0, "0x00 0x20 0xba468eea561b26301e4cf69fa34bde4ad60c81e70f059f045ca9a79931004a4d", 16777215]], -"0100000000010280e68831516392fcd100d186b3c2c7b95c80b53c77e77c35ba03a66b429a2a1b0000000000ffffffffe9b542c5176808107ff1df906f46bb1f2583b16112b95ee5380665ba7fcfc0010000000000ffffffff0280969800000000001976a9146648a8cd4531e1ec47f35916de8e259237294d1e88ac80969800000000001976a914de4b231626ef508c9a74a8517e6783c0546d6b2888ac024730440220032521802a76ad7bf74d0e2c218b72cf0cbc867066e2e53db905ba37f130397e02207709e2188ed7f08f4c952d9d13986da504502b8c3be59617e043552f506c46ff83275163ab68210392972e2eb617b2388771abe27235fd5ac44af8e61693261550447a4c3e39da98ac02483045022100f6a10b8604e6dc910194b79ccfc93e1bc0ec7c03453caaa8987f7d6c3413566002206216229ede9b4d6ec2d325be245c5b508ff0339bf1794078e20bfe0babc7ffe683270063ab68210392972e2eb617b2388771abe27235fd5ac44af8e61693261550447a4c3e39da98ac00000000", "P2SH,WITNESS"], +"0100000000010280e68831516392fcd100d186b3c2c7b95c80b53c77e77c35ba03a66b429a2a1b0000000000ffffffffe9b542c5176808107ff1df906f46bb1f2583b16112b95ee5380665ba7fcfc0010000000000ffffffff0280969800000000001976a9146648a8cd4531e1ec47f35916de8e259237294d1e88ac80969800000000001976a914de4b231626ef508c9a74a8517e6783c0546d6b2888ac024730440220032521802a76ad7bf74d0e2c218b72cf0cbc867066e2e53db905ba37f130397e02207709e2188ed7f08f4c952d9d13986da504502b8c3be59617e043552f506c46ff83275163ab68210392972e2eb617b2388771abe27235fd5ac44af8e61693261550447a4c3e39da98ac02483045022100f6a10b8604e6dc910194b79ccfc93e1bc0ec7c03453caaa8987f7d6c3413566002206216229ede9b4d6ec2d325be245c5b508ff0339bf1794078e20bfe0babc7ffe683270063ab68210392972e2eb617b2388771abe27235fd5ac44af8e61693261550447a4c3e39da98ac00000000", "P2SH,WITNESS,CONST_SCRIPTCODE"], ["BIP143 example: P2SH-P2WSH 6-of-6 multisig signed with 6 different SIGHASH types"], [[["6eb98797a21c6c10aa74edf29d618be109f48a8e94c694f3701e08ca69186436", 1, "HASH160 0x14 0x9993a429037b5d912407a71c252019287b8d27a5 EQUAL", 987654321]], @@ -498,7 +498,7 @@ "010000000169c12106097dc2e0526493ef67f21269fe888ef05c7a3a5dacab38e1ac8387f1581b0000b64830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0121037a3fb04bcdb09eba90f69961ba1692a3528e45e67c85b200df820212d7594d334aad4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e01ffffffff0101000000000000000000000000", "P2SH,WITNESS"], ["BIP143: correct sighash (without FindAndDelete) = 71c9cd9b2869b9c70b01b1f0360c148f42dee72297db312638df136f43311f23"], [[["f18783ace138abac5d3a7a5cf08e88fe6912f267ef936452e0c27d090621c169", 7500, "0x00 0x20 0x9e1be07558ea5cc8e02ed1d80c0911048afad949affa36d5c3951e3159dbea19", 200000]], -"0100000000010169c12106097dc2e0526493ef67f21269fe888ef05c7a3a5dacab38e1ac8387f14c1d000000ffffffff01010000000000000000034830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e012102a9781d66b61fb5a7ef00ac5ad5bc6ffc78be7b44a566e3c87870e1079368df4c4aad4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0100000000", "P2SH,WITNESS"], +"0100000000010169c12106097dc2e0526493ef67f21269fe888ef05c7a3a5dacab38e1ac8387f14c1d000000ffffffff01010000000000000000034830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e012102a9781d66b61fb5a7ef00ac5ad5bc6ffc78be7b44a566e3c87870e1079368df4c4aad4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0100000000", "P2SH,WITNESS,CONST_SCRIPTCODE"], ["This is multisig version of the FindAndDelete tests"], ["Script is 2 CHECKMULTISIGVERIFY DROP"], ["52af4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c0395960175"], @@ -508,7 +508,9 @@ "01000000019275cb8d4a485ce95741c013f7c0d28722160008021bb469a11982d47a662896581b0000fd6f01004830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c03959601522102cd74a2809ffeeed0092bc124fd79836706e41f048db3f6ae9df8708cefb83a1c2102e615999372426e46fd107b76eaf007156a507584aa2cc21de9eee3bdbd26d36c4c9552af4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c0395960175ffffffff0101000000000000000000000000", "P2SH,WITNESS"], ["BIP143: correct sighash (without FindAndDelete) = c1628a1e7c67f14ca0c27c06e4fdeec2e6d1a73c7a91d7c046ff83e835aebb72"], [[["9628667ad48219a169b41b020800162287d2c0f713c04157e95c484a8dcb7592", 7500, "0x00 0x20 0x9b66c15b4e0b4eb49fa877982cafded24859fe5b0e2dbfbe4f0df1de7743fd52", 200000]], -"010000000001019275cb8d4a485ce95741c013f7c0d28722160008021bb469a11982d47a6628964c1d000000ffffffff0101000000000000000007004830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c0395960101022102966f109c54e85d3aee8321301136cedeb9fc710fdef58a9de8a73942f8e567c021034ffc99dd9a79dd3cb31e2ab3e0b09e0e67db41ac068c625cd1f491576016c84e9552af4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c039596017500000000", "P2SH,WITNESS"], +"010000000001019275cb8d4a485ce95741c013f7c0d28722160008021bb469a11982d47a6628964c1d000000ffffffff0101000000000000000007004830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c0395960101022102966f109c54e85d3aee8321301136cedeb9fc710fdef58a9de8a73942f8e567c021034ffc99dd9a79dd3cb31e2ab3e0b09e0e67db41ac068c625cd1f491576016c84e9552af4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c039596017500000000", "P2SH,WITNESS,CONST_SCRIPTCODE"], +[[["7a554c397846f025738965683b8448d79458c54b869f6391ece95145c962e65f", 0, "OP_HASH160 0x149512447916448e4193c321f2d599dff2538973f3 OP_EQUAL", 0]], +"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"], ["Make diffs cleaner by leaving a comment here without comma at the end"] ] diff --git a/txscript/doc.go b/txscript/doc.go index 7da521615a..957c91947c 100644 --- a/txscript/doc.go +++ b/txscript/doc.go @@ -12,12 +12,12 @@ overview to provide information on how to use the package. This package provides data structures and functions to parse and execute bitcoin transaction scripts. -Script Overview +# Script Overview Bitcoin transaction scripts are written in a stack-base, FORTH-like language. The bitcoin script language consists of a number of opcodes which fall into -several categories such pushing and popping data to and from the stack, +several categories such as pushing and popping data to and from the stack, performing basic and bitwise arithmetic, conditional branching, comparing hashes, and checking cryptographic signatures. Scripts are processed from left to right and intentionally do not provide loops. @@ -25,12 +25,12 @@ to right and intentionally do not provide loops. The vast majority of Bitcoin scripts at the time of this writing are of several standard forms which consist of a spender providing a public key and a signature which proves the spender owns the associated private key. This information -is used to prove the the spender is authorized to perform the transaction. +is used to prove the spender is authorized to perform the transaction. One benefit of using a scripting language is added flexibility in specifying what conditions must be met in order to spend bitcoins. -Errors +# Errors Errors returned by this package are of type txscript.Error. This allows the caller to programmatically determine the specific error by examining the diff --git a/txscript/engine.go b/txscript/engine.go index db661860c8..0cc3d96caa 100644 --- a/txscript/engine.go +++ b/txscript/engine.go @@ -10,8 +10,10 @@ import ( "crypto/sha256" "fmt" "math/big" + "strings" - "github.com/btcsuite/btcd/btcec" + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/wire" ) @@ -94,6 +96,28 @@ const ( // operation whose public key isn't serialized in a compressed format // non-standard. ScriptVerifyWitnessPubKeyType + + // ScriptVerifyTaproot defines whether or not to verify a transaction + // output using the new taproot validation rules. + ScriptVerifyTaproot + + // ScriptVerifyDiscourageUpgradeableWitnessProgram defines whether or + // not to consider any new/unknown taproot leaf versions as + // non-standard. + ScriptVerifyDiscourageUpgradeableTaprootVersion + + // ScriptVerifyDiscourageOpSuccess defines whether or not to consider + // usage of OP_SUCCESS op codes during tapscript execution as + // non-standard. + ScriptVerifyDiscourageOpSuccess + + // ScriptVerifyDiscourageUpgradeablePubkeyType defines if unknown + // public key versions (during tapscript execution) is non-standard. + ScriptVerifyDiscourageUpgradeablePubkeyType + + // ScriptVerifyConstScriptCode fails non-segwit scripts if a signature + // match is found in the script code or if OP_CODESEPARATOR is used. + ScriptVerifyConstScriptCode ) const ( @@ -111,31 +135,187 @@ const ( // payToWitnessScriptHashDataSize is the size of the witness program's // data push for a pay-to-witness-script-hash output. payToWitnessScriptHashDataSize = 32 + + // payToTaprootDataSize is the size of the witness program push for + // taproot spends. This will be the serialized x-coordinate of the + // top-level taproot output public key. + payToTaprootDataSize = 32 +) + +const ( + // BaseSegwitWitnessVersion is the original witness version that defines + // the initial set of segwit validation logic. + BaseSegwitWitnessVersion = 0 + + // TaprootWitnessVersion is the witness version that defines the new + // taproot verification logic. + TaprootWitnessVersion = 1 ) // halforder is used to tame ECDSA malleability (see BIP0062). var halfOrder = new(big.Int).Rsh(btcec.S256().N, 1) +// taprootExecutionCtx houses the special context-specific information we need +// to validate a taproot script spend. This includes the annex, the running sig +// op count tally, and other relevant information. +type taprootExecutionCtx struct { + annex []byte + + codeSepPos uint32 + + tapLeafHash chainhash.Hash + + sigOpsBudget int32 + + mustSucceed bool +} + +// sigOpsDelta is both the starting budget for sig ops for tapscript +// verification, as well as the decrease in the total budget when we encounter +// a signature. +const sigOpsDelta = 50 + +// tallysigOp attempts to decrease the current sig ops budget by sigOpsDelta. +// An error is returned if after subtracting the delta, the budget is below +// zero. +func (t *taprootExecutionCtx) tallysigOp() error { + t.sigOpsBudget -= sigOpsDelta + + if t.sigOpsBudget < 0 { + return scriptError(ErrTaprootMaxSigOps, "") + } + + return nil +} + +// newTaprootExecutionCtx returns a fresh instance of the taproot execution +// context. +func newTaprootExecutionCtx(inputWitnessSize int32) *taprootExecutionCtx { + return &taprootExecutionCtx{ + codeSepPos: blankCodeSepValue, + sigOpsBudget: sigOpsDelta + inputWitnessSize, + } +} + // Engine is the virtual machine that executes scripts. type Engine struct { - scripts [][]parsedOpcode + // The following fields are set when the engine is created and must not be + // changed afterwards. The entries of the signature cache are mutated + // during execution, however, the cache pointer itself is not changed. + // + // flags specifies the additional flags which modify the execution behavior + // of the engine. + // + // tx identifies the transaction that contains the input which in turn + // contains the signature script being executed. + // + // txIdx identifies the input index within the transaction that contains + // the signature script being executed. + // + // version specifies the version of the public key script to execute. Since + // signature scripts redeem public keys scripts, this means the same version + // also extends to signature scripts and redeem scripts in the case of + // pay-to-script-hash. + // + // bip16 specifies that the public key script is of a special form that + // indicates it is a BIP16 pay-to-script-hash and therefore the + // execution must be treated as such. + // + // sigCache caches the results of signature verifications. This is useful + // since transaction scripts are often executed more than once from various + // contexts (e.g. new block templates, when transactions are first seen + // prior to being mined, part of full block verification, etc). + // + // hashCache caches the midstate of segwit v0 and v1 sighashes to + // optimize worst-case hashing complexity. + // + // prevOutFetcher is used to look up all the previous output of + // taproot transactions, as that information is hashed into the + // sighash digest for such inputs. + flags ScriptFlags + tx wire.MsgTx + txIdx int + version uint16 + bip16 bool + sigCache *SigCache + hashCache *TxSigHashes + prevOutFetcher PrevOutputFetcher + + // The following fields handle keeping track of the current execution state + // of the engine. + // + // scripts houses the raw scripts that are executed by the engine. This + // includes the signature script as well as the public key script. It also + // includes the redeem script in the case of pay-to-script-hash. + // + // scriptIdx tracks the index into the scripts array for the current program + // counter. + // + // opcodeIdx tracks the number of the opcode within the current script for + // the current program counter. Note that it differs from the actual byte + // index into the script and is really only used for disassembly purposes. + // + // lastCodeSep specifies the position within the current script of the last + // OP_CODESEPARATOR. + // + // tokenizer provides the token stream of the current script being executed + // and doubles as state tracking for the program counter within the script. + // + // savedFirstStack keeps a copy of the stack from the first script when + // performing pay-to-script-hash execution. + // + // dstack is the primary data stack the various opcodes push and pop data + // to and from during execution. + // + // astack is the alternate data stack the various opcodes push and pop data + // to and from during execution. + // + // condStack tracks the conditional execution state with support for + // multiple nested conditional execution opcodes. + // + // numOps tracks the total number of non-push operations in a script and is + // primarily used to enforce maximum limits. + scripts [][]byte scriptIdx int - scriptOff int + opcodeIdx int lastCodeSep int - dstack stack // data stack - astack stack // alt stack - tx wire.MsgTx - txIdx int + tokenizer ScriptTokenizer + savedFirstStack [][]byte + dstack stack + astack stack condStack []int numOps int - flags ScriptFlags - sigCache *SigCache - hashCache *TxSigHashes - bip16 bool // treat execution as pay-to-script-hash - savedFirstStack [][]byte // stack from first script for bip16 scripts witnessVersion int witnessProgram []byte inputAmount int64 + taprootCtx *taprootExecutionCtx + + // stepCallback is an optional function that will be called every time + // a step has been performed during script execution. + // + // NOTE: This is only meant to be used in debugging, and SHOULD NOT BE + // USED during regular operation. + stepCallback func(*StepInfo) error +} + +// StepInfo houses the current VM state information that is passed back to the +// stepCallback during script execution. +type StepInfo struct { + // ScriptIndex is the index of the script currently being executed by + // the Engine. + ScriptIndex int + + // OpcodeIndex is the index of the next opcode that will be executed. + // In case the execution has completed, the opcode index will be + // incrementet beyond the number of the current script's opcodes. This + // indicates no new script is being executed, and execution is done. + OpcodeIndex int + + // Stack is the Engine's current content on the stack: + Stack [][]byte + + // AltStack is the Engine's current content on the alt stack. + AltStack [][]byte } // hasFlag returns whether the script engine instance has the passed flag set. @@ -154,26 +334,144 @@ func (vm *Engine) isBranchExecuting() bool { return vm.condStack[len(vm.condStack)-1] == OpCondTrue } -// executeOpcode peforms execution on the passed opcode. It takes into account +// isOpcodeDisabled returns whether or not the opcode is disabled and thus is +// always bad to see in the instruction stream (even if turned off by a +// conditional). +func isOpcodeDisabled(opcode byte) bool { + switch opcode { + case OP_CAT: + return true + case OP_SUBSTR: + return true + case OP_LEFT: + return true + case OP_RIGHT: + return true + case OP_INVERT: + return true + case OP_AND: + return true + case OP_OR: + return true + case OP_XOR: + return true + case OP_2MUL: + return true + case OP_2DIV: + return true + case OP_MUL: + return true + case OP_DIV: + return true + case OP_MOD: + return true + case OP_LSHIFT: + return true + case OP_RSHIFT: + return true + default: + return false + } +} + +// isOpcodeAlwaysIllegal returns whether or not the opcode is always illegal +// when passed over by the program counter even if in a non-executed branch (it +// isn't a coincidence that they are conditionals). +func isOpcodeAlwaysIllegal(opcode byte) bool { + switch opcode { + case OP_VERIF: + return true + case OP_VERNOTIF: + return true + default: + return false + } +} + +// isOpcodeConditional returns whether or not the opcode is a conditional opcode +// which changes the conditional execution stack when executed. +func isOpcodeConditional(opcode byte) bool { + switch opcode { + case OP_IF: + return true + case OP_NOTIF: + return true + case OP_ELSE: + return true + case OP_ENDIF: + return true + default: + return false + } +} + +// checkMinimalDataPush returns whether or not the provided opcode is the +// smallest possible way to represent the given data. For example, the value 15 +// could be pushed with OP_DATA_1 15 (among other variations); however, OP_15 is +// a single opcode that represents the same value and is only a single byte +// versus two bytes. +func checkMinimalDataPush(op *opcode, data []byte) error { + opcodeVal := op.value + dataLen := len(data) + switch { + case dataLen == 0 && opcodeVal != OP_0: + str := fmt.Sprintf("zero length data push is encoded with opcode %s "+ + "instead of OP_0", op.name) + return scriptError(ErrMinimalData, str) + case dataLen == 1 && data[0] >= 1 && data[0] <= 16: + if opcodeVal != OP_1+data[0]-1 { + // Should have used OP_1 .. OP_16 + str := fmt.Sprintf("data push of the value %d encoded with opcode "+ + "%s instead of OP_%d", data[0], op.name, data[0]) + return scriptError(ErrMinimalData, str) + } + case dataLen == 1 && data[0] == 0x81: + if opcodeVal != OP_1NEGATE { + str := fmt.Sprintf("data push of the value -1 encoded with opcode "+ + "%s instead of OP_1NEGATE", op.name) + return scriptError(ErrMinimalData, str) + } + case dataLen <= 75: + if int(opcodeVal) != dataLen { + // Should have used a direct push + str := fmt.Sprintf("data push of %d bytes encoded with opcode %s "+ + "instead of OP_DATA_%d", dataLen, op.name, dataLen) + return scriptError(ErrMinimalData, str) + } + case dataLen <= 255: + if opcodeVal != OP_PUSHDATA1 { + str := fmt.Sprintf("data push of %d bytes encoded with opcode %s "+ + "instead of OP_PUSHDATA1", dataLen, op.name) + return scriptError(ErrMinimalData, str) + } + case dataLen <= 65535: + if opcodeVal != OP_PUSHDATA2 { + str := fmt.Sprintf("data push of %d bytes encoded with opcode %s "+ + "instead of OP_PUSHDATA2", dataLen, op.name) + return scriptError(ErrMinimalData, str) + } + } + return nil +} + +// executeOpcode performs execution on the passed opcode. It takes into account // whether or not it is hidden by conditionals, but some rules still must be // tested in this case. -func (vm *Engine) executeOpcode(pop *parsedOpcode) error { +func (vm *Engine) executeOpcode(op *opcode, data []byte) error { // Disabled opcodes are fail on program counter. - if pop.isDisabled() { - str := fmt.Sprintf("attempt to execute disabled opcode %s", - pop.opcode.name) + if isOpcodeDisabled(op.value) { + str := fmt.Sprintf("attempt to execute disabled opcode %s", op.name) return scriptError(ErrDisabledOpcode, str) } // Always-illegal opcodes are fail on program counter. - if pop.alwaysIllegal() { - str := fmt.Sprintf("attempt to execute reserved opcode %s", - pop.opcode.name) + if isOpcodeAlwaysIllegal(op.value) { + str := fmt.Sprintf("attempt to execute reserved opcode %s", op.name) return scriptError(ErrReservedOpcode, str) } // Note that this includes OP_RESERVED which counts as a push operation. - if pop.opcode.value > OP_16 { + if vm.taprootCtx == nil && op.value > OP_16 { vm.numOps++ if vm.numOps > MaxOpsPerScript { str := fmt.Sprintf("exceeded max operation limit of %d", @@ -181,67 +479,42 @@ func (vm *Engine) executeOpcode(pop *parsedOpcode) error { return scriptError(ErrTooManyOperations, str) } - } else if len(pop.data) > MaxScriptElementSize { + } else if len(data) > MaxScriptElementSize { str := fmt.Sprintf("element size %d exceeds max allowed size %d", - len(pop.data), MaxScriptElementSize) + len(data), MaxScriptElementSize) return scriptError(ErrElementTooBig, str) } // Nothing left to do when this is not a conditional opcode and it is // not in an executing branch. - if !vm.isBranchExecuting() && !pop.isConditional() { + if !vm.isBranchExecuting() && !isOpcodeConditional(op.value) { return nil } // Ensure all executed data push opcodes use the minimal encoding when // the minimal data verification flag is set. if vm.dstack.verifyMinimalData && vm.isBranchExecuting() && - pop.opcode.value >= 0 && pop.opcode.value <= OP_PUSHDATA4 { + op.value >= 0 && op.value <= OP_PUSHDATA4 { - if err := pop.checkMinimalDataPush(); err != nil { + if err := checkMinimalDataPush(op, data); err != nil { return err } } - return pop.opcode.opfunc(pop, vm) -} - -// disasm is a helper function to produce the output for DisasmPC and -// DisasmScript. It produces the opcode prefixed by the program counter at the -// provided position in the script. It does no error checking and leaves that -// to the caller to provide a valid offset. -func (vm *Engine) disasm(scriptIdx int, scriptOff int) string { - return fmt.Sprintf("%02x:%04x: %s", scriptIdx, scriptOff, - vm.scripts[scriptIdx][scriptOff].print(false)) + return op.opfunc(op, data, vm) } -// validPC returns an error if the current script position is valid for -// execution, nil otherwise. -func (vm *Engine) validPC() error { +// checkValidPC returns an error if the current script position is not valid for +// execution. +func (vm *Engine) checkValidPC() error { if vm.scriptIdx >= len(vm.scripts) { - str := fmt.Sprintf("past input scripts %v:%v %v:xxxx", - vm.scriptIdx, vm.scriptOff, len(vm.scripts)) - return scriptError(ErrInvalidProgramCounter, str) - } - if vm.scriptOff >= len(vm.scripts[vm.scriptIdx]) { - str := fmt.Sprintf("past input scripts %v:%v %v:%04d", - vm.scriptIdx, vm.scriptOff, vm.scriptIdx, - len(vm.scripts[vm.scriptIdx])) + str := fmt.Sprintf("script index %d beyond total scripts %d", + vm.scriptIdx, len(vm.scripts)) return scriptError(ErrInvalidProgramCounter, str) } return nil } -// curPC returns either the current script and offset, or an error if the -// position isn't valid. -func (vm *Engine) curPC() (script int, off int, err error) { - err = vm.validPC() - if err != nil { - return 0, 0, err - } - return vm.scriptIdx, vm.scriptOff, nil -} - // isWitnessVersionActive returns true if a witness program was extracted // during the initialization of the Engine, and the program's version matches // the specified version. @@ -251,8 +524,12 @@ func (vm *Engine) isWitnessVersionActive(version uint) bool { // verifyWitnessProgram validates the stored witness program using the passed // witness as input. -func (vm *Engine) verifyWitnessProgram(witness [][]byte) error { - if vm.isWitnessVersionActive(0) { +func (vm *Engine) verifyWitnessProgram(witness wire.TxWitness) error { + switch { + + // We're attempting to verify a base (witness version 0) segwit output, + // so we'll be looking for either a p2wsh or a p2wkh spend. + case vm.isWitnessVersionActive(BaseSegwitWitnessVersion): switch len(vm.witnessProgram) { case payToWitnessPubKeyHashDataSize: // P2WKH // The witness stack should consist of exactly two @@ -269,7 +546,9 @@ func (vm *Engine) verifyWitnessProgram(witness [][]byte) error { if err != nil { return err } - pops, err := parseScript(pkScript) + + const scriptVersion = 0 + err = checkScriptParses(vm.version, pkScript) if err != nil { return err } @@ -277,7 +556,7 @@ func (vm *Engine) verifyWitnessProgram(witness [][]byte) error { // Set the stack to the provided witness stack, then // append the pkScript generated above as the next // script to execute. - vm.scripts = append(vm.scripts, pops) + vm.scripts = append(vm.scripts, pkScript) vm.SetStack(witness) case payToWitnessScriptHashDataSize: // P2WSH @@ -307,10 +586,10 @@ func (vm *Engine) verifyWitnessProgram(witness [][]byte) error { "witness program hash mismatch") } - // With all the validity checks passed, parse the - // script into individual op-codes so w can execute it - // as the next script. - pops, err := parseScript(witnessScript) + // With all the validity checks passed, assert that the + // script parses without failure. + const scriptVersion = 0 + err := checkScriptParses(vm.version, witnessScript) if err != nil { return err } @@ -318,7 +597,7 @@ func (vm *Engine) verifyWitnessProgram(witness [][]byte) error { // The hash matched successfully, so use the witness as // the stack, and set the witnessScript to be the next // script executed. - vm.scripts = append(vm.scripts, pops) + vm.scripts = append(vm.scripts, witnessScript) vm.SetStack(witness[:len(witness)-1]) default: @@ -329,11 +608,164 @@ func (vm *Engine) verifyWitnessProgram(witness [][]byte) error { len(vm.witnessProgram)) return scriptError(ErrWitnessProgramWrongLength, errStr) } - } else if vm.hasFlag(ScriptVerifyDiscourageUpgradeableWitnessProgram) { + + // We're attempting to verify a taproot input, and the witness + // program data push is of the expected size, so we'll be looking for a + // normal key-path spend, or a merkle proof for a tapscript with + // execution afterwards. + case vm.isWitnessVersionActive(TaprootWitnessVersion) && + len(vm.witnessProgram) == payToTaprootDataSize && !vm.bip16: + + // If taproot isn't currently active, then we'll return a + // success here in place as we don't apply the new rules unless + // the flag flips, as governed by the version bits deployment. + if !vm.hasFlag(ScriptVerifyTaproot) { + return nil + } + + // If there're no stack elements at all, then this is an + // invalid spend. + if len(witness) == 0 { + return scriptError(ErrWitnessProgramEmpty, "witness "+ + "program empty passed empty witness") + } + + // At this point, we know taproot is active, so we'll populate + // the taproot execution context. + vm.taprootCtx = newTaprootExecutionCtx( + int32(witness.SerializeSize()), + ) + + // If we can detect the annex, then drop that off the stack, + // we'll only need it to compute the sighash later. + if isAnnexedWitness(witness) { + vm.taprootCtx.annex, _ = extractAnnex(witness) + + // Snip the annex off the end of the witness stack. + witness = witness[:len(witness)-1] + } + + // From here, we'll either be validating a normal key spend, or + // a spend from the tap script leaf using a committed leaf. + switch { + // If there's only a single element left on the stack (the + // signature), then we'll apply the normal top-level schnorr + // signature verification. + case len(witness) == 1: + // As we only have a single element left (after maybe + // removing the annex), we'll do normal taproot + // keyspend validation. + rawSig := witness[0] + err := VerifyTaprootKeySpend( + vm.witnessProgram, rawSig, &vm.tx, vm.txIdx, + vm.prevOutFetcher, vm.hashCache, vm.sigCache, + ) + if err != nil { + // TODO(roasbeef): proper error + return err + } + + // TODO(roasbeef): or remove the other items from the stack? + vm.taprootCtx.mustSucceed = true + return nil + + // Otherwise, we need to attempt full tapscript leaf + // verification in place. + default: + // First, attempt to parse the control block, if this + // isn't formatted properly, then we'll end execution + // right here. + controlBlock, err := ParseControlBlock( + witness[len(witness)-1], + ) + if err != nil { + return err + } + + // Now that we know the control block is valid, we'll + // verify the top-level taproot commitment, which + // proves that the specified script was committed to in + // the merkle tree. + witnessScript := witness[len(witness)-2] + err = VerifyTaprootLeafCommitment( + controlBlock, vm.witnessProgram, witnessScript, + ) + if err != nil { + return err + } + + // Now that we know the commitment is valid, we'll + // check to see if OP_SUCCESS op codes are found in the + // script. If so, then we'll return here early as we + // skip proper validation. + if ScriptHasOpSuccess(witnessScript) { + // An op success op code has been found, however if + // the policy flag forbidding them is active, then + // we'll return an error. + if vm.hasFlag(ScriptVerifyDiscourageOpSuccess) { + errStr := fmt.Sprintf("script contains " + + "OP_SUCCESS op code") + return scriptError(ErrDiscourageOpSuccess, errStr) + } + + // Otherwise, the script passes scott free. + vm.taprootCtx.mustSucceed = true + return nil + } + + // Before we proceed with normal execution, check the + // leaf version of the script, as if the policy flag is + // active, then we should only allow the base leaf + // version. + if controlBlock.LeafVersion != BaseLeafVersion { + switch { + case vm.hasFlag(ScriptVerifyDiscourageUpgradeableTaprootVersion): + errStr := fmt.Sprintf("tapscript is attempting "+ + "to use version: %v", controlBlock.LeafVersion) + return scriptError( + ErrDiscourageUpgradeableTaprootVersion, errStr, + ) + default: + // If the policy flag isn't active, + // then execution succeeds here as we + // don't know the rules of the future + // leaf versions. + vm.taprootCtx.mustSucceed = true + return nil + } + } + + // Now that we know we don't have any op success + // fields, ensure that the script parses properly. + // + // TODO(roasbeef): combine w/ the above? + err = checkScriptParses(vm.version, witnessScript) + if err != nil { + return err + } + + // Now that we know the script parses, and we have a + // valid leaf version, we'll save the tapscript hash of + // the leaf, as we need that for signature validation + // later. + vm.taprootCtx.tapLeafHash = NewBaseTapLeaf( + witnessScript, + ).TapHash() + + // Otherwise, we'll now "recurse" one level deeper, and + // set the remaining witness (leaving off the annex and + // the witness script) as the execution stack, and + // enter further execution. + vm.scripts = append(vm.scripts, witnessScript) + vm.SetStack(witness[:len(witness)-2]) + } + + case vm.hasFlag(ScriptVerifyDiscourageUpgradeableWitnessProgram): errStr := fmt.Sprintf("new witness program versions "+ "invalid: %v", vm.witnessProgram) + return scriptError(ErrDiscourageUpgradableWitnessProgram, errStr) - } else { + default: // If we encounter an unknown witness program version and we // aren't discouraging future unknown witness based soft-forks, // then we de-activate the segwit behavior within the VM for @@ -341,7 +773,20 @@ func (vm *Engine) verifyWitnessProgram(witness [][]byte) error { vm.witnessProgram = nil } - if vm.isWitnessVersionActive(0) { + // TODO(roasbeef): other sanity checks here + switch { + + // In addition to the normal script element size limits, taproot also + // enforces a limit on the max _starting_ stack size. + case vm.isWitnessVersionActive(TaprootWitnessVersion): + if vm.dstack.Depth() > MaxStackSize { + str := fmt.Sprintf("tapscript stack size %d > max allowed %d", + vm.dstack.Depth(), MaxStackSize) + return scriptError(ErrStackOverflow, str) + } + + fallthrough + case vm.isWitnessVersionActive(BaseSegwitWitnessVersion): // All elements within the witness stack must not be greater // than the maximum bytes which are allowed to be pushed onto // the stack. @@ -353,24 +798,58 @@ func (vm *Engine) verifyWitnessProgram(witness [][]byte) error { return scriptError(ErrElementTooBig, str) } } + + return nil } return nil } // DisasmPC returns the string for the disassembly of the opcode that will be -// next to execute when Step() is called. +// next to execute when Step is called. func (vm *Engine) DisasmPC() (string, error) { - scriptIdx, scriptOff, err := vm.curPC() - if err != nil { + if err := vm.checkValidPC(); err != nil { return "", err } - return vm.disasm(scriptIdx, scriptOff), nil + + // Create a copy of the current tokenizer and parse the next opcode in the + // copy to avoid mutating the current one. + peekTokenizer := vm.tokenizer + if !peekTokenizer.Next() { + // Note that due to the fact that all scripts are checked for parse + // failures before this code ever runs, there should never be an error + // here, but check again to be safe in case a refactor breaks that + // assumption or new script versions are introduced with different + // semantics. + if err := peekTokenizer.Err(); err != nil { + return "", err + } + + // Note that this should be impossible to hit in practice because the + // only way it could happen would be for the final opcode of a script to + // already be parsed without the script index having been updated, which + // is not the case since stepping the script always increments the + // script index when parsing and executing the final opcode of a script. + // + // However, check again to be safe in case a refactor breaks that + // assumption or new script versions are introduced with different + // semantics. + str := fmt.Sprintf("program counter beyond script index %d (bytes %x)", + vm.scriptIdx, vm.scripts[vm.scriptIdx]) + return "", scriptError(ErrInvalidProgramCounter, str) + } + + var buf strings.Builder + disasmOpcode(&buf, peekTokenizer.op, peekTokenizer.Data(), false) + return fmt.Sprintf("%02x:%04x: %s", vm.scriptIdx, vm.opcodeIdx, + buf.String()), nil } // DisasmScript returns the disassembly string for the script at the requested // offset index. Index 0 is the signature script and 1 is the public key -// script. +// script. In the case of pay-to-script-hash, index 2 is the redeem script once +// the execution has progressed far enough to have successfully verified script +// hash and thus add the script to the scripts to execute. func (vm *Engine) DisasmScript(idx int) (string, error) { if idx >= len(vm.scripts) { str := fmt.Sprintf("script index %d >= total scripts %d", idx, @@ -378,19 +857,29 @@ func (vm *Engine) DisasmScript(idx int) (string, error) { return "", scriptError(ErrInvalidIndex, str) } - var disstr string - for i := range vm.scripts[idx] { - disstr = disstr + vm.disasm(idx, i) + "\n" + var disbuf strings.Builder + script := vm.scripts[idx] + tokenizer := MakeScriptTokenizer(vm.version, script) + var opcodeIdx int + for tokenizer.Next() { + disbuf.WriteString(fmt.Sprintf("%02x:%04x: ", idx, opcodeIdx)) + disasmOpcode(&disbuf, tokenizer.op, tokenizer.Data(), false) + disbuf.WriteByte('\n') + opcodeIdx++ } - return disstr, nil + return disbuf.String(), tokenizer.Err() } // CheckErrorCondition returns nil if the running script has ended and was // successful, leaving a a true boolean on the stack. An error otherwise, // including if the script has not finished. func (vm *Engine) CheckErrorCondition(finalScript bool) error { - // Check execution is actually done. When pc is past the end of script - // array there are no more scripts to run. + if vm.taprootCtx != nil && vm.taprootCtx.mustSucceed { + return nil + } + + // Check execution is actually done by ensuring the script index is after + // the final script in the array script. if vm.scriptIdx < len(vm.scripts) { return scriptError(ErrScriptUnfinished, "error check when script unfinished") @@ -399,16 +888,20 @@ func (vm *Engine) CheckErrorCondition(finalScript bool) error { // If we're in version zero witness execution mode, and this was the // final script, then the stack MUST be clean in order to maintain // compatibility with BIP16. - if finalScript && vm.isWitnessVersionActive(0) && vm.dstack.Depth() != 1 { + if finalScript && vm.isWitnessVersionActive(BaseSegwitWitnessVersion) && + vm.dstack.Depth() != 1 { return scriptError(ErrEvalFalse, "witness program must "+ "have clean stack") } - if finalScript && vm.hasFlag(ScriptVerifyCleanStack) && - vm.dstack.Depth() != 1 { + // The final script must end with exactly one data stack item when the + // verify clean stack flag is set. Otherwise, there must be at least one + // data stack item in order to interpret it as a boolean. + cleanStackActive := vm.hasFlag(ScriptVerifyCleanStack) || vm.taprootCtx != nil + if finalScript && cleanStackActive && vm.dstack.Depth() != 1 { - str := fmt.Sprintf("stack contains %d unexpected items", - vm.dstack.Depth()-1) + str := fmt.Sprintf("stack must contain exactly one item (contains %d)", + vm.dstack.Depth()) return scriptError(ErrCleanStack, str) } else if vm.dstack.Depth() < 1 { return scriptError(ErrEmptyStack, @@ -422,10 +915,14 @@ func (vm *Engine) CheckErrorCondition(finalScript bool) error { if !v { // Log interesting data. log.Tracef("%v", newLogClosure(func() string { - dis0, _ := vm.DisasmScript(0) - dis1, _ := vm.DisasmScript(1) - return fmt.Sprintf("scripts failed: script0: %s\n"+ - "script1: %s", dis0, dis1) + var buf strings.Builder + buf.WriteString("scripts failed:\n") + for i := range vm.scripts { + dis, _ := vm.DisasmScript(i) + buf.WriteString(fmt.Sprintf("script%d:\n", i)) + buf.WriteString(dis) + } + return buf.String() })) return scriptError(ErrEvalFalse, "false stack entry at end of script execution") @@ -433,25 +930,38 @@ func (vm *Engine) CheckErrorCondition(finalScript bool) error { return nil } -// Step will execute the next instruction and move the program counter to the -// next opcode in the script, or the next script if the current has ended. Step -// will return true in the case that the last opcode was successfully executed. +// Step executes the next instruction and moves the program counter to the next +// opcode in the script, or the next script if the current has ended. Step will +// return true in the case that the last opcode was successfully executed. // // The result of calling Step or any other method is undefined if an error is // returned. func (vm *Engine) Step() (done bool, err error) { - // Verify that it is pointing to a valid script address. - err = vm.validPC() - if err != nil { + // Verify the engine is pointing to a valid program counter. + if err := vm.checkValidPC(); err != nil { return true, err } - opcode := &vm.scripts[vm.scriptIdx][vm.scriptOff] - vm.scriptOff++ + + // Attempt to parse the next opcode from the current script. + if !vm.tokenizer.Next() { + // Note that due to the fact that all scripts are checked for parse + // failures before this code ever runs, there should never be an error + // here, but check again to be safe in case a refactor breaks that + // assumption or new script versions are introduced with different + // semantics. + if err := vm.tokenizer.Err(); err != nil { + return false, err + } + + str := fmt.Sprintf("attempt to step beyond script index %d (bytes %x)", + vm.scriptIdx, vm.scripts[vm.scriptIdx]) + return true, scriptError(ErrInvalidProgramCounter, str) + } // Execute the opcode while taking into account several things such as - // disabled opcodes, illegal opcodes, maximum allowed operations per - // script, maximum script element sizes, and conditionals. - err = vm.executeOpcode(opcode) + // disabled opcodes, illegal opcodes, maximum allowed operations per script, + // maximum script element sizes, and conditionals. + err = vm.executeOpcode(vm.tokenizer.op, vm.tokenizer.Data()) if err != nil { return true, err } @@ -466,43 +976,53 @@ func (vm *Engine) Step() (done bool, err error) { } // Prepare for next instruction. - if vm.scriptOff >= len(vm.scripts[vm.scriptIdx]) { - // Illegal to have an `if' that straddles two scripts. - if err == nil && len(vm.condStack) != 0 { + vm.opcodeIdx++ + if vm.tokenizer.Done() { + // Illegal to have a conditional that straddles two scripts. + if len(vm.condStack) != 0 { return false, scriptError(ErrUnbalancedConditional, "end of script reached in conditional execution") } - // Alt stack doesn't persist. + // Alt stack doesn't persist between scripts. _ = vm.astack.DropN(vm.astack.Depth()) - vm.numOps = 0 // number of ops is per script. - vm.scriptOff = 0 - if vm.scriptIdx == 0 && vm.bip16 { + // The number of operations is per script. + vm.numOps = 0 + + // Reset the opcode index for the next script. + vm.opcodeIdx = 0 + + // Advance to the next script as needed. + switch { + case vm.scriptIdx == 0 && vm.bip16: vm.scriptIdx++ vm.savedFirstStack = vm.GetStack() - } else if vm.scriptIdx == 1 && vm.bip16 { + + case vm.scriptIdx == 1 && vm.bip16: // Put us past the end for CheckErrorCondition() vm.scriptIdx++ - // Check script ran successfully and pull the script - // out of the first stack and execute that. + + // Check script ran successfully. err := vm.CheckErrorCondition(false) if err != nil { return false, err } + // Obtain the redeem script from the first stack and ensure it + // parses. script := vm.savedFirstStack[len(vm.savedFirstStack)-1] - pops, err := parseScript(script) - if err != nil { + if err := checkScriptParses(vm.version, script); err != nil { return false, err } - vm.scripts = append(vm.scripts, pops) + vm.scripts = append(vm.scripts, script) - // Set stack to be the stack from first script minus the + // Set stack to be the stack from first script minus the redeem // script itself vm.SetStack(vm.savedFirstStack[:len(vm.savedFirstStack)-1]) - } else if (vm.scriptIdx == 1 && vm.witnessProgram != nil) || - (vm.scriptIdx == 2 && vm.witnessProgram != nil && vm.bip16) { // Nested P2SH. + + case vm.scriptIdx == 1 && vm.witnessProgram != nil, + vm.scriptIdx == 2 && vm.witnessProgram != nil && vm.bip16: // np2sh vm.scriptIdx++ @@ -510,30 +1030,73 @@ func (vm *Engine) Step() (done bool, err error) { if err := vm.verifyWitnessProgram(witness); err != nil { return false, err } - } else { + + default: vm.scriptIdx++ } - // there are zero length scripts in the wild - if vm.scriptIdx < len(vm.scripts) && vm.scriptOff >= len(vm.scripts[vm.scriptIdx]) { + + // Skip empty scripts. + if vm.scriptIdx < len(vm.scripts) && len(vm.scripts[vm.scriptIdx]) == 0 { vm.scriptIdx++ } + vm.lastCodeSep = 0 if vm.scriptIdx >= len(vm.scripts) { return true, nil } + + // Finally, update the current tokenizer used to parse through scripts + // one opcode at a time to start from the beginning of the new script + // associated with the program counter. + vm.tokenizer = MakeScriptTokenizer(vm.version, vm.scripts[vm.scriptIdx]) } + return false, nil } +// copyStack makes a deep copy of the provided slice. +func copyStack(stk [][]byte) [][]byte { + c := make([][]byte, len(stk)) + for i := range stk { + c[i] = make([]byte, len(stk[i])) + copy(c[i][:], stk[i][:]) + } + + return c +} + // Execute will execute all scripts in the script engine and return either nil // for successful validation or an error if one occurred. func (vm *Engine) Execute() (err error) { + // All script versions other than 0 currently execute without issue, + // making all outputs to them anyone can pay. In the future this + // will allow for the addition of new scripting languages. + if vm.version != 0 { + return nil + } + + // If the stepCallback is set, we start by making a call back with the + // initial engine state. + var stepInfo *StepInfo + if vm.stepCallback != nil { + stepInfo = &StepInfo{ + ScriptIndex: vm.scriptIdx, + OpcodeIndex: vm.opcodeIdx, + Stack: copyStack(vm.dstack.stk), + AltStack: copyStack(vm.astack.stk), + } + err := vm.stepCallback(stepInfo) + if err != nil { + return err + } + } + done := false for !done { log.Tracef("%v", newLogClosure(func() string { dis, err := vm.DisasmPC() if err != nil { - return fmt.Sprintf("stepping (%v)", err) + return fmt.Sprintf("stepping - failed to disasm pc: %v", err) } return fmt.Sprintf("stepping %v", dis) })) @@ -545,7 +1108,7 @@ func (vm *Engine) Execute() (err error) { log.Tracef("%v", newLogClosure(func() string { var dstr, astr string - // if we're tracing, dump the stacks. + // Log the non-empty stacks when tracing. if vm.dstack.Depth() != 0 { dstr = "Stack:\n" + vm.dstack.String() } @@ -555,13 +1118,38 @@ func (vm *Engine) Execute() (err error) { return dstr + astr })) + + if vm.stepCallback != nil { + scriptIdx := vm.scriptIdx + opcodeIdx := vm.opcodeIdx + + // In case the execution has completed, we keep the + // current script index while increasing the opcode + // index. This is to indicate that no new script is + // being executed. + if done { + scriptIdx = stepInfo.ScriptIndex + opcodeIdx = stepInfo.OpcodeIndex + 1 + } + + stepInfo = &StepInfo{ + ScriptIndex: scriptIdx, + OpcodeIndex: opcodeIdx, + Stack: copyStack(vm.dstack.stk), + AltStack: copyStack(vm.astack.stk), + } + err := vm.stepCallback(stepInfo) + if err != nil { + return err + } + } } return vm.CheckErrorCondition(true) } // subScript returns the script since the last OP_CODESEPARATOR. -func (vm *Engine) subScript() []parsedOpcode { +func (vm *Engine) subScript() []byte { return vm.scripts[vm.scriptIdx][vm.lastCodeSep:] } @@ -580,13 +1168,35 @@ func (vm *Engine) checkHashTypeEncoding(hashType SigHashType) error { return nil } +// isStrictPubKeyEncoding returns whether or not the passed public key adheres +// to the strict encoding requirements. +func isStrictPubKeyEncoding(pubKey []byte) bool { + if len(pubKey) == 33 && (pubKey[0] == 0x02 || pubKey[0] == 0x03) { + // Compressed + return true + } + if len(pubKey) == 65 { + switch pubKey[0] { + case 0x04: + // Uncompressed + return true + + case 0x06, 0x07: + // Hybrid + return true + } + } + return false +} + // checkPubKeyEncoding returns whether or not the passed public key adheres to // the strict encoding requirements if enabled. func (vm *Engine) checkPubKeyEncoding(pubKey []byte) error { if vm.hasFlag(ScriptVerifyWitnessPubKeyType) && - vm.isWitnessVersionActive(0) && !btcec.IsCompressedPubKey(pubKey) { + vm.isWitnessVersionActive(BaseSegwitWitnessVersion) && + !btcec.IsCompressedPubKey(pubKey) { - str := "only uncompressed keys are accepted post-segwit" + str := "only compressed keys are accepted post-segwit" return scriptError(ErrWitnessPubKeyType, str) } @@ -808,7 +1418,7 @@ func (vm *Engine) checkSignatureEncoding(sig []byte) error { func getStack(stack *stack) [][]byte { array := make([][]byte, stack.Depth()) for i := range array { - // PeekByteArry can't fail due to overflow, already checked + // PeekByteArray can't fail due to overflow, already checked array[len(array)-i-1], _ = stack.PeekByteArray(int32(i)) } return array @@ -853,7 +1463,10 @@ func (vm *Engine) SetAltStack(data [][]byte) { // transaction, and input index. The flags modify the behavior of the script // engine according to the description provided by each flag. func NewEngine(scriptPubKey []byte, tx *wire.MsgTx, txIdx int, flags ScriptFlags, - sigCache *SigCache, hashCache *TxSigHashes, inputAmount int64) (*Engine, error) { + sigCache *SigCache, hashCache *TxSigHashes, inputAmount int64, + prevOutFetcher PrevOutputFetcher) (*Engine, error) { + + const scriptVersion = 0 // The provided transaction input index must refer to a valid input. if txIdx < 0 || txIdx >= len(tx.TxIn) { @@ -863,10 +1476,10 @@ func NewEngine(scriptPubKey []byte, tx *wire.MsgTx, txIdx int, flags ScriptFlags } scriptSig := tx.TxIn[txIdx].SignatureScript - // When both the signature script and public key script are empty the - // result is necessarily an error since the stack would end up being - // empty which is equivalent to a false top element. Thus, just return - // the relevant error now as an optimization. + // When both the signature script and public key script are empty the result + // is necessarily an error since the stack would end up being empty which is + // equivalent to a false top element. Thus, just return the relevant error + // now as an optimization. if len(scriptSig) == 0 && len(scriptPubKey) == 0 { return nil, scriptError(ErrEvalFalse, "false stack entry at end of script execution") @@ -882,8 +1495,13 @@ func NewEngine(scriptPubKey []byte, tx *wire.MsgTx, txIdx int, flags ScriptFlags // it possible to have a situation where P2SH would not be a soft fork // when it should be. The same goes for segwit which will pull in // additional scripts for execution from the witness stack. - vm := Engine{flags: flags, sigCache: sigCache, hashCache: hashCache, - inputAmount: inputAmount} + vm := Engine{ + flags: flags, + sigCache: sigCache, + hashCache: hashCache, + inputAmount: inputAmount, + prevOutFetcher: prevOutFetcher, + } if vm.hasFlag(ScriptVerifyCleanStack) && (!vm.hasFlag(ScriptBip16) && !vm.hasFlag(ScriptVerifyWitness)) { return nil, scriptError(ErrInvalidFlags, @@ -897,40 +1515,45 @@ func NewEngine(scriptPubKey []byte, tx *wire.MsgTx, txIdx int, flags ScriptFlags "signature script is not push only") } - // The engine stores the scripts in parsed form using a slice. This - // allows multiple scripts to be executed in sequence. For example, - // with a pay-to-script-hash transaction, there will be ultimately be - // a third script to execute. + // The signature script must only contain data pushes for PS2H which is + // determined based on the form of the public key script. + if vm.hasFlag(ScriptBip16) && isScriptHashScript(scriptPubKey) { + // Only accept input scripts that push data for P2SH. + // Notice that the push only checks have already been done when + // the flag to verify signature scripts are push only is set + // above, so avoid checking again. + alreadyChecked := vm.hasFlag(ScriptVerifySigPushOnly) + if !alreadyChecked && !IsPushOnlyScript(scriptSig) { + return nil, scriptError(ErrNotPushOnly, + "pay to script hash is not push only") + } + vm.bip16 = true + } + + // The engine stores the scripts using a slice. This allows multiple + // scripts to be executed in sequence. For example, with a + // pay-to-script-hash transaction, there will be ultimately be a third + // script to execute. scripts := [][]byte{scriptSig, scriptPubKey} - vm.scripts = make([][]parsedOpcode, len(scripts)) - for i, scr := range scripts { + for _, scr := range scripts { if len(scr) > MaxScriptSize { - str := fmt.Sprintf("script size %d is larger than max "+ - "allowed size %d", len(scr), MaxScriptSize) + str := fmt.Sprintf("script size %d is larger than max allowed "+ + "size %d", len(scr), MaxScriptSize) return nil, scriptError(ErrScriptTooBig, str) } - var err error - vm.scripts[i], err = parseScript(scr) - if err != nil { + + const scriptVersion = 0 + if err := checkScriptParses(scriptVersion, scr); err != nil { return nil, err } } + vm.scripts = scripts // Advance the program counter to the public key script if the signature - // script is empty since there is nothing to execute for it in that - // case. - if len(scripts[0]) == 0 { + // script is empty since there is nothing to execute for it in that case. + if len(scriptSig) == 0 { vm.scriptIdx++ } - - if vm.hasFlag(ScriptBip16) && isScriptHash(vm.scripts[1]) { - // Only accept input scripts that push data for P2SH. - if !isPushOnly(vm.scripts[0]) { - return nil, scriptError(ErrNotPushOnly, - "pay to script hash is not push only") - } - vm.bip16 = true - } if vm.hasFlag(ScriptVerifyMinimalData) { vm.dstack.verifyMinimalData = true vm.astack.verifyMinimalData = true @@ -952,7 +1575,7 @@ func NewEngine(scriptPubKey []byte, tx *wire.MsgTx, txIdx int, flags ScriptFlags var witProgram []byte switch { - case isWitnessProgram(vm.scripts[1]): + case IsWitnessProgram(vm.scripts[1]): // The scriptSig must be *empty* for all native witness // programs, otherwise we introduce malleability. if len(scriptSig) != 0 { @@ -967,10 +1590,11 @@ func NewEngine(scriptPubKey []byte, tx *wire.MsgTx, txIdx int, flags ScriptFlags // data push of the witness program, otherwise we // reintroduce malleability. sigPops := vm.scripts[0] - if len(sigPops) == 1 && canonicalPush(sigPops[0]) && - IsWitnessProgram(sigPops[0].data) { + if len(sigPops) > 2 && + isCanonicalPush(sigPops[0], sigPops[1:]) && + IsWitnessProgram(sigPops[1:]) { - witProgram = sigPops[0].data + witProgram = sigPops[1:] } else { errStr := "signature script for witness " + "nested p2sh is not canonical" @@ -980,7 +1604,9 @@ func NewEngine(scriptPubKey []byte, tx *wire.MsgTx, txIdx int, flags ScriptFlags if witProgram != nil { var err error - vm.witnessVersion, vm.witnessProgram, err = ExtractWitnessProgramInfo(witProgram) + vm.witnessVersion, vm.witnessProgram, err = ExtractWitnessProgramInfo( + witProgram, + ) if err != nil { return nil, err } @@ -997,8 +1623,31 @@ func NewEngine(scriptPubKey []byte, tx *wire.MsgTx, txIdx int, flags ScriptFlags } + // Setup the current tokenizer used to parse through the script one opcode + // at a time with the script associated with the program counter. + vm.tokenizer = MakeScriptTokenizer(scriptVersion, scripts[vm.scriptIdx]) + vm.tx = *tx vm.txIdx = txIdx return &vm, nil } + +// NewEngine returns a new script engine with a script execution callback set. +// This is useful for debugging script execution. +func NewDebugEngine(scriptPubKey []byte, tx *wire.MsgTx, txIdx int, + flags ScriptFlags, sigCache *SigCache, hashCache *TxSigHashes, + inputAmount int64, prevOutFetcher PrevOutputFetcher, + stepCallback func(*StepInfo) error) (*Engine, error) { + + vm, err := NewEngine( + scriptPubKey, tx, txIdx, flags, sigCache, hashCache, + inputAmount, prevOutFetcher, + ) + if err != nil { + return nil, err + } + + vm.stepCallback = stepCallback + return vm, nil +} diff --git a/txscript/engine_debug_test.go b/txscript/engine_debug_test.go new file mode 100644 index 0000000000..aa7283e22f --- /dev/null +++ b/txscript/engine_debug_test.go @@ -0,0 +1,178 @@ +// Copyright (c) 2013-2023 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package txscript + +import ( + "testing" + + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcec/v2/schnorr" + "github.com/btcsuite/btcd/wire" + "github.com/stretchr/testify/require" +) + +// TestDebugEngine checks that the StepCallback called during debug script +// execution contains the expected data. +func TestDebugEngine(t *testing.T) { + t.Parallel() + + // We'll generate a private key and a signature for the tx. + privKey, err := btcec.NewPrivateKey() + require.NoError(t, err) + + internalKey := privKey.PubKey() + + // We use a simple script that will utilize both the stack and alt + // stack in order to test the step callback, and wrap it in a taproot + // witness script. + builder := NewScriptBuilder() + builder.AddData([]byte{0xab}) + builder.AddOp(OP_TOALTSTACK) + builder.AddData(schnorr.SerializePubKey(internalKey)) + builder.AddOp(OP_CHECKSIG) + builder.AddOp(OP_VERIFY) + builder.AddOp(OP_1) + pkScript, err := builder.Script() + require.NoError(t, err) + + tapLeaf := NewBaseTapLeaf(pkScript) + tapScriptTree := AssembleTaprootScriptTree(tapLeaf) + + ctrlBlock := tapScriptTree.LeafMerkleProofs[0].ToControlBlock( + internalKey, + ) + + tapScriptRootHash := tapScriptTree.RootNode.TapHash() + outputKey := ComputeTaprootOutputKey( + internalKey, tapScriptRootHash[:], + ) + p2trScript, err := PayToTaprootScript(outputKey) + require.NoError(t, err) + + testTx := wire.NewMsgTx(2) + testTx.AddTxIn(&wire.TxIn{ + PreviousOutPoint: wire.OutPoint{ + Index: 1, + }, + }) + txOut := &wire.TxOut{ + Value: 1e8, PkScript: p2trScript, + } + testTx.AddTxOut(txOut) + + prevFetcher := NewCannedPrevOutputFetcher( + txOut.PkScript, txOut.Value, + ) + sigHashes := NewTxSigHashes(testTx, prevFetcher) + + sig, err := RawTxInTapscriptSignature( + testTx, sigHashes, 0, txOut.Value, + txOut.PkScript, tapLeaf, + SigHashDefault, privKey, + ) + require.NoError(t, err) + + // Now that we have the sig, we'll make a valid witness + // including the control block. + ctrlBlockBytes, err := ctrlBlock.ToBytes() + require.NoError(t, err) + txCopy := testTx.Copy() + txCopy.TxIn[0].Witness = wire.TxWitness{ + sig, pkScript, ctrlBlockBytes, + } + + expCallback := []StepInfo{ + // First callback is looking at the OP_1 witness version. + { + ScriptIndex: 1, + OpcodeIndex: 0, + Stack: [][]byte{}, + AltStack: [][]byte{}, + }, + // The OP_1 witness version is pushed to stack, + { + ScriptIndex: 1, + OpcodeIndex: 1, + Stack: [][]byte{{0x01}}, + AltStack: [][]byte{}, + }, + // Then the taproot script is being executed, starting with + // only the signature on the stacks. + { + ScriptIndex: 2, + OpcodeIndex: 0, + Stack: [][]byte{sig}, + AltStack: [][]byte{}, + }, + // 0xab is pushed to the stack. + { + ScriptIndex: 2, + OpcodeIndex: 1, + Stack: [][]byte{sig, {0xab}}, + AltStack: [][]byte{}, + }, + // 0xab is moved to the alt stack. + { + ScriptIndex: 2, + OpcodeIndex: 2, + Stack: [][]byte{sig}, + AltStack: [][]byte{{0xab}}, + }, + // The public key is pushed to the stack. + { + ScriptIndex: 2, + OpcodeIndex: 3, + Stack: [][]byte{ + sig, + schnorr.SerializePubKey(internalKey), + }, + AltStack: [][]byte{{0xab}}, + }, + // OP_CHECKSIG is executed, resulting in 0x01 on the stack. + { + ScriptIndex: 2, + OpcodeIndex: 4, + Stack: [][]byte{ + {0x01}, + }, + AltStack: [][]byte{{0xab}}, + }, + // OP_VERIFY pops and checks the top stack element. + { + ScriptIndex: 2, + OpcodeIndex: 5, + Stack: [][]byte{}, + AltStack: [][]byte{{0xab}}, + }, + // A single OP_1 push completes the script execution (note that + // the alt stack is cleared when the script is "done"). + { + ScriptIndex: 2, + OpcodeIndex: 6, + Stack: [][]byte{{0x01}}, + AltStack: [][]byte{}, + }, + } + + stepIndex := 0 + callback := func(s *StepInfo) error { + require.Less( + t, stepIndex, len(expCallback), "unexpected callback", + ) + + require.Equal(t, &expCallback[stepIndex], s) + stepIndex++ + return nil + } + + // Run the debug engine. + vm, err := NewDebugEngine( + txOut.PkScript, txCopy, 0, StandardVerifyFlags, + nil, sigHashes, txOut.Value, prevFetcher, + callback, + ) + require.NoError(t, err) + require.NoError(t, vm.Execute()) +} diff --git a/txscript/engine_test.go b/txscript/engine_test.go index 2e8c522c1a..c88d27a60e 100644 --- a/txscript/engine_test.go +++ b/txscript/engine_test.go @@ -1,4 +1,5 @@ // Copyright (c) 2013-2017 The btcsuite developers +// Copyright (c) 2015-2019 The Decred developers // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. @@ -11,16 +12,16 @@ import ( "github.com/btcsuite/btcd/wire" ) -// TestBadPC sets the pc to a deliberately bad result then confirms that Step() +// TestBadPC sets the pc to a deliberately bad result then confirms that Step // and Disasm fail correctly. func TestBadPC(t *testing.T) { t.Parallel() tests := []struct { - script, off int + scriptIdx int }{ - {script: 2, off: 0}, - {script: 0, off: 2}, + {scriptIdx: 2}, + {scriptIdx: 3}, } // tx with almost empty scripts. @@ -54,25 +55,25 @@ func TestBadPC(t *testing.T) { pkScript := mustParseShortForm("NOP") for _, test := range tests { - vm, err := NewEngine(pkScript, tx, 0, 0, nil, nil, -1) + vm, err := NewEngine(pkScript, tx, 0, 0, nil, nil, -1, nil) if err != nil { t.Errorf("Failed to create script: %v", err) } - // set to after all scripts - vm.scriptIdx = test.script - vm.scriptOff = test.off + // Set to after all scripts. + vm.scriptIdx = test.scriptIdx + // Ensure attempting to step fails. _, err = vm.Step() if err == nil { t.Errorf("Step with invalid pc (%v) succeeds!", test) continue } + // Ensure attempting to disassemble the current program counter fails. _, err = vm.DisasmPC() if err == nil { - t.Errorf("DisasmPC with invalid pc (%v) succeeds!", - test) + t.Errorf("DisasmPC with invalid pc (%v) succeeds!", test) } } } @@ -111,7 +112,7 @@ func TestCheckErrorCondition(t *testing.T) { pkScript := mustParseShortForm("NOP NOP NOP NOP NOP NOP NOP NOP NOP" + " NOP TRUE") - vm, err := NewEngine(pkScript, tx, 0, 0, nil, nil, 0) + vm, err := NewEngine(pkScript, tx, 0, 0, nil, nil, 0, nil) if err != nil { t.Errorf("failed to create script: %v", err) } @@ -122,12 +123,12 @@ func TestCheckErrorCondition(t *testing.T) { t.Fatalf("failed to step %dth time: %v", i, err) } if done { - t.Fatalf("finshed early on %dth time", i) + t.Fatalf("finished early on %dth time", i) } err = vm.CheckErrorCondition(false) if !IsErrorCode(err, ErrScriptUnfinished) { - t.Fatalf("got unexepected error %v on %dth iteration", + t.Fatalf("got unexpected error %v on %dth iteration", err, i) } } @@ -187,7 +188,7 @@ func TestInvalidFlagCombinations(t *testing.T) { pkScript := []byte{OP_NOP} for i, test := range tests { - _, err := NewEngine(pkScript, tx, 0, test, nil, nil, -1) + _, err := NewEngine(pkScript, tx, 0, test, nil, nil, -1, nil) if !IsErrorCode(err, ErrInvalidFlags) { t.Fatalf("TestInvalidFlagCombinations #%d unexpected "+ "error: %v", i, err) diff --git a/txscript/error.go b/txscript/error.go index a61d02729f..a5aaab1571 100644 --- a/txscript/error.go +++ b/txscript/error.go @@ -1,4 +1,5 @@ // Copyright (c) 2013-2017 The btcsuite developers +// Copyright (c) 2015-2019 The Decred developers // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. @@ -47,6 +48,10 @@ const ( // the provided data exceeds MaxDataCarrierSize. ErrTooMuchNullData + // ErrUnsupportedScriptVersion is returned when an unsupported script + // version is passed to a function which deals with script analysis. + ErrUnsupportedScriptVersion + // ------------------------------------------ // Failures related to final execution state. // ------------------------------------------ @@ -262,7 +267,7 @@ const ( ErrPubKeyType // ErrCleanStack is returned when the ScriptVerifyCleanStack flag - // is set, and after evalution, the stack does not contain only a + // is set, and after evaluation, the stack does not contain only a // single element. ErrCleanStack @@ -304,9 +309,9 @@ const ( ErrMinimalIf // ErrDiscourageUpgradableWitnessProgram is returned if - // ScriptVerifyWitness is set and the versino of an executing witness + // ScriptVerifyWitness is set and the version of an executing witness // program is outside the set of currently defined witness program - // vesions. + // versions. ErrDiscourageUpgradableWitnessProgram // ---------------------------------------- @@ -338,6 +343,79 @@ const ( // serialized in a compressed format. ErrWitnessPubKeyType + // ---------------------------- + // Failures related to taproot. + // ---------------------------- + + // ErrDiscourageOpSuccess is returned if + // ScriptVerifyDiscourageOpSuccess is active, and a OP_SUCCESS op code + // is encountered during tapscript validation. + ErrDiscourageOpSuccess + + // ErrDiscourageUpgradeableTaprootVersion is returned if + // ScriptVerifyDiscourageUpgradeableTaprootVersion is active and a leaf + // version encountered isn't the base leaf version. + ErrDiscourageUpgradeableTaprootVersion + + // ErrTapscriptCheckMultisig is returned if a script attempts to use + // OP_CHECKMULTISIGVERIFY or OP_CHECKMULTISIG during tapscript + // execution. + ErrTapscriptCheckMultisig + + // ErrDiscourageUpgradeableTaprootVersion is returned if during + // tapscript execution, we encounter a public key that isn't 0 or 32 + // bytes. + ErrDiscourageUpgradeablePubKeyType + + // ErrTaprootSigInvalid is returned when an invalid taproot key spend + // signature is encountered. + ErrTaprootSigInvalid + + // ErrTaprootMerkleProofInvalid is returned when the revealed script + // merkle proof for a taproot spend is found to be invalid. + ErrTaprootMerkleProofInvalid + + // ErrTaprootOutputKeyParityMismatch is returned when the control block + // proof is valid, but the parity of the y-coordinate of the derived + // key doesn't match the value encoded in the control block. + ErrTaprootOutputKeyParityMismatch + + // ErrControlBlockTooSmall is returned when a parsed control block is + // less than 33 bytes. + ErrControlBlockTooSmall + + // ErrControlBlockTooLarge is returned when the control block is larger + // than the largest possible proof for a merkle script tree. + ErrControlBlockTooLarge + + // ErrControlBlockInvalidLength is returned when the control block, + // without the public key isn't a multiple of 32. + ErrControlBlockInvalidLength + + // ErrWitnessHasNoAnnex is returned when a caller attempts to extract + // an annex, but the witness has no annex present. + ErrWitnessHasNoAnnex + + // ErrInvalidTaprootSigLen is returned when taproot signature isn't 64 + // or 65 bytes. + ErrInvalidTaprootSigLen + + // ErrTaprootPubkeyIsEmpty is returned when a signature checking op + // code encounters an empty public key. + ErrTaprootPubkeyIsEmpty + + // ErrTaprootMaxSigOps is returned when the number of allotted sig ops + // is exceeded during taproot execution. + ErrTaprootMaxSigOps + + // ErrNonConstScriptCode is returned when a signature match is found when + // calling removeOpcodeByData in a non-segwit script. + ErrNonConstScriptCode + + // ErrCodeSeparator is returned when OP_CODESEPARATOR is used in a + // non-segwit script. + ErrCodeSeparator + // numErrorCodes is the maximum error code number used in tests. This // entry MUST be the last entry in the enum. numErrorCodes @@ -345,70 +423,87 @@ const ( // Map of ErrorCode values back to their constant names for pretty printing. var errorCodeStrings = map[ErrorCode]string{ - ErrInternal: "ErrInternal", - ErrInvalidFlags: "ErrInvalidFlags", - ErrInvalidIndex: "ErrInvalidIndex", - ErrUnsupportedAddress: "ErrUnsupportedAddress", - ErrNotMultisigScript: "ErrNotMultisigScript", - ErrTooManyRequiredSigs: "ErrTooManyRequiredSigs", - ErrTooMuchNullData: "ErrTooMuchNullData", - ErrEarlyReturn: "ErrEarlyReturn", - ErrEmptyStack: "ErrEmptyStack", - ErrEvalFalse: "ErrEvalFalse", - ErrScriptUnfinished: "ErrScriptUnfinished", - ErrInvalidProgramCounter: "ErrInvalidProgramCounter", - ErrScriptTooBig: "ErrScriptTooBig", - ErrElementTooBig: "ErrElementTooBig", - ErrTooManyOperations: "ErrTooManyOperations", - ErrStackOverflow: "ErrStackOverflow", - ErrInvalidPubKeyCount: "ErrInvalidPubKeyCount", - ErrInvalidSignatureCount: "ErrInvalidSignatureCount", - ErrNumberTooBig: "ErrNumberTooBig", - ErrVerify: "ErrVerify", - ErrEqualVerify: "ErrEqualVerify", - ErrNumEqualVerify: "ErrNumEqualVerify", - ErrCheckSigVerify: "ErrCheckSigVerify", - ErrCheckMultiSigVerify: "ErrCheckMultiSigVerify", - ErrDisabledOpcode: "ErrDisabledOpcode", - ErrReservedOpcode: "ErrReservedOpcode", - ErrMalformedPush: "ErrMalformedPush", - ErrInvalidStackOperation: "ErrInvalidStackOperation", - ErrUnbalancedConditional: "ErrUnbalancedConditional", - ErrMinimalData: "ErrMinimalData", - ErrInvalidSigHashType: "ErrInvalidSigHashType", - ErrSigTooShort: "ErrSigTooShort", - ErrSigTooLong: "ErrSigTooLong", - ErrSigInvalidSeqID: "ErrSigInvalidSeqID", - ErrSigInvalidDataLen: "ErrSigInvalidDataLen", - ErrSigMissingSTypeID: "ErrSigMissingSTypeID", - ErrSigMissingSLen: "ErrSigMissingSLen", - ErrSigInvalidSLen: "ErrSigInvalidSLen", - ErrSigInvalidRIntID: "ErrSigInvalidRIntID", - ErrSigZeroRLen: "ErrSigZeroRLen", - ErrSigNegativeR: "ErrSigNegativeR", - ErrSigTooMuchRPadding: "ErrSigTooMuchRPadding", - ErrSigInvalidSIntID: "ErrSigInvalidSIntID", - ErrSigZeroSLen: "ErrSigZeroSLen", - ErrSigNegativeS: "ErrSigNegativeS", - ErrSigTooMuchSPadding: "ErrSigTooMuchSPadding", - ErrSigHighS: "ErrSigHighS", - ErrNotPushOnly: "ErrNotPushOnly", - ErrSigNullDummy: "ErrSigNullDummy", - ErrPubKeyType: "ErrPubKeyType", - ErrCleanStack: "ErrCleanStack", - ErrNullFail: "ErrNullFail", - ErrDiscourageUpgradableNOPs: "ErrDiscourageUpgradableNOPs", - ErrNegativeLockTime: "ErrNegativeLockTime", - ErrUnsatisfiedLockTime: "ErrUnsatisfiedLockTime", - ErrWitnessProgramEmpty: "ErrWitnessProgramEmpty", - ErrWitnessProgramMismatch: "ErrWitnessProgramMismatch", - ErrWitnessProgramWrongLength: "ErrWitnessProgramWrongLength", - ErrWitnessMalleated: "ErrWitnessMalleated", - ErrWitnessMalleatedP2SH: "ErrWitnessMalleatedP2SH", - ErrWitnessUnexpected: "ErrWitnessUnexpected", - ErrMinimalIf: "ErrMinimalIf", - ErrWitnessPubKeyType: "ErrWitnessPubKeyType", - ErrDiscourageUpgradableWitnessProgram: "ErrDiscourageUpgradableWitnessProgram", + ErrInternal: "ErrInternal", + ErrInvalidFlags: "ErrInvalidFlags", + ErrInvalidIndex: "ErrInvalidIndex", + ErrUnsupportedAddress: "ErrUnsupportedAddress", + ErrNotMultisigScript: "ErrNotMultisigScript", + ErrTooManyRequiredSigs: "ErrTooManyRequiredSigs", + ErrTooMuchNullData: "ErrTooMuchNullData", + ErrUnsupportedScriptVersion: "ErrUnsupportedScriptVersion", + ErrEarlyReturn: "ErrEarlyReturn", + ErrEmptyStack: "ErrEmptyStack", + ErrEvalFalse: "ErrEvalFalse", + ErrScriptUnfinished: "ErrScriptUnfinished", + ErrInvalidProgramCounter: "ErrInvalidProgramCounter", + ErrScriptTooBig: "ErrScriptTooBig", + ErrElementTooBig: "ErrElementTooBig", + ErrTooManyOperations: "ErrTooManyOperations", + ErrStackOverflow: "ErrStackOverflow", + ErrInvalidPubKeyCount: "ErrInvalidPubKeyCount", + ErrInvalidSignatureCount: "ErrInvalidSignatureCount", + ErrNumberTooBig: "ErrNumberTooBig", + ErrVerify: "ErrVerify", + ErrEqualVerify: "ErrEqualVerify", + ErrNumEqualVerify: "ErrNumEqualVerify", + ErrCheckSigVerify: "ErrCheckSigVerify", + ErrCheckMultiSigVerify: "ErrCheckMultiSigVerify", + ErrDisabledOpcode: "ErrDisabledOpcode", + ErrReservedOpcode: "ErrReservedOpcode", + ErrMalformedPush: "ErrMalformedPush", + ErrInvalidStackOperation: "ErrInvalidStackOperation", + ErrUnbalancedConditional: "ErrUnbalancedConditional", + ErrMinimalData: "ErrMinimalData", + ErrInvalidSigHashType: "ErrInvalidSigHashType", + ErrSigTooShort: "ErrSigTooShort", + ErrSigTooLong: "ErrSigTooLong", + ErrSigInvalidSeqID: "ErrSigInvalidSeqID", + ErrSigInvalidDataLen: "ErrSigInvalidDataLen", + ErrSigMissingSTypeID: "ErrSigMissingSTypeID", + ErrSigMissingSLen: "ErrSigMissingSLen", + ErrSigInvalidSLen: "ErrSigInvalidSLen", + ErrSigInvalidRIntID: "ErrSigInvalidRIntID", + ErrSigZeroRLen: "ErrSigZeroRLen", + ErrSigNegativeR: "ErrSigNegativeR", + ErrSigTooMuchRPadding: "ErrSigTooMuchRPadding", + ErrSigInvalidSIntID: "ErrSigInvalidSIntID", + ErrSigZeroSLen: "ErrSigZeroSLen", + ErrSigNegativeS: "ErrSigNegativeS", + ErrSigTooMuchSPadding: "ErrSigTooMuchSPadding", + ErrSigHighS: "ErrSigHighS", + ErrNotPushOnly: "ErrNotPushOnly", + ErrSigNullDummy: "ErrSigNullDummy", + ErrPubKeyType: "ErrPubKeyType", + ErrCleanStack: "ErrCleanStack", + ErrNullFail: "ErrNullFail", + ErrDiscourageUpgradableNOPs: "ErrDiscourageUpgradableNOPs", + ErrNegativeLockTime: "ErrNegativeLockTime", + ErrUnsatisfiedLockTime: "ErrUnsatisfiedLockTime", + ErrWitnessProgramEmpty: "ErrWitnessProgramEmpty", + ErrWitnessProgramMismatch: "ErrWitnessProgramMismatch", + ErrWitnessProgramWrongLength: "ErrWitnessProgramWrongLength", + ErrWitnessMalleated: "ErrWitnessMalleated", + ErrWitnessMalleatedP2SH: "ErrWitnessMalleatedP2SH", + ErrWitnessUnexpected: "ErrWitnessUnexpected", + ErrMinimalIf: "ErrMinimalIf", + ErrWitnessPubKeyType: "ErrWitnessPubKeyType", + ErrDiscourageUpgradableWitnessProgram: "ErrDiscourageUpgradableWitnessProgram", + ErrDiscourageOpSuccess: "ErrDiscourageOpSuccess", + ErrDiscourageUpgradeableTaprootVersion: "ErrDiscourageUpgradeableTaprootVersion", + ErrTapscriptCheckMultisig: "ErrTapscriptCheckMultisig", + ErrDiscourageUpgradeablePubKeyType: "ErrDiscourageUpgradeablePubKeyType", + ErrTaprootSigInvalid: "ErrTaprootSigInvalid", + ErrTaprootMerkleProofInvalid: "ErrTaprootMerkleProofInvalid", + ErrTaprootOutputKeyParityMismatch: "ErrTaprootOutputKeyParityMismatch", + ErrControlBlockTooSmall: "ErrControlBlockTooSmall", + ErrControlBlockTooLarge: "ErrControlBlockTooLarge", + ErrControlBlockInvalidLength: "ErrControlBlockInvalidLength", + ErrWitnessHasNoAnnex: "ErrWitnessHasNoAnnex", + ErrInvalidTaprootSigLen: "ErrInvalidTaprootSigLen", + ErrTaprootPubkeyIsEmpty: "ErrTaprootPubkeyIsEmpty", + ErrTaprootMaxSigOps: "ErrTaprootMaxSigOps", + ErrNonConstScriptCode: "ErrNonConstScriptCode", + ErrCodeSeparator: "ErrCodeSeparator", } // String returns the ErrorCode as a human-readable name. @@ -421,10 +516,10 @@ func (e ErrorCode) String() string { // Error identifies a script-related error. It is used to indicate three // classes of errors: -// 1) Script execution failures due to violating one of the many requirements -// imposed by the script engine or evaluating to false -// 2) Improper API usage by callers -// 3) Internal consistency check failures +// 1. Script execution failures due to violating one of the many requirements +// imposed by the script engine or evaluating to false +// 2. Improper API usage by callers +// 3. Internal consistency check failures // // The caller can use type assertions on the returned errors to access the // ErrorCode field to ascertain the specific reason for the error. As an diff --git a/txscript/error_test.go b/txscript/error_test.go index ebac85fdaa..bb1f73e92e 100644 --- a/txscript/error_test.go +++ b/txscript/error_test.go @@ -1,4 +1,5 @@ // Copyright (c) 2017 The btcsuite developers +// Copyright (c) 2015-2019 The Decred developers // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. @@ -22,6 +23,7 @@ func TestErrorCodeStringer(t *testing.T) { {ErrUnsupportedAddress, "ErrUnsupportedAddress"}, {ErrTooManyRequiredSigs, "ErrTooManyRequiredSigs"}, {ErrTooMuchNullData, "ErrTooMuchNullData"}, + {ErrUnsupportedScriptVersion, "ErrUnsupportedScriptVersion"}, {ErrNotMultisigScript, "ErrNotMultisigScript"}, {ErrEarlyReturn, "ErrEarlyReturn"}, {ErrEmptyStack, "ErrEmptyStack"}, @@ -79,7 +81,23 @@ func TestErrorCodeStringer(t *testing.T) { {ErrWitnessUnexpected, "ErrWitnessUnexpected"}, {ErrMinimalIf, "ErrMinimalIf"}, {ErrWitnessPubKeyType, "ErrWitnessPubKeyType"}, + {ErrDiscourageOpSuccess, "ErrDiscourageOpSuccess"}, + {ErrDiscourageUpgradeableTaprootVersion, "ErrDiscourageUpgradeableTaprootVersion"}, + {ErrTapscriptCheckMultisig, "ErrTapscriptCheckMultisig"}, {ErrDiscourageUpgradableWitnessProgram, "ErrDiscourageUpgradableWitnessProgram"}, + {ErrDiscourageUpgradeablePubKeyType, "ErrDiscourageUpgradeablePubKeyType"}, + {ErrTaprootSigInvalid, "ErrTaprootSigInvalid"}, + {ErrTaprootMerkleProofInvalid, "ErrTaprootMerkleProofInvalid"}, + {ErrTaprootOutputKeyParityMismatch, "ErrTaprootOutputKeyParityMismatch"}, + {ErrControlBlockTooSmall, "ErrControlBlockTooSmall"}, + {ErrControlBlockTooLarge, "ErrControlBlockTooLarge"}, + {ErrControlBlockInvalidLength, "ErrControlBlockInvalidLength"}, + {ErrWitnessHasNoAnnex, "ErrWitnessHasNoAnnex"}, + {ErrInvalidTaprootSigLen, "ErrInvalidTaprootSigLen"}, + {ErrTaprootPubkeyIsEmpty, "ErrTaprootPubkeyIsEmpty"}, + {ErrTaprootMaxSigOps, "ErrTaprootMaxSigOps"}, + {ErrNonConstScriptCode, "ErrNonConstScriptCode"}, + {ErrCodeSeparator, "ErrCodeSeparator"}, {0xffff, "Unknown ErrorCode (65535)"}, } diff --git a/txscript/example_test.go b/txscript/example_test.go index 7bf2b3f059..b8c7104b5a 100644 --- a/txscript/example_test.go +++ b/txscript/example_test.go @@ -1,4 +1,5 @@ // Copyright (c) 2014-2016 The btcsuite developers +// Copyright (c) 2015-2019 The Decred developers // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. @@ -8,12 +9,12 @@ import ( "encoding/hex" "fmt" - "github.com/btcsuite/btcd/btcec" + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) // This example demonstrates creating a script which pays to a bitcoin address. @@ -89,7 +90,7 @@ func ExampleSignTxOutput() { fmt.Println(err) return } - privKey, pubKey := btcec.PrivKeyFromBytes(btcec.S256(), privKeyBytes) + privKey, pubKey := btcec.PrivKeyFromBytes(privKeyBytes) pubKeyHash := btcutil.Hash160(pubKey.SerializeCompressed()) addr, err := btcutil.NewAddressPubKeyHash(pubKeyHash, &chaincfg.MainNetParams) @@ -166,7 +167,7 @@ func ExampleSignTxOutput() { txscript.ScriptStrictMultiSig | txscript.ScriptDiscourageUpgradableNops vm, err := txscript.NewEngine(originTx.TxOut[0].PkScript, redeemTx, 0, - flags, nil, nil, -1) + flags, nil, nil, -1, nil) if err != nil { fmt.Println(err) return @@ -180,3 +181,34 @@ func ExampleSignTxOutput() { // Output: // Transaction successfully signed } + +// This example demonstrates creating a script tokenizer instance and using it +// to count the number of opcodes a script contains. +func ExampleScriptTokenizer() { + // Create a script to use in the example. Ordinarily this would come from + // some other source. + hash160 := btcutil.Hash160([]byte("example")) + script, err := txscript.NewScriptBuilder().AddOp(txscript.OP_DUP). + AddOp(txscript.OP_HASH160).AddData(hash160). + AddOp(txscript.OP_EQUALVERIFY).AddOp(txscript.OP_CHECKSIG).Script() + if err != nil { + fmt.Printf("failed to build script: %v\n", err) + return + } + + // Create a tokenizer to iterate the script and count the number of opcodes. + const scriptVersion = 0 + var numOpcodes int + tokenizer := txscript.MakeScriptTokenizer(scriptVersion, script) + for tokenizer.Next() { + numOpcodes++ + } + if tokenizer.Err() != nil { + fmt.Printf("script failed to parse: %v\n", err) + } else { + fmt.Printf("script contains %d opcode(s)\n", numOpcodes) + } + + // Output: + // script contains 5 opcode(s) +} diff --git a/txscript/hashcache.go b/txscript/hashcache.go index f9c2caf76c..4a5f88fb24 100644 --- a/txscript/hashcache.go +++ b/txscript/hashcache.go @@ -5,30 +5,293 @@ package txscript import ( + "bytes" + "encoding/binary" + "math" "sync" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/wire" ) +// calcHashPrevOuts calculates a single hash of all the previous outputs +// (txid:index) referenced within the passed transaction. This calculated hash +// can be re-used when validating all inputs spending segwit outputs, with a +// signature hash type of SigHashAll. This allows validation to re-use previous +// hashing computation, reducing the complexity of validating SigHashAll inputs +// from O(N^2) to O(N). +func calcHashPrevOuts(tx *wire.MsgTx) chainhash.Hash { + var b bytes.Buffer + for _, in := range tx.TxIn { + // First write out the 32-byte transaction ID one of whose + // outputs are being referenced by this input. + b.Write(in.PreviousOutPoint.Hash[:]) + + // Next, we'll encode the index of the referenced output as a + // little endian integer. + var buf [4]byte + binary.LittleEndian.PutUint32(buf[:], in.PreviousOutPoint.Index) + b.Write(buf[:]) + } + + return chainhash.HashH(b.Bytes()) +} + +// calcHashSequence computes an aggregated hash of each of the sequence numbers +// within the inputs of the passed transaction. This single hash can be re-used +// when validating all inputs spending segwit outputs, which include signatures +// using the SigHashAll sighash type. This allows validation to re-use previous +// hashing computation, reducing the complexity of validating SigHashAll inputs +// from O(N^2) to O(N). +func calcHashSequence(tx *wire.MsgTx) chainhash.Hash { + var b bytes.Buffer + for _, in := range tx.TxIn { + var buf [4]byte + binary.LittleEndian.PutUint32(buf[:], in.Sequence) + b.Write(buf[:]) + } + + return chainhash.HashH(b.Bytes()) +} + +// calcHashOutputs computes a hash digest of all outputs created by the +// transaction encoded using the wire format. This single hash can be re-used +// when validating all inputs spending witness programs, which include +// signatures using the SigHashAll sighash type. This allows computation to be +// cached, reducing the total hashing complexity from O(N^2) to O(N). +func calcHashOutputs(tx *wire.MsgTx) chainhash.Hash { + var b bytes.Buffer + for _, out := range tx.TxOut { + wire.WriteTxOut(&b, 0, 0, out) + } + + return chainhash.HashH(b.Bytes()) +} + +// PrevOutputFetcher is an interface used to supply the sighash cache with the +// previous output information needed to calculate the pre-computed sighash +// midstate for taproot transactions. +type PrevOutputFetcher interface { + // FetchPrevOutput attempts to fetch the previous output referenced by + // the passed outpoint. A nil value will be returned if the passed + // outpoint doesn't exist. + FetchPrevOutput(wire.OutPoint) *wire.TxOut +} + +// CannedPrevOutputFetcher is an implementation of PrevOutputFetcher that only +// is able to return information for a single previous output. +type CannedPrevOutputFetcher struct { + pkScript []byte + amt int64 +} + +// NewCannedPrevOutputFetcher returns an instance of a CannedPrevOutputFetcher +// that can only return the TxOut defined by the passed script and amount. +func NewCannedPrevOutputFetcher(script []byte, amt int64) *CannedPrevOutputFetcher { + return &CannedPrevOutputFetcher{ + pkScript: script, + amt: amt, + } +} + +// FetchPrevOutput attempts to fetch the previous output referenced by the +// passed outpoint. +// +// NOTE: This is a part of the PrevOutputFetcher interface. +func (c *CannedPrevOutputFetcher) FetchPrevOutput(wire.OutPoint) *wire.TxOut { + return &wire.TxOut{ + PkScript: c.pkScript, + Value: c.amt, + } +} + +// A compile-time assertion to ensure that CannedPrevOutputFetcher matches the +// PrevOutputFetcher interface. +var _ PrevOutputFetcher = (*CannedPrevOutputFetcher)(nil) + +// MultiPrevOutFetcher is a custom implementation of the PrevOutputFetcher +// backed by a key-value map of prevouts to outputs. +type MultiPrevOutFetcher struct { + prevOuts map[wire.OutPoint]*wire.TxOut +} + +// NewMultiPrevOutFetcher returns an instance of a PrevOutputFetcher that's +// backed by an optional map which is used as an input source. The +func NewMultiPrevOutFetcher(prevOuts map[wire.OutPoint]*wire.TxOut) *MultiPrevOutFetcher { + if prevOuts == nil { + prevOuts = make(map[wire.OutPoint]*wire.TxOut) + } + + return &MultiPrevOutFetcher{ + prevOuts: prevOuts, + } +} + +// FetchPrevOutput attempts to fetch the previous output referenced by the +// passed outpoint. +// +// NOTE: This is a part of the CannedPrevOutputFetcher interface. +func (m *MultiPrevOutFetcher) FetchPrevOutput(op wire.OutPoint) *wire.TxOut { + return m.prevOuts[op] +} + +// AddPrevOut adds a new prev out, tx out pair to the backing map. +func (m *MultiPrevOutFetcher) AddPrevOut(op wire.OutPoint, txOut *wire.TxOut) { + m.prevOuts[op] = txOut +} + +// Merge merges two instances of a MultiPrevOutFetcher into a single source. +func (m *MultiPrevOutFetcher) Merge(other *MultiPrevOutFetcher) { + for k, v := range other.prevOuts { + m.prevOuts[k] = v + } +} + +// A compile-time assertion to ensure that MultiPrevOutFetcher matches the +// PrevOutputFetcher interface. +var _ PrevOutputFetcher = (*MultiPrevOutFetcher)(nil) + +// calcHashInputAmounts computes a hash digest of the input amounts of all +// inputs referenced in the passed transaction. This hash pre computation is only +// used for validating taproot inputs. +func calcHashInputAmounts(tx *wire.MsgTx, inputFetcher PrevOutputFetcher) chainhash.Hash { + var b bytes.Buffer + for _, txIn := range tx.TxIn { + prevOut := inputFetcher.FetchPrevOutput(txIn.PreviousOutPoint) + + _ = binary.Write(&b, binary.LittleEndian, prevOut.Value) + } + + return chainhash.HashH(b.Bytes()) +} + +// calcHashInputAmts computes the hash digest of all the previous input scripts +// referenced by the passed transaction. This hash pre computation is only used +// for validating taproot inputs. +func calcHashInputScripts(tx *wire.MsgTx, inputFetcher PrevOutputFetcher) chainhash.Hash { + var b bytes.Buffer + for _, txIn := range tx.TxIn { + prevOut := inputFetcher.FetchPrevOutput(txIn.PreviousOutPoint) + + _ = wire.WriteVarBytes(&b, 0, prevOut.PkScript) + } + + return chainhash.HashH(b.Bytes()) +} + +// SegwitSigHashMidstate is the sighash midstate used in the base segwit +// sighash calculation as defined in BIP 143. +type SegwitSigHashMidstate struct { + HashPrevOutsV0 chainhash.Hash + HashSequenceV0 chainhash.Hash + HashOutputsV0 chainhash.Hash +} + +// TaprootSigHashMidState is the sighash midstate used to compute taproot and +// tapscript signatures as defined in BIP 341. +type TaprootSigHashMidState struct { + HashPrevOutsV1 chainhash.Hash + HashSequenceV1 chainhash.Hash + HashOutputsV1 chainhash.Hash + HashInputScriptsV1 chainhash.Hash + HashInputAmountsV1 chainhash.Hash +} + // TxSigHashes houses the partial set of sighashes introduced within BIP0143. // This partial set of sighashes may be re-used within each input across a // transaction when validating all inputs. As a result, validation complexity // for SigHashAll can be reduced by a polynomial factor. type TxSigHashes struct { - HashPrevOuts chainhash.Hash - HashSequence chainhash.Hash - HashOutputs chainhash.Hash + SegwitSigHashMidstate + + TaprootSigHashMidState } // NewTxSigHashes computes, and returns the cached sighashes of the given // transaction. -func NewTxSigHashes(tx *wire.MsgTx) *TxSigHashes { - return &TxSigHashes{ - HashPrevOuts: calcHashPrevOuts(tx), - HashSequence: calcHashSequence(tx), - HashOutputs: calcHashOutputs(tx), +func NewTxSigHashes(tx *wire.MsgTx, + inputFetcher PrevOutputFetcher) *TxSigHashes { + + var ( + sigHashes TxSigHashes + zeroHash chainhash.Hash + ) + + // Base segwit (witness version v0), and taproot (witness version v1) + // differ in how the set of pre-computed cached sighash midstate is + // computed. For taproot, the prevouts, sequence, and outputs are + // computed as normal, but a single sha256 hash invocation is used. In + // addition, the hashes of all the previous input amounts and scripts + // are included as well. + // + // Based on the above distinction, we'll run through all the referenced + // inputs to determine what we need to compute. + var hasV0Inputs, hasV1Inputs bool + for _, txIn := range tx.TxIn { + // If this is a coinbase input, then we know that we only need + // the v0 midstate (though it won't be used) in this instance. + outpoint := txIn.PreviousOutPoint + if outpoint.Index == math.MaxUint32 && outpoint.Hash == zeroHash { + hasV0Inputs = true + continue + } + + prevOut := inputFetcher.FetchPrevOutput(outpoint) + + // If this is spending a script that looks like a taproot output, + // then we'll need to pre-compute the extra taproot data. + if IsPayToTaproot(prevOut.PkScript) { + hasV1Inputs = true + } else { + // Otherwise, we'll assume we need the v0 sighash midstate. + hasV0Inputs = true + } + + // If the transaction has _both_ v0 and v1 inputs, then we can stop + // here. + if hasV0Inputs && hasV1Inputs { + break + } + } + + // Now that we know which cached midstate we need to calculate, we can + // go ahead and do so. + // + // First, we can calculate the information that both segwit v0 and v1 + // need: the prevout, sequence and output hashes. For v1 the only + // difference is that this is a single instead of a double hash. + // + // Both v0 and v1 share this base data computed using a sha256 single + // hash. + sigHashes.HashPrevOutsV1 = calcHashPrevOuts(tx) + sigHashes.HashSequenceV1 = calcHashSequence(tx) + sigHashes.HashOutputsV1 = calcHashOutputs(tx) + + // The v0 data is the same as the v1 (newer data) but it uses a double + // hash instead. + if hasV0Inputs { + sigHashes.HashPrevOutsV0 = chainhash.HashH( + sigHashes.HashPrevOutsV1[:], + ) + sigHashes.HashSequenceV0 = chainhash.HashH( + sigHashes.HashSequenceV1[:], + ) + sigHashes.HashOutputsV0 = chainhash.HashH( + sigHashes.HashOutputsV1[:], + ) } + + // Finally, we'll compute the taproot specific data if needed. + if hasV1Inputs { + sigHashes.HashInputAmountsV1 = calcHashInputAmounts( + tx, inputFetcher, + ) + sigHashes.HashInputScriptsV1 = calcHashInputScripts( + tx, inputFetcher, + ) + } + + return &sigHashes } // HashCache houses a set of partial sighashes keyed by txid. The set of partial @@ -52,9 +315,11 @@ func NewHashCache(maxSize uint) *HashCache { // AddSigHashes computes, then adds the partial sighashes for the passed // transaction. -func (h *HashCache) AddSigHashes(tx *wire.MsgTx) { +func (h *HashCache) AddSigHashes(tx *wire.MsgTx, + inputFetcher PrevOutputFetcher) { + h.Lock() - h.sigHashes[tx.TxHash()] = NewTxSigHashes(tx) + h.sigHashes[tx.TxHash()] = NewTxSigHashes(tx, inputFetcher) h.Unlock() } diff --git a/txscript/hashcache_test.go b/txscript/hashcache_test.go index 389918e2f2..8d731820ec 100644 --- a/txscript/hashcache_test.go +++ b/txscript/hashcache_test.go @@ -13,12 +13,18 @@ import ( "github.com/davecgh/go-spew/spew" ) +func init() { + rand.Seed(time.Now().Unix()) +} + // genTestTx creates a random transaction for uses within test cases. -func genTestTx() (*wire.MsgTx, error) { +func genTestTx() (*wire.MsgTx, *MultiPrevOutFetcher, error) { tx := wire.NewMsgTx(2) tx.Version = rand.Int31() - numTxins := rand.Intn(11) + prevOuts := NewMultiPrevOutFetcher(nil) + + numTxins := 1 + rand.Intn(11) for i := 0; i < numTxins; i++ { randTxIn := wire.TxIn{ PreviousOutPoint: wire.OutPoint{ @@ -28,25 +34,29 @@ func genTestTx() (*wire.MsgTx, error) { } _, err := rand.Read(randTxIn.PreviousOutPoint.Hash[:]) if err != nil { - return nil, err + return nil, nil, err } tx.TxIn = append(tx.TxIn, &randTxIn) + + prevOuts.AddPrevOut( + randTxIn.PreviousOutPoint, &wire.TxOut{}, + ) } - numTxouts := rand.Intn(11) + numTxouts := 1 + rand.Intn(11) for i := 0; i < numTxouts; i++ { randTxOut := wire.TxOut{ Value: rand.Int63(), PkScript: make([]byte, rand.Intn(30)), } if _, err := rand.Read(randTxOut.PkScript); err != nil { - return nil, err + return nil, nil, err } tx.TxOut = append(tx.TxOut, &randTxOut) } - return tx, nil + return tx, prevOuts, nil } // TestHashCacheAddContainsHashes tests that after items have been added to the @@ -56,27 +66,31 @@ func genTestTx() (*wire.MsgTx, error) { func TestHashCacheAddContainsHashes(t *testing.T) { t.Parallel() - rand.Seed(time.Now().Unix()) - cache := NewHashCache(10) - var err error + var ( + err error + randPrevOuts *MultiPrevOutFetcher + ) + prevOuts := NewMultiPrevOutFetcher(nil) // First, we'll generate 10 random transactions for use within our // tests. const numTxns = 10 txns := make([]*wire.MsgTx, numTxns) for i := 0; i < numTxns; i++ { - txns[i], err = genTestTx() + txns[i], randPrevOuts, err = genTestTx() if err != nil { t.Fatalf("unable to generate test tx: %v", err) } + + prevOuts.Merge(randPrevOuts) } // With the transactions generated, we'll add each of them to the hash // cache. for _, tx := range txns { - cache.AddSigHashes(tx) + cache.AddSigHashes(tx, prevOuts) } // Next, we'll ensure that each of the transactions inserted into the @@ -89,7 +103,7 @@ func TestHashCacheAddContainsHashes(t *testing.T) { } } - randTx, err := genTestTx() + randTx, _, err := genTestTx() if err != nil { t.Fatalf("unable to generate tx: %v", err) } @@ -109,20 +123,18 @@ func TestHashCacheAddContainsHashes(t *testing.T) { func TestHashCacheAddGet(t *testing.T) { t.Parallel() - rand.Seed(time.Now().Unix()) - cache := NewHashCache(10) // To start, we'll generate a random transaction and compute the set of // sighashes for the transaction. - randTx, err := genTestTx() + randTx, prevOuts, err := genTestTx() if err != nil { t.Fatalf("unable to generate tx: %v", err) } - sigHashes := NewTxSigHashes(randTx) + sigHashes := NewTxSigHashes(randTx, prevOuts) // Next, add the transaction to the hash cache. - cache.AddSigHashes(randTx) + cache.AddSigHashes(randTx, prevOuts) // The transaction inserted into the cache above should be found. txid := randTx.TxHash() @@ -144,23 +156,27 @@ func TestHashCacheAddGet(t *testing.T) { func TestHashCachePurge(t *testing.T) { t.Parallel() - rand.Seed(time.Now().Unix()) - cache := NewHashCache(10) - var err error + var ( + err error + randPrevOuts *MultiPrevOutFetcher + ) + prevOuts := NewMultiPrevOutFetcher(nil) // First we'll start by inserting numTxns transactions into the hash cache. const numTxns = 10 txns := make([]*wire.MsgTx, numTxns) for i := 0; i < numTxns; i++ { - txns[i], err = genTestTx() + txns[i], randPrevOuts, err = genTestTx() if err != nil { t.Fatalf("unable to generate test tx: %v", err) } + + prevOuts.Merge(randPrevOuts) } for _, tx := range txns { - cache.AddSigHashes(tx) + cache.AddSigHashes(tx, prevOuts) } // Once all the transactions have been inserted, we'll purge them from diff --git a/txscript/opcode.go b/txscript/opcode.go index 5ffb398277..770e5b470d 100644 --- a/txscript/opcode.go +++ b/txscript/opcode.go @@ -8,13 +8,16 @@ import ( "bytes" "crypto/sha1" "crypto/sha256" - "encoding/binary" + "encoding/hex" + "errors" "fmt" "hash" + "strings" "golang.org/x/crypto/ripemd160" - "github.com/btcsuite/btcd/btcec" + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcec/v2/ecdsa" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/wire" ) @@ -27,7 +30,7 @@ type opcode struct { value byte name string length int - opfunc func(*parsedOpcode, *Engine) error + opfunc func(*opcode, []byte, *Engine) error } // These constants are the values of the official opcodes used on the btc wiki, @@ -224,7 +227,7 @@ const ( OP_NOP8 = 0xb7 // 183 OP_NOP9 = 0xb8 // 184 OP_NOP10 = 0xb9 // 185 - OP_UNKNOWN186 = 0xba // 186 + OP_CHECKSIGADD = 0xba // 186 OP_UNKNOWN187 = 0xbb // 187 OP_UNKNOWN188 = 0xbc // 188 OP_UNKNOWN189 = 0xbd // 189 @@ -498,6 +501,7 @@ var opcodeArray = [256]opcode{ OP_CHECKSIGVERIFY: {OP_CHECKSIGVERIFY, "OP_CHECKSIGVERIFY", 1, opcodeCheckSigVerify}, OP_CHECKMULTISIG: {OP_CHECKMULTISIG, "OP_CHECKMULTISIG", 1, opcodeCheckMultiSig}, OP_CHECKMULTISIGVERIFY: {OP_CHECKMULTISIGVERIFY, "OP_CHECKMULTISIGVERIFY", 1, opcodeCheckMultiSigVerify}, + OP_CHECKSIGADD: {OP_CHECKSIGADD, "OP_CHECKSIGADD", 1, opcodeCheckSigAdd}, // Reserved opcodes. OP_NOP1: {OP_NOP1, "OP_NOP1", 1, opcodeNop}, @@ -510,7 +514,6 @@ var opcodeArray = [256]opcode{ OP_NOP10: {OP_NOP10, "OP_NOP10", 1, opcodeNop}, // Undefined opcodes. - OP_UNKNOWN186: {OP_UNKNOWN186, "OP_UNKNOWN186", 1, opcodeInvalid}, OP_UNKNOWN187: {OP_UNKNOWN187, "OP_UNKNOWN187", 1, opcodeInvalid}, OP_UNKNOWN188: {OP_UNKNOWN188, "OP_UNKNOWN188", 1, opcodeInvalid}, OP_UNKNOWN189: {OP_UNKNOWN189, "OP_UNKNOWN189", 1, opcodeInvalid}, @@ -610,233 +613,145 @@ var opcodeOnelineRepls = map[string]string{ "OP_16": "16", } -// parsedOpcode represents an opcode that has been parsed and includes any -// potential data associated with it. -type parsedOpcode struct { - opcode *opcode - data []byte -} - -// isDisabled returns whether or not the opcode is disabled and thus is always -// bad to see in the instruction stream (even if turned off by a conditional). -func (pop *parsedOpcode) isDisabled() bool { - switch pop.opcode.value { - case OP_CAT: - return true - case OP_SUBSTR: - return true - case OP_LEFT: - return true - case OP_RIGHT: - return true - case OP_INVERT: - return true - case OP_AND: - return true - case OP_OR: - return true - case OP_XOR: - return true - case OP_2MUL: - return true - case OP_2DIV: - return true - case OP_MUL: - return true - case OP_DIV: - return true - case OP_MOD: - return true - case OP_LSHIFT: - return true - case OP_RSHIFT: - return true - default: - return false - } -} - -// alwaysIllegal returns whether or not the opcode is always illegal when passed -// over by the program counter even if in a non-executed branch (it isn't a -// coincidence that they are conditionals). -func (pop *parsedOpcode) alwaysIllegal() bool { - switch pop.opcode.value { - case OP_VERIF: - return true - case OP_VERNOTIF: - return true - default: - return false - } -} - -// isConditional returns whether or not the opcode is a conditional opcode which -// changes the conditional execution stack when executed. -func (pop *parsedOpcode) isConditional() bool { - switch pop.opcode.value { - case OP_IF: - return true - case OP_NOTIF: - return true - case OP_ELSE: - return true - case OP_ENDIF: - return true - default: - return false - } -} - -// checkMinimalDataPush returns whether or not the current data push uses the -// smallest possible opcode to represent it. For example, the value 15 could -// be pushed with OP_DATA_1 15 (among other variations); however, OP_15 is a -// single opcode that represents the same value and is only a single byte versus -// two bytes. -func (pop *parsedOpcode) checkMinimalDataPush() error { - data := pop.data - dataLen := len(data) - opcode := pop.opcode.value - - if dataLen == 0 && opcode != OP_0 { - str := fmt.Sprintf("zero length data push is encoded with "+ - "opcode %s instead of OP_0", pop.opcode.name) - return scriptError(ErrMinimalData, str) - } else if dataLen == 1 && data[0] >= 1 && data[0] <= 16 { - if opcode != OP_1+data[0]-1 { - // Should have used OP_1 .. OP_16 - str := fmt.Sprintf("data push of the value %d encoded "+ - "with opcode %s instead of OP_%d", data[0], - pop.opcode.name, data[0]) - return scriptError(ErrMinimalData, str) - } - } else if dataLen == 1 && data[0] == 0x81 { - if opcode != OP_1NEGATE { - str := fmt.Sprintf("data push of the value -1 encoded "+ - "with opcode %s instead of OP_1NEGATE", - pop.opcode.name) - return scriptError(ErrMinimalData, str) - } - } else if dataLen <= 75 { - if int(opcode) != dataLen { - // Should have used a direct push - str := fmt.Sprintf("data push of %d bytes encoded "+ - "with opcode %s instead of OP_DATA_%d", dataLen, - pop.opcode.name, dataLen) - return scriptError(ErrMinimalData, str) - } - } else if dataLen <= 255 { - if opcode != OP_PUSHDATA1 { - str := fmt.Sprintf("data push of %d bytes encoded "+ - "with opcode %s instead of OP_PUSHDATA1", - dataLen, pop.opcode.name) - return scriptError(ErrMinimalData, str) - } - } else if dataLen <= 65535 { - if opcode != OP_PUSHDATA2 { - str := fmt.Sprintf("data push of %d bytes encoded "+ - "with opcode %s instead of OP_PUSHDATA2", - dataLen, pop.opcode.name) - return scriptError(ErrMinimalData, str) - } - } - return nil -} - -// print returns a human-readable string representation of the opcode for use -// in script disassembly. -func (pop *parsedOpcode) print(oneline bool) string { - // The reference implementation one-line disassembly replaces opcodes - // which represent values (e.g. OP_0 through OP_16 and OP_1NEGATE) - // with the raw value. However, when not doing a one-line dissassembly, - // we prefer to show the actual opcode names. Thus, only replace the - // opcodes in question when the oneline flag is set. - opcodeName := pop.opcode.name - if oneline { +// successOpcodes tracks the set of op codes that are to be interpreted as op +// codes that cause execution to automatically succeed. This map is used to +// quickly look up the op codes during script pre-processing. +var successOpcodes = map[byte]struct{}{ + OP_RESERVED: {}, // 80 + OP_VER: {}, // 98 + OP_CAT: {}, // 126 + OP_SUBSTR: {}, // 127 + OP_LEFT: {}, // 128 + OP_RIGHT: {}, // 129 + OP_INVERT: {}, // 131 + OP_AND: {}, // 132 + OP_OR: {}, // 133 + OP_XOR: {}, // 134 + OP_RESERVED1: {}, // 137 + OP_RESERVED2: {}, // 138 + OP_2MUL: {}, // 141 + OP_2DIV: {}, // 142 + OP_MUL: {}, // 149 + OP_DIV: {}, // 150 + OP_MOD: {}, // 151 + OP_LSHIFT: {}, // 152 + OP_RSHIFT: {}, // 153 + OP_UNKNOWN187: {}, // 187 + OP_UNKNOWN188: {}, // 188 + OP_UNKNOWN189: {}, // 189 + OP_UNKNOWN190: {}, // 190 + OP_UNKNOWN191: {}, // 191 + OP_UNKNOWN192: {}, // 192 + OP_UNKNOWN193: {}, // 193 + OP_UNKNOWN194: {}, // 194 + OP_UNKNOWN195: {}, // 195 + OP_UNKNOWN196: {}, // 196 + OP_UNKNOWN197: {}, // 197 + OP_UNKNOWN198: {}, // 198 + OP_UNKNOWN199: {}, // 199 + OP_UNKNOWN200: {}, // 200 + OP_UNKNOWN201: {}, // 201 + OP_UNKNOWN202: {}, // 202 + OP_UNKNOWN203: {}, // 203 + OP_UNKNOWN204: {}, // 204 + OP_UNKNOWN205: {}, // 205 + OP_UNKNOWN206: {}, // 206 + OP_UNKNOWN207: {}, // 207 + OP_UNKNOWN208: {}, // 208 + OP_UNKNOWN209: {}, // 209 + OP_UNKNOWN210: {}, // 210 + OP_UNKNOWN211: {}, // 211 + OP_UNKNOWN212: {}, // 212 + OP_UNKNOWN213: {}, // 213 + OP_UNKNOWN214: {}, // 214 + OP_UNKNOWN215: {}, // 215 + OP_UNKNOWN216: {}, // 216 + OP_UNKNOWN217: {}, // 217 + OP_UNKNOWN218: {}, // 218 + OP_UNKNOWN219: {}, // 219 + OP_UNKNOWN220: {}, // 220 + OP_UNKNOWN221: {}, // 221 + OP_UNKNOWN222: {}, // 222 + OP_UNKNOWN223: {}, // 223 + OP_UNKNOWN224: {}, // 224 + OP_UNKNOWN225: {}, // 225 + OP_UNKNOWN226: {}, // 226 + OP_UNKNOWN227: {}, // 227 + OP_UNKNOWN228: {}, // 228 + OP_UNKNOWN229: {}, // 229 + OP_UNKNOWN230: {}, // 230 + OP_UNKNOWN231: {}, // 231 + OP_UNKNOWN232: {}, // 232 + OP_UNKNOWN233: {}, // 233 + OP_UNKNOWN234: {}, // 234 + OP_UNKNOWN235: {}, // 235 + OP_UNKNOWN236: {}, // 236 + OP_UNKNOWN237: {}, // 237 + OP_UNKNOWN238: {}, // 238 + OP_UNKNOWN239: {}, // 239 + OP_UNKNOWN240: {}, // 240 + OP_UNKNOWN241: {}, // 241 + OP_UNKNOWN242: {}, // 242 + OP_UNKNOWN243: {}, // 243 + OP_UNKNOWN244: {}, // 244 + OP_UNKNOWN245: {}, // 245 + OP_UNKNOWN246: {}, // 246 + OP_UNKNOWN247: {}, // 247 + OP_UNKNOWN248: {}, // 248 + OP_UNKNOWN249: {}, // 249 + OP_SMALLINTEGER: {}, // 250 + OP_PUBKEYS: {}, // 251 + OP_UNKNOWN252: {}, // 252 + OP_PUBKEYHASH: {}, // 253 + OP_PUBKEY: {}, // 254 +} + +// disasmOpcode writes a human-readable disassembly of the provided opcode and +// data into the provided buffer. The compact flag indicates the disassembly +// should print a more compact representation of data-carrying and small integer +// opcodes. For example, OP_0 through OP_16 are replaced with the numeric value +// and data pushes are printed as only the hex representation of the data as +// opposed to including the opcode that specifies the amount of data to push as +// well. +func disasmOpcode(buf *strings.Builder, op *opcode, data []byte, compact bool) { + // Replace opcode which represent values (e.g. OP_0 through OP_16 and + // OP_1NEGATE) with the raw value when performing a compact disassembly. + opcodeName := op.name + if compact { if replName, ok := opcodeOnelineRepls[opcodeName]; ok { opcodeName = replName } - // Nothing more to do for non-data push opcodes. - if pop.opcode.length == 1 { - return opcodeName + // Either write the human-readable opcode or the parsed data in hex for + // data-carrying opcodes. + switch { + case op.length == 1: + buf.WriteString(opcodeName) + + default: + buf.WriteString(hex.EncodeToString(data)) } - return fmt.Sprintf("%x", pop.data) + return } - // Nothing more to do for non-data push opcodes. - if pop.opcode.length == 1 { - return opcodeName - } + buf.WriteString(opcodeName) + + switch op.length { + // Only write the opcode name for non-data push opcodes. + case 1: + return // Add length for the OP_PUSHDATA# opcodes. - retString := opcodeName - switch pop.opcode.length { case -1: - retString += fmt.Sprintf(" 0x%02x", len(pop.data)) + buf.WriteString(fmt.Sprintf(" 0x%02x", len(data))) case -2: - retString += fmt.Sprintf(" 0x%04x", len(pop.data)) + buf.WriteString(fmt.Sprintf(" 0x%04x", len(data))) case -4: - retString += fmt.Sprintf(" 0x%08x", len(pop.data)) - } - - return fmt.Sprintf("%s 0x%02x", retString, pop.data) -} - -// bytes returns any data associated with the opcode encoded as it would be in -// a script. This is used for unparsing scripts from parsed opcodes. -func (pop *parsedOpcode) bytes() ([]byte, error) { - var retbytes []byte - if pop.opcode.length > 0 { - retbytes = make([]byte, 1, pop.opcode.length) - } else { - retbytes = make([]byte, 1, 1+len(pop.data)- - pop.opcode.length) - } - - retbytes[0] = pop.opcode.value - if pop.opcode.length == 1 { - if len(pop.data) != 0 { - str := fmt.Sprintf("internal consistency error - "+ - "parsed opcode %s has data length %d when %d "+ - "was expected", pop.opcode.name, len(pop.data), - 0) - return nil, scriptError(ErrInternal, str) - } - return retbytes, nil - } - nbytes := pop.opcode.length - if pop.opcode.length < 0 { - l := len(pop.data) - // tempting just to hardcode to avoid the complexity here. - switch pop.opcode.length { - case -1: - retbytes = append(retbytes, byte(l)) - nbytes = int(retbytes[1]) + len(retbytes) - case -2: - retbytes = append(retbytes, byte(l&0xff), - byte(l>>8&0xff)) - nbytes = int(binary.LittleEndian.Uint16(retbytes[1:])) + - len(retbytes) - case -4: - retbytes = append(retbytes, byte(l&0xff), - byte((l>>8)&0xff), byte((l>>16)&0xff), - byte((l>>24)&0xff)) - nbytes = int(binary.LittleEndian.Uint32(retbytes[1:])) + - len(retbytes) - } + buf.WriteString(fmt.Sprintf(" 0x%08x", len(data))) } - retbytes = append(retbytes, pop.data...) - - if len(retbytes) != nbytes { - str := fmt.Sprintf("internal consistency error - "+ - "parsed opcode %s has data length %d when %d was "+ - "expected", pop.opcode.name, len(retbytes), nbytes) - return nil, scriptError(ErrInternal, str) - } - - return retbytes, nil + buf.WriteString(fmt.Sprintf(" 0x%02x", data)) } // ******************************************* @@ -849,45 +764,42 @@ func (pop *parsedOpcode) bytes() ([]byte, error) { // opcodes before executing in an initial parse step, the consensus rules // dictate the script doesn't fail until the program counter passes over a // disabled opcode (even when they appear in a branch that is not executed). -func opcodeDisabled(op *parsedOpcode, vm *Engine) error { - str := fmt.Sprintf("attempt to execute disabled opcode %s", - op.opcode.name) +func opcodeDisabled(op *opcode, data []byte, vm *Engine) error { + str := fmt.Sprintf("attempt to execute disabled opcode %s", op.name) return scriptError(ErrDisabledOpcode, str) } // opcodeReserved is a common handler for all reserved opcodes. It returns an // appropriate error indicating the opcode is reserved. -func opcodeReserved(op *parsedOpcode, vm *Engine) error { - str := fmt.Sprintf("attempt to execute reserved opcode %s", - op.opcode.name) +func opcodeReserved(op *opcode, data []byte, vm *Engine) error { + str := fmt.Sprintf("attempt to execute reserved opcode %s", op.name) return scriptError(ErrReservedOpcode, str) } // opcodeInvalid is a common handler for all invalid opcodes. It returns an // appropriate error indicating the opcode is invalid. -func opcodeInvalid(op *parsedOpcode, vm *Engine) error { - str := fmt.Sprintf("attempt to execute invalid opcode %s", - op.opcode.name) +func opcodeInvalid(op *opcode, data []byte, vm *Engine) error { + str := fmt.Sprintf("attempt to execute invalid opcode %s", op.name) return scriptError(ErrReservedOpcode, str) } // opcodeFalse pushes an empty array to the data stack to represent false. Note // that 0, when encoded as a number according to the numeric encoding consensus // rules, is an empty array. -func opcodeFalse(op *parsedOpcode, vm *Engine) error { +func opcodeFalse(op *opcode, data []byte, vm *Engine) error { vm.dstack.PushByteArray(nil) return nil } // opcodePushData is a common handler for the vast majority of opcodes that push // raw data (bytes) to the data stack. -func opcodePushData(op *parsedOpcode, vm *Engine) error { - vm.dstack.PushByteArray(op.data) +func opcodePushData(op *opcode, data []byte, vm *Engine) error { + vm.dstack.PushByteArray(data) return nil } // opcode1Negate pushes -1, encoded as a number, to the data stack. -func opcode1Negate(op *parsedOpcode, vm *Engine) error { +func opcode1Negate(op *opcode, data []byte, vm *Engine) error { vm.dstack.PushInt(scriptNum(-1)) return nil } @@ -895,23 +807,24 @@ func opcode1Negate(op *parsedOpcode, vm *Engine) error { // opcodeN is a common handler for the small integer data push opcodes. It // pushes the numeric value the opcode represents (which will be from 1 to 16) // onto the data stack. -func opcodeN(op *parsedOpcode, vm *Engine) error { +func opcodeN(op *opcode, data []byte, vm *Engine) error { // The opcodes are all defined consecutively, so the numeric value is // the difference. - vm.dstack.PushInt(scriptNum((op.opcode.value - (OP_1 - 1)))) + vm.dstack.PushInt(scriptNum((op.value - (OP_1 - 1)))) return nil } // opcodeNop is a common handler for the NOP family of opcodes. As the name // implies it generally does nothing, however, it will return an error when // the flag to discourage use of NOPs is set for select opcodes. -func opcodeNop(op *parsedOpcode, vm *Engine) error { - switch op.opcode.value { +func opcodeNop(op *opcode, data []byte, vm *Engine) error { + switch op.value { case OP_NOP1, OP_NOP4, OP_NOP5, OP_NOP6, OP_NOP7, OP_NOP8, OP_NOP9, OP_NOP10: + if vm.hasFlag(ScriptDiscourageUpgradableNops) { - str := fmt.Sprintf("OP_NOP%d reserved for soft-fork "+ - "upgrades", op.opcode.value-(OP_NOP1-1)) + str := fmt.Sprintf("%v reserved for soft-fork "+ + "upgrades", op.name) return scriptError(ErrDiscourageUpgradableNOPs, str) } } @@ -926,15 +839,27 @@ func opcodeNop(op *parsedOpcode, vm *Engine) error { // the stack will be popped and interpreted as a boolean. func popIfBool(vm *Engine) (bool, error) { // When not in witness execution mode, not executing a v0 witness - // program, or the minimal if flag isn't set pop the top stack item as - // a normal bool. - if !vm.isWitnessVersionActive(0) || !vm.hasFlag(ScriptVerifyMinimalIf) { + // program, or not doing tapscript execution, or the minimal if flag + // isn't set pop the top stack item as a normal bool. + switch { + // Minimal if is always on for taproot execution. + case vm.isWitnessVersionActive(TaprootWitnessVersion): + break + + // If this isn't the base segwit version, then we'll coerce the stack + // element as a bool as normal. + case !vm.isWitnessVersionActive(BaseSegwitWitnessVersion): + fallthrough + + // If the minimal if flag isn't set, then we don't need any extra + // checks here. + case !vm.hasFlag(ScriptVerifyMinimalIf): return vm.dstack.PopBool() } - // At this point, a v0 witness program is being executed and the minimal - // if flag is set, so enforce additional constraints on the top stack - // item. + // At this point, a v0 or v1 witness program is being executed and the + // minimal if flag is set, so enforce additional constraints on the top + // stack item. so, err := vm.dstack.PopByteArray() if err != nil { return false, err @@ -974,7 +899,7 @@ func popIfBool(vm *Engine) (bool, error) { // // Data stack transformation: [... bool] -> [...] // Conditional stack transformation: [...] -> [... OpCondValue] -func opcodeIf(op *parsedOpcode, vm *Engine) error { +func opcodeIf(op *opcode, data []byte, vm *Engine) error { condVal := OpCondFalse if vm.isBranchExecuting() { ok, err := popIfBool(vm) @@ -1008,7 +933,7 @@ func opcodeIf(op *parsedOpcode, vm *Engine) error { // // Data stack transformation: [... bool] -> [...] // Conditional stack transformation: [...] -> [... OpCondValue] -func opcodeNotIf(op *parsedOpcode, vm *Engine) error { +func opcodeNotIf(op *opcode, data []byte, vm *Engine) error { condVal := OpCondFalse if vm.isBranchExecuting() { ok, err := popIfBool(vm) @@ -1031,10 +956,10 @@ func opcodeNotIf(op *parsedOpcode, vm *Engine) error { // An error is returned if there has not already been a matching OP_IF. // // Conditional stack transformation: [... OpCondValue] -> [... !OpCondValue] -func opcodeElse(op *parsedOpcode, vm *Engine) error { +func opcodeElse(op *opcode, data []byte, vm *Engine) error { if len(vm.condStack) == 0 { str := fmt.Sprintf("encountered opcode %s with no matching "+ - "opcode to begin conditional execution", op.opcode.name) + "opcode to begin conditional execution", op.name) return scriptError(ErrUnbalancedConditional, str) } @@ -1057,10 +982,10 @@ func opcodeElse(op *parsedOpcode, vm *Engine) error { // An error is returned if there has not already been a matching OP_IF. // // Conditional stack transformation: [... OpCondValue] -> [...] -func opcodeEndif(op *parsedOpcode, vm *Engine) error { +func opcodeEndif(op *opcode, data []byte, vm *Engine) error { if len(vm.condStack) == 0 { str := fmt.Sprintf("encountered opcode %s with no matching "+ - "opcode to begin conditional execution", op.opcode.name) + "opcode to begin conditional execution", op.name) return scriptError(ErrUnbalancedConditional, str) } @@ -1073,14 +998,14 @@ func opcodeEndif(op *parsedOpcode, vm *Engine) error { // item on the stack or when that item evaluates to false. In the latter case // where the verification fails specifically due to the top item evaluating // to false, the returned error will use the passed error code. -func abstractVerify(op *parsedOpcode, vm *Engine, c ErrorCode) error { +func abstractVerify(op *opcode, vm *Engine, c ErrorCode) error { verified, err := vm.dstack.PopBool() if err != nil { return err } if !verified { - str := fmt.Sprintf("%s failed", op.opcode.name) + str := fmt.Sprintf("%s failed", op.name) return scriptError(c, str) } return nil @@ -1088,13 +1013,13 @@ func abstractVerify(op *parsedOpcode, vm *Engine, c ErrorCode) error { // opcodeVerify examines the top item on the data stack as a boolean value and // verifies it evaluates to true. An error is returned if it does not. -func opcodeVerify(op *parsedOpcode, vm *Engine) error { +func opcodeVerify(op *opcode, data []byte, vm *Engine) error { return abstractVerify(op, vm, ErrVerify) } // opcodeReturn returns an appropriate error since it is always an error to // return early from a script. -func opcodeReturn(op *parsedOpcode, vm *Engine) error { +func opcodeReturn(op *opcode, data []byte, vm *Engine) error { return scriptError(ErrEarlyReturn, "script returned early") } @@ -1124,7 +1049,7 @@ func verifyLockTime(txLockTime, threshold, lockTime int64) error { // validating if the transaction outputs are spendable yet. If flag // ScriptVerifyCheckLockTimeVerify is not set, the code continues as if OP_NOP2 // were executed. -func opcodeCheckLockTimeVerify(op *parsedOpcode, vm *Engine) error { +func opcodeCheckLockTimeVerify(op *opcode, data []byte, vm *Engine) error { // If the ScriptVerifyCheckLockTimeVerify script flag is not set, treat // opcode as OP_NOP2 instead. if !vm.hasFlag(ScriptVerifyCheckLockTimeVerify) { @@ -1148,7 +1073,7 @@ func opcodeCheckLockTimeVerify(op *parsedOpcode, vm *Engine) error { if err != nil { return err } - lockTime, err := makeScriptNum(so, vm.dstack.verifyMinimalData, 5) + lockTime, err := MakeScriptNum(so, vm.dstack.verifyMinimalData, 5) if err != nil { return err } @@ -1198,7 +1123,7 @@ func opcodeCheckLockTimeVerify(op *parsedOpcode, vm *Engine) error { // validating if the transaction outputs are spendable yet. If flag // ScriptVerifyCheckSequenceVerify is not set, the code continues as if OP_NOP3 // were executed. -func opcodeCheckSequenceVerify(op *parsedOpcode, vm *Engine) error { +func opcodeCheckSequenceVerify(op *opcode, data []byte, vm *Engine) error { // If the ScriptVerifyCheckSequenceVerify script flag is not set, treat // opcode as OP_NOP3 instead. if !vm.hasFlag(ScriptVerifyCheckSequenceVerify) { @@ -1222,7 +1147,7 @@ func opcodeCheckSequenceVerify(op *parsedOpcode, vm *Engine) error { if err != nil { return err } - stackSequence, err := makeScriptNum(so, vm.dstack.verifyMinimalData, 5) + stackSequence, err := MakeScriptNum(so, vm.dstack.verifyMinimalData, 5) if err != nil { return err } @@ -1246,7 +1171,7 @@ func opcodeCheckSequenceVerify(op *parsedOpcode, vm *Engine) error { // Transaction version numbers not high enough to trigger CSV rules must // fail. - if vm.tx.Version < 2 { + if uint32(vm.tx.Version) < 2 { str := fmt.Sprintf("invalid transaction version: %d", vm.tx.Version) return scriptError(ErrUnsatisfiedLockTime, str) @@ -1275,7 +1200,7 @@ func opcodeCheckSequenceVerify(op *parsedOpcode, vm *Engine) error { // // Main data stack transformation: [... x1 x2 x3] -> [... x1 x2] // Alt data stack transformation: [... y1 y2 y3] -> [... y1 y2 y3 x3] -func opcodeToAltStack(op *parsedOpcode, vm *Engine) error { +func opcodeToAltStack(op *opcode, data []byte, vm *Engine) error { so, err := vm.dstack.PopByteArray() if err != nil { return err @@ -1290,7 +1215,7 @@ func opcodeToAltStack(op *parsedOpcode, vm *Engine) error { // // Main data stack transformation: [... x1 x2 x3] -> [... x1 x2 x3 y3] // Alt data stack transformation: [... y1 y2 y3] -> [... y1 y2] -func opcodeFromAltStack(op *parsedOpcode, vm *Engine) error { +func opcodeFromAltStack(op *opcode, data []byte, vm *Engine) error { so, err := vm.astack.PopByteArray() if err != nil { return err @@ -1303,35 +1228,35 @@ func opcodeFromAltStack(op *parsedOpcode, vm *Engine) error { // opcode2Drop removes the top 2 items from the data stack. // // Stack transformation: [... x1 x2 x3] -> [... x1] -func opcode2Drop(op *parsedOpcode, vm *Engine) error { +func opcode2Drop(op *opcode, data []byte, vm *Engine) error { return vm.dstack.DropN(2) } // opcode2Dup duplicates the top 2 items on the data stack. // // Stack transformation: [... x1 x2 x3] -> [... x1 x2 x3 x2 x3] -func opcode2Dup(op *parsedOpcode, vm *Engine) error { +func opcode2Dup(op *opcode, data []byte, vm *Engine) error { return vm.dstack.DupN(2) } // opcode3Dup duplicates the top 3 items on the data stack. // // Stack transformation: [... x1 x2 x3] -> [... x1 x2 x3 x1 x2 x3] -func opcode3Dup(op *parsedOpcode, vm *Engine) error { +func opcode3Dup(op *opcode, data []byte, vm *Engine) error { return vm.dstack.DupN(3) } // opcode2Over duplicates the 2 items before the top 2 items on the data stack. // // Stack transformation: [... x1 x2 x3 x4] -> [... x1 x2 x3 x4 x1 x2] -func opcode2Over(op *parsedOpcode, vm *Engine) error { +func opcode2Over(op *opcode, data []byte, vm *Engine) error { return vm.dstack.OverN(2) } // opcode2Rot rotates the top 6 items on the data stack to the left twice. // // Stack transformation: [... x1 x2 x3 x4 x5 x6] -> [... x3 x4 x5 x6 x1 x2] -func opcode2Rot(op *parsedOpcode, vm *Engine) error { +func opcode2Rot(op *opcode, data []byte, vm *Engine) error { return vm.dstack.RotN(2) } @@ -1339,7 +1264,7 @@ func opcode2Rot(op *parsedOpcode, vm *Engine) error { // before them. // // Stack transformation: [... x1 x2 x3 x4] -> [... x3 x4 x1 x2] -func opcode2Swap(op *parsedOpcode, vm *Engine) error { +func opcode2Swap(op *opcode, data []byte, vm *Engine) error { return vm.dstack.SwapN(2) } @@ -1347,7 +1272,7 @@ func opcode2Swap(op *parsedOpcode, vm *Engine) error { // // Stack transformation (x1==0): [... x1] -> [... x1] // Stack transformation (x1!=0): [... x1] -> [... x1 x1] -func opcodeIfDup(op *parsedOpcode, vm *Engine) error { +func opcodeIfDup(op *opcode, data []byte, vm *Engine) error { so, err := vm.dstack.PeekByteArray(0) if err != nil { return err @@ -1367,7 +1292,7 @@ func opcodeIfDup(op *parsedOpcode, vm *Engine) error { // Stack transformation: [...] -> [... ] // Example with 2 items: [x1 x2] -> [x1 x2 2] // Example with 3 items: [x1 x2 x3] -> [x1 x2 x3 3] -func opcodeDepth(op *parsedOpcode, vm *Engine) error { +func opcodeDepth(op *opcode, data []byte, vm *Engine) error { vm.dstack.PushInt(scriptNum(vm.dstack.Depth())) return nil } @@ -1375,28 +1300,28 @@ func opcodeDepth(op *parsedOpcode, vm *Engine) error { // opcodeDrop removes the top item from the data stack. // // Stack transformation: [... x1 x2 x3] -> [... x1 x2] -func opcodeDrop(op *parsedOpcode, vm *Engine) error { +func opcodeDrop(op *opcode, data []byte, vm *Engine) error { return vm.dstack.DropN(1) } // opcodeDup duplicates the top item on the data stack. // // Stack transformation: [... x1 x2 x3] -> [... x1 x2 x3 x3] -func opcodeDup(op *parsedOpcode, vm *Engine) error { +func opcodeDup(op *opcode, data []byte, vm *Engine) error { return vm.dstack.DupN(1) } // opcodeNip removes the item before the top item on the data stack. // // Stack transformation: [... x1 x2 x3] -> [... x1 x3] -func opcodeNip(op *parsedOpcode, vm *Engine) error { +func opcodeNip(op *opcode, data []byte, vm *Engine) error { return vm.dstack.NipN(1) } // opcodeOver duplicates the item before the top item on the data stack. // // Stack transformation: [... x1 x2 x3] -> [... x1 x2 x3 x2] -func opcodeOver(op *parsedOpcode, vm *Engine) error { +func opcodeOver(op *opcode, data []byte, vm *Engine) error { return vm.dstack.OverN(1) } @@ -1406,7 +1331,7 @@ func opcodeOver(op *parsedOpcode, vm *Engine) error { // Stack transformation: [xn ... x2 x1 x0 n] -> [xn ... x2 x1 x0 xn] // Example with n=1: [x2 x1 x0 1] -> [x2 x1 x0 x1] // Example with n=2: [x2 x1 x0 2] -> [x2 x1 x0 x2] -func opcodePick(op *parsedOpcode, vm *Engine) error { +func opcodePick(op *opcode, data []byte, vm *Engine) error { val, err := vm.dstack.PopInt() if err != nil { return err @@ -1421,7 +1346,7 @@ func opcodePick(op *parsedOpcode, vm *Engine) error { // Stack transformation: [xn ... x2 x1 x0 n] -> [... x2 x1 x0 xn] // Example with n=1: [x2 x1 x0 1] -> [x2 x0 x1] // Example with n=2: [x2 x1 x0 2] -> [x1 x0 x2] -func opcodeRoll(op *parsedOpcode, vm *Engine) error { +func opcodeRoll(op *opcode, data []byte, vm *Engine) error { val, err := vm.dstack.PopInt() if err != nil { return err @@ -1433,14 +1358,14 @@ func opcodeRoll(op *parsedOpcode, vm *Engine) error { // opcodeRot rotates the top 3 items on the data stack to the left. // // Stack transformation: [... x1 x2 x3] -> [... x2 x3 x1] -func opcodeRot(op *parsedOpcode, vm *Engine) error { +func opcodeRot(op *opcode, data []byte, vm *Engine) error { return vm.dstack.RotN(1) } // opcodeSwap swaps the top two items on the stack. // // Stack transformation: [... x1 x2] -> [... x2 x1] -func opcodeSwap(op *parsedOpcode, vm *Engine) error { +func opcodeSwap(op *opcode, data []byte, vm *Engine) error { return vm.dstack.SwapN(1) } @@ -1448,7 +1373,7 @@ func opcodeSwap(op *parsedOpcode, vm *Engine) error { // second-to-top item. // // Stack transformation: [... x1 x2] -> [... x2 x1 x2] -func opcodeTuck(op *parsedOpcode, vm *Engine) error { +func opcodeTuck(op *opcode, data []byte, vm *Engine) error { return vm.dstack.Tuck() } @@ -1456,7 +1381,7 @@ func opcodeTuck(op *parsedOpcode, vm *Engine) error { // stack. // // Stack transformation: [... x1] -> [... x1 len(x1)] -func opcodeSize(op *parsedOpcode, vm *Engine) error { +func opcodeSize(op *opcode, data []byte, vm *Engine) error { so, err := vm.dstack.PeekByteArray(0) if err != nil { return err @@ -1470,7 +1395,7 @@ func opcodeSize(op *parsedOpcode, vm *Engine) error { // bytes, and pushes the result, encoded as a boolean, back to the stack. // // Stack transformation: [... x1 x2] -> [... bool] -func opcodeEqual(op *parsedOpcode, vm *Engine) error { +func opcodeEqual(op *opcode, data []byte, vm *Engine) error { a, err := vm.dstack.PopByteArray() if err != nil { return err @@ -1491,8 +1416,8 @@ func opcodeEqual(op *parsedOpcode, vm *Engine) error { // evaluates to true. An error is returned if it does not. // // Stack transformation: [... x1 x2] -> [... bool] -> [...] -func opcodeEqualVerify(op *parsedOpcode, vm *Engine) error { - err := opcodeEqual(op, vm) +func opcodeEqualVerify(op *opcode, data []byte, vm *Engine) error { + err := opcodeEqual(op, data, vm) if err == nil { err = abstractVerify(op, vm, ErrEqualVerify) } @@ -1503,7 +1428,7 @@ func opcodeEqualVerify(op *parsedOpcode, vm *Engine) error { // it with its incremented value (plus 1). // // Stack transformation: [... x1 x2] -> [... x1 x2+1] -func opcode1Add(op *parsedOpcode, vm *Engine) error { +func opcode1Add(op *opcode, data []byte, vm *Engine) error { m, err := vm.dstack.PopInt() if err != nil { return err @@ -1517,7 +1442,7 @@ func opcode1Add(op *parsedOpcode, vm *Engine) error { // it with its decremented value (minus 1). // // Stack transformation: [... x1 x2] -> [... x1 x2-1] -func opcode1Sub(op *parsedOpcode, vm *Engine) error { +func opcode1Sub(op *opcode, data []byte, vm *Engine) error { m, err := vm.dstack.PopInt() if err != nil { return err @@ -1531,7 +1456,7 @@ func opcode1Sub(op *parsedOpcode, vm *Engine) error { // it with its negation. // // Stack transformation: [... x1 x2] -> [... x1 -x2] -func opcodeNegate(op *parsedOpcode, vm *Engine) error { +func opcodeNegate(op *opcode, data []byte, vm *Engine) error { m, err := vm.dstack.PopInt() if err != nil { return err @@ -1545,7 +1470,7 @@ func opcodeNegate(op *parsedOpcode, vm *Engine) error { // it with its absolute value. // // Stack transformation: [... x1 x2] -> [... x1 abs(x2)] -func opcodeAbs(op *parsedOpcode, vm *Engine) error { +func opcodeAbs(op *opcode, data []byte, vm *Engine) error { m, err := vm.dstack.PopInt() if err != nil { return err @@ -1570,7 +1495,7 @@ func opcodeAbs(op *parsedOpcode, vm *Engine) error { // Stack transformation (x2==0): [... x1 0] -> [... x1 1] // Stack transformation (x2!=0): [... x1 1] -> [... x1 0] // Stack transformation (x2!=0): [... x1 17] -> [... x1 0] -func opcodeNot(op *parsedOpcode, vm *Engine) error { +func opcodeNot(op *opcode, data []byte, vm *Engine) error { m, err := vm.dstack.PopInt() if err != nil { return err @@ -1590,7 +1515,7 @@ func opcodeNot(op *parsedOpcode, vm *Engine) error { // Stack transformation (x2==0): [... x1 0] -> [... x1 0] // Stack transformation (x2!=0): [... x1 1] -> [... x1 1] // Stack transformation (x2!=0): [... x1 17] -> [... x1 1] -func opcode0NotEqual(op *parsedOpcode, vm *Engine) error { +func opcode0NotEqual(op *opcode, data []byte, vm *Engine) error { m, err := vm.dstack.PopInt() if err != nil { return err @@ -1607,7 +1532,7 @@ func opcode0NotEqual(op *parsedOpcode, vm *Engine) error { // them with their sum. // // Stack transformation: [... x1 x2] -> [... x1+x2] -func opcodeAdd(op *parsedOpcode, vm *Engine) error { +func opcodeAdd(op *opcode, data []byte, vm *Engine) error { v0, err := vm.dstack.PopInt() if err != nil { return err @@ -1627,7 +1552,7 @@ func opcodeAdd(op *parsedOpcode, vm *Engine) error { // entry. // // Stack transformation: [... x1 x2] -> [... x1-x2] -func opcodeSub(op *parsedOpcode, vm *Engine) error { +func opcodeSub(op *opcode, data []byte, vm *Engine) error { v0, err := vm.dstack.PopInt() if err != nil { return err @@ -1649,7 +1574,7 @@ func opcodeSub(op *parsedOpcode, vm *Engine) error { // Stack transformation (x1!=0, x2==0): [... 5 0] -> [... 0] // Stack transformation (x1==0, x2!=0): [... 0 7] -> [... 0] // Stack transformation (x1!=0, x2!=0): [... 4 8] -> [... 1] -func opcodeBoolAnd(op *parsedOpcode, vm *Engine) error { +func opcodeBoolAnd(op *opcode, data []byte, vm *Engine) error { v0, err := vm.dstack.PopInt() if err != nil { return err @@ -1676,7 +1601,7 @@ func opcodeBoolAnd(op *parsedOpcode, vm *Engine) error { // Stack transformation (x1!=0, x2==0): [... 5 0] -> [... 1] // Stack transformation (x1==0, x2!=0): [... 0 7] -> [... 1] // Stack transformation (x1!=0, x2!=0): [... 4 8] -> [... 1] -func opcodeBoolOr(op *parsedOpcode, vm *Engine) error { +func opcodeBoolOr(op *opcode, data []byte, vm *Engine) error { v0, err := vm.dstack.PopInt() if err != nil { return err @@ -1701,7 +1626,7 @@ func opcodeBoolOr(op *parsedOpcode, vm *Engine) error { // // Stack transformation (x1==x2): [... 5 5] -> [... 1] // Stack transformation (x1!=x2): [... 5 7] -> [... 0] -func opcodeNumEqual(op *parsedOpcode, vm *Engine) error { +func opcodeNumEqual(op *opcode, data []byte, vm *Engine) error { v0, err := vm.dstack.PopInt() if err != nil { return err @@ -1729,8 +1654,8 @@ func opcodeNumEqual(op *parsedOpcode, vm *Engine) error { // to true. An error is returned if it does not. // // Stack transformation: [... x1 x2] -> [... bool] -> [...] -func opcodeNumEqualVerify(op *parsedOpcode, vm *Engine) error { - err := opcodeNumEqual(op, vm) +func opcodeNumEqualVerify(op *opcode, data []byte, vm *Engine) error { + err := opcodeNumEqual(op, data, vm) if err == nil { err = abstractVerify(op, vm, ErrNumEqualVerify) } @@ -1742,7 +1667,7 @@ func opcodeNumEqualVerify(op *parsedOpcode, vm *Engine) error { // // Stack transformation (x1==x2): [... 5 5] -> [... 0] // Stack transformation (x1!=x2): [... 5 7] -> [... 1] -func opcodeNumNotEqual(op *parsedOpcode, vm *Engine) error { +func opcodeNumNotEqual(op *opcode, data []byte, vm *Engine) error { v0, err := vm.dstack.PopInt() if err != nil { return err @@ -1767,7 +1692,7 @@ func opcodeNumNotEqual(op *parsedOpcode, vm *Engine) error { // otherwise a 0. // // Stack transformation: [... x1 x2] -> [... bool] -func opcodeLessThan(op *parsedOpcode, vm *Engine) error { +func opcodeLessThan(op *opcode, data []byte, vm *Engine) error { v0, err := vm.dstack.PopInt() if err != nil { return err @@ -1792,7 +1717,7 @@ func opcodeLessThan(op *parsedOpcode, vm *Engine) error { // with a 1, otherwise a 0. // // Stack transformation: [... x1 x2] -> [... bool] -func opcodeGreaterThan(op *parsedOpcode, vm *Engine) error { +func opcodeGreaterThan(op *opcode, data []byte, vm *Engine) error { v0, err := vm.dstack.PopInt() if err != nil { return err @@ -1816,7 +1741,7 @@ func opcodeGreaterThan(op *parsedOpcode, vm *Engine) error { // replaced with a 1, otherwise a 0. // // Stack transformation: [... x1 x2] -> [... bool] -func opcodeLessThanOrEqual(op *parsedOpcode, vm *Engine) error { +func opcodeLessThanOrEqual(op *opcode, data []byte, vm *Engine) error { v0, err := vm.dstack.PopInt() if err != nil { return err @@ -1840,7 +1765,7 @@ func opcodeLessThanOrEqual(op *parsedOpcode, vm *Engine) error { // item, they are replaced with a 1, otherwise a 0. // // Stack transformation: [... x1 x2] -> [... bool] -func opcodeGreaterThanOrEqual(op *parsedOpcode, vm *Engine) error { +func opcodeGreaterThanOrEqual(op *opcode, data []byte, vm *Engine) error { v0, err := vm.dstack.PopInt() if err != nil { return err @@ -1864,7 +1789,7 @@ func opcodeGreaterThanOrEqual(op *parsedOpcode, vm *Engine) error { // them with the minimum of the two. // // Stack transformation: [... x1 x2] -> [... min(x1, x2)] -func opcodeMin(op *parsedOpcode, vm *Engine) error { +func opcodeMin(op *opcode, data []byte, vm *Engine) error { v0, err := vm.dstack.PopInt() if err != nil { return err @@ -1888,7 +1813,7 @@ func opcodeMin(op *parsedOpcode, vm *Engine) error { // them with the maximum of the two. // // Stack transformation: [... x1 x2] -> [... max(x1, x2)] -func opcodeMax(op *parsedOpcode, vm *Engine) error { +func opcodeMax(op *opcode, data []byte, vm *Engine) error { v0, err := vm.dstack.PopInt() if err != nil { return err @@ -1916,7 +1841,7 @@ func opcodeMax(op *parsedOpcode, vm *Engine) error { // the third-to-top item is the value to test. // // Stack transformation: [... x1 min max] -> [... bool] -func opcodeWithin(op *parsedOpcode, vm *Engine) error { +func opcodeWithin(op *opcode, data []byte, vm *Engine) error { maxVal, err := vm.dstack.PopInt() if err != nil { return err @@ -1950,7 +1875,7 @@ func calcHash(buf []byte, hasher hash.Hash) []byte { // replaces it with ripemd160(data). // // Stack transformation: [... x1] -> [... ripemd160(x1)] -func opcodeRipemd160(op *parsedOpcode, vm *Engine) error { +func opcodeRipemd160(op *opcode, data []byte, vm *Engine) error { buf, err := vm.dstack.PopByteArray() if err != nil { return err @@ -1964,7 +1889,7 @@ func opcodeRipemd160(op *parsedOpcode, vm *Engine) error { // with sha1(data). // // Stack transformation: [... x1] -> [... sha1(x1)] -func opcodeSha1(op *parsedOpcode, vm *Engine) error { +func opcodeSha1(op *opcode, data []byte, vm *Engine) error { buf, err := vm.dstack.PopByteArray() if err != nil { return err @@ -1979,7 +1904,7 @@ func opcodeSha1(op *parsedOpcode, vm *Engine) error { // it with sha256(data). // // Stack transformation: [... x1] -> [... sha256(x1)] -func opcodeSha256(op *parsedOpcode, vm *Engine) error { +func opcodeSha256(op *opcode, data []byte, vm *Engine) error { buf, err := vm.dstack.PopByteArray() if err != nil { return err @@ -1994,7 +1919,7 @@ func opcodeSha256(op *parsedOpcode, vm *Engine) error { // it with ripemd160(sha256(data)). // // Stack transformation: [... x1] -> [... ripemd160(sha256(x1))] -func opcodeHash160(op *parsedOpcode, vm *Engine) error { +func opcodeHash160(op *opcode, data []byte, vm *Engine) error { buf, err := vm.dstack.PopByteArray() if err != nil { return err @@ -2009,7 +1934,7 @@ func opcodeHash160(op *parsedOpcode, vm *Engine) error { // it with sha256(sha256(data)). // // Stack transformation: [... x1] -> [... sha256(sha256(x1))] -func opcodeHash256(op *parsedOpcode, vm *Engine) error { +func opcodeHash256(op *opcode, data []byte, vm *Engine) error { buf, err := vm.dstack.PopByteArray() if err != nil { return err @@ -2023,8 +1948,19 @@ func opcodeHash256(op *parsedOpcode, vm *Engine) error { // seen OP_CODESEPARATOR which is used during signature checking. // // This opcode does not change the contents of the data stack. -func opcodeCodeSeparator(op *parsedOpcode, vm *Engine) error { - vm.lastCodeSep = vm.scriptOff +func opcodeCodeSeparator(op *opcode, data []byte, vm *Engine) error { + vm.lastCodeSep = int(vm.tokenizer.ByteIndex()) + + if vm.taprootCtx != nil { + vm.taprootCtx.codeSepPos = uint32(vm.tokenizer.OpcodePosition()) + } else if vm.witnessProgram == nil && + vm.hasFlag(ScriptVerifyConstScriptCode) { + + // Disable OP_CODESEPARATOR for non-segwit scripts. + str := "OP_CODESEPARATOR used in non-segwit script" + return scriptError(ErrCodeSeparator, str) + } + return nil } @@ -2042,7 +1978,7 @@ func opcodeCodeSeparator(op *parsedOpcode, vm *Engine) error { // cryptographic methods against the provided public key. // // Stack transformation: [... signature pubkey] -> [... bool] -func opcodeCheckSig(op *parsedOpcode, vm *Engine) error { +func opcodeCheckSig(op *opcode, data []byte, vm *Engine) error { pkBytes, err := vm.dstack.PopByteArray() if err != nil { return err @@ -2053,98 +1989,110 @@ func opcodeCheckSig(op *parsedOpcode, vm *Engine) error { return err } - // The signature actually needs needs to be longer than this, but at + // The signature actually needs to be longer than this, but at // least 1 byte is needed for the hash type below. The full length is // checked depending on the script flags and upon parsing the signature. - if len(fullSigBytes) < 1 { + // + // This only applies if tapscript verification isn't active, as this + // check is done within the sighash itself. + if vm.taprootCtx == nil && len(fullSigBytes) < 1 { vm.dstack.PushBool(false) return nil } - // Trim off hashtype from the signature string and check if the - // signature and pubkey conform to the strict encoding requirements - // depending on the flags. - // - // NOTE: When the strict encoding flags are set, any errors in the - // signature or public encoding here result in an immediate script error - // (and thus no result bool is pushed to the data stack). This differs - // from the logic below where any errors in parsing the signature is - // treated as the signature failure resulting in false being pushed to - // the data stack. This is required because the more general script - // validation consensus rules do not have the new strict encoding - // requirements enabled by the flags. - hashType := SigHashType(fullSigBytes[len(fullSigBytes)-1]) - sigBytes := fullSigBytes[:len(fullSigBytes)-1] - if err := vm.checkHashTypeEncoding(hashType); err != nil { - return err - } - if err := vm.checkSignatureEncoding(sigBytes); err != nil { - return err - } - if err := vm.checkPubKeyEncoding(pkBytes); err != nil { - return err - } + var sigVerifier signatureVerifier + switch { + // If no witness program is active, then we're verifying under the + // base consensus rules. + case vm.witnessProgram == nil: + sigVerifier, err = newBaseSigVerifier( + pkBytes, fullSigBytes, vm, + ) + if err != nil { + var scriptErr Error + if errors.As(err, &scriptErr) { + return err + } - // Get script starting from the most recent OP_CODESEPARATOR. - subScript := vm.subScript() - - // Generate the signature hash based on the signature hash type. - var hash []byte - if vm.isWitnessVersionActive(0) { - var sigHashes *TxSigHashes - if vm.hashCache != nil { - sigHashes = vm.hashCache - } else { - sigHashes = NewTxSigHashes(&vm.tx) + vm.dstack.PushBool(false) + return nil } - hash, err = calcWitnessSignatureHash(subScript, sigHashes, hashType, - &vm.tx, vm.txIdx, vm.inputAmount) + // If the base segwit version is active, then we'll create the verifier + // that factors in those new consensus rules. + case vm.isWitnessVersionActive(BaseSegwitWitnessVersion): + sigVerifier, err = newBaseSegwitSigVerifier( + pkBytes, fullSigBytes, vm, + ) if err != nil { - return err - } - } else { - // Remove the signature since there is no way for a signature - // to sign itself. - subScript = removeOpcodeByData(subScript, fullSigBytes) - - hash = calcSignatureHash(subScript, hashType, &vm.tx, vm.txIdx) - } + var scriptErr Error + if errors.As(err, &scriptErr) { + return err + } - pubKey, err := btcec.ParsePubKey(pkBytes, btcec.S256()) - if err != nil { - vm.dstack.PushBool(false) - return nil - } + vm.dstack.PushBool(false) + return nil + } - var signature *btcec.Signature - if vm.hasFlag(ScriptVerifyStrictEncoding) || - vm.hasFlag(ScriptVerifyDERSignatures) { + // Otherwise, this is routine tapscript execution. + case vm.taprootCtx != nil: + // Account for changes in the sig ops budget after this + // execution, but only for non-empty signatures. + if len(fullSigBytes) > 0 { + if err := vm.taprootCtx.tallysigOp(); err != nil { + return err + } + } - signature, err = btcec.ParseDERSignature(sigBytes, btcec.S256()) - } else { - signature, err = btcec.ParseSignature(sigBytes, btcec.S256()) - } - if err != nil { - vm.dstack.PushBool(false) - return nil - } + // Empty public keys immediately cause execution to fail. + if len(pkBytes) == 0 { + return scriptError(ErrTaprootPubkeyIsEmpty, "") + } - var valid bool - if vm.sigCache != nil { - var sigHash chainhash.Hash - copy(sigHash[:], hash) + // If this is tapscript execution, and the signature was + // actually an empty vector, then we push on an empty vector + // and continue execution from there, but only if the pubkey + // isn't empty. + if len(fullSigBytes) == 0 { + vm.dstack.PushByteArray([]byte{}) + return nil + } - valid = vm.sigCache.Exists(sigHash, signature, pubKey) - if !valid && signature.Verify(hash, pubKey) { - vm.sigCache.Add(sigHash, signature, pubKey) - valid = true + // If the constructor fails immediately, then it's because + // the public key size is zero, so we'll fail all script + // execution. + sigVerifier, err = newBaseTapscriptSigVerifier( + pkBytes, fullSigBytes, vm, + ) + if err != nil { + return err } - } else { - valid = signature.Verify(hash, pubKey) - } - if !valid && vm.hasFlag(ScriptVerifyNullFail) && len(sigBytes) > 0 { + default: + // We skip segwit v1 in isolation here, as the v1 rules aren't + // used in script execution (for sig verification) and are only + // part of the top-level key-spend verification which we + // already skipped. + // + // In other words, this path shouldn't ever be reached + // + // TODO(roasbeef): return an error? + } + + result := sigVerifier.Verify() + valid := result.sigValid + + if vm.hasFlag(ScriptVerifyConstScriptCode) && result.sigMatch { + str := "non-const script code" + return scriptError(ErrNonConstScriptCode, str) + } + + switch { + // For tapscript, and prior execution with null fail active, if the + // signature is invalid, then this MUST be an empty signature. + case !valid && vm.taprootCtx != nil && len(fullSigBytes) != 0: + fallthrough + case !valid && vm.hasFlag(ScriptVerifyNullFail) && len(fullSigBytes) > 0: str := "signature not empty on failed checksig" return scriptError(ErrNullFail, str) } @@ -2157,21 +2105,101 @@ func opcodeCheckSig(op *parsedOpcode, vm *Engine) error { // The opcodeCheckSig function is invoked followed by opcodeVerify. See the // documentation for each of those opcodes for more details. // -// Stack transformation: signature pubkey] -> [... bool] -> [...] -func opcodeCheckSigVerify(op *parsedOpcode, vm *Engine) error { - err := opcodeCheckSig(op, vm) +// Stack transformation: [... signature pubkey] -> [... bool] -> [...] +func opcodeCheckSigVerify(op *opcode, data []byte, vm *Engine) error { + err := opcodeCheckSig(op, data, vm) if err == nil { err = abstractVerify(op, vm, ErrCheckSigVerify) } return err } +// opcodeCheckSigAdd implements the OP_CHECKSIGADD operation defined in BIP +// 342. This is a replacement for OP_CHECKMULTISIGVERIFY and OP_CHECKMULTISIG +// that lends better to batch sig validation, as well as a possible future of +// signature aggregation across inputs. +// +// The op code takes a public key, an integer (N) and a signature, and returns +// N if the signature was the empty vector, and n+1 otherwise. +// +// Stack transformation: [... pubkey n signature] -> [... n | n+1 ] -> [...] +func opcodeCheckSigAdd(op *opcode, data []byte, vm *Engine) error { + // This op code can only be used if tapsript execution is active. + // Before the soft fork, this opcode was marked as an invalid reserved + // op code. + if vm.taprootCtx == nil { + str := fmt.Sprintf("attempt to execute invalid opcode %s", op.name) + return scriptError(ErrReservedOpcode, str) + } + + // Pop the signature, integer n, and public key off the stack. + pubKeyBytes, err := vm.dstack.PopByteArray() + if err != nil { + return err + } + accumulatorInt, err := vm.dstack.PopInt() + if err != nil { + return err + } + sigBytes, err := vm.dstack.PopByteArray() + if err != nil { + return err + } + + // Only non-empty signatures count towards the total tapscript sig op + // limit. + if len(sigBytes) != 0 { + // Account for changes in the sig ops budget after this execution. + if err := vm.taprootCtx.tallysigOp(); err != nil { + return err + } + } + + // Empty public keys immediately cause execution to fail. + if len(pubKeyBytes) == 0 { + return scriptError(ErrTaprootPubkeyIsEmpty, "") + } + + // If the signature is empty, then we'll just push the value N back + // onto the stack and continue from here. + if len(sigBytes) == 0 { + vm.dstack.PushInt(accumulatorInt) + return nil + } + + // Otherwise, we'll attempt to validate the signature as normal. + // + // If the constructor fails immediately, then it's because the public + // key size is zero, so we'll fail all script execution. + sigVerifier, err := newBaseTapscriptSigVerifier( + pubKeyBytes, sigBytes, vm, + ) + if err != nil { + return err + } + + result := sigVerifier.Verify() + + // If the signature is invalid, this we fail execution, as it should + // have been an empty signature. + if !result.sigValid { + str := "signature not empty on failed checksig" + return scriptError(ErrNullFail, str) + } + + // Otherwise, we increment the accumulatorInt by one, and push that + // back onto the stack. + vm.dstack.PushInt(accumulatorInt + 1) + + return nil +} + // parsedSigInfo houses a raw signature along with its parsed form and a flag // for whether or not it has already been parsed. It is used to prevent parsing // the same signature multiple times when verifying a multisig. type parsedSigInfo struct { signature []byte - parsedSignature *btcec.Signature + parsedSignature *ecdsa.Signature parsed bool } @@ -2194,7 +2222,15 @@ type parsedSigInfo struct { // // Stack transformation: // [... dummy [sig ...] numsigs [pubkey ...] numpubkeys] -> [... bool] -func opcodeCheckMultiSig(op *parsedOpcode, vm *Engine) error { +func opcodeCheckMultiSig(op *opcode, data []byte, vm *Engine) error { + // If we're doing tapscript execution, then this op code is disabled. + if vm.taprootCtx != nil { + str := fmt.Sprintf("OP_CHECKMULTISIG and " + + "OP_CHECKMULTISIGVERIFY are disabled during " + + "tapscript execution") + return scriptError(ErrTapscriptCheckMultisig, str) + } + numKeys, err := vm.dstack.PopInt() if err != nil { return err @@ -2279,7 +2315,13 @@ func opcodeCheckMultiSig(op *parsedOpcode, vm *Engine) error { // no way for a signature to sign itself. if !vm.isWitnessVersionActive(0) { for _, sigInfo := range signatures { - script = removeOpcodeByData(script, sigInfo.signature) + var match bool + script, match = removeOpcodeByData(script, sigInfo.signature) + if vm.hasFlag(ScriptVerifyConstScriptCode) && match { + str := fmt.Sprintf("got match of %v in %v", sigInfo.signature, + script) + return scriptError(ErrNonConstScriptCode, str) + } } } @@ -2316,7 +2358,7 @@ func opcodeCheckMultiSig(op *parsedOpcode, vm *Engine) error { signature := rawSig[:len(rawSig)-1] // Only parse and check the signature encoding once. - var parsedSig *btcec.Signature + var parsedSig *ecdsa.Signature if !sigInfo.parsed { if err := vm.checkHashTypeEncoding(hashType); err != nil { return err @@ -2330,11 +2372,9 @@ func opcodeCheckMultiSig(op *parsedOpcode, vm *Engine) error { if vm.hasFlag(ScriptVerifyStrictEncoding) || vm.hasFlag(ScriptVerifyDERSignatures) { - parsedSig, err = btcec.ParseDERSignature(signature, - btcec.S256()) + parsedSig, err = ecdsa.ParseDERSignature(signature) } else { - parsedSig, err = btcec.ParseSignature(signature, - btcec.S256()) + parsedSig, err = ecdsa.ParseSignature(signature) } sigInfo.parsed = true if err != nil { @@ -2356,7 +2396,7 @@ func opcodeCheckMultiSig(op *parsedOpcode, vm *Engine) error { } // Parse the pubkey. - parsedPubKey, err := btcec.ParsePubKey(pubKey, btcec.S256()) + parsedPubKey, err := btcec.ParsePubKey(pubKey) if err != nil { continue } @@ -2368,10 +2408,12 @@ func opcodeCheckMultiSig(op *parsedOpcode, vm *Engine) error { if vm.hashCache != nil { sigHashes = vm.hashCache } else { - sigHashes = NewTxSigHashes(&vm.tx) + sigHashes = NewTxSigHashes( + &vm.tx, vm.prevOutFetcher, + ) } - hash, err = calcWitnessSignatureHash(script, sigHashes, hashType, + hash, err = calcWitnessSignatureHashRaw(script, sigHashes, hashType, &vm.tx, vm.txIdx, vm.inputAmount) if err != nil { return err @@ -2385,9 +2427,9 @@ func opcodeCheckMultiSig(op *parsedOpcode, vm *Engine) error { var sigHash chainhash.Hash copy(sigHash[:], hash) - valid = vm.sigCache.Exists(sigHash, parsedSig, parsedPubKey) + valid = vm.sigCache.Exists(sigHash, signature, pubKey) if !valid && parsedSig.Verify(hash, parsedPubKey) { - vm.sigCache.Add(sigHash, parsedSig, parsedPubKey) + vm.sigCache.Add(sigHash, signature, pubKey) valid = true } } else { @@ -2420,8 +2462,8 @@ func opcodeCheckMultiSig(op *parsedOpcode, vm *Engine) error { // // Stack transformation: // [... dummy [sig ...] numsigs [pubkey ...] numpubkeys] -> [... bool] -> [...] -func opcodeCheckMultiSigVerify(op *parsedOpcode, vm *Engine) error { - err := opcodeCheckMultiSig(op, vm) +func opcodeCheckMultiSigVerify(op *opcode, data []byte, vm *Engine) error { + err := opcodeCheckMultiSig(op, data, vm) if err == nil { err = abstractVerify(op, vm, ErrCheckMultiSigVerify) } diff --git a/txscript/opcode_test.go b/txscript/opcode_test.go index 6e3205a209..15c62907aa 100644 --- a/txscript/opcode_test.go +++ b/txscript/opcode_test.go @@ -23,8 +23,8 @@ func TestOpcodeDisabled(t *testing.T) { OP_LSHIFT, OP_RSHIFT, } for _, opcodeVal := range tests { - pop := parsedOpcode{opcode: &opcodeArray[opcodeVal], data: nil} - err := opcodeDisabled(&pop, nil) + op := &opcodeArray[opcodeVal] + err := opcodeDisabled(op, nil, nil) if !IsErrorCode(err, ErrDisabledOpcode) { t.Errorf("opcodeDisabled: unexpected error - got %v, "+ "want %v", err, ErrDisabledOpcode) @@ -77,7 +77,7 @@ func TestOpcodeDisasm(t *testing.T) { 0xae: "OP_CHECKMULTISIG", 0xaf: "OP_CHECKMULTISIGVERIFY", 0xfa: "OP_SMALLINTEGER", 0xfb: "OP_PUBKEYS", 0xfd: "OP_PUBKEYHASH", 0xfe: "OP_PUBKEY", - 0xff: "OP_INVALIDOPCODE", + 0xff: "OP_INVALIDOPCODE", 0xba: "OP_CHECKSIGADD", } for opcodeVal, expectedStr := range expectedStrings { var data []byte @@ -123,12 +123,13 @@ func TestOpcodeDisasm(t *testing.T) { } // OP_UNKNOWN#. - case opcodeVal >= 0xba && opcodeVal <= 0xf9 || opcodeVal == 0xfc: - expectedStr = "OP_UNKNOWN" + strconv.Itoa(int(opcodeVal)) + case opcodeVal >= 0xbb && opcodeVal <= 0xf9 || opcodeVal == 0xfc: + expectedStr = "OP_UNKNOWN" + strconv.Itoa(opcodeVal) } - pop := parsedOpcode{opcode: &opcodeArray[opcodeVal], data: data} - gotStr := pop.print(true) + var buf strings.Builder + disasmOpcode(&buf, &opcodeArray[opcodeVal], data, true) + gotStr := buf.String() if gotStr != expectedStr { t.Errorf("pop.print (opcode %x): Unexpected disasm "+ "string - got %v, want %v", opcodeVal, gotStr, @@ -190,11 +191,18 @@ func TestOpcodeDisasm(t *testing.T) { // OP_UNKNOWN#. case opcodeVal >= 0xba && opcodeVal <= 0xf9 || opcodeVal == 0xfc: - expectedStr = "OP_UNKNOWN" + strconv.Itoa(int(opcodeVal)) + switch opcodeVal { + // OP_UNKNOWN186 a.k.a 0xba is now OP_CHECKSIGADD. + case 0xba: + expectedStr = "OP_CHECKSIGADD" + default: + expectedStr = "OP_UNKNOWN" + strconv.Itoa(opcodeVal) + } } - pop := parsedOpcode{opcode: &opcodeArray[opcodeVal], data: data} - gotStr := pop.print(false) + var buf strings.Builder + disasmOpcode(&buf, &opcodeArray[opcodeVal], data, false) + gotStr := buf.String() if gotStr != expectedStr { t.Errorf("pop.print (opcode %x): Unexpected disasm "+ "string - got %v, want %v", opcodeVal, gotStr, diff --git a/txscript/pkscript.go b/txscript/pkscript.go index 0703ef5d05..4998f97b2f 100644 --- a/txscript/pkscript.go +++ b/txscript/pkscript.go @@ -5,10 +5,11 @@ import ( "errors" "fmt" - "github.com/btcsuite/btcd/btcec" + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcec/v2/ecdsa" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" "golang.org/x/crypto/ripemd160" ) @@ -20,7 +21,7 @@ const ( // Signature hash type (1 byte) // Public key length (1 byte) // Public key (33 byte) - minPubKeyHashSigScriptLen = 1 + btcec.MinSigLen + 1 + 1 + 33 + minPubKeyHashSigScriptLen = 1 + ecdsa.MinSigLen + 1 + 1 + 33 // maxPubKeyHashSigScriptLen is the maximum length of a signature script // that spends a P2PKH output. The length is composed of the following: @@ -47,6 +48,9 @@ const ( // witnessV0ScriptHashLen is the length of a P2WSH script. witnessV0ScriptHashLen = 34 + // witnessV1TaprootLen is the length of a P2TR script. + witnessV1TaprootLen = 34 + // maxLen is the maximum script length supported by ParsePkScript. maxLen = witnessV0ScriptHashLen ) @@ -99,7 +103,7 @@ func ParsePkScript(pkScript []byte) (PkScript, error) { func isSupportedScriptType(class ScriptClass) bool { switch class { case PubKeyHashTy, WitnessV0PubKeyHashTy, ScriptHashTy, - WitnessV0ScriptHashTy: + WitnessV0ScriptHashTy, WitnessV1TaprootTy: return true default: return false @@ -132,6 +136,10 @@ func (s PkScript) Script() []byte { script = make([]byte, witnessV0ScriptHashLen) copy(script, s.script[:witnessV0ScriptHashLen]) + case WitnessV1TaprootTy: + script = make([]byte, witnessV1TaprootLen) + copy(script, s.script[:witnessV1TaprootLen]) + default: // Unsupported script type. return nil @@ -211,11 +219,12 @@ func computeNonWitnessPkScript(sigScript []byte) (PkScript, error) { // The redeem script will always be the last data push of the // signature script, so we'll parse the script into opcodes to // obtain it. - parsedOpcodes, err := parseScript(sigScript) + const scriptVersion = 0 + err := checkScriptParses(scriptVersion, sigScript) if err != nil { return PkScript{}, err } - redeemScript := parsedOpcodes[len(parsedOpcodes)-1].data + redeemScript := finalOpcodeData(scriptVersion, sigScript) scriptHash := hash160(redeemScript) script, err := payToScriptHashScript(scriptHash) diff --git a/txscript/pkscript_test.go b/txscript/pkscript_test.go index 841842c268..c82ab04e62 100644 --- a/txscript/pkscript_test.go +++ b/txscript/pkscript_test.go @@ -337,9 +337,9 @@ func TestComputePkScript(t *testing.T) { name: "P2WSH witness", sigScript: nil, witness: [][]byte{ - []byte{}, + {}, // Witness script. - []byte{ + { 0x21, 0x03, 0x82, 0x62, 0xa6, 0xc6, 0xce, 0xc9, 0x3c, 0x2d, 0x3e, 0xcd, 0x6c, 0x60, 0x72, 0xef, 0xea, 0x86, @@ -367,9 +367,9 @@ func TestComputePkScript(t *testing.T) { witness: [][]byte{ // Signature is not needed to re-derive the // pkScript. - []byte{}, + {}, // Compressed pubkey. - []byte{ + { 0x03, 0x82, 0x62, 0xa6, 0xc6, 0xce, 0xc9, 0x3c, 0x2d, 0x3e, 0xcd, 0x6c, 0x60, 0x72, 0xef, 0xea, 0x86, 0xd0, @@ -398,9 +398,9 @@ func TestComputePkScript(t *testing.T) { witness: [][]byte{ // Signature is not needed to re-derive the // pkScript. - []byte{}, + {}, // Malformed compressed pubkey. - []byte{ + { 0x03, 0x82, 0x62, 0xa6, 0xc6, 0xce, 0xc9, 0x3c, 0x2d, 0x3e, 0xcd, 0x6c, 0x60, 0x72, 0xef, 0xea, 0x86, 0xd0, @@ -429,12 +429,12 @@ func TestComputePkScript(t *testing.T) { } if pkScript.Class() != test.class { - t.Fatalf("expected pkScript of type %v, got %v", - test.class, pkScript.Class()) + t.Fatalf("%s: expected pkScript of type %v, got %v", + test.name, test.class, pkScript.Class()) } if !bytes.Equal(pkScript.Script(), test.pkScript) { - t.Fatalf("expected pkScript=%x, got pkScript=%x", - test.pkScript, pkScript.Script()) + t.Fatalf("%s: expected pkScript=%x, got pkScript=%x", + test.name, test.pkScript, pkScript.Script()) } }) } diff --git a/txscript/reference_test.go b/txscript/reference_test.go index 5015960b94..b3f90cd5ba 100644 --- a/txscript/reference_test.go +++ b/txscript/reference_test.go @@ -10,14 +10,16 @@ import ( "encoding/json" "errors" "fmt" - "io/ioutil" + "io/fs" + "os" + "path/filepath" "strconv" "strings" "testing" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) // scriptTestName returns a descriptive test name for the given reference script @@ -192,6 +194,10 @@ func parseScriptFlags(flagStr string) (ScriptFlags, error) { flags |= ScriptVerifyMinimalIf case "WITNESS_PUBKEYTYPE": flags |= ScriptVerifyWitnessPubKeyType + case "TAPROOT": + flags |= ScriptVerifyTaproot + case "CONST_SCRIPTCODE": + flags |= ScriptVerifyConstScriptCode default: return flags, fmt.Errorf("invalid flag: %s", flag) } @@ -441,10 +447,14 @@ func testScripts(t *testing.T, tests [][]interface{}, useSigCache bool) { // Generate a transaction pair such that one spends from the // other and the provided signature and public key scripts are // used, then create a new engine to execute the scripts. - tx := createSpendingTx(witness, scriptSig, scriptPubKey, - int64(inputAmt)) - vm, err := NewEngine(scriptPubKey, tx, 0, flags, sigCache, nil, - int64(inputAmt)) + tx := createSpendingTx( + witness, scriptSig, scriptPubKey, int64(inputAmt), + ) + prevOuts := NewCannedPrevOutputFetcher(scriptPubKey, int64(inputAmt)) + vm, err := NewEngine( + scriptPubKey, tx, 0, flags, sigCache, nil, + int64(inputAmt), prevOuts, + ) if err == nil { err = vm.Execute() } @@ -482,7 +492,7 @@ func testScripts(t *testing.T, tests [][]interface{}, useSigCache bool) { // TestScripts ensures all of the tests in script_tests.json execute with the // expected results as defined in the test data. func TestScripts(t *testing.T) { - file, err := ioutil.ReadFile("data/script_tests.json") + file, err := os.ReadFile("data/script_tests.json") if err != nil { t.Fatalf("TestScripts: %v\n", err) } @@ -513,7 +523,7 @@ func testVecF64ToUint32(f float64) uint32 { // TestTxInvalidTests ensures all of the tests in tx_invalid.json fail as // expected. func TestTxInvalidTests(t *testing.T) { - file, err := ioutil.ReadFile("data/tx_invalid.json") + file, err := os.ReadFile("data/tx_invalid.json") if err != nil { t.Fatalf("TestTxInvalidTests: %v\n", err) } @@ -572,7 +582,7 @@ testloop: continue } - prevOuts := make(map[wire.OutPoint]scriptWithInputVal) + prevOutFetcher := NewMultiPrevOutFetcher(nil) for j, iinput := range inputs { input, ok := iinput.([]interface{}) if !ok { @@ -633,16 +643,18 @@ testloop: } } - v := scriptWithInputVal{ - inputVal: int64(inputValue), - pkScript: script, - } - prevOuts[*wire.NewOutPoint(prevhash, idx)] = v + op := wire.NewOutPoint(prevhash, idx) + prevOutFetcher.AddPrevOut(*op, &wire.TxOut{ + Value: int64(inputValue), + PkScript: script, + }) } for k, txin := range tx.MsgTx().TxIn { - prevOut, ok := prevOuts[txin.PreviousOutPoint] - if !ok { + prevOut := prevOutFetcher.FetchPrevOutput( + txin.PreviousOutPoint, + ) + if prevOut == nil { t.Errorf("bad test (missing %dth input) %d:%v", k, i, test) continue testloop @@ -650,8 +662,8 @@ testloop: // These are meant to fail, so as soon as the first // input fails the transaction has failed. (some of the // test txns have good inputs, too.. - vm, err := NewEngine(prevOut.pkScript, tx.MsgTx(), k, - flags, nil, nil, prevOut.inputVal) + vm, err := NewEngine(prevOut.PkScript, tx.MsgTx(), k, + flags, nil, nil, prevOut.Value, prevOutFetcher) if err != nil { continue testloop } @@ -669,7 +681,7 @@ testloop: // TestTxValidTests ensures all of the tests in tx_valid.json pass as expected. func TestTxValidTests(t *testing.T) { - file, err := ioutil.ReadFile("data/tx_valid.json") + file, err := os.ReadFile("data/tx_valid.json") if err != nil { t.Fatalf("TestTxValidTests: %v\n", err) } @@ -727,7 +739,7 @@ testloop: continue } - prevOuts := make(map[wire.OutPoint]scriptWithInputVal) + prevOutFetcher := NewMultiPrevOutFetcher(nil) for j, iinput := range inputs { input, ok := iinput.([]interface{}) if !ok { @@ -788,22 +800,24 @@ testloop: } } - v := scriptWithInputVal{ - inputVal: int64(inputValue), - pkScript: script, - } - prevOuts[*wire.NewOutPoint(prevhash, idx)] = v + op := wire.NewOutPoint(prevhash, idx) + prevOutFetcher.AddPrevOut(*op, &wire.TxOut{ + Value: int64(inputValue), + PkScript: script, + }) } for k, txin := range tx.MsgTx().TxIn { - prevOut, ok := prevOuts[txin.PreviousOutPoint] - if !ok { + prevOut := prevOutFetcher.FetchPrevOutput( + txin.PreviousOutPoint, + ) + if prevOut == nil { t.Errorf("bad test (missing %dth input) %d:%v", k, i, test) continue testloop } - vm, err := NewEngine(prevOut.pkScript, tx.MsgTx(), k, - flags, nil, nil, prevOut.inputVal) + vm, err := NewEngine(prevOut.PkScript, tx.MsgTx(), k, + flags, nil, nil, prevOut.Value, prevOutFetcher) if err != nil { t.Errorf("test (%d:%v:%d) failed to create "+ "script: %v", i, test, k, err) @@ -824,7 +838,7 @@ testloop: // in sighash.json. // https://github.com/bitcoin/bitcoin/blob/master/src/test/data/sighash.json func TestCalcSignatureHash(t *testing.T) { - file, err := ioutil.ReadFile("data/sighash.json") + file, err := os.ReadFile("data/sighash.json") if err != nil { t.Fatalf("TestCalcSignatureHash: %v\n", err) } @@ -836,6 +850,7 @@ func TestCalcSignatureHash(t *testing.T) { err) } + const scriptVersion = 0 for i, test := range tests { if i == 0 { // Skip first line -- contains comments only. @@ -855,16 +870,20 @@ func TestCalcSignatureHash(t *testing.T) { } subScript, _ := hex.DecodeString(test[1].(string)) - parsedScript, err := parseScript(subScript) - if err != nil { + if err := checkScriptParses(scriptVersion, subScript); err != nil { t.Errorf("TestCalcSignatureHash failed test #%d: "+ "Failed to parse sub-script: %v", i, err) continue } hashType := SigHashType(testVecF64ToUint32(test[3].(float64))) - hash := calcSignatureHash(parsedScript, hashType, &tx, + hash, err := CalcSignatureHash(subScript, hashType, &tx, int(test[2].(float64))) + if err != nil { + t.Errorf("TestCalcSignatureHash failed test #%d: "+ + "Failed to compute sighash: %v", i, err) + continue + } expectedHash, _ := chainhash.NewHashFromStr(test[4].(string)) if !bytes.Equal(hash, expectedHash[:]) { @@ -873,3 +892,189 @@ func TestCalcSignatureHash(t *testing.T) { } } } + +type inputWitness struct { + ScriptSig string `json:"scriptSig"` + Witness []string `json:"witness"` +} + +type taprootJsonTest struct { + Tx string `json:"tx"` + Prevouts []string `json:"prevouts"` + Index int `json:"index"` + Flags string `json:"flags"` + + Comment string `json:"comment"` + + Success *inputWitness `json:"success"` + + Failure *inputWitness `json:"failure"` +} + +func executeTaprootRefTest(t *testing.T, testCase taprootJsonTest) { + t.Helper() + + txHex, err := hex.DecodeString(testCase.Tx) + if err != nil { + t.Fatalf("unable to decode hex: %v", err) + } + tx, err := btcutil.NewTxFromBytes(txHex) + if err != nil { + t.Fatalf("unable to decode hex: %v", err) + } + + var prevOut wire.TxOut + + prevOutFetcher := NewMultiPrevOutFetcher(nil) + for i, prevOutString := range testCase.Prevouts { + prevOutBytes, err := hex.DecodeString(prevOutString) + if err != nil { + t.Fatalf("unable to decode hex: %v", err) + } + + var txOut wire.TxOut + err = wire.ReadTxOut( + bytes.NewReader(prevOutBytes), 0, 0, &txOut, + ) + if err != nil { + t.Fatalf("unable to read utxo: %v", err) + } + + prevOutFetcher.AddPrevOut( + tx.MsgTx().TxIn[i].PreviousOutPoint, &txOut, + ) + + if i == testCase.Index { + prevOut = txOut + } + } + + flags, err := parseScriptFlags(testCase.Flags) + if err != nil { + t.Fatalf("unable to parse flags: %v", err) + } + + makeVM := func() *Engine { + hashCache := NewTxSigHashes(tx.MsgTx(), prevOutFetcher) + + vm, err := NewEngine( + prevOut.PkScript, tx.MsgTx(), testCase.Index, + flags, nil, hashCache, prevOut.Value, prevOutFetcher, + ) + if err != nil { + t.Fatalf("unable to create vm: %v", err) + } + + return vm + } + + if testCase.Success != nil { + tx.MsgTx().TxIn[testCase.Index].SignatureScript, err = hex.DecodeString( + testCase.Success.ScriptSig, + ) + if err != nil { + t.Fatalf("unable to parse sig script: %v", err) + } + + var witness [][]byte + for _, witnessStr := range testCase.Success.Witness { + witElem, err := hex.DecodeString(witnessStr) + if err != nil { + t.Fatalf("unable to parse witness stack: %v", err) + } + + witness = append(witness, witElem) + } + + tx.MsgTx().TxIn[testCase.Index].Witness = witness + + vm := makeVM() + + err = vm.Execute() + if err != nil { + t.Fatalf("test (%v) failed to execute: "+ + "%v", testCase.Comment, err) + } + } + + if testCase.Failure != nil { + tx.MsgTx().TxIn[testCase.Index].SignatureScript, err = hex.DecodeString( + testCase.Failure.ScriptSig, + ) + if err != nil { + t.Fatalf("unable to parse sig script: %v", err) + } + + var witness [][]byte + for _, witnessStr := range testCase.Failure.Witness { + witElem, err := hex.DecodeString(witnessStr) + if err != nil { + t.Fatalf("unable to parse witness stack: %v", err) + } + + witness = append(witness, witElem) + } + + tx.MsgTx().TxIn[testCase.Index].Witness = witness + + vm := makeVM() + + err = vm.Execute() + if err == nil { + t.Fatalf("test (%v) succeeded, should fail: "+ + "%v", testCase.Comment, err) + } + } +} + +// TestTaprootReferenceTests test that we're able to properly validate (success +// and failure paths for each test) the set of functional generative tests +// created by the bitcoind project for taproot at: +// https://github.com/bitcoin/bitcoin/blob/master/test/functional/feature_taproot.py. +func TestTaprootReferenceTests(t *testing.T) { + t.Parallel() + + filePath := "data/taproot-ref" + + testFunc := func(path string, info fs.FileInfo, walkErr error) error { + if walkErr != nil { + return walkErr + } + + if info.IsDir() { + t.Logf("skipping dir: %v", info.Name()) + return nil + } + + testJson, err := os.ReadFile(path) + if err != nil { + return fmt.Errorf("unable to read file: %v", err) + } + + // All the JSON files have a trailing comma and a new line + // character, so we'll remove that here before attempting to + // parse it. + testJson = bytes.TrimSuffix(testJson, []byte(",\n")) + + var testCase taprootJsonTest + if err := json.Unmarshal(testJson, &testCase); err != nil { + return fmt.Errorf("unable to decode json: %v", err) + } + + testName := fmt.Sprintf( + "%v:%v", testCase.Comment, filepath.Base(path), + ) + _ = t.Run(testName, func(t *testing.T) { + t.Parallel() + + executeTaprootRefTest(t, testCase) + }) + + return nil + } + + err := filepath.Walk(filePath, testFunc) + if err != nil { + t.Fatalf("unable to execute taproot test vectors: %v", err) + } +} diff --git a/txscript/script.go b/txscript/script.go index aac3d4aaaa..6d16f74f95 100644 --- a/txscript/script.go +++ b/txscript/script.go @@ -1,4 +1,5 @@ // Copyright (c) 2013-2017 The btcsuite developers +// Copyright (c) 2015-2019 The Decred developers // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. @@ -6,11 +7,10 @@ package txscript import ( "bytes" - "encoding/binary" "fmt" + "strings" "time" - "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/wire" ) @@ -19,20 +19,18 @@ import ( // This timestamp corresponds to Sun Apr 1 00:00:00 UTC 2012. var Bip16Activation = time.Unix(1333238400, 0) -// SigHashType represents hash type bits at the end of a signature. -type SigHashType uint32 - -// Hash type bits from the end of a signature. const ( - SigHashOld SigHashType = 0x0 - SigHashAll SigHashType = 0x1 - SigHashNone SigHashType = 0x2 - SigHashSingle SigHashType = 0x3 - SigHashAnyOneCanPay SigHashType = 0x80 - - // sigHashMask defines the number of bits of the hash type which is used - // to identify which outputs are signed. - sigHashMask = 0x1f + // TaprootAnnexTag is the tag for an annex. This value is used to + // identify the annex during tapscript spends. If there're at least two + // elements in the taproot witness stack, and the first byte of the + // last element matches this tag, then we'll extract this as a distinct + // item. + TaprootAnnexTag = 0x50 + + // TaprootLeafMask is the mask applied to the control block to extract + // the leaf version and parity of the y-coordinate of the output key if + // the taproot script leaf being spent. + TaprootLeafMask = 0xfe ) // These are the constants specified for maximums in individual scripts. @@ -42,68 +40,56 @@ const ( MaxScriptElementSize = 520 // Max bytes pushable to the stack. ) -// isSmallInt returns whether or not the opcode is considered a small integer, +// IsSmallInt returns whether or not the opcode is considered a small integer, // which is an OP_0, or OP_1 through OP_16. -func isSmallInt(op *opcode) bool { - if op.value == OP_0 || (op.value >= OP_1 && op.value <= OP_16) { - return true - } - return false +// +// NOTE: This function is only valid for version 0 opcodes. Since the function +// does not accept a script version, the results are undefined for other script +// versions. +func IsSmallInt(op byte) bool { + return op == OP_0 || (op >= OP_1 && op <= OP_16) } -// isScriptHash returns true if the script passed is a pay-to-script-hash -// transaction, false otherwise. -func isScriptHash(pops []parsedOpcode) bool { - return len(pops) == 3 && - pops[0].opcode.value == OP_HASH160 && - pops[1].opcode.value == OP_DATA_20 && - pops[2].opcode.value == OP_EQUAL +// IsPayToPubKey returns true if the script is in the standard pay-to-pubkey +// (P2PK) format, false otherwise. +func IsPayToPubKey(script []byte) bool { + return isPubKeyScript(script) +} + +// IsPayToPubKeyHash returns true if the script is in the standard +// pay-to-pubkey-hash (P2PKH) format, false otherwise. +func IsPayToPubKeyHash(script []byte) bool { + return isPubKeyHashScript(script) } // IsPayToScriptHash returns true if the script is in the standard // pay-to-script-hash (P2SH) format, false otherwise. +// +// WARNING: This function always treats the passed script as version 0. Great +// care must be taken if introducing a new script version because it is used in +// consensus which, unfortunately as of the time of this writing, does not check +// script versions before determining if the script is a P2SH which means nodes +// on existing rules will analyze new version scripts as if they were version 0. func IsPayToScriptHash(script []byte) bool { - pops, err := parseScript(script) - if err != nil { - return false - } - return isScriptHash(pops) + return isScriptHashScript(script) } -// isWitnessScriptHash returns true if the passed script is a -// pay-to-witness-script-hash transaction, false otherwise. -func isWitnessScriptHash(pops []parsedOpcode) bool { - return len(pops) == 2 && - pops[0].opcode.value == OP_0 && - pops[1].opcode.value == OP_DATA_32 -} - -// IsPayToWitnessScriptHash returns true if the is in the standard +// IsPayToWitnessScriptHash returns true if the script is in the standard // pay-to-witness-script-hash (P2WSH) format, false otherwise. func IsPayToWitnessScriptHash(script []byte) bool { - pops, err := parseScript(script) - if err != nil { - return false - } - return isWitnessScriptHash(pops) + return isWitnessScriptHashScript(script) } -// IsPayToWitnessPubKeyHash returns true if the is in the standard +// IsPayToWitnessPubKeyHash returns true if the script is in the standard // pay-to-witness-pubkey-hash (P2WKH) format, false otherwise. func IsPayToWitnessPubKeyHash(script []byte) bool { - pops, err := parseScript(script) - if err != nil { - return false - } - return isWitnessPubKeyHash(pops) + return isWitnessPubKeyHashScript(script) } -// isWitnessPubKeyHash returns true if the passed script is a -// pay-to-witness-pubkey-hash, and false otherwise. -func isWitnessPubKeyHash(pops []parsedOpcode) bool { - return len(pops) == 2 && - pops[0].opcode.value == OP_0 && - pops[1].opcode.value == OP_DATA_20 +// IsPayToTaproot returns true if the passed script is a standard +// pay-to-taproot (PTTR) scripts, and false otherwise. +func IsPayToTaproot(script []byte) bool { + return isWitnessTaprootScript(script) } // IsWitnessProgram returns true if the passed script is a valid witness @@ -111,191 +97,52 @@ func isWitnessPubKeyHash(pops []parsedOpcode) bool { // witness program must be a small integer (from 0-16), followed by 2-40 bytes // of pushed data. func IsWitnessProgram(script []byte) bool { - // The length of the script must be between 4 and 42 bytes. The - // smallest program is the witness version, followed by a data push of - // 2 bytes. The largest allowed witness program has a data push of - // 40-bytes. - if len(script) < 4 || len(script) > 42 { - return false - } - - pops, err := parseScript(script) - if err != nil { - return false - } - - return isWitnessProgram(pops) + return isWitnessProgramScript(script) } -// isWitnessProgram returns true if the passed script is a witness program, and -// false otherwise. A witness program MUST adhere to the following constraints: -// there must be exactly two pops (program version and the program itself), the -// first opcode MUST be a small integer (0-16), the push data MUST be -// canonical, and finally the size of the push data must be between 2 and 40 -// bytes. -func isWitnessProgram(pops []parsedOpcode) bool { - return len(pops) == 2 && - isSmallInt(pops[0].opcode) && - canonicalPush(pops[1]) && - (len(pops[1].data) >= 2 && len(pops[1].data) <= 40) +// IsNullData returns true if the passed script is a null data script, false +// otherwise. +func IsNullData(script []byte) bool { + const scriptVersion = 0 + return isNullDataScript(scriptVersion, script) } // ExtractWitnessProgramInfo attempts to extract the witness program version, // as well as the witness program itself from the passed script. func ExtractWitnessProgramInfo(script []byte) (int, []byte, error) { - pops, err := parseScript(script) - if err != nil { - return 0, nil, err - } - // If at this point, the scripts doesn't resemble a witness program, // then we'll exit early as there isn't a valid version or program to // extract. - if !isWitnessProgram(pops) { + version, program, valid := extractWitnessProgramInfo(script) + if !valid { return 0, nil, fmt.Errorf("script is not a witness program, " + "unable to extract version or witness program") } - witnessVersion := asSmallInt(pops[0].opcode) - witnessProgram := pops[1].data - - return witnessVersion, witnessProgram, nil + return version, program, nil } -// isPushOnly returns true if the script only pushes data, false otherwise. -func isPushOnly(pops []parsedOpcode) bool { - // NOTE: This function does NOT verify opcodes directly since it is - // internal and is only called with parsed opcodes for scripts that did - // not have any parse errors. Thus, consensus is properly maintained. - - for _, pop := range pops { - // All opcodes up to OP_16 are data push instructions. - // NOTE: This does consider OP_RESERVED to be a data push - // instruction, but execution of OP_RESERVED will fail anyways - // and matches the behavior required by consensus. - if pop.opcode.value > OP_16 { - return false - } - } - return true -} - -// IsPushOnlyScript returns whether or not the passed script only pushes data. +// IsPushOnlyScript returns whether or not the passed script only pushes data +// according to the consensus definition of pushing data. // -// False will be returned when the script does not parse. +// WARNING: This function always treats the passed script as version 0. Great +// care must be taken if introducing a new script version because it is used in +// consensus which, unfortunately as of the time of this writing, does not check +// script versions before checking if it is a push only script which means nodes +// on existing rules will treat new version scripts as if they were version 0. func IsPushOnlyScript(script []byte) bool { - pops, err := parseScript(script) - if err != nil { - return false - } - return isPushOnly(pops) -} - -// parseScriptTemplate is the same as parseScript but allows the passing of the -// template list for testing purposes. When there are parse errors, it returns -// the list of parsed opcodes up to the point of failure along with the error. -func parseScriptTemplate(script []byte, opcodes *[256]opcode) ([]parsedOpcode, error) { - retScript := make([]parsedOpcode, 0, len(script)) - for i := 0; i < len(script); { - instr := script[i] - op := &opcodes[instr] - pop := parsedOpcode{opcode: op} - - // Parse data out of instruction. - switch { - // No additional data. Note that some of the opcodes, notably - // OP_1NEGATE, OP_0, and OP_[1-16] represent the data - // themselves. - case op.length == 1: - i++ - - // Data pushes of specific lengths -- OP_DATA_[1-75]. - case op.length > 1: - if len(script[i:]) < op.length { - str := fmt.Sprintf("opcode %s requires %d "+ - "bytes, but script only has %d remaining", - op.name, op.length, len(script[i:])) - return retScript, scriptError(ErrMalformedPush, - str) - } - - // Slice out the data. - pop.data = script[i+1 : i+op.length] - i += op.length - - // Data pushes with parsed lengths -- OP_PUSHDATAP{1,2,4}. - case op.length < 0: - var l uint - off := i + 1 - - if len(script[off:]) < -op.length { - str := fmt.Sprintf("opcode %s requires %d "+ - "bytes, but script only has %d remaining", - op.name, -op.length, len(script[off:])) - return retScript, scriptError(ErrMalformedPush, - str) - } - - // Next -length bytes are little endian length of data. - switch op.length { - case -1: - l = uint(script[off]) - case -2: - l = ((uint(script[off+1]) << 8) | - uint(script[off])) - case -4: - l = ((uint(script[off+3]) << 24) | - (uint(script[off+2]) << 16) | - (uint(script[off+1]) << 8) | - uint(script[off])) - default: - str := fmt.Sprintf("invalid opcode length %d", - op.length) - return retScript, scriptError(ErrMalformedPush, - str) - } - - // Move offset to beginning of the data. - off += -op.length - - // Disallow entries that do not fit script or were - // sign extended. - if int(l) > len(script[off:]) || int(l) < 0 { - str := fmt.Sprintf("opcode %s pushes %d bytes, "+ - "but script only has %d remaining", - op.name, int(l), len(script[off:])) - return retScript, scriptError(ErrMalformedPush, - str) - } - - pop.data = script[off : off+int(l)] - i += 1 - op.length + int(l) - } - - retScript = append(retScript, pop) - } - - return retScript, nil -} - -// parseScript preparses the script in bytes into a list of parsedOpcodes while -// applying a number of sanity checks. -func parseScript(script []byte) ([]parsedOpcode, error) { - return parseScriptTemplate(script, &opcodeArray) -} - -// unparseScript reversed the action of parseScript and returns the -// parsedOpcodes as a list of bytes -func unparseScript(pops []parsedOpcode) ([]byte, error) { - script := make([]byte, 0, len(pops)) - for _, pop := range pops { - b, err := pop.bytes() - if err != nil { - return nil, err + const scriptVersion = 0 + tokenizer := MakeScriptTokenizer(scriptVersion, script) + for tokenizer.Next() { + // All opcodes up to OP_16 are data push instructions. + // NOTE: This does consider OP_RESERVED to be a data push instruction, + // but execution of OP_RESERVED will fail anyway and matches the + // behavior required by consensus. + if tokenizer.Opcode() > OP_16 { + return false } - script = append(script, b...) } - return script, nil + return tokenizer.Err() == nil } // DisasmString formats a disassembled script for one line printing. When the @@ -303,41 +150,78 @@ func unparseScript(pops []parsedOpcode) ([]byte, error) { // script up to the point the failure occurred along with the string '[error]' // appended. In addition, the reason the script failed to parse is returned // if the caller wants more information about the failure. -func DisasmString(buf []byte) (string, error) { - var disbuf bytes.Buffer - opcodes, err := parseScript(buf) - for _, pop := range opcodes { - disbuf.WriteString(pop.print(true)) +// +// NOTE: This function is only valid for version 0 scripts. Since the function +// does not accept a script version, the results are undefined for other script +// versions. +func DisasmString(script []byte) (string, error) { + const scriptVersion = 0 + + var disbuf strings.Builder + tokenizer := MakeScriptTokenizer(scriptVersion, script) + if tokenizer.Next() { + disasmOpcode(&disbuf, tokenizer.op, tokenizer.Data(), true) + } + for tokenizer.Next() { disbuf.WriteByte(' ') + disasmOpcode(&disbuf, tokenizer.op, tokenizer.Data(), true) } - if disbuf.Len() > 0 { - disbuf.Truncate(disbuf.Len() - 1) - } - if err != nil { + if tokenizer.Err() != nil { + if tokenizer.ByteIndex() != 0 { + disbuf.WriteByte(' ') + } disbuf.WriteString("[error]") } - return disbuf.String(), err + return disbuf.String(), tokenizer.Err() } -// removeOpcode will remove any opcode matching ``opcode'' from the opcode -// stream in pkscript -func removeOpcode(pkscript []parsedOpcode, opcode byte) []parsedOpcode { - retScript := make([]parsedOpcode, 0, len(pkscript)) - for _, pop := range pkscript { - if pop.opcode.value != opcode { - retScript = append(retScript, pop) +// removeOpcodeRaw will return the script after removing any opcodes that match +// `opcode`. If the opcode does not appear in script, the original script will +// be returned unmodified. Otherwise, a new script will be allocated to contain +// the filtered script. This method assumes that the script parses +// successfully. +// +// NOTE: This function is only valid for version 0 scripts. Since the function +// does not accept a script version, the results are undefined for other script +// versions. +func removeOpcodeRaw(script []byte, opcode byte) []byte { + // Avoid work when possible. + if len(script) == 0 { + return script + } + + const scriptVersion = 0 + var result []byte + var prevOffset int32 + + tokenizer := MakeScriptTokenizer(scriptVersion, script) + for tokenizer.Next() { + if tokenizer.Opcode() == opcode { + if result == nil { + result = make([]byte, 0, len(script)) + result = append(result, script[:prevOffset]...) + } + } else if result != nil { + result = append(result, script[prevOffset:tokenizer.ByteIndex()]...) } + prevOffset = tokenizer.ByteIndex() + } + if result == nil { + return script } - return retScript + return result } -// canonicalPush returns true if the object is either not a push instruction -// or the push instruction contained wherein is matches the canonical form -// or using the smallest instruction to do the job. False otherwise. -func canonicalPush(pop parsedOpcode) bool { - opcode := pop.opcode.value - data := pop.data - dataLen := len(pop.data) +// isCanonicalPush returns true if the opcode is either not a push instruction +// or the data associated with the push instruction uses the smallest +// instruction to do the job. False otherwise. +// +// For example, it is possible to push a value of 1 to the stack as "OP_1", +// "OP_DATA_1 0x01", "OP_PUSHDATA1 0x01 0x01", and others, however, the first +// only takes a single byte, while the rest take more. Only the first is +// considered canonical. +func isCanonicalPush(opcode byte, data []byte) bool { + dataLen := len(data) if opcode > OP_16 { return true } @@ -357,390 +241,169 @@ func canonicalPush(pop parsedOpcode) bool { return true } -// removeOpcodeByData will return the script minus any opcodes that would push -// the passed data to the stack. -func removeOpcodeByData(pkscript []parsedOpcode, data []byte) []parsedOpcode { - retScript := make([]parsedOpcode, 0, len(pkscript)) - for _, pop := range pkscript { - if !canonicalPush(pop) || !bytes.Contains(pop.data, data) { - retScript = append(retScript, pop) +// removeOpcodeByData will return the script minus any opcodes that perform a +// canonical push of data that contains the passed data to remove. This +// function assumes it is provided a version 0 script as any future version of +// script should avoid this functionality since it is unnecessary due to the +// signature scripts not being part of the witness-free transaction hash. +// +// WARNING: This will return the passed script unmodified unless a modification +// is necessary in which case the modified script is returned. This implies +// callers may NOT rely on being able to safely mutate either the passed or +// returned script without potentially modifying the same data. +// +// NOTE: This function is only valid for version 0 scripts. Since the function +// does not accept a script version, the results are undefined for other script +// versions. +func removeOpcodeByData(script []byte, dataToRemove []byte) ([]byte, bool) { + // Avoid work when possible. + if len(script) == 0 || len(dataToRemove) == 0 { + return script, false + } + + // Parse through the script looking for a canonical data push that contains + // the data to remove. + const scriptVersion = 0 + var result []byte + var prevOffset int32 + var match bool + tokenizer := MakeScriptTokenizer(scriptVersion, script) + for tokenizer.Next() { + var found bool + result, prevOffset, found = removeOpcodeCanonical( + &tokenizer, script, dataToRemove, prevOffset, result, + ) + if found { + match = true } } - return retScript - -} - -// calcHashPrevOuts calculates a single hash of all the previous outputs -// (txid:index) referenced within the passed transaction. This calculated hash -// can be re-used when validating all inputs spending segwit outputs, with a -// signature hash type of SigHashAll. This allows validation to re-use previous -// hashing computation, reducing the complexity of validating SigHashAll inputs -// from O(N^2) to O(N). -func calcHashPrevOuts(tx *wire.MsgTx) chainhash.Hash { - var b bytes.Buffer - for _, in := range tx.TxIn { - // First write out the 32-byte transaction ID one of whose - // outputs are being referenced by this input. - b.Write(in.PreviousOutPoint.Hash[:]) - - // Next, we'll encode the index of the referenced output as a - // little endian integer. - var buf [4]byte - binary.LittleEndian.PutUint32(buf[:], in.PreviousOutPoint.Index) - b.Write(buf[:]) - } - - return chainhash.DoubleHashH(b.Bytes()) -} - -// calcHashSequence computes an aggregated hash of each of the sequence numbers -// within the inputs of the passed transaction. This single hash can be re-used -// when validating all inputs spending segwit outputs, which include signatures -// using the SigHashAll sighash type. This allows validation to re-use previous -// hashing computation, reducing the complexity of validating SigHashAll inputs -// from O(N^2) to O(N). -func calcHashSequence(tx *wire.MsgTx) chainhash.Hash { - var b bytes.Buffer - for _, in := range tx.TxIn { - var buf [4]byte - binary.LittleEndian.PutUint32(buf[:], in.Sequence) - b.Write(buf[:]) - } - - return chainhash.DoubleHashH(b.Bytes()) -} - -// calcHashOutputs computes a hash digest of all outputs created by the -// transaction encoded using the wire format. This single hash can be re-used -// when validating all inputs spending witness programs, which include -// signatures using the SigHashAll sighash type. This allows computation to be -// cached, reducing the total hashing complexity from O(N^2) to O(N). -func calcHashOutputs(tx *wire.MsgTx) chainhash.Hash { - var b bytes.Buffer - for _, out := range tx.TxOut { - wire.WriteTxOut(&b, 0, 0, out) + if result == nil { + result = script } - - return chainhash.DoubleHashH(b.Bytes()) + return result, match } -// calcWitnessSignatureHash computes the sighash digest of a transaction's -// segwit input using the new, optimized digest calculation algorithm defined -// in BIP0143: https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki. -// This function makes use of pre-calculated sighash fragments stored within -// the passed HashCache to eliminate duplicate hashing computations when -// calculating the final digest, reducing the complexity from O(N^2) to O(N). -// Additionally, signatures now cover the input value of the referenced unspent -// output. This allows offline, or hardware wallets to compute the exact amount -// being spent, in addition to the final transaction fee. In the case the -// wallet if fed an invalid input amount, the real sighash will differ causing -// the produced signature to be invalid. -func calcWitnessSignatureHash(subScript []parsedOpcode, sigHashes *TxSigHashes, - hashType SigHashType, tx *wire.MsgTx, idx int, amt int64) ([]byte, error) { - - // As a sanity check, ensure the passed input index for the transaction - // is valid. - if idx > len(tx.TxIn)-1 { - return nil, fmt.Errorf("idx %d but %d txins", idx, len(tx.TxIn)) - } - - // We'll utilize this buffer throughout to incrementally calculate - // the signature hash for this transaction. - var sigHash bytes.Buffer - - // First write out, then encode the transaction's version number. - var bVersion [4]byte - binary.LittleEndian.PutUint32(bVersion[:], uint32(tx.Version)) - sigHash.Write(bVersion[:]) - - // Next write out the possibly pre-calculated hashes for the sequence - // numbers of all inputs, and the hashes of the previous outs for all - // outputs. - var zeroHash chainhash.Hash - - // If anyone can pay isn't active, then we can use the cached - // hashPrevOuts, otherwise we just write zeroes for the prev outs. - if hashType&SigHashAnyOneCanPay == 0 { - sigHash.Write(sigHashes.HashPrevOuts[:]) - } else { - sigHash.Write(zeroHash[:]) - } - - // If the sighash isn't anyone can pay, single, or none, the use the - // cached hash sequences, otherwise write all zeroes for the - // hashSequence. - if hashType&SigHashAnyOneCanPay == 0 && - hashType&sigHashMask != SigHashSingle && - hashType&sigHashMask != SigHashNone { - sigHash.Write(sigHashes.HashSequence[:]) - } else { - sigHash.Write(zeroHash[:]) - } - - txIn := tx.TxIn[idx] - - // Next, write the outpoint being spent. - sigHash.Write(txIn.PreviousOutPoint.Hash[:]) - var bIndex [4]byte - binary.LittleEndian.PutUint32(bIndex[:], txIn.PreviousOutPoint.Index) - sigHash.Write(bIndex[:]) - - if isWitnessPubKeyHash(subScript) { - // The script code for a p2wkh is a length prefix varint for - // the next 25 bytes, followed by a re-creation of the original - // p2pkh pk script. - sigHash.Write([]byte{0x19}) - sigHash.Write([]byte{OP_DUP}) - sigHash.Write([]byte{OP_HASH160}) - sigHash.Write([]byte{OP_DATA_20}) - sigHash.Write(subScript[1].data) - sigHash.Write([]byte{OP_EQUALVERIFY}) - sigHash.Write([]byte{OP_CHECKSIG}) - } else { - // For p2wsh outputs, and future outputs, the script code is - // the original script, with all code separators removed, - // serialized with a var int length prefix. - rawScript, _ := unparseScript(subScript) - wire.WriteVarBytes(&sigHash, 0, rawScript) - } - - // Next, add the input amount, and sequence number of the input being - // signed. - var bAmount [8]byte - binary.LittleEndian.PutUint64(bAmount[:], uint64(amt)) - sigHash.Write(bAmount[:]) - var bSequence [4]byte - binary.LittleEndian.PutUint32(bSequence[:], txIn.Sequence) - sigHash.Write(bSequence[:]) - - // If the current signature mode isn't single, or none, then we can - // re-use the pre-generated hashoutputs sighash fragment. Otherwise, - // we'll serialize and add only the target output index to the signature - // pre-image. - if hashType&SigHashSingle != SigHashSingle && - hashType&SigHashNone != SigHashNone { - sigHash.Write(sigHashes.HashOutputs[:]) - } else if hashType&sigHashMask == SigHashSingle && idx < len(tx.TxOut) { - var b bytes.Buffer - wire.WriteTxOut(&b, 0, 0, tx.TxOut[idx]) - sigHash.Write(chainhash.DoubleHashB(b.Bytes())) - } else { - sigHash.Write(zeroHash[:]) - } - - // Finally, write out the transaction's locktime, and the sig hash - // type. - var bLockTime [4]byte - binary.LittleEndian.PutUint32(bLockTime[:], tx.LockTime) - sigHash.Write(bLockTime[:]) - var bHashType [4]byte - binary.LittleEndian.PutUint32(bHashType[:], uint32(hashType)) - sigHash.Write(bHashType[:]) - - return chainhash.DoubleHashB(sigHash.Bytes()), nil -} +func removeOpcodeCanonical(t *ScriptTokenizer, script, dataToRemove []byte, + prevOffset int32, result []byte) ([]byte, int32, bool) { -// CalcWitnessSigHash computes the sighash digest for the specified input of -// the target transaction observing the desired sig hash type. -func CalcWitnessSigHash(script []byte, sigHashes *TxSigHashes, hType SigHashType, - tx *wire.MsgTx, idx int, amt int64) ([]byte, error) { + var found bool - parsedScript, err := parseScript(script) - if err != nil { - return nil, fmt.Errorf("cannot parse output script: %v", err) - } - - return calcWitnessSignatureHash(parsedScript, sigHashes, hType, tx, idx, - amt) -} - -// shallowCopyTx creates a shallow copy of the transaction for use when -// calculating the signature hash. It is used over the Copy method on the -// transaction itself since that is a deep copy and therefore does more work and -// allocates much more space than needed. -func shallowCopyTx(tx *wire.MsgTx) wire.MsgTx { - // As an additional memory optimization, use contiguous backing arrays - // for the copied inputs and outputs and point the final slice of - // pointers into the contiguous arrays. This avoids a lot of small - // allocations. - txCopy := wire.MsgTx{ - Version: tx.Version, - TxIn: make([]*wire.TxIn, len(tx.TxIn)), - TxOut: make([]*wire.TxOut, len(tx.TxOut)), - LockTime: tx.LockTime, - } - txIns := make([]wire.TxIn, len(tx.TxIn)) - for i, oldTxIn := range tx.TxIn { - txIns[i] = *oldTxIn - txCopy.TxIn[i] = &txIns[i] - } - txOuts := make([]wire.TxOut, len(tx.TxOut)) - for i, oldTxOut := range tx.TxOut { - txOuts[i] = *oldTxOut - txCopy.TxOut[i] = &txOuts[i] - } - return txCopy -} - -// CalcSignatureHash will, given a script and hash type for the current script -// engine instance, calculate the signature hash to be used for signing and -// verification. -func CalcSignatureHash(script []byte, hashType SigHashType, tx *wire.MsgTx, idx int) ([]byte, error) { - parsedScript, err := parseScript(script) - if err != nil { - return nil, fmt.Errorf("cannot parse output script: %v", err) - } - return calcSignatureHash(parsedScript, hashType, tx, idx), nil -} - -// calcSignatureHash will, given a script and hash type for the current script -// engine instance, calculate the signature hash to be used for signing and -// verification. -func calcSignatureHash(script []parsedOpcode, hashType SigHashType, tx *wire.MsgTx, idx int) []byte { - // The SigHashSingle signature type signs only the corresponding input - // and output (the output with the same index number as the input). + // In practice, the script will basically never actually contain the + // data since this function is only used during signature verification + // to remove the signature itself which would require some incredibly + // non-standard code to create. // - // Since transactions can have more inputs than outputs, this means it - // is improper to use SigHashSingle on input indices that don't have a - // corresponding output. - // - // A bug in the original Satoshi client implementation means specifying - // an index that is out of range results in a signature hash of 1 (as a - // uint256 little endian). The original intent appeared to be to - // indicate failure, but unfortunately, it was never checked and thus is - // treated as the actual signature hash. This buggy behavior is now - // part of the consensus and a hard fork would be required to fix it. - // - // Due to this, care must be taken by software that creates transactions - // which make use of SigHashSingle because it can lead to an extremely - // dangerous situation where the invalid inputs will end up signing a - // hash of 1. This in turn presents an opportunity for attackers to - // cleverly construct transactions which can steal those coins provided - // they can reuse signatures. - if hashType&sigHashMask == SigHashSingle && idx >= len(tx.TxOut) { - var hash chainhash.Hash - hash[0] = 0x01 - return hash[:] - } - - // Remove all instances of OP_CODESEPARATOR from the script. - script = removeOpcode(script, OP_CODESEPARATOR) - - // Make a shallow copy of the transaction, zeroing out the script for - // all inputs that are not currently being processed. - txCopy := shallowCopyTx(tx) - for i := range txCopy.TxIn { - if i == idx { - // UnparseScript cannot fail here because removeOpcode - // above only returns a valid script. - sigScript, _ := unparseScript(script) - txCopy.TxIn[idx].SignatureScript = sigScript - } else { - txCopy.TxIn[i].SignatureScript = nil + // Thus, as an optimization, avoid allocating a new script unless there + // is actually a match that needs to be removed. + op, data := t.Opcode(), t.Data() + if isCanonicalPush(op, data) && bytes.Equal(data, dataToRemove) { + if result == nil { + fullPushLen := t.ByteIndex() - prevOffset + result = make([]byte, 0, int32(len(script))-fullPushLen) + result = append(result, script[0:prevOffset]...) } + found = true + } else if result != nil { + result = append(result, script[prevOffset:t.ByteIndex()]...) } - switch hashType & sigHashMask { - case SigHashNone: - txCopy.TxOut = txCopy.TxOut[0:0] // Empty slice. - for i := range txCopy.TxIn { - if i != idx { - txCopy.TxIn[i].Sequence = 0 - } - } - - case SigHashSingle: - // Resize output array to up to and including requested index. - txCopy.TxOut = txCopy.TxOut[:idx+1] - - // All but current output get zeroed out. - for i := 0; i < idx; i++ { - txCopy.TxOut[i].Value = -1 - txCopy.TxOut[i].PkScript = nil - } - - // Sequence on all other inputs is 0, too. - for i := range txCopy.TxIn { - if i != idx { - txCopy.TxIn[i].Sequence = 0 - } - } - - default: - // Consensus treats undefined hashtypes like normal SigHashAll - // for purposes of hash generation. - fallthrough - case SigHashOld: - fallthrough - case SigHashAll: - // Nothing special here. - } - if hashType&SigHashAnyOneCanPay != 0 { - txCopy.TxIn = txCopy.TxIn[idx : idx+1] - } - - // The final hash is the double sha256 of both the serialized modified - // transaction and the hash type (encoded as a 4-byte little-endian - // value) appended. - wbuf := bytes.NewBuffer(make([]byte, 0, txCopy.SerializeSizeStripped()+4)) - txCopy.SerializeNoWitness(wbuf) - binary.Write(wbuf, binary.LittleEndian, hashType) - return chainhash.DoubleHashB(wbuf.Bytes()) + return result, t.ByteIndex(), found } -// asSmallInt returns the passed opcode, which must be true according to -// isSmallInt(), as an integer. -func asSmallInt(op *opcode) int { - if op.value == OP_0 { +// AsSmallInt returns the passed opcode, which must be true according to +// IsSmallInt(), as an integer. +func AsSmallInt(op byte) int { + if op == OP_0 { return 0 } - return int(op.value - (OP_1 - 1)) + return int(op - (OP_1 - 1)) } -// getSigOpCount is the implementation function for counting the number of -// signature operations in the script provided by pops. If precise mode is -// requested then we attempt to count the number of operations for a multisig -// op. Otherwise we use the maximum. -func getSigOpCount(pops []parsedOpcode, precise bool) int { - nSigs := 0 - for i, pop := range pops { - switch pop.opcode.value { - case OP_CHECKSIG: - fallthrough - case OP_CHECKSIGVERIFY: - nSigs++ - case OP_CHECKMULTISIG: - fallthrough - case OP_CHECKMULTISIGVERIFY: - // If we are being precise then look for familiar - // patterns for multisig, for now all we recognize is - // OP_1 - OP_16 to signify the number of pubkeys. - // Otherwise, we use the max of 20. - if precise && i > 0 && - pops[i-1].opcode.value >= OP_1 && - pops[i-1].opcode.value <= OP_16 { - nSigs += asSmallInt(pops[i-1].opcode) +// countSigOpsV0 returns the number of signature operations in the provided +// script up to the point of the first parse failure or the entire script when +// there are no parse failures. The precise flag attempts to accurately count +// the number of operations for a multisig operation versus using the maximum +// allowed. +// +// WARNING: This function always treats the passed script as version 0. Great +// care must be taken if introducing a new script version because it is used in +// consensus which, unfortunately as of the time of this writing, does not check +// script versions before counting their signature operations which means nodes +// on existing rules will count new version scripts as if they were version 0. +func countSigOpsV0(script []byte, precise bool) int { + const scriptVersion = 0 + + numSigOps := 0 + tokenizer := MakeScriptTokenizer(scriptVersion, script) + prevOp := byte(OP_INVALIDOPCODE) + for tokenizer.Next() { + switch tokenizer.Opcode() { + case OP_CHECKSIG, OP_CHECKSIGVERIFY: + numSigOps++ + + case OP_CHECKMULTISIG, OP_CHECKMULTISIGVERIFY: + // Note that OP_0 is treated as the max number of sigops here in + // precise mode despite it being a valid small integer in order to + // highly discourage multisigs with zero pubkeys. + // + // Also, even though this is referred to as "precise" counting, it's + // not really precise at all due to the small int opcodes only + // covering 1 through 16 pubkeys, which means this will count any + // more than that value (e.g. 17, 18 19) as the maximum number of + // allowed pubkeys. This is, unfortunately, now part of + // the Bitcoin consensus rules, due to historical + // reasons. This could be made more correct with a new + // script version, however, ideally all multisignaure + // operations in new script versions should move to + // aggregated schemes such as Schnorr instead. + if precise && prevOp >= OP_1 && prevOp <= OP_16 { + numSigOps += AsSmallInt(prevOp) } else { - nSigs += MaxPubKeysPerMultiSig + numSigOps += MaxPubKeysPerMultiSig } + default: // Not a sigop. } + + prevOp = tokenizer.Opcode() } - return nSigs + return numSigOps } // GetSigOpCount provides a quick count of the number of signature operations // in a script. a CHECKSIG operations counts for 1, and a CHECK_MULTISIG for 20. // If the script fails to parse, then the count up to the point of failure is // returned. +// +// WARNING: This function always treats the passed script as version 0. Great +// care must be taken if introducing a new script version because it is used in +// consensus which, unfortunately as of the time of this writing, does not check +// script versions before counting their signature operations which means nodes +// on existing rules will count new version scripts as if they were version 0. func GetSigOpCount(script []byte) int { - // Don't check error since parseScript returns the parsed-up-to-error - // list of pops. - pops, _ := parseScript(script) - return getSigOpCount(pops, false) + return countSigOpsV0(script, false) +} + +// finalOpcodeData returns the data associated with the final opcode in the +// script. It will return nil if the script fails to parse. +func finalOpcodeData(scriptVersion uint16, script []byte) []byte { + // Avoid unnecessary work. + if len(script) == 0 { + return nil + } + + var data []byte + tokenizer := MakeScriptTokenizer(scriptVersion, script) + for tokenizer.Next() { + data = tokenizer.Data() + } + if tokenizer.Err() != nil { + return nil + } + return data } // GetPreciseSigOpCount returns the number of signature operations in @@ -748,44 +411,44 @@ func GetSigOpCount(script []byte) int { // Pay-To-Script-Hash script in order to find the precise number of signature // operations in the transaction. If the script fails to parse, then the count // up to the point of failure is returned. -func GetPreciseSigOpCount(scriptSig, scriptPubKey []byte, bip16 bool) int { - // Don't check error since parseScript returns the parsed-up-to-error - // list of pops. - pops, _ := parseScript(scriptPubKey) - - // Treat non P2SH transactions as normal. - if !(bip16 && isScriptHash(pops)) { - return getSigOpCount(pops, true) - } +// +// WARNING: This function always treats the passed script as version 0. Great +// care must be taken if introducing a new script version because it is used in +// consensus which, unfortunately as of the time of this writing, does not check +// script versions before counting their signature operations which means nodes +// on existing rules will count new version scripts as if they were version 0. +// +// The third parameter is DEPRECATED and is unused. +func GetPreciseSigOpCount(scriptSig, scriptPubKey []byte, _ bool) int { + const scriptVersion = 0 - // The public key script is a pay-to-script-hash, so parse the signature - // script to get the final item. Scripts that fail to fully parse count - // as 0 signature operations. - sigPops, err := parseScript(scriptSig) - if err != nil { - return 0 + // Treat non P2SH transactions as normal. Note that signature operation + // counting includes all operations up to the first parse failure. + if !isScriptHashScript(scriptPubKey) { + return countSigOpsV0(scriptPubKey, true) } // The signature script must only push data to the stack for P2SH to be // a valid pair, so the signature operation count is 0 when that is not // the case. - if !isPushOnly(sigPops) || len(sigPops) == 0 { + if len(scriptSig) == 0 || !IsPushOnlyScript(scriptSig) { return 0 } // The P2SH script is the last item the signature script pushes to the // stack. When the script is empty, there are no signature operations. - shScript := sigPops[len(sigPops)-1].data - if len(shScript) == 0 { + // + // Notice that signature scripts that fail to fully parse count as 0 + // signature operations unlike public key and redeem scripts. + redeemScript := finalOpcodeData(scriptVersion, scriptSig) + if len(redeemScript) == 0 { return 0 } - // Parse the P2SH script and don't check the error since parseScript - // returns the parsed-up-to-error list of pops and the consensus rules - // dictate signature operations are counted up to the first parse - // failure. - shPops, _ := parseScript(shScript) - return getSigOpCount(shPops, true) + // Return the more precise sigops count for the redeem script. Note that + // signature operation counting includes all operations up to the first + // parse failure. + return countSigOpsV0(redeemScript, true) } // GetWitnessSigOpCount returns the number of signature operations generated by @@ -797,19 +460,15 @@ func GetPreciseSigOpCount(scriptSig, scriptPubKey []byte, bip16 bool) int { func GetWitnessSigOpCount(sigScript, pkScript []byte, witness wire.TxWitness) int { // If this is a regular witness program, then we can proceed directly // to counting its signature operations without any further processing. - if IsWitnessProgram(pkScript) { + if isWitnessProgramScript(pkScript) { return getWitnessSigOps(pkScript, witness) } // Next, we'll check the sigScript to see if this is a nested p2sh // witness program. This is a case wherein the sigScript is actually a // datapush of a p2wsh witness program. - sigPops, err := parseScript(sigScript) - if err != nil { - return 0 - } - if IsPayToScriptHash(pkScript) && isPushOnly(sigPops) && - IsWitnessProgram(sigScript[1:]) { + if isScriptHashScript(pkScript) && IsPushOnlyScript(sigScript) && + len(sigScript) > 0 && isWitnessProgramScript(sigScript[1:]) { return getWitnessSigOps(sigScript[1:], witness) } @@ -831,7 +490,7 @@ func getWitnessSigOps(pkScript []byte, witness wire.TxWitness) int { } switch witnessVersion { - case 0: + case BaseSegwitWitnessVersion: switch { case len(witnessProgram) == payToWitnessPubKeyHashDataSize: return 1 @@ -839,22 +498,64 @@ func getWitnessSigOps(pkScript []byte, witness wire.TxWitness) int { len(witness) > 0: witnessScript := witness[len(witness)-1] - pops, _ := parseScript(witnessScript) - return getSigOpCount(pops, true) + return countSigOpsV0(witnessScript, true) } + + // Taproot signature operations don't count towards the block-wide sig + // op limit, instead a distinct weight-based accounting method is used. + case TaprootWitnessVersion: + return 0 } return 0 } +// checkScriptParses returns an error if the provided script fails to parse. +func checkScriptParses(scriptVersion uint16, script []byte) error { + tokenizer := MakeScriptTokenizer(scriptVersion, script) + for tokenizer.Next() { + // Nothing to do. + } + return tokenizer.Err() +} + // IsUnspendable returns whether the passed public key script is unspendable, or -// guaranteed to fail at execution. This allows inputs to be pruned instantly +// guaranteed to fail at execution. This allows outputs to be pruned instantly // when entering the UTXO set. +// +// NOTE: This function is only valid for version 0 scripts. Since the function +// does not accept a script version, the results are undefined for other script +// versions. func IsUnspendable(pkScript []byte) bool { - pops, err := parseScript(pkScript) - if err != nil { + // The script is unspendable if starts with OP_RETURN or is guaranteed + // to fail at execution due to being larger than the max allowed script + // size. + switch { + case len(pkScript) > 0 && pkScript[0] == OP_RETURN: return true + case len(pkScript) > MaxScriptSize: + return true + } + + // The script is unspendable if it is guaranteed to fail at execution. + const scriptVersion = 0 + return checkScriptParses(scriptVersion, pkScript) != nil +} + +// ScriptHasOpSuccess returns true if any op codes in the script contain an +// OP_SUCCESS op code. +func ScriptHasOpSuccess(witnessScript []byte) bool { + // First, create a new script tokenizer so we can run through all the + // elements. + tokenizer := MakeScriptTokenizer(0, witnessScript) + + // Run through all the op codes, returning true if we find anything + // that is marked as a new op success. + for tokenizer.Next() { + if _, ok := successOpcodes[tokenizer.Opcode()]; ok { + return true + } } - return len(pops) > 0 && pops[0].opcode.value == OP_RETURN + return false } diff --git a/txscript/script_test.go b/txscript/script_test.go index 6a725e275c..7842565c6c 100644 --- a/txscript/script_test.go +++ b/txscript/script_test.go @@ -12,3673 +12,6 @@ import ( "github.com/btcsuite/btcd/wire" ) -// TestParseOpcode tests for opcode parsing with bad data templates. -func TestParseOpcode(t *testing.T) { - // Deep copy the array and make one of the opcodes invalid by setting it - // to the wrong length. - fakeArray := opcodeArray - fakeArray[OP_PUSHDATA4] = opcode{value: OP_PUSHDATA4, - name: "OP_PUSHDATA4", length: -8, opfunc: opcodePushData} - - // This script would be fine if -8 was a valid length. - _, err := parseScriptTemplate([]byte{OP_PUSHDATA4, 0x1, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00}, &fakeArray) - if err == nil { - t.Errorf("no error with dodgy opcode array!") - } -} - -// TestUnparsingInvalidOpcodes tests for errors when unparsing invalid parsed -// opcodes. -func TestUnparsingInvalidOpcodes(t *testing.T) { - tests := []struct { - name string - pop *parsedOpcode - expectedErr error - }{ - { - name: "OP_FALSE", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_FALSE], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_FALSE long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_FALSE], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_1 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_1], - data: nil, - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_1", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_1], - data: make([]byte, 1), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_1 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_1], - data: make([]byte, 2), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_2 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_2], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_2", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_2], - data: make([]byte, 2), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_2 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_2], - data: make([]byte, 3), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_3 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_3], - data: make([]byte, 2), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_3", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_3], - data: make([]byte, 3), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_3 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_3], - data: make([]byte, 4), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_4 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_4], - data: make([]byte, 3), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_4", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_4], - data: make([]byte, 4), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_4 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_4], - data: make([]byte, 5), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_5 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_5], - data: make([]byte, 4), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_5", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_5], - data: make([]byte, 5), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_5 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_5], - data: make([]byte, 6), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_6 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_6], - data: make([]byte, 5), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_6", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_6], - data: make([]byte, 6), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_6 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_6], - data: make([]byte, 7), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_7 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_7], - data: make([]byte, 6), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_7", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_7], - data: make([]byte, 7), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_7 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_7], - data: make([]byte, 8), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_8 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_8], - data: make([]byte, 7), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_8", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_8], - data: make([]byte, 8), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_8 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_8], - data: make([]byte, 9), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_9 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_9], - data: make([]byte, 8), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_9", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_9], - data: make([]byte, 9), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_9 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_9], - data: make([]byte, 10), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_10 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_10], - data: make([]byte, 9), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_10", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_10], - data: make([]byte, 10), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_10 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_10], - data: make([]byte, 11), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_11 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_11], - data: make([]byte, 10), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_11", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_11], - data: make([]byte, 11), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_11 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_11], - data: make([]byte, 12), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_12 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_12], - data: make([]byte, 11), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_12", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_12], - data: make([]byte, 12), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_12 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_12], - data: make([]byte, 13), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_13 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_13], - data: make([]byte, 12), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_13", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_13], - data: make([]byte, 13), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_13 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_13], - data: make([]byte, 14), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_14 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_14], - data: make([]byte, 13), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_14", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_14], - data: make([]byte, 14), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_14 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_14], - data: make([]byte, 15), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_15 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_15], - data: make([]byte, 14), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_15", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_15], - data: make([]byte, 15), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_15 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_15], - data: make([]byte, 16), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_16 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_16], - data: make([]byte, 15), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_16", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_16], - data: make([]byte, 16), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_16 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_16], - data: make([]byte, 17), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_17 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_17], - data: make([]byte, 16), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_17", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_17], - data: make([]byte, 17), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_17 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_17], - data: make([]byte, 18), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_18 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_18], - data: make([]byte, 17), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_18", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_18], - data: make([]byte, 18), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_18 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_18], - data: make([]byte, 19), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_19 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_19], - data: make([]byte, 18), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_19", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_19], - data: make([]byte, 19), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_19 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_19], - data: make([]byte, 20), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_20 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_20], - data: make([]byte, 19), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_20", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_20], - data: make([]byte, 20), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_20 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_20], - data: make([]byte, 21), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_21 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_21], - data: make([]byte, 20), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_21", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_21], - data: make([]byte, 21), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_21 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_21], - data: make([]byte, 22), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_22 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_22], - data: make([]byte, 21), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_22", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_22], - data: make([]byte, 22), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_22 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_22], - data: make([]byte, 23), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_23 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_23], - data: make([]byte, 22), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_23", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_23], - data: make([]byte, 23), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_23 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_23], - data: make([]byte, 24), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_24 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_24], - data: make([]byte, 23), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_24", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_24], - data: make([]byte, 24), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_24 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_24], - data: make([]byte, 25), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_25 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_25], - data: make([]byte, 24), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_25", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_25], - data: make([]byte, 25), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_25 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_25], - data: make([]byte, 26), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_26 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_26], - data: make([]byte, 25), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_26", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_26], - data: make([]byte, 26), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_26 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_26], - data: make([]byte, 27), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_27 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_27], - data: make([]byte, 26), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_27", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_27], - data: make([]byte, 27), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_27 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_27], - data: make([]byte, 28), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_28 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_28], - data: make([]byte, 27), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_28", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_28], - data: make([]byte, 28), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_28 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_28], - data: make([]byte, 29), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_29 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_29], - data: make([]byte, 28), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_29", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_29], - data: make([]byte, 29), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_29 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_29], - data: make([]byte, 30), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_30 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_30], - data: make([]byte, 29), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_30", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_30], - data: make([]byte, 30), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_30 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_30], - data: make([]byte, 31), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_31 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_31], - data: make([]byte, 30), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_31", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_31], - data: make([]byte, 31), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_31 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_31], - data: make([]byte, 32), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_32 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_32], - data: make([]byte, 31), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_32", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_32], - data: make([]byte, 32), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_32 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_32], - data: make([]byte, 33), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_33 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_33], - data: make([]byte, 32), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_33", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_33], - data: make([]byte, 33), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_33 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_33], - data: make([]byte, 34), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_34 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_34], - data: make([]byte, 33), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_34", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_34], - data: make([]byte, 34), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_34 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_34], - data: make([]byte, 35), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_35 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_35], - data: make([]byte, 34), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_35", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_35], - data: make([]byte, 35), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_35 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_35], - data: make([]byte, 36), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_36 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_36], - data: make([]byte, 35), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_36", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_36], - data: make([]byte, 36), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_36 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_36], - data: make([]byte, 37), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_37 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_37], - data: make([]byte, 36), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_37", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_37], - data: make([]byte, 37), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_37 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_37], - data: make([]byte, 38), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_38 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_38], - data: make([]byte, 37), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_38", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_38], - data: make([]byte, 38), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_38 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_38], - data: make([]byte, 39), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_39 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_39], - data: make([]byte, 38), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_39", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_39], - data: make([]byte, 39), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_39 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_39], - data: make([]byte, 40), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_40 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_40], - data: make([]byte, 39), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_40", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_40], - data: make([]byte, 40), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_40 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_40], - data: make([]byte, 41), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_41 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_41], - data: make([]byte, 40), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_41", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_41], - data: make([]byte, 41), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_41 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_41], - data: make([]byte, 42), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_42 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_42], - data: make([]byte, 41), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_42", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_42], - data: make([]byte, 42), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_42 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_42], - data: make([]byte, 43), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_43 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_43], - data: make([]byte, 42), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_43", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_43], - data: make([]byte, 43), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_43 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_43], - data: make([]byte, 44), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_44 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_44], - data: make([]byte, 43), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_44", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_44], - data: make([]byte, 44), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_44 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_44], - data: make([]byte, 45), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_45 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_45], - data: make([]byte, 44), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_45", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_45], - data: make([]byte, 45), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_45 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_45], - data: make([]byte, 46), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_46 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_46], - data: make([]byte, 45), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_46", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_46], - data: make([]byte, 46), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_46 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_46], - data: make([]byte, 47), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_47 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_47], - data: make([]byte, 46), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_47", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_47], - data: make([]byte, 47), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_47 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_47], - data: make([]byte, 48), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_48 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_48], - data: make([]byte, 47), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_48", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_48], - data: make([]byte, 48), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_48 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_48], - data: make([]byte, 49), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_49 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_49], - data: make([]byte, 48), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_49", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_49], - data: make([]byte, 49), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_49 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_49], - data: make([]byte, 50), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_50 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_50], - data: make([]byte, 49), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_50", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_50], - data: make([]byte, 50), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_50 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_50], - data: make([]byte, 51), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_51 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_51], - data: make([]byte, 50), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_51", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_51], - data: make([]byte, 51), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_51 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_51], - data: make([]byte, 52), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_52 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_52], - data: make([]byte, 51), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_52", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_52], - data: make([]byte, 52), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_52 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_52], - data: make([]byte, 53), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_53 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_53], - data: make([]byte, 52), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_53", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_53], - data: make([]byte, 53), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_53 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_53], - data: make([]byte, 54), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_54 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_54], - data: make([]byte, 53), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_54", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_54], - data: make([]byte, 54), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_54 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_54], - data: make([]byte, 55), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_55 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_55], - data: make([]byte, 54), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_55", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_55], - data: make([]byte, 55), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_55 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_55], - data: make([]byte, 56), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_56 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_56], - data: make([]byte, 55), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_56", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_56], - data: make([]byte, 56), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_56 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_56], - data: make([]byte, 57), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_57 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_57], - data: make([]byte, 56), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_57", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_57], - data: make([]byte, 57), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_57 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_57], - data: make([]byte, 58), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_58 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_58], - data: make([]byte, 57), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_58", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_58], - data: make([]byte, 58), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_58 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_58], - data: make([]byte, 59), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_59 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_59], - data: make([]byte, 58), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_59", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_59], - data: make([]byte, 59), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_59 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_59], - data: make([]byte, 60), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_60 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_60], - data: make([]byte, 59), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_60", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_60], - data: make([]byte, 60), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_60 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_60], - data: make([]byte, 61), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_61 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_61], - data: make([]byte, 60), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_61", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_61], - data: make([]byte, 61), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_61 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_61], - data: make([]byte, 62), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_62 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_62], - data: make([]byte, 61), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_62", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_62], - data: make([]byte, 62), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_62 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_62], - data: make([]byte, 63), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_63 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_63], - data: make([]byte, 62), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_63", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_63], - data: make([]byte, 63), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_63 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_63], - data: make([]byte, 64), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_64 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_64], - data: make([]byte, 63), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_64", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_64], - data: make([]byte, 64), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_64 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_64], - data: make([]byte, 65), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_65 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_65], - data: make([]byte, 64), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_65", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_65], - data: make([]byte, 65), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_65 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_65], - data: make([]byte, 66), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_66 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_66], - data: make([]byte, 65), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_66", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_66], - data: make([]byte, 66), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_66 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_66], - data: make([]byte, 67), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_67 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_67], - data: make([]byte, 66), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_67", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_67], - data: make([]byte, 67), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_67 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_67], - data: make([]byte, 68), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_68 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_68], - data: make([]byte, 67), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_68", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_68], - data: make([]byte, 68), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_68 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_68], - data: make([]byte, 69), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_69 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_69], - data: make([]byte, 68), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_69", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_69], - data: make([]byte, 69), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_69 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_69], - data: make([]byte, 70), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_70 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_70], - data: make([]byte, 69), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_70", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_70], - data: make([]byte, 70), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_70 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_70], - data: make([]byte, 71), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_71 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_71], - data: make([]byte, 70), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_71", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_71], - data: make([]byte, 71), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_71 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_71], - data: make([]byte, 72), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_72 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_72], - data: make([]byte, 71), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_72", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_72], - data: make([]byte, 72), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_72 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_72], - data: make([]byte, 73), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_73 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_73], - data: make([]byte, 72), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_73", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_73], - data: make([]byte, 73), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_73 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_73], - data: make([]byte, 74), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_74 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_74], - data: make([]byte, 73), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_74", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_74], - data: make([]byte, 74), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_74 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_74], - data: make([]byte, 75), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_75 short", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_75], - data: make([]byte, 74), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DATA_75", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_75], - data: make([]byte, 75), - }, - expectedErr: nil, - }, - { - name: "OP_DATA_75 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DATA_75], - data: make([]byte, 76), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_PUSHDATA1", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_PUSHDATA1], - data: []byte{0, 1, 2, 3, 4}, - }, - expectedErr: nil, - }, - { - name: "OP_PUSHDATA2", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_PUSHDATA2], - data: []byte{0, 1, 2, 3, 4}, - }, - expectedErr: nil, - }, - { - name: "OP_PUSHDATA4", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_PUSHDATA1], - data: []byte{0, 1, 2, 3, 4}, - }, - expectedErr: nil, - }, - { - name: "OP_1NEGATE", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_1NEGATE], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_1NEGATE long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_1NEGATE], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_RESERVED", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_RESERVED], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_RESERVED long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_RESERVED], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_TRUE", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_TRUE], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_TRUE long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_TRUE], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_2", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_2], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_2 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_2], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_2", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_2], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_2 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_2], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_3", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_3], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_3 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_3], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_4", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_4], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_4 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_4], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_5", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_5], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_5 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_5], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_6", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_6], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_6 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_6], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_7", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_7], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_7 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_7], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_8", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_8], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_8 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_8], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_9", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_9], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_9 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_9], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_10", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_10], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_10 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_10], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_11", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_11], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_11 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_11], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_12", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_12], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_12 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_12], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_13", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_13], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_13 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_13], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_14", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_14], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_14 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_14], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_15", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_15], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_15 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_15], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_16", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_16], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_16 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_16], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_NOP", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NOP], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_NOP long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NOP], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_VER", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_VER], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_VER long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_VER], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_IF", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_IF], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_IF long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_IF], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_NOTIF", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NOTIF], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_NOTIF long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NOTIF], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_VERIF", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_VERIF], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_VERIF long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_VERIF], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_VERNOTIF", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_VERNOTIF], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_VERNOTIF long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_VERNOTIF], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_ELSE", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_ELSE], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_ELSE long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_ELSE], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_ENDIF", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_ENDIF], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_ENDIF long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_ENDIF], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_VERIFY", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_VERIFY], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_VERIFY long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_VERIFY], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_RETURN", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_RETURN], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_RETURN long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_RETURN], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_TOALTSTACK", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_TOALTSTACK], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_TOALTSTACK long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_TOALTSTACK], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_FROMALTSTACK", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_FROMALTSTACK], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_FROMALTSTACK long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_FROMALTSTACK], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_2DROP", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_2DROP], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_2DROP long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_2DROP], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_2DUP", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_2DUP], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_2DUP long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_2DUP], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_3DUP", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_3DUP], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_3DUP long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_3DUP], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_2OVER", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_2OVER], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_2OVER long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_2OVER], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_2ROT", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_2ROT], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_2ROT long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_2ROT], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_2SWAP", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_2SWAP], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_2SWAP long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_2SWAP], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_IFDUP", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_IFDUP], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_IFDUP long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_IFDUP], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DEPTH", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DEPTH], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_DEPTH long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DEPTH], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DROP", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DROP], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_DROP long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DROP], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DUP", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DUP], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_DUP long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DUP], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_NIP", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NIP], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_NIP long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NIP], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_OVER", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_OVER], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_OVER long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_OVER], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_PICK", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_PICK], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_PICK long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_PICK], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_ROLL", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_ROLL], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_ROLL long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_ROLL], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_ROT", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_ROT], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_ROT long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_ROT], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_SWAP", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_SWAP], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_SWAP long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_SWAP], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_TUCK", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_TUCK], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_TUCK long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_TUCK], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_CAT", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_CAT], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_CAT long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_CAT], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_SUBSTR", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_SUBSTR], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_SUBSTR long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_SUBSTR], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_LEFT", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_LEFT], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_LEFT long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_LEFT], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_LEFT", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_LEFT], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_LEFT long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_LEFT], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_RIGHT", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_RIGHT], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_RIGHT long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_RIGHT], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_SIZE", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_SIZE], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_SIZE long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_SIZE], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_INVERT", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_INVERT], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_INVERT long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_INVERT], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_AND", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_AND], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_AND long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_AND], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_OR", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_OR], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_OR long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_OR], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_XOR", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_XOR], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_XOR long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_XOR], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_EQUAL", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_EQUAL], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_EQUAL long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_EQUAL], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_EQUALVERIFY", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_EQUALVERIFY], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_EQUALVERIFY long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_EQUALVERIFY], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_RESERVED1", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_RESERVED1], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_RESERVED1 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_RESERVED1], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_RESERVED2", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_RESERVED2], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_RESERVED2 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_RESERVED2], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_1ADD", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_1ADD], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_1ADD long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_1ADD], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_1SUB", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_1SUB], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_1SUB long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_1SUB], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_2MUL", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_2MUL], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_2MUL long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_2MUL], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_2DIV", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_2DIV], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_2DIV long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_2DIV], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_NEGATE", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NEGATE], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_NEGATE long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NEGATE], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_ABS", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_ABS], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_ABS long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_ABS], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_NOT", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NOT], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_NOT long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NOT], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_0NOTEQUAL", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_0NOTEQUAL], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_0NOTEQUAL long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_0NOTEQUAL], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_ADD", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_ADD], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_ADD long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_ADD], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_SUB", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_SUB], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_SUB long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_SUB], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_MUL", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_MUL], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_MUL long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_MUL], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_DIV", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DIV], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_DIV long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_DIV], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_MOD", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_MOD], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_MOD long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_MOD], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_LSHIFT", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_LSHIFT], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_LSHIFT long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_LSHIFT], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_RSHIFT", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_RSHIFT], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_RSHIFT long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_RSHIFT], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_BOOLAND", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_BOOLAND], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_BOOLAND long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_BOOLAND], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_BOOLOR", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_BOOLOR], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_BOOLOR long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_BOOLOR], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_NUMEQUAL", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NUMEQUAL], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_NUMEQUAL long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NUMEQUAL], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_NUMEQUALVERIFY", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NUMEQUALVERIFY], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_NUMEQUALVERIFY long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NUMEQUALVERIFY], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_NUMNOTEQUAL", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NUMNOTEQUAL], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_NUMNOTEQUAL long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NUMNOTEQUAL], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_LESSTHAN", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_LESSTHAN], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_LESSTHAN long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_LESSTHAN], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_GREATERTHAN", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_GREATERTHAN], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_GREATERTHAN long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_GREATERTHAN], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_LESSTHANOREQUAL", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_LESSTHANOREQUAL], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_LESSTHANOREQUAL long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_LESSTHANOREQUAL], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_GREATERTHANOREQUAL", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_GREATERTHANOREQUAL], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_GREATERTHANOREQUAL long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_GREATERTHANOREQUAL], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_MIN", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_MIN], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_MIN long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_MIN], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_MAX", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_MAX], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_MAX long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_MAX], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_WITHIN", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_WITHIN], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_WITHIN long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_WITHIN], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_RIPEMD160", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_RIPEMD160], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_RIPEMD160 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_RIPEMD160], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_SHA1", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_SHA1], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_SHA1 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_SHA1], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_SHA256", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_SHA256], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_SHA256 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_SHA256], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_HASH160", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_HASH160], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_HASH160 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_HASH160], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_HASH256", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_HASH256], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_HASH256 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_HASH256], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_CODESAPERATOR", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_CODESEPARATOR], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_CODESEPARATOR long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_CODESEPARATOR], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_CHECKSIG", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_CHECKSIG], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_CHECKSIG long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_CHECKSIG], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_CHECKSIGVERIFY", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_CHECKSIGVERIFY], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_CHECKSIGVERIFY long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_CHECKSIGVERIFY], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_CHECKMULTISIG", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_CHECKMULTISIG], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_CHECKMULTISIG long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_CHECKMULTISIG], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_CHECKMULTISIGVERIFY", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_CHECKMULTISIGVERIFY], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_CHECKMULTISIGVERIFY long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_CHECKMULTISIGVERIFY], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_NOP1", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NOP1], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_NOP1 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NOP1], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_NOP2", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NOP2], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_NOP2 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NOP2], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_NOP3", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NOP3], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_NOP3 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NOP3], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_NOP4", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NOP4], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_NOP4 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NOP4], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_NOP5", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NOP5], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_NOP5 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NOP5], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_NOP6", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NOP6], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_NOP6 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NOP6], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_NOP7", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NOP7], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_NOP7 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NOP7], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_NOP8", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NOP8], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_NOP8 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NOP8], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_NOP9", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NOP9], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_NOP9 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NOP9], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_NOP10", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NOP10], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_NOP10 long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_NOP10], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_PUBKEYHASH", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_PUBKEYHASH], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_PUBKEYHASH long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_PUBKEYHASH], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_PUBKEY", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_PUBKEY], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_PUBKEY long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_PUBKEY], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - { - name: "OP_INVALIDOPCODE", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_INVALIDOPCODE], - data: nil, - }, - expectedErr: nil, - }, - { - name: "OP_INVALIDOPCODE long", - pop: &parsedOpcode{ - opcode: &opcodeArray[OP_INVALIDOPCODE], - data: make([]byte, 1), - }, - expectedErr: scriptError(ErrInternal, ""), - }, - } - - for _, test := range tests { - _, err := test.pop.bytes() - if e := tstCheckScriptError(err, test.expectedErr); e != nil { - t.Errorf("Parsed opcode test '%s': %v", test.name, e) - continue - } - } -} - // TestPushedData ensured the PushedData function extracts the expected data out // of various scripts. func TestPushedData(t *testing.T) { @@ -3740,31 +73,25 @@ func TestPushedData(t *testing.T) { } } -// TestHasCanonicalPush ensures the canonicalPush function works as expected. +// TestHasCanonicalPush ensures the isCanonicalPush function works as expected. func TestHasCanonicalPush(t *testing.T) { t.Parallel() + const scriptVersion = 0 for i := 0; i < 65535; i++ { script, err := NewScriptBuilder().AddInt64(int64(i)).Script() if err != nil { - t.Errorf("Script: test #%d unexpected error: %v\n", i, - err) - continue - } - if result := IsPushOnlyScript(script); !result { - t.Errorf("IsPushOnlyScript: test #%d failed: %x\n", i, - script) + t.Errorf("Script: test #%d unexpected error: %v\n", i, err) continue } - pops, err := parseScript(script) - if err != nil { - t.Errorf("parseScript: #%d failed: %v", i, err) + if !IsPushOnlyScript(script) { + t.Errorf("IsPushOnlyScript: test #%d failed: %x\n", i, script) continue } - for _, pop := range pops { - if result := canonicalPush(pop); !result { - t.Errorf("canonicalPush: test #%d failed: %x\n", - i, script) + tokenizer := MakeScriptTokenizer(scriptVersion, script) + for tokenizer.Next() { + if !isCanonicalPush(tokenizer.Opcode(), tokenizer.Data()) { + t.Errorf("isCanonicalPush: test #%d failed: %x\n", i, script) break } } @@ -3774,21 +101,17 @@ func TestHasCanonicalPush(t *testing.T) { builder.AddData(bytes.Repeat([]byte{0x49}, i)) script, err := builder.Script() if err != nil { - t.Errorf("StandardPushesTests test #%d unexpected error: %v\n", i, err) - continue - } - if result := IsPushOnlyScript(script); !result { - t.Errorf("StandardPushesTests IsPushOnlyScript test #%d failed: %x\n", i, script) + t.Errorf("Script: test #%d unexpected error: %v\n", i, err) continue } - pops, err := parseScript(script) - if err != nil { - t.Errorf("StandardPushesTests #%d failed to TstParseScript: %v", i, err) + if !IsPushOnlyScript(script) { + t.Errorf("IsPushOnlyScript: test #%d failed: %x\n", i, script) continue } - for _, pop := range pops { - if result := canonicalPush(pop); !result { - t.Errorf("StandardPushesTests TstHasCanonicalPushes test #%d failed: %x\n", i, script) + tokenizer := MakeScriptTokenizer(scriptVersion, script) + for tokenizer.Next() { + if !isCanonicalPush(tokenizer.Opcode(), tokenizer.Data()) { + t.Errorf("isCanonicalPush: test #%d failed: %x\n", i, script) break } } @@ -3850,6 +173,7 @@ func TestGetPreciseSigOps(t *testing.T) { // nested p2sh, and invalid variants are counted properly. func TestGetWitnessSigOpCount(t *testing.T) { t.Parallel() + tests := []struct { name string @@ -3859,7 +183,7 @@ func TestGetWitnessSigOpCount(t *testing.T) { numSigOps int }{ - // A regualr p2wkh witness program. The output being spent + // A regular p2wkh witness program. The output being spent // should only have a single sig-op counted. { name: "p2wkh", @@ -3991,13 +315,12 @@ func TestRemoveOpcodes(t *testing.T) { // tstRemoveOpcode is a convenience function to parse the provided // raw script, remove the passed opcode, then unparse the result back // into a raw script. + const scriptVersion = 0 tstRemoveOpcode := func(script []byte, opcode byte) ([]byte, error) { - pops, err := parseScript(script) - if err != nil { + if err := checkScriptParses(scriptVersion, script); err != nil { return nil, err } - pops = removeOpcode(pops, opcode) - return unparseScript(pops) + return removeOpcodeRaw(script, opcode), nil } for _, test := range tests { @@ -4034,6 +357,12 @@ func TestRemoveOpcodeByData(t *testing.T) { remove: []byte{1, 2, 3, 4}, after: []byte{OP_NOP}, }, + { + name: "", + before: []byte{OP_NOP, OP_DATA_8, 1, 2, 3, 4, 5, 6, 7, 8, OP_DATA_4, 1, 2, 3, 4}, + remove: []byte{1, 2, 3, 4}, + after: []byte{OP_NOP, OP_DATA_8, 1, 2, 3, 4, 5, 6, 7, 8}, + }, { name: "simple case", before: []byte{OP_DATA_4, 1, 2, 3, 4}, @@ -4053,7 +382,9 @@ func TestRemoveOpcodeByData(t *testing.T) { bytes.Repeat([]byte{0}, 72)...), []byte{1, 2, 3, 4}...), remove: []byte{1, 2, 3, 4}, - after: nil, + after: append(append([]byte{OP_PUSHDATA1, 76}, + bytes.Repeat([]byte{0}, 72)...), + []byte{1, 2, 3, 4}...), }, { name: "simple case (pushdata1 miss)", @@ -4077,7 +408,9 @@ func TestRemoveOpcodeByData(t *testing.T) { bytes.Repeat([]byte{0}, 252)...), []byte{1, 2, 3, 4}...), remove: []byte{1, 2, 3, 4}, - after: nil, + after: append(append([]byte{OP_PUSHDATA2, 0, 1}, + bytes.Repeat([]byte{0}, 252)...), + []byte{1, 2, 3, 4}...), }, { name: "simple case (pushdata2 miss)", @@ -4102,7 +435,9 @@ func TestRemoveOpcodeByData(t *testing.T) { bytes.Repeat([]byte{0}, 65532)...), []byte{1, 2, 3, 4}...), remove: []byte{1, 2, 3, 4}, - after: nil, + after: append(append([]byte{OP_PUSHDATA4, 0, 0, 1, 0}, + bytes.Repeat([]byte{0}, 65532)...), + []byte{1, 2, 3, 4}...), }, { name: "simple case (pushdata4 miss noncanonical)", @@ -4139,20 +474,20 @@ func TestRemoveOpcodeByData(t *testing.T) { }, } - // tstRemoveOpcodeByData is a convenience function to parse the provided - // raw script, remove the passed data, then unparse the result back - // into a raw script. - tstRemoveOpcodeByData := func(script []byte, data []byte) ([]byte, error) { - pops, err := parseScript(script) - if err != nil { - return nil, err + // tstRemoveOpcodeByData is a convenience function to ensure the provided + // script parses before attempting to remove the passed data. + const scriptVersion = 0 + tstRemoveOpcodeByData := func(script []byte, data []byte) ([]byte, bool, error) { + if err := checkScriptParses(scriptVersion, script); err != nil { + return nil, false, err } - pops = removeOpcodeByData(pops, data) - return unparseScript(pops) + + result, match := removeOpcodeByData(script, data) + return result, match, nil } for _, test := range tests { - result, err := tstRemoveOpcodeByData(test.before, test.remove) + result, _, err := tstRemoveOpcodeByData(test.before, test.remove) if e := tstCheckScriptError(err, test.err); e != nil { t.Errorf("%s: %v", test.name, e) continue @@ -4213,11 +548,13 @@ func TestIsPayToWitnessPubKeyHash(t *testing.T) { } } -// TestHasCanonicalPushes ensures the canonicalPush function properly determines -// what is considered a canonical push for the purposes of removeOpcodeByData. +// TestHasCanonicalPushes ensures the isCanonicalPush function properly +// determines what is considered a canonical push for the purposes of +// removeOpcodeByData. func TestHasCanonicalPushes(t *testing.T) { t.Parallel() + const scriptVersion = 0 tests := []struct { name string script string @@ -4236,20 +573,20 @@ func TestHasCanonicalPushes(t *testing.T) { }, } - for i, test := range tests { + for _, test := range tests { script := mustParseShortForm(test.script) - pops, err := parseScript(script) - if err != nil { + if err := checkScriptParses(scriptVersion, script); err != nil { if test.expected { - t.Errorf("TstParseScript #%d failed: %v", i, err) + t.Errorf("%q: script parse failed: %v", test.name, err) } continue } - for _, pop := range pops { - if canonicalPush(pop) != test.expected { - t.Errorf("canonicalPush: #%d (%s) wrong result"+ - "\ngot: %v\nwant: %v", i, test.name, - true, test.expected) + tokenizer := MakeScriptTokenizer(scriptVersion, script) + for tokenizer.Next() { + result := isCanonicalPush(tokenizer.Opcode(), tokenizer.Data()) + if result != test.expected { + t.Errorf("%q: isCanonicalPush wrong result\ngot: %v\nwant: %v", + test.name, result, test.expected) break } } @@ -4301,6 +638,28 @@ func TestIsUnspendable(t *testing.T) { 0xfa, 0x0b, 0x5c, 0x88, 0xac}, expected: false, }, + { + // Spendable + pkScript: []byte{0xa9, 0x14, 0x82, 0x1d, 0xba, 0x94, 0xbc, 0xfb, + 0xa2, 0x57, 0x36, 0xa3, 0x9e, 0x5d, 0x14, 0x5d, 0x69, 0x75, + 0xba, 0x8c, 0x0b, 0x42, 0x87}, + expected: false, + }, + { + // Not Necessarily Unspendable + pkScript: []byte{}, + expected: false, + }, + { + // Spendable + pkScript: []byte{OP_TRUE}, + expected: false, + }, + { + // Unspendable + pkScript: []byte{OP_RETURN}, + expected: true, + }, } for i, test := range tests { diff --git a/txscript/scriptbuilder.go b/txscript/scriptbuilder.go index 7984dd9661..fa2bc073f0 100644 --- a/txscript/scriptbuilder.go +++ b/txscript/scriptbuilder.go @@ -13,11 +13,41 @@ const ( // defaultScriptAlloc is the default size used for the backing array // for a script being built by the ScriptBuilder. The array will // dynamically grow as needed, but this figure is intended to provide - // enough space for vast majority of scripts without needing to grow the - // backing array multiple times. + // enough space for the vast majority of scripts without needing to grow + // the backing array multiple times. Can be overwritten with the + // WithScriptAllocSize functional option where expected script sizes are + // known. defaultScriptAlloc = 500 ) +// scriptBuilderConfig is a configuration struct that can be used to modify the +// initialization of a ScriptBuilder. +type scriptBuilderConfig struct { + // allocSize specifies the initial size of the backing array for the + // script builder. + allocSize int +} + +// defaultScriptBuilderConfig returns a new scriptBuilderConfig with the +// default values set. +func defaultScriptBuilderConfig() *scriptBuilderConfig { + return &scriptBuilderConfig{ + allocSize: defaultScriptAlloc, + } +} + +// ScriptBuilderOpt is a functional option type which is used to modify the +// initialization of a ScriptBuilder. +type ScriptBuilderOpt func(*scriptBuilderConfig) + +// WithScriptAllocSize specifies the initial size of the backing array for the +// script builder. +func WithScriptAllocSize(size int) ScriptBuilderOpt { + return func(cfg *scriptBuilderConfig) { + cfg.allocSize = size + } +} + // ErrScriptNotCanonical identifies a non-canonical script. The caller can use // a type assertion to detect this error type. type ErrScriptNotCanonical string @@ -37,16 +67,17 @@ func (e ErrScriptNotCanonical) Error() string { // For example, the following would build a 2-of-3 multisig script for usage in // a pay-to-script-hash (although in this situation MultiSigScript() would be a // better choice to generate the script): -// builder := txscript.NewScriptBuilder() -// builder.AddOp(txscript.OP_2).AddData(pubKey1).AddData(pubKey2) -// builder.AddData(pubKey3).AddOp(txscript.OP_3) -// builder.AddOp(txscript.OP_CHECKMULTISIG) -// script, err := builder.Script() -// if err != nil { -// // Handle the error. -// return -// } -// fmt.Printf("Final multi-sig script: %x\n", script) +// +// builder := txscript.NewScriptBuilder() +// builder.AddOp(txscript.OP_2).AddData(pubKey1).AddData(pubKey2) +// builder.AddData(pubKey3).AddOp(txscript.OP_3) +// builder.AddOp(txscript.OP_CHECKMULTISIG) +// script, err := builder.Script() +// if err != nil { +// // Handle the error. +// return +// } +// fmt.Printf("Final multi-sig script: %x\n", script) type ScriptBuilder struct { script []byte err error @@ -267,8 +298,13 @@ func (b *ScriptBuilder) Script() ([]byte, error) { // NewScriptBuilder returns a new instance of a script builder. See // ScriptBuilder for details. -func NewScriptBuilder() *ScriptBuilder { +func NewScriptBuilder(opts ...ScriptBuilderOpt) *ScriptBuilder { + cfg := defaultScriptBuilderConfig() + for _, opt := range opts { + opt(cfg) + } + return &ScriptBuilder{ - script: make([]byte, 0, defaultScriptAlloc), + script: make([]byte, 0, cfg.allocSize), } } diff --git a/txscript/scriptbuilder_test.go b/txscript/scriptbuilder_test.go index 89f2b861ab..baf9526a26 100644 --- a/txscript/scriptbuilder_test.go +++ b/txscript/scriptbuilder_test.go @@ -7,8 +7,38 @@ package txscript import ( "bytes" "testing" + + "github.com/stretchr/testify/require" ) +// TestScriptBuilderAlloc tests that the pre-allocation for a script via the +// NewScriptBuilder function works as expected. +func TestScriptBuilderAlloc(t *testing.T) { + // Using the default value, we should get a script with a capacity of + // 500 bytes, which is quite large for most scripts. + defaultBuilder := NewScriptBuilder() + require.EqualValues(t, defaultScriptAlloc, cap(defaultBuilder.script)) + + const allocSize = 23 + builder := NewScriptBuilder(WithScriptAllocSize(allocSize)) + + // The initial capacity of the script should be set to the explicit + // value. + require.EqualValues(t, allocSize, cap(builder.script)) + + builder.AddOp(OP_HASH160) + builder.AddData(make([]byte, 20)) + builder.AddOp(OP_EQUAL) + script, err := builder.Script() + require.NoError(t, err) + + require.Len(t, script, allocSize) + + // The capacity shouldn't have changed, as the script should've fit just + // fine. + require.EqualValues(t, allocSize, cap(builder.script)) +} + // TestScriptBuilderAddOp tests that pushing opcodes to a script via the // ScriptBuilder API works as expected. func TestScriptBuilderAddOp(t *testing.T) { diff --git a/txscript/scriptnum.go b/txscript/scriptnum.go index a89d5f39cc..550b01e1ff 100644 --- a/txscript/scriptnum.go +++ b/txscript/scriptnum.go @@ -12,9 +12,21 @@ const ( maxInt32 = 1<<31 - 1 minInt32 = -1 << 31 - // defaultScriptNumLen is the default number of bytes - // data being interpreted as an integer may be. - defaultScriptNumLen = 4 + // maxScriptNumLen is the maximum number of bytes data being interpreted + // as an integer may be for the majority of op codes. + maxScriptNumLen = 4 + + // cltvMaxScriptNumLen is the maximum number of bytes data being interpreted + // as an integer may be for by-time and by-height locks as interpreted by + // CHECKLOCKTIMEVERIFY. + // + // The value comes from the fact that the current transaction locktime + // is a uint32 resulting in a maximum locktime of 2^32-1 (the year + // 2106). However, scriptNums are signed and therefore a standard + // 4-byte scriptNum would only support up to a maximum of 2^31-1 (the + // year 2038). Thus, a 5-byte scriptNum is needed since it will support + // up to 2^39-1 which allows dates beyond the current locktime limit. + cltvMaxScriptNumLen = 5 ) // scriptNum represents a numeric value used in the scripting engine with @@ -39,7 +51,7 @@ const ( // method to get the serialized representation (including values that overflow). // // Then, whenever data is interpreted as an integer, it is converted to this -// type by using the makeScriptNum function which will return an error if the +// type by using the MakeScriptNum function which will return an error if the // number is out of range or not minimally encoded depending on parameters. // Since all numeric opcodes involve pulling data from the stack and // interpreting it as an integer, it provides the required behavior. @@ -77,18 +89,19 @@ func checkMinimalDataEncoding(v []byte) error { // Bytes returns the number serialized as a little endian with a sign bit. // // Example encodings: -// 127 -> [0x7f] -// -127 -> [0xff] -// 128 -> [0x80 0x00] -// -128 -> [0x80 0x80] -// 129 -> [0x81 0x00] -// -129 -> [0x81 0x80] -// 256 -> [0x00 0x01] -// -256 -> [0x00 0x81] -// 32767 -> [0xff 0x7f] -// -32767 -> [0xff 0xff] -// 32768 -> [0x00 0x80 0x00] -// -32768 -> [0x00 0x80 0x80] +// +// 127 -> [0x7f] +// -127 -> [0xff] +// 128 -> [0x80 0x00] +// -128 -> [0x80 0x80] +// 129 -> [0x81 0x00] +// -129 -> [0x81 0x80] +// 256 -> [0x00 0x01] +// -256 -> [0x00 0x81] +// 32767 -> [0xff 0x7f] +// -32767 -> [0xff 0xff] +// 32768 -> [0x00 0x80 0x00] +// -32768 -> [0x00 0x80 0x80] func (n scriptNum) Bytes() []byte { // Zero encodes as an empty byte slice. if n == 0 { @@ -139,7 +152,7 @@ func (n scriptNum) Bytes() []byte { // provide this behavior. // // In practice, for most opcodes, the number should never be out of range since -// it will have been created with makeScriptNum using the defaultScriptLen +// it will have been created with MakeScriptNum using the defaultScriptLen // value, which rejects them. In case something in the future ends up calling // this function against the result of some arithmetic, which IS allowed to be // out of range before being reinterpreted as an integer, this will provide the @@ -156,7 +169,7 @@ func (n scriptNum) Int32() int32 { return int32(n) } -// makeScriptNum interprets the passed serialized bytes as an encoded integer +// MakeScriptNum interprets the passed serialized bytes as an encoded integer // and returns the result as a script number. // // Since the consensus rules dictate that serialized bytes interpreted as ints @@ -178,13 +191,13 @@ func (n scriptNum) Int32() int32 { // before an ErrStackNumberTooBig is returned. This effectively limits the // range of allowed values. // WARNING: Great care should be taken if passing a value larger than -// defaultScriptNumLen, which could lead to addition and multiplication +// maxScriptNumLen, which could lead to addition and multiplication // overflows. // // See the Bytes function documentation for example encodings. -func makeScriptNum(v []byte, requireMinimal bool, scriptNumLen int) (scriptNum, error) { +func MakeScriptNum(v []byte, requireMinimal bool, scriptNumLen int) (scriptNum, error) { // Interpreting data requires that it is not larger than - // the the passed scriptNumLen value. + // the passed scriptNumLen value. if len(v) > scriptNumLen { str := fmt.Sprintf("numeric value encoded as %x is %d bytes "+ "which exceeds the max allowed of %d", v, len(v), diff --git a/txscript/scriptnum_test.go b/txscript/scriptnum_test.go index e32862b736..9aba3a7062 100644 --- a/txscript/scriptnum_test.go +++ b/txscript/scriptnum_test.go @@ -104,35 +104,35 @@ func TestMakeScriptNum(t *testing.T) { err error }{ // Minimal encoding must reject negative 0. - {hexToBytes("80"), 0, defaultScriptNumLen, true, errMinimalData}, + {hexToBytes("80"), 0, maxScriptNumLen, true, errMinimalData}, // Minimally encoded valid values with minimal encoding flag. // Should not error and return expected integral number. - {nil, 0, defaultScriptNumLen, true, nil}, - {hexToBytes("01"), 1, defaultScriptNumLen, true, nil}, - {hexToBytes("81"), -1, defaultScriptNumLen, true, nil}, - {hexToBytes("7f"), 127, defaultScriptNumLen, true, nil}, - {hexToBytes("ff"), -127, defaultScriptNumLen, true, nil}, - {hexToBytes("8000"), 128, defaultScriptNumLen, true, nil}, - {hexToBytes("8080"), -128, defaultScriptNumLen, true, nil}, - {hexToBytes("8100"), 129, defaultScriptNumLen, true, nil}, - {hexToBytes("8180"), -129, defaultScriptNumLen, true, nil}, - {hexToBytes("0001"), 256, defaultScriptNumLen, true, nil}, - {hexToBytes("0081"), -256, defaultScriptNumLen, true, nil}, - {hexToBytes("ff7f"), 32767, defaultScriptNumLen, true, nil}, - {hexToBytes("ffff"), -32767, defaultScriptNumLen, true, nil}, - {hexToBytes("008000"), 32768, defaultScriptNumLen, true, nil}, - {hexToBytes("008080"), -32768, defaultScriptNumLen, true, nil}, - {hexToBytes("ffff00"), 65535, defaultScriptNumLen, true, nil}, - {hexToBytes("ffff80"), -65535, defaultScriptNumLen, true, nil}, - {hexToBytes("000008"), 524288, defaultScriptNumLen, true, nil}, - {hexToBytes("000088"), -524288, defaultScriptNumLen, true, nil}, - {hexToBytes("000070"), 7340032, defaultScriptNumLen, true, nil}, - {hexToBytes("0000f0"), -7340032, defaultScriptNumLen, true, nil}, - {hexToBytes("00008000"), 8388608, defaultScriptNumLen, true, nil}, - {hexToBytes("00008080"), -8388608, defaultScriptNumLen, true, nil}, - {hexToBytes("ffffff7f"), 2147483647, defaultScriptNumLen, true, nil}, - {hexToBytes("ffffffff"), -2147483647, defaultScriptNumLen, true, nil}, + {nil, 0, maxScriptNumLen, true, nil}, + {hexToBytes("01"), 1, maxScriptNumLen, true, nil}, + {hexToBytes("81"), -1, maxScriptNumLen, true, nil}, + {hexToBytes("7f"), 127, maxScriptNumLen, true, nil}, + {hexToBytes("ff"), -127, maxScriptNumLen, true, nil}, + {hexToBytes("8000"), 128, maxScriptNumLen, true, nil}, + {hexToBytes("8080"), -128, maxScriptNumLen, true, nil}, + {hexToBytes("8100"), 129, maxScriptNumLen, true, nil}, + {hexToBytes("8180"), -129, maxScriptNumLen, true, nil}, + {hexToBytes("0001"), 256, maxScriptNumLen, true, nil}, + {hexToBytes("0081"), -256, maxScriptNumLen, true, nil}, + {hexToBytes("ff7f"), 32767, maxScriptNumLen, true, nil}, + {hexToBytes("ffff"), -32767, maxScriptNumLen, true, nil}, + {hexToBytes("008000"), 32768, maxScriptNumLen, true, nil}, + {hexToBytes("008080"), -32768, maxScriptNumLen, true, nil}, + {hexToBytes("ffff00"), 65535, maxScriptNumLen, true, nil}, + {hexToBytes("ffff80"), -65535, maxScriptNumLen, true, nil}, + {hexToBytes("000008"), 524288, maxScriptNumLen, true, nil}, + {hexToBytes("000088"), -524288, maxScriptNumLen, true, nil}, + {hexToBytes("000070"), 7340032, maxScriptNumLen, true, nil}, + {hexToBytes("0000f0"), -7340032, maxScriptNumLen, true, nil}, + {hexToBytes("00008000"), 8388608, maxScriptNumLen, true, nil}, + {hexToBytes("00008080"), -8388608, maxScriptNumLen, true, nil}, + {hexToBytes("ffffff7f"), 2147483647, maxScriptNumLen, true, nil}, + {hexToBytes("ffffffff"), -2147483647, maxScriptNumLen, true, nil}, {hexToBytes("ffffffff7f"), 549755813887, 5, true, nil}, {hexToBytes("ffffffffff"), -549755813887, 5, true, nil}, {hexToBytes("ffffffffffffff7f"), 9223372036854775807, 8, true, nil}, @@ -145,65 +145,65 @@ func TestMakeScriptNum(t *testing.T) { // Minimally encoded values that are out of range for data that // is interpreted as script numbers with the minimal encoding // flag set. Should error and return 0. - {hexToBytes("0000008000"), 0, defaultScriptNumLen, true, errNumTooBig}, - {hexToBytes("0000008080"), 0, defaultScriptNumLen, true, errNumTooBig}, - {hexToBytes("0000009000"), 0, defaultScriptNumLen, true, errNumTooBig}, - {hexToBytes("0000009080"), 0, defaultScriptNumLen, true, errNumTooBig}, - {hexToBytes("ffffffff00"), 0, defaultScriptNumLen, true, errNumTooBig}, - {hexToBytes("ffffffff80"), 0, defaultScriptNumLen, true, errNumTooBig}, - {hexToBytes("0000000001"), 0, defaultScriptNumLen, true, errNumTooBig}, - {hexToBytes("0000000081"), 0, defaultScriptNumLen, true, errNumTooBig}, - {hexToBytes("ffffffffffff00"), 0, defaultScriptNumLen, true, errNumTooBig}, - {hexToBytes("ffffffffffff80"), 0, defaultScriptNumLen, true, errNumTooBig}, - {hexToBytes("ffffffffffffff00"), 0, defaultScriptNumLen, true, errNumTooBig}, - {hexToBytes("ffffffffffffff80"), 0, defaultScriptNumLen, true, errNumTooBig}, - {hexToBytes("ffffffffffffff7f"), 0, defaultScriptNumLen, true, errNumTooBig}, - {hexToBytes("ffffffffffffffff"), 0, defaultScriptNumLen, true, errNumTooBig}, + {hexToBytes("0000008000"), 0, maxScriptNumLen, true, errNumTooBig}, + {hexToBytes("0000008080"), 0, maxScriptNumLen, true, errNumTooBig}, + {hexToBytes("0000009000"), 0, maxScriptNumLen, true, errNumTooBig}, + {hexToBytes("0000009080"), 0, maxScriptNumLen, true, errNumTooBig}, + {hexToBytes("ffffffff00"), 0, maxScriptNumLen, true, errNumTooBig}, + {hexToBytes("ffffffff80"), 0, maxScriptNumLen, true, errNumTooBig}, + {hexToBytes("0000000001"), 0, maxScriptNumLen, true, errNumTooBig}, + {hexToBytes("0000000081"), 0, maxScriptNumLen, true, errNumTooBig}, + {hexToBytes("ffffffffffff00"), 0, maxScriptNumLen, true, errNumTooBig}, + {hexToBytes("ffffffffffff80"), 0, maxScriptNumLen, true, errNumTooBig}, + {hexToBytes("ffffffffffffff00"), 0, maxScriptNumLen, true, errNumTooBig}, + {hexToBytes("ffffffffffffff80"), 0, maxScriptNumLen, true, errNumTooBig}, + {hexToBytes("ffffffffffffff7f"), 0, maxScriptNumLen, true, errNumTooBig}, + {hexToBytes("ffffffffffffffff"), 0, maxScriptNumLen, true, errNumTooBig}, // Non-minimally encoded, but otherwise valid values with // minimal encoding flag. Should error and return 0. - {hexToBytes("00"), 0, defaultScriptNumLen, true, errMinimalData}, // 0 - {hexToBytes("0100"), 0, defaultScriptNumLen, true, errMinimalData}, // 1 - {hexToBytes("7f00"), 0, defaultScriptNumLen, true, errMinimalData}, // 127 - {hexToBytes("800000"), 0, defaultScriptNumLen, true, errMinimalData}, // 128 - {hexToBytes("810000"), 0, defaultScriptNumLen, true, errMinimalData}, // 129 - {hexToBytes("000100"), 0, defaultScriptNumLen, true, errMinimalData}, // 256 - {hexToBytes("ff7f00"), 0, defaultScriptNumLen, true, errMinimalData}, // 32767 - {hexToBytes("00800000"), 0, defaultScriptNumLen, true, errMinimalData}, // 32768 - {hexToBytes("ffff0000"), 0, defaultScriptNumLen, true, errMinimalData}, // 65535 - {hexToBytes("00000800"), 0, defaultScriptNumLen, true, errMinimalData}, // 524288 - {hexToBytes("00007000"), 0, defaultScriptNumLen, true, errMinimalData}, // 7340032 - {hexToBytes("0009000100"), 0, 5, true, errMinimalData}, // 16779520 + {hexToBytes("00"), 0, maxScriptNumLen, true, errMinimalData}, // 0 + {hexToBytes("0100"), 0, maxScriptNumLen, true, errMinimalData}, // 1 + {hexToBytes("7f00"), 0, maxScriptNumLen, true, errMinimalData}, // 127 + {hexToBytes("800000"), 0, maxScriptNumLen, true, errMinimalData}, // 128 + {hexToBytes("810000"), 0, maxScriptNumLen, true, errMinimalData}, // 129 + {hexToBytes("000100"), 0, maxScriptNumLen, true, errMinimalData}, // 256 + {hexToBytes("ff7f00"), 0, maxScriptNumLen, true, errMinimalData}, // 32767 + {hexToBytes("00800000"), 0, maxScriptNumLen, true, errMinimalData}, // 32768 + {hexToBytes("ffff0000"), 0, maxScriptNumLen, true, errMinimalData}, // 65535 + {hexToBytes("00000800"), 0, maxScriptNumLen, true, errMinimalData}, // 524288 + {hexToBytes("00007000"), 0, maxScriptNumLen, true, errMinimalData}, // 7340032 + {hexToBytes("0009000100"), 0, 5, true, errMinimalData}, // 16779520 // Non-minimally encoded, but otherwise valid values without // minimal encoding flag. Should not error and return expected // integral number. - {hexToBytes("00"), 0, defaultScriptNumLen, false, nil}, - {hexToBytes("0100"), 1, defaultScriptNumLen, false, nil}, - {hexToBytes("7f00"), 127, defaultScriptNumLen, false, nil}, - {hexToBytes("800000"), 128, defaultScriptNumLen, false, nil}, - {hexToBytes("810000"), 129, defaultScriptNumLen, false, nil}, - {hexToBytes("000100"), 256, defaultScriptNumLen, false, nil}, - {hexToBytes("ff7f00"), 32767, defaultScriptNumLen, false, nil}, - {hexToBytes("00800000"), 32768, defaultScriptNumLen, false, nil}, - {hexToBytes("ffff0000"), 65535, defaultScriptNumLen, false, nil}, - {hexToBytes("00000800"), 524288, defaultScriptNumLen, false, nil}, - {hexToBytes("00007000"), 7340032, defaultScriptNumLen, false, nil}, + {hexToBytes("00"), 0, maxScriptNumLen, false, nil}, + {hexToBytes("0100"), 1, maxScriptNumLen, false, nil}, + {hexToBytes("7f00"), 127, maxScriptNumLen, false, nil}, + {hexToBytes("800000"), 128, maxScriptNumLen, false, nil}, + {hexToBytes("810000"), 129, maxScriptNumLen, false, nil}, + {hexToBytes("000100"), 256, maxScriptNumLen, false, nil}, + {hexToBytes("ff7f00"), 32767, maxScriptNumLen, false, nil}, + {hexToBytes("00800000"), 32768, maxScriptNumLen, false, nil}, + {hexToBytes("ffff0000"), 65535, maxScriptNumLen, false, nil}, + {hexToBytes("00000800"), 524288, maxScriptNumLen, false, nil}, + {hexToBytes("00007000"), 7340032, maxScriptNumLen, false, nil}, {hexToBytes("0009000100"), 16779520, 5, false, nil}, } for _, test := range tests { // Ensure the error code is of the expected type and the error // code matches the value specified in the test instance. - gotNum, err := makeScriptNum(test.serialized, test.minimalEncoding, + gotNum, err := MakeScriptNum(test.serialized, test.minimalEncoding, test.numLen) if e := tstCheckScriptError(err, test.err); e != nil { - t.Errorf("makeScriptNum(%#x): %v", test.serialized, e) + t.Errorf("MakeScriptNum(%#x): %v", test.serialized, e) continue } if gotNum != test.num { - t.Errorf("makeScriptNum(%#x): did not get expected "+ + t.Errorf("MakeScriptNum(%#x): did not get expected "+ "number - got %d, want %d", test.serialized, gotNum, test.num) continue diff --git a/txscript/sigcache.go b/txscript/sigcache.go index d9e4fa6ce1..b7b1308968 100644 --- a/txscript/sigcache.go +++ b/txscript/sigcache.go @@ -5,9 +5,9 @@ package txscript import ( + "bytes" "sync" - "github.com/btcsuite/btcd/btcec" "github.com/btcsuite/btcd/chaincfg/chainhash" ) @@ -18,20 +18,23 @@ import ( // match. In the occasion that two sigHashes collide, the newer sigHash will // simply overwrite the existing entry. type sigCacheEntry struct { - sig *btcec.Signature - pubKey *btcec.PublicKey + sig []byte + pubKey []byte } -// SigCache implements an ECDSA signature verification cache with a randomized -// entry eviction policy. Only valid signatures will be added to the cache. The -// benefits of SigCache are two fold. Firstly, usage of SigCache mitigates a DoS -// attack wherein an attack causes a victim's client to hang due to worst-case -// behavior triggered while processing attacker crafted invalid transactions. A -// detailed description of the mitigated DoS attack can be found here: +// SigCache implements an Schnorr+ECDSA signature verification cache with a +// randomized entry eviction policy. Only valid signatures will be added to the +// cache. The benefits of SigCache are two fold. Firstly, usage of SigCache +// mitigates a DoS attack wherein an attack causes a victim's client to hang +// due to worst-case behavior triggered while processing attacker crafted +// invalid transactions. A detailed description of the mitigated DoS attack can +// be found here: // https://bitslog.wordpress.com/2013/01/23/fixed-bitcoin-vulnerability-explanation-why-the-signature-cache-is-a-dos-protection/. // Secondly, usage of the SigCache introduces a signature verification // optimization which speeds up the validation of transactions within a block, // if they've already been seen and verified within the mempool. +// +// TODO(roasbeef): use type params here after Go 1.18 type SigCache struct { sync.RWMutex validSigs map[chainhash.Hash]sigCacheEntry @@ -55,12 +58,12 @@ func NewSigCache(maxEntries uint) *SigCache { // // NOTE: This function is safe for concurrent access. Readers won't be blocked // unless there exists a writer, adding an entry to the SigCache. -func (s *SigCache) Exists(sigHash chainhash.Hash, sig *btcec.Signature, pubKey *btcec.PublicKey) bool { +func (s *SigCache) Exists(sigHash chainhash.Hash, sig []byte, pubKey []byte) bool { s.RLock() entry, ok := s.validSigs[sigHash] s.RUnlock() - return ok && entry.pubKey.IsEqual(pubKey) && entry.sig.IsEqual(sig) + return ok && bytes.Equal(entry.pubKey, pubKey) && bytes.Equal(entry.sig, sig) } // Add adds an entry for a signature over 'sigHash' under public key 'pubKey' @@ -70,7 +73,7 @@ func (s *SigCache) Exists(sigHash chainhash.Hash, sig *btcec.Signature, pubKey * // // NOTE: This function is safe for concurrent access. Writers will block // simultaneous readers until function execution has concluded. -func (s *SigCache) Add(sigHash chainhash.Hash, sig *btcec.Signature, pubKey *btcec.PublicKey) { +func (s *SigCache) Add(sigHash chainhash.Hash, sig []byte, pubKey []byte) { s.Lock() defer s.Unlock() diff --git a/txscript/sigcache_test.go b/txscript/sigcache_test.go index 5413ea3b2c..f83b8350b1 100644 --- a/txscript/sigcache_test.go +++ b/txscript/sigcache_test.go @@ -8,15 +8,16 @@ import ( "crypto/rand" "testing" - "github.com/btcsuite/btcd/btcec" + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcec/v2/ecdsa" "github.com/btcsuite/btcd/chaincfg/chainhash" ) // genRandomSig returns a random message, a signature of the message under the // public key and the public key. This function is used to generate randomized // test data. -func genRandomSig() (*chainhash.Hash, *btcec.Signature, *btcec.PublicKey, error) { - privKey, err := btcec.NewPrivateKey(btcec.S256()) +func genRandomSig() (*chainhash.Hash, *ecdsa.Signature, *btcec.PublicKey, error) { + privKey, err := btcec.NewPrivateKey() if err != nil { return nil, nil, nil, err } @@ -26,10 +27,7 @@ func genRandomSig() (*chainhash.Hash, *btcec.Signature, *btcec.PublicKey, error) return nil, nil, nil, err } - sig, err := privKey.Sign(msgHash[:]) - if err != nil { - return nil, nil, nil, err - } + sig := ecdsa.Sign(privKey, msgHash[:]) return &msgHash, sig, privKey.PubKey(), nil } @@ -46,12 +44,12 @@ func TestSigCacheAddExists(t *testing.T) { } // Add the triplet to the signature cache. - sigCache.Add(*msg1, sig1, key1) + sigCache.Add(*msg1, sig1.Serialize(), key1.SerializeCompressed()) // The previously added triplet should now be found within the sigcache. - sig1Copy, _ := btcec.ParseSignature(sig1.Serialize(), btcec.S256()) - key1Copy, _ := btcec.ParsePubKey(key1.SerializeCompressed(), btcec.S256()) - if !sigCache.Exists(*msg1, sig1Copy, key1Copy) { + sig1Copy, _ := ecdsa.ParseSignature(sig1.Serialize()) + key1Copy, _ := btcec.ParsePubKey(key1.SerializeCompressed()) + if !sigCache.Exists(*msg1, sig1Copy.Serialize(), key1Copy.SerializeCompressed()) { t.Errorf("previously added item not found in signature cache") } } @@ -71,11 +69,17 @@ func TestSigCacheAddEvictEntry(t *testing.T) { t.Fatalf("unable to generate random signature test data") } - sigCache.Add(*msg, sig, key) + sigCache.Add(*msg, sig.Serialize(), key.SerializeCompressed()) - sigCopy, _ := btcec.ParseSignature(sig.Serialize(), btcec.S256()) - keyCopy, _ := btcec.ParsePubKey(key.SerializeCompressed(), btcec.S256()) - if !sigCache.Exists(*msg, sigCopy, keyCopy) { + sigCopy, err := ecdsa.ParseSignature(sig.Serialize()) + if err != nil { + t.Fatalf("unable to parse sig: %v", err) + } + keyCopy, err := btcec.ParsePubKey(key.SerializeCompressed()) + if err != nil { + t.Fatalf("unable to parse key: %v", err) + } + if !sigCache.Exists(*msg, sigCopy.Serialize(), keyCopy.SerializeCompressed()) { t.Errorf("previously added item not found in signature" + "cache") } @@ -93,7 +97,7 @@ func TestSigCacheAddEvictEntry(t *testing.T) { if err != nil { t.Fatalf("unable to generate random signature test data") } - sigCache.Add(*msgNew, sigNew, keyNew) + sigCache.Add(*msgNew, sigNew.Serialize(), keyNew.SerializeCompressed()) // The sigcache should still have sigCache entries. if uint(len(sigCache.validSigs)) != sigCacheSize { @@ -102,9 +106,9 @@ func TestSigCacheAddEvictEntry(t *testing.T) { } // The entry added above should be found within the sigcache. - sigNewCopy, _ := btcec.ParseSignature(sigNew.Serialize(), btcec.S256()) - keyNewCopy, _ := btcec.ParsePubKey(keyNew.SerializeCompressed(), btcec.S256()) - if !sigCache.Exists(*msgNew, sigNewCopy, keyNewCopy) { + sigNewCopy, _ := ecdsa.ParseSignature(sigNew.Serialize()) + keyNewCopy, _ := btcec.ParsePubKey(keyNew.SerializeCompressed()) + if !sigCache.Exists(*msgNew, sigNewCopy.Serialize(), keyNewCopy.SerializeCompressed()) { t.Fatalf("previously added item not found in signature cache") } } @@ -122,12 +126,12 @@ func TestSigCacheAddMaxEntriesZeroOrNegative(t *testing.T) { } // Add the triplet to the signature cache. - sigCache.Add(*msg1, sig1, key1) + sigCache.Add(*msg1, sig1.Serialize(), key1.SerializeCompressed()) // The generated triplet should not be found. - sig1Copy, _ := btcec.ParseSignature(sig1.Serialize(), btcec.S256()) - key1Copy, _ := btcec.ParsePubKey(key1.SerializeCompressed(), btcec.S256()) - if sigCache.Exists(*msg1, sig1Copy, key1Copy) { + sig1Copy, _ := ecdsa.ParseSignature(sig1.Serialize()) + key1Copy, _ := btcec.ParsePubKey(key1.SerializeCompressed()) + if sigCache.Exists(*msg1, sig1Copy.Serialize(), key1Copy.SerializeCompressed()) { t.Errorf("previously added signature found in sigcache, but" + "shouldn't have been") } diff --git a/txscript/sighash.go b/txscript/sighash.go new file mode 100644 index 0000000000..16c3c19c18 --- /dev/null +++ b/txscript/sighash.go @@ -0,0 +1,644 @@ +// Copyright (c) 2013-2017 The btcsuite developers +// Copyright (c) 2015-2019 The Decred developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package txscript + +import ( + "bytes" + "crypto/sha256" + "encoding/binary" + "fmt" + "io" + "math" + + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/wire" +) + +// SigHashType represents hash type bits at the end of a signature. +type SigHashType uint32 + +// Hash type bits from the end of a signature. +const ( + SigHashDefault SigHashType = 0x00 + SigHashOld SigHashType = 0x0 + SigHashAll SigHashType = 0x1 + SigHashNone SigHashType = 0x2 + SigHashSingle SigHashType = 0x3 + SigHashAnyOneCanPay SigHashType = 0x80 + + // sigHashMask defines the number of bits of the hash type which is used + // to identify which outputs are signed. + sigHashMask = 0x1f +) + +const ( + // blankCodeSepValue is the value of the code separator position in the + // tapscript sighash when no code separator was found in the script. + blankCodeSepValue = math.MaxUint32 +) + +// shallowCopyTx creates a shallow copy of the transaction for use when +// calculating the signature hash. It is used over the Copy method on the +// transaction itself since that is a deep copy and therefore does more work and +// allocates much more space than needed. +func shallowCopyTx(tx *wire.MsgTx) wire.MsgTx { + // As an additional memory optimization, use contiguous backing arrays + // for the copied inputs and outputs and point the final slice of + // pointers into the contiguous arrays. This avoids a lot of small + // allocations. + txCopy := wire.MsgTx{ + Version: tx.Version, + TxIn: make([]*wire.TxIn, len(tx.TxIn)), + TxOut: make([]*wire.TxOut, len(tx.TxOut)), + LockTime: tx.LockTime, + } + txIns := make([]wire.TxIn, len(tx.TxIn)) + for i, oldTxIn := range tx.TxIn { + txIns[i] = *oldTxIn + txCopy.TxIn[i] = &txIns[i] + } + txOuts := make([]wire.TxOut, len(tx.TxOut)) + for i, oldTxOut := range tx.TxOut { + txOuts[i] = *oldTxOut + txCopy.TxOut[i] = &txOuts[i] + } + return txCopy +} + +// CalcSignatureHash will, given a script and hash type for the current script +// engine instance, calculate the signature hash to be used for signing and +// verification. +// +// NOTE: This function is only valid for version 0 scripts. Since the function +// does not accept a script version, the results are undefined for other script +// versions. +func CalcSignatureHash(script []byte, hashType SigHashType, tx *wire.MsgTx, idx int) ([]byte, error) { + const scriptVersion = 0 + if err := checkScriptParses(scriptVersion, script); err != nil { + return nil, err + } + + return calcSignatureHash(script, hashType, tx, idx), nil +} + +// calcSignatureHash computes the signature hash for the specified input of the +// target transaction observing the desired signature hash type. +func calcSignatureHash(sigScript []byte, hashType SigHashType, tx *wire.MsgTx, idx int) []byte { + // The SigHashSingle signature type signs only the corresponding input + // and output (the output with the same index number as the input). + // + // Since transactions can have more inputs than outputs, this means it + // is improper to use SigHashSingle on input indices that don't have a + // corresponding output. + // + // A bug in the original Satoshi client implementation means specifying + // an index that is out of range results in a signature hash of 1 (as a + // uint256 little endian). The original intent appeared to be to + // indicate failure, but unfortunately, it was never checked and thus is + // treated as the actual signature hash. This buggy behavior is now + // part of the consensus and a hard fork would be required to fix it. + // + // Due to this, care must be taken by software that creates transactions + // which make use of SigHashSingle because it can lead to an extremely + // dangerous situation where the invalid inputs will end up signing a + // hash of 1. This in turn presents an opportunity for attackers to + // cleverly construct transactions which can steal those coins provided + // they can reuse signatures. + if hashType&sigHashMask == SigHashSingle && idx >= len(tx.TxOut) { + var hash chainhash.Hash + hash[0] = 0x01 + return hash[:] + } + + // Remove all instances of OP_CODESEPARATOR from the script. + sigScript = removeOpcodeRaw(sigScript, OP_CODESEPARATOR) + + // Make a shallow copy of the transaction, zeroing out the script for + // all inputs that are not currently being processed. + txCopy := shallowCopyTx(tx) + for i := range txCopy.TxIn { + if i == idx { + txCopy.TxIn[idx].SignatureScript = sigScript + } else { + txCopy.TxIn[i].SignatureScript = nil + } + } + + switch hashType & sigHashMask { + case SigHashNone: + txCopy.TxOut = txCopy.TxOut[0:0] // Empty slice. + for i := range txCopy.TxIn { + if i != idx { + txCopy.TxIn[i].Sequence = 0 + } + } + + case SigHashSingle: + // Resize output array to up to and including requested index. + txCopy.TxOut = txCopy.TxOut[:idx+1] + + // All but current output get zeroed out. + for i := 0; i < idx; i++ { + txCopy.TxOut[i].Value = -1 + txCopy.TxOut[i].PkScript = nil + } + + // Sequence on all other inputs is 0, too. + for i := range txCopy.TxIn { + if i != idx { + txCopy.TxIn[i].Sequence = 0 + } + } + + default: + // Consensus treats undefined hashtypes like normal SigHashAll + // for purposes of hash generation. + fallthrough + case SigHashOld: + fallthrough + case SigHashAll: + // Nothing special here. + } + if hashType&SigHashAnyOneCanPay != 0 { + txCopy.TxIn = txCopy.TxIn[idx : idx+1] + } + + // The final hash is the double sha256 of both the serialized modified + // transaction and the hash type (encoded as a 4-byte little-endian + // value) appended. + sigHashBytes := chainhash.DoubleHashRaw(func(w io.Writer) error { + if err := txCopy.SerializeNoWitness(w); err != nil { + return err + } + err := binary.Write(w, binary.LittleEndian, hashType) + if err != nil { + return err + } + return nil + }) + + return sigHashBytes[:] +} + +// calcWitnessSignatureHashRaw computes the sighash digest of a transaction's +// segwit input using the new, optimized digest calculation algorithm defined +// in BIP0143: https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki. +// This function makes use of pre-calculated sighash fragments stored within +// the passed HashCache to eliminate duplicate hashing computations when +// calculating the final digest, reducing the complexity from O(N^2) to O(N). +// Additionally, signatures now cover the input value of the referenced unspent +// output. This allows offline, or hardware wallets to compute the exact amount +// being spent, in addition to the final transaction fee. In the case the +// wallet if fed an invalid input amount, the real sighash will differ causing +// the produced signature to be invalid. +func calcWitnessSignatureHashRaw(subScript []byte, sigHashes *TxSigHashes, + hashType SigHashType, tx *wire.MsgTx, idx int, amt int64) ([]byte, error) { + + // As a sanity check, ensure the passed input index for the transaction + // is valid. + // + // TODO(roasbeef): check needs to be lifted elsewhere? + if idx > len(tx.TxIn)-1 { + return nil, fmt.Errorf("idx %d but %d txins", idx, len(tx.TxIn)) + } + + sigHashBytes := chainhash.DoubleHashRaw(func(w io.Writer) error { + var scratch [8]byte + + // First write out, then encode the transaction's version + // number. + binary.LittleEndian.PutUint32(scratch[:], uint32(tx.Version)) + w.Write(scratch[:4]) + + // Next write out the possibly pre-calculated hashes for the + // sequence numbers of all inputs, and the hashes of the + // previous outs for all outputs. + var zeroHash chainhash.Hash + + // If anyone can pay isn't active, then we can use the cached + // hashPrevOuts, otherwise we just write zeroes for the prev + // outs. + if hashType&SigHashAnyOneCanPay == 0 { + w.Write(sigHashes.HashPrevOutsV0[:]) + } else { + w.Write(zeroHash[:]) + } + + // If the sighash isn't anyone can pay, single, or none, the + // use the cached hash sequences, otherwise write all zeroes + // for the hashSequence. + if hashType&SigHashAnyOneCanPay == 0 && + hashType&sigHashMask != SigHashSingle && + hashType&sigHashMask != SigHashNone { + + w.Write(sigHashes.HashSequenceV0[:]) + } else { + w.Write(zeroHash[:]) + } + + txIn := tx.TxIn[idx] + + // Next, write the outpoint being spent. + w.Write(txIn.PreviousOutPoint.Hash[:]) + var bIndex [4]byte + binary.LittleEndian.PutUint32( + bIndex[:], txIn.PreviousOutPoint.Index, + ) + w.Write(bIndex[:]) + + if isWitnessPubKeyHashScript(subScript) { + // The script code for a p2wkh is a length prefix + // varint for the next 25 bytes, followed by a + // re-creation of the original p2pkh pk script. + w.Write([]byte{0x19}) + w.Write([]byte{OP_DUP}) + w.Write([]byte{OP_HASH160}) + w.Write([]byte{OP_DATA_20}) + w.Write(extractWitnessPubKeyHash(subScript)) + w.Write([]byte{OP_EQUALVERIFY}) + w.Write([]byte{OP_CHECKSIG}) + } else { + // For p2wsh outputs, and future outputs, the script + // code is the original script, with all code + // separators removed, serialized with a var int length + // prefix. + wire.WriteVarBytes(w, 0, subScript) + } + + // Next, add the input amount, and sequence number of the input + // being signed. + binary.LittleEndian.PutUint64(scratch[:], uint64(amt)) + w.Write(scratch[:]) + binary.LittleEndian.PutUint32(scratch[:], txIn.Sequence) + w.Write(scratch[:4]) + + // If the current signature mode isn't single, or none, then we + // can re-use the pre-generated hashoutputs sighash fragment. + // Otherwise, we'll serialize and add only the target output + // index to the signature pre-image. + if hashType&sigHashMask != SigHashSingle && + hashType&sigHashMask != SigHashNone { + + w.Write(sigHashes.HashOutputsV0[:]) + } else if hashType&sigHashMask == SigHashSingle && + idx < len(tx.TxOut) { + + h := chainhash.DoubleHashRaw(func(tw io.Writer) error { + wire.WriteTxOut(tw, 0, 0, tx.TxOut[idx]) + return nil + }) + w.Write(h[:]) + } else { + w.Write(zeroHash[:]) + } + + // Finally, write out the transaction's locktime, and the sig + // hash type. + binary.LittleEndian.PutUint32(scratch[:], tx.LockTime) + w.Write(scratch[:4]) + binary.LittleEndian.PutUint32(scratch[:], uint32(hashType)) + w.Write(scratch[:4]) + + return nil + }) + + return sigHashBytes[:], nil +} + +// CalcWitnessSigHash computes the sighash digest for the specified input of +// the target transaction observing the desired sig hash type. +func CalcWitnessSigHash(script []byte, sigHashes *TxSigHashes, hType SigHashType, + tx *wire.MsgTx, idx int, amt int64) ([]byte, error) { + + const scriptVersion = 0 + if err := checkScriptParses(scriptVersion, script); err != nil { + return nil, err + } + + return calcWitnessSignatureHashRaw(script, sigHashes, hType, tx, idx, amt) +} + +// sigHashExtFlag represents the sig hash extension flag as defined in BIP 341. +// Extensions to the base sighash algorithm will be appended to the base +// sighash digest. +type sigHashExtFlag uint8 + +const ( + // baseSigHashExtFlag is the base extension flag. This adds no changes + // to the sighash digest message. This is used for segwit v1 spends, + // a.k.a the tapscript keyspend path. + baseSigHashExtFlag sigHashExtFlag = 0 + + // tapscriptSighashExtFlag is the extension flag defined by tapscript + // base leaf version spend define din BIP 342. This augments the base + // sighash by including the tapscript leaf hash, the key version, and + // the code separator position. + tapscriptSighashExtFlag sigHashExtFlag = 1 +) + +// taprootSigHashOptions houses a set of functional options that may optionally +// modify how the taproot/script sighash digest algorithm is implemented. +type taprootSigHashOptions struct { + // extFlag denotes the current message digest extension being used. For + // top-level script spends use a value of zero, while each tapscript + // version can define its own values as well. + extFlag sigHashExtFlag + + // annexHash is the sha256 hash of the annex with a compact size length + // prefix: sha256(sizeOf(annex) || annex). + annexHash []byte + + // tapLeafHash is the hash of the tapscript leaf as defined in BIP 341. + // This should be h_tapleaf(version || compactSizeOf(script) || script). + tapLeafHash []byte + + // keyVersion is the key version as defined in BIP 341. This is always + // 0x00 for all currently defined leaf versions. + keyVersion byte + + // codeSepPos is the op code position of the last code separator. This + // is used for the BIP 342 sighash message extension. + codeSepPos uint32 +} + +// writeDigestExtensions writes out the sighash message extension defined by the +// current active sigHashExtFlags. +func (t *taprootSigHashOptions) writeDigestExtensions(w io.Writer) error { + switch t.extFlag { + // The base extension, used for tapscript keypath spends doesn't modify + // the digest at all. + case baseSigHashExtFlag: + return nil + + // The tapscript base leaf version extension adds the leaf hash, key + // version, and code separator position to the final digest. + case tapscriptSighashExtFlag: + if _, err := w.Write(t.tapLeafHash); err != nil { + return err + } + if _, err := w.Write([]byte{t.keyVersion}); err != nil { + return err + } + err := binary.Write(w, binary.LittleEndian, t.codeSepPos) + if err != nil { + return err + } + } + + return nil +} + +// defaultTaprootSighashOptions returns the set of default sighash options for +// taproot execution. +func defaultTaprootSighashOptions() *taprootSigHashOptions { + return &taprootSigHashOptions{} +} + +// TaprootSigHashOption defines a set of functional param options that can be +// used to modify the base sighash message with optional extensions. +type TaprootSigHashOption func(*taprootSigHashOptions) + +// WithAnnex is a functional option that allows the caller to specify the +// existence of an annex in the final witness stack for the taproot/tapscript +// spends. +func WithAnnex(annex []byte) TaprootSigHashOption { + return func(o *taprootSigHashOptions) { + // It's just a bytes.Buffer which never returns an error on + // write. + var b bytes.Buffer + _ = wire.WriteVarBytes(&b, 0, annex) + + o.annexHash = chainhash.HashB(b.Bytes()) + } +} + +// WithBaseTapscriptVersion is a functional option that specifies that the +// sighash digest should include the extra information included as part of the +// base tapscript version. +func WithBaseTapscriptVersion(codeSepPos uint32, + tapLeafHash []byte) TaprootSigHashOption { + + return func(o *taprootSigHashOptions) { + o.extFlag = tapscriptSighashExtFlag + o.tapLeafHash = tapLeafHash + o.keyVersion = 0 + o.codeSepPos = codeSepPos + } +} + +// isValidTaprootSigHash returns true if the passed sighash is a valid taproot +// sighash. +func isValidTaprootSigHash(hashType SigHashType) bool { + switch hashType { + case SigHashDefault, SigHashAll, SigHashNone, SigHashSingle: + fallthrough + case 0x81, 0x82, 0x83: + return true + + default: + return false + } +} + +// calcTaprootSignatureHashRaw computes the sighash as specified in BIP 143. +// If an invalid sighash type is passed in, an error is returned. +func calcTaprootSignatureHashRaw(sigHashes *TxSigHashes, hType SigHashType, + tx *wire.MsgTx, idx int, + prevOutFetcher PrevOutputFetcher, + sigHashOpts ...TaprootSigHashOption) ([]byte, error) { + + opts := defaultTaprootSighashOptions() + for _, sigHashOpt := range sigHashOpts { + sigHashOpt(opts) + } + + // If a valid sighash type isn't passed in, then we'll exit early. + if !isValidTaprootSigHash(hType) { + // TODO(roasbeef): use actual errr here + return nil, fmt.Errorf("invalid taproot sighash type: %v", hType) + } + + // As a sanity check, ensure the passed input index for the transaction + // is valid. + if idx > len(tx.TxIn)-1 { + return nil, fmt.Errorf("idx %d but %d txins", idx, len(tx.TxIn)) + } + + // We'll utilize this buffer throughout to incrementally calculate + // the signature hash for this transaction. + var sigMsg bytes.Buffer + + // The final sighash always has a value of 0x00 prepended to it, which + // is called the sighash epoch. + sigMsg.WriteByte(0x00) + + // First, we write the hash type encoded as a single byte. + if err := sigMsg.WriteByte(byte(hType)); err != nil { + return nil, err + } + + // Next we'll write out the transaction specific data which binds the + // outer context of the sighash. + err := binary.Write(&sigMsg, binary.LittleEndian, tx.Version) + if err != nil { + return nil, err + } + err = binary.Write(&sigMsg, binary.LittleEndian, tx.LockTime) + if err != nil { + return nil, err + } + + // If sighash isn't anyone can pay, then we'll include all the + // pre-computed midstate digests in the sighash. + if hType&SigHashAnyOneCanPay != SigHashAnyOneCanPay { + sigMsg.Write(sigHashes.HashPrevOutsV1[:]) + sigMsg.Write(sigHashes.HashInputAmountsV1[:]) + sigMsg.Write(sigHashes.HashInputScriptsV1[:]) + sigMsg.Write(sigHashes.HashSequenceV1[:]) + } + + // If this is sighash all, or its taproot alias (sighash default), + // then we'll also include the pre-computed digest of all the outputs + // of the transaction. + if hType&SigHashSingle != SigHashSingle && + hType&SigHashSingle != SigHashNone { + + sigMsg.Write(sigHashes.HashOutputsV1[:]) + } + + // Next, we'll write out the relevant information for this specific + // input. + // + // The spend type is computed as the (ext_flag*2) + annex_present. We + // use this to bind the extension flag (that BIP 342 uses), as well as + // the annex if its present. + input := tx.TxIn[idx] + witnessHasAnnex := opts.annexHash != nil + spendType := byte(opts.extFlag) * 2 + if witnessHasAnnex { + spendType += 1 + } + + if err := sigMsg.WriteByte(spendType); err != nil { + return nil, err + } + + // If anyone can pay is active, then we'll write out just the specific + // information about this input, given we skipped writing all the + // information of all the inputs above. + if hType&SigHashAnyOneCanPay == SigHashAnyOneCanPay { + // We'll start out with writing this input specific information by + // first writing the entire previous output. + err = wire.WriteOutPoint(&sigMsg, 0, 0, &input.PreviousOutPoint) + if err != nil { + return nil, err + } + + // Next, we'll write out the previous output (amt+script) being + // spent itself. + prevOut := prevOutFetcher.FetchPrevOutput(input.PreviousOutPoint) + if err := wire.WriteTxOut(&sigMsg, 0, 0, prevOut); err != nil { + return nil, err + } + + // Finally, we'll write out the input sequence itself. + err = binary.Write(&sigMsg, binary.LittleEndian, input.Sequence) + if err != nil { + return nil, err + } + } else { + err := binary.Write(&sigMsg, binary.LittleEndian, uint32(idx)) + if err != nil { + return nil, err + } + } + + // Now that we have the input specific information written, we'll + // include the anex, if we have it. + if witnessHasAnnex { + sigMsg.Write(opts.annexHash) + } + + // Finally, if this is sighash single, then we'll write out the + // information for this given output. + if hType&sigHashMask == SigHashSingle { + // If this output doesn't exist, then we'll return with an error + // here as this is an invalid sighash type for this input. + if idx >= len(tx.TxOut) { + // TODO(roasbeef): real error here + return nil, fmt.Errorf("invalid sighash type for input") + } + + // Now that we know this is a valid sighash input combination, + // we'll write out the information specific to this input. + // We'll write the wire serialization of the output and compute + // the sha256 in a single step. + shaWriter := sha256.New() + txOut := tx.TxOut[idx] + if err := wire.WriteTxOut(shaWriter, 0, 0, txOut); err != nil { + return nil, err + } + + // With the digest obtained, we'll write this out into our + // signature message. + if _, err := sigMsg.Write(shaWriter.Sum(nil)); err != nil { + return nil, err + } + } + + // Now that we've written out all the base information, we'll write any + // message extensions (if they exist). + if err := opts.writeDigestExtensions(&sigMsg); err != nil { + return nil, err + } + + // The final sighash is computed as: hash_TagSigHash(0x00 || sigMsg). + // We wrote the 0x00 above so we don't need to append here and incur + // extra allocations. + sigHash := chainhash.TaggedHash(chainhash.TagTapSighash, sigMsg.Bytes()) + return sigHash[:], nil +} + +// CalcTaprootSignatureHash computes the sighash digest of a transaction's +// taproot-spending input using the new sighash digest algorithm described in +// BIP 341. As the new digest algorithms may require the digest to commit to the +// entire prev output, a PrevOutputFetcher argument is required to obtain the +// needed information. The TxSigHashes pre-computed sighash midstate MUST be +// specified. +func CalcTaprootSignatureHash(sigHashes *TxSigHashes, hType SigHashType, + tx *wire.MsgTx, idx int, + prevOutFetcher PrevOutputFetcher) ([]byte, error) { + + return calcTaprootSignatureHashRaw( + sigHashes, hType, tx, idx, prevOutFetcher, + ) +} + +// CalcTaprootSignatureHash is similar to CalcTaprootSignatureHash but for +// _tapscript_ spends instead. A proper TapLeaf instance (the script leaf being +// signed) must be passed in. The functional options can be used to specify an +// annex if the signature was bound to that context. +// +// NOTE: This function is able to compute the sighash of scripts that contain a +// code separator if the caller passes in an instance of +// WithBaseTapscriptVersion with the valid position. +func CalcTapscriptSignaturehash(sigHashes *TxSigHashes, hType SigHashType, + tx *wire.MsgTx, idx int, prevOutFetcher PrevOutputFetcher, + tapLeaf TapLeaf, + sigHashOpts ...TaprootSigHashOption) ([]byte, error) { + + tapLeafHash := tapLeaf.TapHash() + + var opts []TaprootSigHashOption + opts = append( + opts, WithBaseTapscriptVersion(blankCodeSepValue, tapLeafHash[:]), + ) + opts = append(opts, sigHashOpts...) + + return calcTaprootSignatureHashRaw( + sigHashes, hType, tx, idx, prevOutFetcher, opts..., + ) +} diff --git a/txscript/sign.go b/txscript/sign.go index 42af9686cb..0a11e1b197 100644 --- a/txscript/sign.go +++ b/txscript/sign.go @@ -6,12 +6,14 @@ package txscript import ( "errors" - "fmt" - "github.com/btcsuite/btcd/btcec" + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcec/v2/schnorr" + "github.com/btcsuite/btcd/btcutil" + + "github.com/btcsuite/btcd/btcec/v2/ecdsa" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) // RawTxInWitnessSignature returns the serialized ECDA signature for the input @@ -22,21 +24,13 @@ func RawTxInWitnessSignature(tx *wire.MsgTx, sigHashes *TxSigHashes, idx int, amt int64, subScript []byte, hashType SigHashType, key *btcec.PrivateKey) ([]byte, error) { - parsedScript, err := parseScript(subScript) - if err != nil { - return nil, fmt.Errorf("cannot parse output script: %v", err) - } - - hash, err := calcWitnessSignatureHash(parsedScript, sigHashes, hashType, tx, + hash, err := calcWitnessSignatureHashRaw(subScript, sigHashes, hashType, tx, idx, amt) if err != nil { return nil, err } - signature, err := key.Sign(hash) - if err != nil { - return nil, fmt.Errorf("cannot sign tx input: %s", err) - } + signature := ecdsa.Sign(key, hash) return append(signature.Serialize(), byte(hashType)), nil } @@ -56,7 +50,7 @@ func WitnessSignature(tx *wire.MsgTx, sigHashes *TxSigHashes, idx int, amt int64 return nil, err } - pk := (*btcec.PublicKey)(&privKey.PublicKey) + pk := privKey.PubKey() var pkData []byte if compress { pkData = pk.SerializeCompressed() @@ -69,6 +63,115 @@ func WitnessSignature(tx *wire.MsgTx, sigHashes *TxSigHashes, idx int, amt int64 return wire.TxWitness{sig, pkData}, nil } +// RawTxInTaprootSignature returns a valid schnorr signature required to +// perform a taproot key-spend of the specified input. If SigHashDefault was +// specified, then the returned signature is 64-byte in length, as it omits the +// additional byte to denote the sighash type. +func RawTxInTaprootSignature(tx *wire.MsgTx, sigHashes *TxSigHashes, idx int, + amt int64, pkScript []byte, tapScriptRootHash []byte, hashType SigHashType, + key *btcec.PrivateKey) ([]byte, error) { + + // First, we'll start by compute the top-level taproot sighash. + sigHash, err := calcTaprootSignatureHashRaw( + sigHashes, hashType, tx, idx, + NewCannedPrevOutputFetcher(pkScript, amt), + ) + if err != nil { + return nil, err + } + + // Before we sign the sighash, we'll need to apply the taptweak to the + // private key based on the tapScriptRootHash. + privKeyTweak := TweakTaprootPrivKey(*key, tapScriptRootHash) + + // With the sighash constructed, we can sign it with the specified + // private key. + signature, err := schnorr.Sign(privKeyTweak, sigHash) + if err != nil { + return nil, err + } + + sig := signature.Serialize() + + // If this is sighash default, then we can just return the signature + // directly. + if hashType == SigHashDefault { + return sig, nil + } + + // Otherwise, append the sighash type to the final sig. + return append(sig, byte(hashType)), nil +} + +// TaprootWitnessSignature returns a valid witness stack that can be used to +// spend the key-spend path of a taproot input as specified in BIP 342 and BIP +// 86. This method assumes that the public key included in pkScript was +// generated using ComputeTaprootKeyNoScript that commits to a fake root +// tapscript hash. If not, then RawTxInTaprootSignature should be used with the +// actual committed contents. +// +// TODO(roasbeef): add support for annex even tho it's non-standard? +func TaprootWitnessSignature(tx *wire.MsgTx, sigHashes *TxSigHashes, idx int, + amt int64, pkScript []byte, hashType SigHashType, + key *btcec.PrivateKey) (wire.TxWitness, error) { + + // As we're assuming this was a BIP 86 key, we use an empty root hash + // which means output key commits to just the public key. + fakeTapscriptRootHash := []byte{} + + sig, err := RawTxInTaprootSignature( + tx, sigHashes, idx, amt, pkScript, fakeTapscriptRootHash, + hashType, key, + ) + if err != nil { + return nil, err + } + + // The witness script to spend a taproot input using the key-spend path + // is just the signature itself, given the public key is + // embedded in the previous output script. + return wire.TxWitness{sig}, nil +} + +// RawTxInTapscriptSignature computes a raw schnorr signature for a signature +// generated from a tapscript leaf. This differs from the +// RawTxInTaprootSignature which is used to generate signatures for top-level +// taproot key spends. +// +// TODO(roasbeef): actually add code-sep to interface? not really used +// anywhere.... +func RawTxInTapscriptSignature(tx *wire.MsgTx, sigHashes *TxSigHashes, idx int, + amt int64, pkScript []byte, tapLeaf TapLeaf, hashType SigHashType, + privKey *btcec.PrivateKey) ([]byte, error) { + + // First, we'll start by compute the top-level taproot sighash. + tapLeafHash := tapLeaf.TapHash() + sigHash, err := calcTaprootSignatureHashRaw( + sigHashes, hashType, tx, idx, + NewCannedPrevOutputFetcher(pkScript, amt), + WithBaseTapscriptVersion(blankCodeSepValue, tapLeafHash[:]), + ) + if err != nil { + return nil, err + } + + // With the sighash constructed, we can sign it with the specified + // private key. + signature, err := schnorr.Sign(privKey, sigHash) + if err != nil { + return nil, err + } + + // Finally, append the sighash type to the final sig if it's not the + // default sighash value (in which case appending it is disallowed). + if hashType != SigHashDefault { + return append(signature.Serialize(), byte(hashType)), nil + } + + // The default sighash case where we'll return _just_ the signature. + return signature.Serialize(), nil +} + // RawTxInSignature returns the serialized ECDSA signature for the input idx of // the given transaction, with hashType appended to it. func RawTxInSignature(tx *wire.MsgTx, idx int, subScript []byte, @@ -78,10 +181,7 @@ func RawTxInSignature(tx *wire.MsgTx, idx int, subScript []byte, if err != nil { return nil, err } - signature, err := key.Sign(hash) - if err != nil { - return nil, fmt.Errorf("cannot sign tx input: %s", err) - } + signature := ecdsa.Sign(key, hash) return append(signature.Serialize(), byte(hashType)), nil } @@ -100,7 +200,7 @@ func SignatureScript(tx *wire.MsgTx, idx int, subscript []byte, hashType SigHash return nil, err } - pk := (*btcec.PublicKey)(&privKey.PublicKey) + pk := privKey.PubKey() var pkData []byte if compress { pkData = pk.SerializeCompressed() @@ -212,110 +312,50 @@ func sign(chainParams *chaincfg.Params, tx *wire.MsgTx, idx int, } } -// mergeScripts merges sigScript and prevScript assuming they are both -// partial solutions for pkScript spending output idx of tx. class, addresses -// and nrequired are the result of extracting the addresses from pkscript. -// The return value is the best effort merging of the two scripts. Calling this -// function with addresses, class and nrequired that do not match pkScript is -// an error and results in undefined behaviour. -func mergeScripts(chainParams *chaincfg.Params, tx *wire.MsgTx, idx int, - pkScript []byte, class ScriptClass, addresses []btcutil.Address, - nRequired int, sigScript, prevScript []byte) []byte { - - // TODO: the scripthash and multisig paths here are overly - // inefficient in that they will recompute already known data. - // some internal refactoring could probably make this avoid needless - // extra calculations. - switch class { - case ScriptHashTy: - // Remove the last push in the script and then recurse. - // this could be a lot less inefficient. - sigPops, err := parseScript(sigScript) - if err != nil || len(sigPops) == 0 { - return prevScript - } - prevPops, err := parseScript(prevScript) - if err != nil || len(prevPops) == 0 { - return sigScript - } - - // assume that script in sigPops is the correct one, we just - // made it. - script := sigPops[len(sigPops)-1].data - - // We already know this information somewhere up the stack. - class, addresses, nrequired, _ := - ExtractPkScriptAddrs(script, chainParams) - - // regenerate scripts. - sigScript, _ := unparseScript(sigPops) - prevScript, _ := unparseScript(prevPops) - - // Merge - mergedScript := mergeScripts(chainParams, tx, idx, script, - class, addresses, nrequired, sigScript, prevScript) - - // Reappend the script and return the result. - builder := NewScriptBuilder() - builder.AddOps(mergedScript) - builder.AddData(script) - finalScript, _ := builder.Script() - return finalScript - case MultiSigTy: - return mergeMultiSig(tx, idx, addresses, nRequired, pkScript, - sigScript, prevScript) - - // It doesn't actually make sense to merge anything other than multiig - // and scripthash (because it could contain multisig). Everything else - // has either zero signature, can't be spent, or has a single signature - // which is either present or not. The other two cases are handled - // above. In the conflict case here we just assume the longest is - // correct (this matches behaviour of the reference implementation). - default: - if len(sigScript) > len(prevScript) { - return sigScript - } - return prevScript - } -} - // mergeMultiSig combines the two signature scripts sigScript and prevScript // that both provide signatures for pkScript in output idx of tx. addresses // and nRequired should be the results from extracting the addresses from // pkScript. Since this function is internal only we assume that the arguments // have come from other functions internally and thus are all consistent with // each other, behaviour is undefined if this contract is broken. +// +// NOTE: This function is only valid for version 0 scripts. Since the function +// does not accept a script version, the results are undefined for other script +// versions. func mergeMultiSig(tx *wire.MsgTx, idx int, addresses []btcutil.Address, nRequired int, pkScript, sigScript, prevScript []byte) []byte { - // This is an internal only function and we already parsed this script - // as ok for multisig (this is how we got here), so if this fails then - // all assumptions are broken and who knows which way is up? - pkPops, _ := parseScript(pkScript) - - sigPops, err := parseScript(sigScript) - if err != nil || len(sigPops) == 0 { + // Nothing to merge if either the new or previous signature scripts are + // empty. + if len(sigScript) == 0 { return prevScript } - - prevPops, err := parseScript(prevScript) - if err != nil || len(prevPops) == 0 { + if len(prevScript) == 0 { return sigScript } // Convenience function to avoid duplication. - extractSigs := func(pops []parsedOpcode, sigs [][]byte) [][]byte { - for _, pop := range pops { - if len(pop.data) != 0 { - sigs = append(sigs, pop.data) + var possibleSigs [][]byte + extractSigs := func(script []byte) error { + const scriptVersion = 0 + tokenizer := MakeScriptTokenizer(scriptVersion, script) + for tokenizer.Next() { + if data := tokenizer.Data(); len(data) != 0 { + possibleSigs = append(possibleSigs, data) } } - return sigs + return tokenizer.Err() } - possibleSigs := make([][]byte, 0, len(sigPops)+len(prevPops)) - possibleSigs = extractSigs(sigPops, possibleSigs) - possibleSigs = extractSigs(prevPops, possibleSigs) + // Attempt to extract signatures from the two scripts. Return the other + // script that is intended to be merged in the case signature extraction + // fails for some reason. + if err := extractSigs(sigScript); err != nil { + return prevScript + } + if err := extractSigs(prevScript); err != nil { + return sigScript + } // Now we need to match the signatures to pubkeys, the only real way to // do that is to try to verify them all and match it to the pubkey @@ -335,7 +375,7 @@ sigLoop: tSig := sig[:len(sig)-1] hashType := SigHashType(sig[len(sig)-1]) - pSig, err := btcec.ParseDERSignature(tSig, btcec.S256()) + pSig, err := ecdsa.ParseDERSignature(tSig) if err != nil { continue } @@ -345,7 +385,7 @@ sigLoop: // however, assume no sigs etc are in the script since that // would make the transaction nonstandard and thus not // MultiSigTy, so we just need to hash the full thing. - hash := calcSignatureHash(pkPops, hashType, tx, idx) + hash := calcSignatureHash(pkScript, hashType, tx, idx) for _, addr := range addresses { // All multisig addresses should be pubkey addresses @@ -394,6 +434,81 @@ sigLoop: return script } +// mergeScripts merges sigScript and prevScript assuming they are both +// partial solutions for pkScript spending output idx of tx. class, addresses +// and nrequired are the result of extracting the addresses from pkscript. +// The return value is the best effort merging of the two scripts. Calling this +// function with addresses, class and nrequired that do not match pkScript is +// an error and results in undefined behaviour. +// +// NOTE: This function is only valid for version 0 scripts. Since the function +// does not accept a script version, the results are undefined for other script +// versions. +func mergeScripts(chainParams *chaincfg.Params, tx *wire.MsgTx, idx int, + pkScript []byte, class ScriptClass, addresses []btcutil.Address, + nRequired int, sigScript, prevScript []byte) []byte { + + // TODO(oga) the scripthash and multisig paths here are overly + // inefficient in that they will recompute already known data. + // some internal refactoring could probably make this avoid needless + // extra calculations. + const scriptVersion = 0 + switch class { + case ScriptHashTy: + // Nothing to merge if either the new or previous signature + // scripts are empty or fail to parse. + if len(sigScript) == 0 || + checkScriptParses(scriptVersion, sigScript) != nil { + + return prevScript + } + if len(prevScript) == 0 || + checkScriptParses(scriptVersion, prevScript) != nil { + + return sigScript + } + + // Remove the last push in the script and then recurse. + // this could be a lot less inefficient. + // + // Assume that final script is the correct one since it was just + // made and it is a pay-to-script-hash. + script := finalOpcodeData(scriptVersion, sigScript) + + // We already know this information somewhere up the stack, + // therefore the error is ignored. + class, addresses, nrequired, _ := + ExtractPkScriptAddrs(script, chainParams) + + // Merge + mergedScript := mergeScripts(chainParams, tx, idx, script, + class, addresses, nrequired, sigScript, prevScript) + + // Reappend the script and return the result. + builder := NewScriptBuilder() + builder.AddOps(mergedScript) + builder.AddData(script) + finalScript, _ := builder.Script() + return finalScript + + case MultiSigTy: + return mergeMultiSig(tx, idx, addresses, nRequired, pkScript, + sigScript, prevScript) + + // It doesn't actually make sense to merge anything other than multiig + // and scripthash (because it could contain multisig). Everything else + // has either zero signature, can't be spent, or has a single signature + // which is either present or not. The other two cases are handled + // above. In the conflict case here we just assume the longest is + // correct (this matches behaviour of the reference implementation). + default: + if len(sigScript) > len(prevScript) { + return sigScript + } + return prevScript + } +} + // KeyDB is an interface type provided to SignTxOutput, it encapsulates // any user state required to get the private keys for an address. type KeyDB interface { @@ -404,8 +519,7 @@ type KeyDB interface { type KeyClosure func(btcutil.Address) (*btcec.PrivateKey, bool, error) // GetKey implements KeyDB by returning the result of calling the closure. -func (kc KeyClosure) GetKey(address btcutil.Address) (*btcec.PrivateKey, - bool, error) { +func (kc KeyClosure) GetKey(address btcutil.Address) (*btcec.PrivateKey, bool, error) { return kc(address) } @@ -430,6 +544,10 @@ func (sc ScriptClosure) GetScript(address btcutil.Address) ([]byte, error) { // getScript. If previousScript is provided then the results in previousScript // will be merged in a type-dependent manner with the newly generated. // signature script. +// +// NOTE: This function is only valid for version 0 scripts. Since the function +// does not accept a script version, the results are undefined for other script +// versions. func SignTxOutput(chainParams *chaincfg.Params, tx *wire.MsgTx, idx int, pkScript []byte, hashType SigHashType, kdb KeyDB, sdb ScriptDB, previousScript []byte) ([]byte, error) { diff --git a/txscript/sign_test.go b/txscript/sign_test.go index b97a8a64d4..b3cf5119d3 100644 --- a/txscript/sign_test.go +++ b/txscript/sign_test.go @@ -9,11 +9,13 @@ import ( "fmt" "testing" - "github.com/btcsuite/btcd/btcec" + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcec/v2/schnorr" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" + "github.com/stretchr/testify/require" ) type addressToKey struct { @@ -56,7 +58,7 @@ func mkGetScript(scripts map[string][]byte) ScriptDB { func checkScripts(msg string, tx *wire.MsgTx, idx int, inputAmt int64, sigScript, pkScript []byte) error { tx.TxIn[idx].SignatureScript = sigScript vm, err := NewEngine(pkScript, tx, idx, - ScriptBip16|ScriptVerifyDERSignatures, nil, nil, inputAmt) + ScriptBip16|ScriptVerifyDERSignatures, nil, nil, inputAmt, nil) if err != nil { return fmt.Errorf("failed to make script engine for %s: %v", msg, err) @@ -143,15 +145,14 @@ func TestSignTxOutput(t *testing.T) { for _, hashType := range hashTypes { for i := range tx.TxIn { msg := fmt.Sprintf("%d:%d", hashType, i) - key, err := btcec.NewPrivateKey(btcec.S256()) + key, err := btcec.NewPrivateKey() if err != nil { t.Errorf("failed to make privKey for %s: %v", msg, err) break } - pk := (*btcec.PublicKey)(&key.PublicKey). - SerializeUncompressed() + pk := key.PubKey().SerializeUncompressed() address, err := btcutil.NewAddressPubKeyHash( btcutil.Hash160(pk), &chaincfg.TestNet3Params) if err != nil { @@ -180,15 +181,14 @@ func TestSignTxOutput(t *testing.T) { for _, hashType := range hashTypes { for i := range tx.TxIn { msg := fmt.Sprintf("%d:%d", hashType, i) - key, err := btcec.NewPrivateKey(btcec.S256()) + key, err := btcec.NewPrivateKey() if err != nil { t.Errorf("failed to make privKey for %s: %v", msg, err) break } - pk := (*btcec.PublicKey)(&key.PublicKey). - SerializeUncompressed() + pk := key.PubKey().SerializeUncompressed() address, err := btcutil.NewAddressPubKeyHash( btcutil.Hash160(pk), &chaincfg.TestNet3Params) if err != nil { @@ -241,15 +241,14 @@ func TestSignTxOutput(t *testing.T) { for i := range tx.TxIn { msg := fmt.Sprintf("%d:%d", hashType, i) - key, err := btcec.NewPrivateKey(btcec.S256()) + key, err := btcec.NewPrivateKey() if err != nil { t.Errorf("failed to make privKey for %s: %v", msg, err) break } - pk := (*btcec.PublicKey)(&key.PublicKey). - SerializeCompressed() + pk := key.PubKey().SerializeCompressed() address, err := btcutil.NewAddressPubKeyHash( btcutil.Hash160(pk), &chaincfg.TestNet3Params) if err != nil { @@ -280,15 +279,14 @@ func TestSignTxOutput(t *testing.T) { for i := range tx.TxIn { msg := fmt.Sprintf("%d:%d", hashType, i) - key, err := btcec.NewPrivateKey(btcec.S256()) + key, err := btcec.NewPrivateKey() if err != nil { t.Errorf("failed to make privKey for %s: %v", msg, err) break } - pk := (*btcec.PublicKey)(&key.PublicKey). - SerializeCompressed() + pk := key.PubKey().SerializeCompressed() address, err := btcutil.NewAddressPubKeyHash( btcutil.Hash160(pk), &chaincfg.TestNet3Params) if err != nil { @@ -342,15 +340,14 @@ func TestSignTxOutput(t *testing.T) { for i := range tx.TxIn { msg := fmt.Sprintf("%d:%d", hashType, i) - key, err := btcec.NewPrivateKey(btcec.S256()) + key, err := btcec.NewPrivateKey() if err != nil { t.Errorf("failed to make privKey for %s: %v", msg, err) break } - pk := (*btcec.PublicKey)(&key.PublicKey). - SerializeUncompressed() + pk := key.PubKey().SerializeUncompressed() address, err := btcutil.NewAddressPubKey(pk, &chaincfg.TestNet3Params) if err != nil { @@ -381,15 +378,14 @@ func TestSignTxOutput(t *testing.T) { for i := range tx.TxIn { msg := fmt.Sprintf("%d:%d", hashType, i) - key, err := btcec.NewPrivateKey(btcec.S256()) + key, err := btcec.NewPrivateKey() if err != nil { t.Errorf("failed to make privKey for %s: %v", msg, err) break } - pk := (*btcec.PublicKey)(&key.PublicKey). - SerializeUncompressed() + pk := key.PubKey().SerializeUncompressed() address, err := btcutil.NewAddressPubKey(pk, &chaincfg.TestNet3Params) if err != nil { @@ -442,15 +438,14 @@ func TestSignTxOutput(t *testing.T) { for i := range tx.TxIn { msg := fmt.Sprintf("%d:%d", hashType, i) - key, err := btcec.NewPrivateKey(btcec.S256()) + key, err := btcec.NewPrivateKey() if err != nil { t.Errorf("failed to make privKey for %s: %v", msg, err) break } - pk := (*btcec.PublicKey)(&key.PublicKey). - SerializeCompressed() + pk := key.PubKey().SerializeCompressed() address, err := btcutil.NewAddressPubKey(pk, &chaincfg.TestNet3Params) if err != nil { @@ -481,15 +476,14 @@ func TestSignTxOutput(t *testing.T) { for i := range tx.TxIn { msg := fmt.Sprintf("%d:%d", hashType, i) - key, err := btcec.NewPrivateKey(btcec.S256()) + key, err := btcec.NewPrivateKey() if err != nil { t.Errorf("failed to make privKey for %s: %v", msg, err) break } - pk := (*btcec.PublicKey)(&key.PublicKey). - SerializeCompressed() + pk := key.PubKey().SerializeCompressed() address, err := btcutil.NewAddressPubKey(pk, &chaincfg.TestNet3Params) if err != nil { @@ -543,15 +537,14 @@ func TestSignTxOutput(t *testing.T) { for _, hashType := range hashTypes { for i := range tx.TxIn { msg := fmt.Sprintf("%d:%d", hashType, i) - key, err := btcec.NewPrivateKey(btcec.S256()) + key, err := btcec.NewPrivateKey() if err != nil { t.Errorf("failed to make privKey for %s: %v", msg, err) break } - pk := (*btcec.PublicKey)(&key.PublicKey). - SerializeUncompressed() + pk := key.PubKey().SerializeUncompressed() address, err := btcutil.NewAddressPubKeyHash( btcutil.Hash160(pk), &chaincfg.TestNet3Params) if err != nil { @@ -600,15 +593,14 @@ func TestSignTxOutput(t *testing.T) { for _, hashType := range hashTypes { for i := range tx.TxIn { msg := fmt.Sprintf("%d:%d", hashType, i) - key, err := btcec.NewPrivateKey(btcec.S256()) + key, err := btcec.NewPrivateKey() if err != nil { t.Errorf("failed to make privKey for %s: %v", msg, err) break } - pk := (*btcec.PublicKey)(&key.PublicKey). - SerializeUncompressed() + pk := key.PubKey().SerializeUncompressed() address, err := btcutil.NewAddressPubKeyHash( btcutil.Hash160(pk), &chaincfg.TestNet3Params) if err != nil { @@ -683,15 +675,14 @@ func TestSignTxOutput(t *testing.T) { for i := range tx.TxIn { msg := fmt.Sprintf("%d:%d", hashType, i) - key, err := btcec.NewPrivateKey(btcec.S256()) + key, err := btcec.NewPrivateKey() if err != nil { t.Errorf("failed to make privKey for %s: %v", msg, err) break } - pk := (*btcec.PublicKey)(&key.PublicKey). - SerializeCompressed() + pk := key.PubKey().SerializeCompressed() address, err := btcutil.NewAddressPubKeyHash( btcutil.Hash160(pk), &chaincfg.TestNet3Params) if err != nil { @@ -740,15 +731,14 @@ func TestSignTxOutput(t *testing.T) { for i := range tx.TxIn { msg := fmt.Sprintf("%d:%d", hashType, i) - key, err := btcec.NewPrivateKey(btcec.S256()) + key, err := btcec.NewPrivateKey() if err != nil { t.Errorf("failed to make privKey for %s: %v", msg, err) break } - pk := (*btcec.PublicKey)(&key.PublicKey). - SerializeCompressed() + pk := key.PubKey().SerializeCompressed() address, err := btcutil.NewAddressPubKeyHash( btcutil.Hash160(pk), &chaincfg.TestNet3Params) if err != nil { @@ -822,15 +812,14 @@ func TestSignTxOutput(t *testing.T) { for i := range tx.TxIn { msg := fmt.Sprintf("%d:%d", hashType, i) - key, err := btcec.NewPrivateKey(btcec.S256()) + key, err := btcec.NewPrivateKey() if err != nil { t.Errorf("failed to make privKey for %s: %v", msg, err) break } - pk := (*btcec.PublicKey)(&key.PublicKey). - SerializeUncompressed() + pk := key.PubKey().SerializeUncompressed() address, err := btcutil.NewAddressPubKey(pk, &chaincfg.TestNet3Params) if err != nil { @@ -879,15 +868,14 @@ func TestSignTxOutput(t *testing.T) { for i := range tx.TxIn { msg := fmt.Sprintf("%d:%d", hashType, i) - key, err := btcec.NewPrivateKey(btcec.S256()) + key, err := btcec.NewPrivateKey() if err != nil { t.Errorf("failed to make privKey for %s: %v", msg, err) break } - pk := (*btcec.PublicKey)(&key.PublicKey). - SerializeUncompressed() + pk := key.PubKey().SerializeUncompressed() address, err := btcutil.NewAddressPubKey(pk, &chaincfg.TestNet3Params) if err != nil { @@ -960,15 +948,14 @@ func TestSignTxOutput(t *testing.T) { for i := range tx.TxIn { msg := fmt.Sprintf("%d:%d", hashType, i) - key, err := btcec.NewPrivateKey(btcec.S256()) + key, err := btcec.NewPrivateKey() if err != nil { t.Errorf("failed to make privKey for %s: %v", msg, err) break } - pk := (*btcec.PublicKey)(&key.PublicKey). - SerializeCompressed() + pk := key.PubKey().SerializeCompressed() address, err := btcutil.NewAddressPubKey(pk, &chaincfg.TestNet3Params) if err != nil { @@ -1016,15 +1003,14 @@ func TestSignTxOutput(t *testing.T) { for i := range tx.TxIn { msg := fmt.Sprintf("%d:%d", hashType, i) - key, err := btcec.NewPrivateKey(btcec.S256()) + key, err := btcec.NewPrivateKey() if err != nil { t.Errorf("failed to make privKey for %s: %v", msg, err) break } - pk := (*btcec.PublicKey)(&key.PublicKey). - SerializeCompressed() + pk := key.PubKey().SerializeCompressed() address, err := btcutil.NewAddressPubKey(pk, &chaincfg.TestNet3Params) if err != nil { @@ -1097,15 +1083,14 @@ func TestSignTxOutput(t *testing.T) { for i := range tx.TxIn { msg := fmt.Sprintf("%d:%d", hashType, i) - key1, err := btcec.NewPrivateKey(btcec.S256()) + key1, err := btcec.NewPrivateKey() if err != nil { t.Errorf("failed to make privKey for %s: %v", msg, err) break } - pk1 := (*btcec.PublicKey)(&key1.PublicKey). - SerializeCompressed() + pk1 := key1.PubKey().SerializeCompressed() address1, err := btcutil.NewAddressPubKey(pk1, &chaincfg.TestNet3Params) if err != nil { @@ -1114,15 +1099,14 @@ func TestSignTxOutput(t *testing.T) { break } - key2, err := btcec.NewPrivateKey(btcec.S256()) + key2, err := btcec.NewPrivateKey() if err != nil { t.Errorf("failed to make privKey 2 for %s: %v", msg, err) break } - pk2 := (*btcec.PublicKey)(&key2.PublicKey). - SerializeCompressed() + pk2 := key2.PubKey().SerializeCompressed() address2, err := btcutil.NewAddressPubKey(pk2, &chaincfg.TestNet3Params) if err != nil { @@ -1173,15 +1157,14 @@ func TestSignTxOutput(t *testing.T) { for i := range tx.TxIn { msg := fmt.Sprintf("%d:%d", hashType, i) - key1, err := btcec.NewPrivateKey(btcec.S256()) + key1, err := btcec.NewPrivateKey() if err != nil { t.Errorf("failed to make privKey for %s: %v", msg, err) break } - pk1 := (*btcec.PublicKey)(&key1.PublicKey). - SerializeCompressed() + pk1 := key1.PubKey().SerializeCompressed() address1, err := btcutil.NewAddressPubKey(pk1, &chaincfg.TestNet3Params) if err != nil { @@ -1190,15 +1173,14 @@ func TestSignTxOutput(t *testing.T) { break } - key2, err := btcec.NewPrivateKey(btcec.S256()) + key2, err := btcec.NewPrivateKey() if err != nil { t.Errorf("failed to make privKey 2 for %s: %v", msg, err) break } - pk2 := (*btcec.PublicKey)(&key2.PublicKey). - SerializeCompressed() + pk2 := key2.PubKey().SerializeCompressed() address2, err := btcutil.NewAddressPubKey(pk2, &chaincfg.TestNet3Params) if err != nil { @@ -1279,15 +1261,14 @@ func TestSignTxOutput(t *testing.T) { for i := range tx.TxIn { msg := fmt.Sprintf("%d:%d", hashType, i) - key1, err := btcec.NewPrivateKey(btcec.S256()) + key1, err := btcec.NewPrivateKey() if err != nil { t.Errorf("failed to make privKey for %s: %v", msg, err) break } - pk1 := (*btcec.PublicKey)(&key1.PublicKey). - SerializeCompressed() + pk1 := key1.PubKey().SerializeCompressed() address1, err := btcutil.NewAddressPubKey(pk1, &chaincfg.TestNet3Params) if err != nil { @@ -1296,15 +1277,14 @@ func TestSignTxOutput(t *testing.T) { break } - key2, err := btcec.NewPrivateKey(btcec.S256()) + key2, err := btcec.NewPrivateKey() if err != nil { t.Errorf("failed to make privKey 2 for %s: %v", msg, err) break } - pk2 := (*btcec.PublicKey)(&key2.PublicKey). - SerializeCompressed() + pk2 := key2.PubKey().SerializeCompressed() address2, err := btcutil.NewAddressPubKey(pk2, &chaincfg.TestNet3Params) if err != nil { @@ -1635,7 +1615,7 @@ var sigScriptTests = []tstSigScript{ func TestSignatureScript(t *testing.T) { t.Parallel() - privKey, _ := btcec.PrivKeyFromBytes(btcec.S256(), privKeyD) + privKey, _ := btcec.PrivKeyFromBytes(privKeyD) nexttest: for i := range sigScriptTests { @@ -1694,7 +1674,7 @@ nexttest: scriptFlags := ScriptBip16 | ScriptVerifyDERSignatures for j := range tx.TxIn { vm, err := NewEngine(sigScriptTests[i]. - inputs[j].txout.PkScript, tx, j, scriptFlags, nil, nil, 0) + inputs[j].txout.PkScript, tx, j, scriptFlags, nil, nil, 0, nil) if err != nil { t.Errorf("cannot create script vm for test %v: %v", sigScriptTests[i].name, err) @@ -1714,3 +1694,205 @@ nexttest: } } } + +// TestRawTxInTaprootSignature tests that the RawTxInTaprootSignature function +// generates valid signatures for all relevant sighash types. +func TestRawTxInTaprootSignature(t *testing.T) { + t.Parallel() + + privKey, err := btcec.NewPrivateKey() + require.NoError(t, err) + + pubKey := ComputeTaprootKeyNoScript(privKey.PubKey()) + + pkScript, err := PayToTaprootScript(pubKey) + require.NoError(t, err) + + // We'll reuse this simple transaction for the tests below. It ends up + // spending from a bip86 P2TR output. + testTx := wire.NewMsgTx(2) + testTx.AddTxIn(&wire.TxIn{ + PreviousOutPoint: wire.OutPoint{ + Index: 1, + }, + }) + txOut := &wire.TxOut{ + Value: 1e8, PkScript: pkScript, + } + testTx.AddTxOut(txOut) + + tests := []struct { + sigHashType SigHashType + }{ + { + sigHashType: SigHashDefault, + }, + { + sigHashType: SigHashAll, + }, + { + sigHashType: SigHashNone, + }, + { + sigHashType: SigHashSingle, + }, + { + sigHashType: SigHashSingle | SigHashAnyOneCanPay, + }, + { + sigHashType: SigHashNone | SigHashAnyOneCanPay, + }, + { + sigHashType: SigHashAll | SigHashAnyOneCanPay, + }, + } + for _, test := range tests { + name := fmt.Sprintf("sighash=%v", test.sigHashType) + t.Run(name, func(t *testing.T) { + prevFetcher := NewCannedPrevOutputFetcher( + txOut.PkScript, txOut.Value, + ) + sigHashes := NewTxSigHashes(testTx, prevFetcher) + + sig, err := RawTxInTaprootSignature( + testTx, sigHashes, 0, txOut.Value, txOut.PkScript, + nil, test.sigHashType, privKey, + ) + require.NoError(t, err) + + // If this isn't sighash default, then a sighash should be + // applied. Otherwise, it should be a normal sig. + expectedLen := schnorr.SignatureSize + if test.sigHashType != SigHashDefault { + expectedLen += 1 + } + require.Len(t, sig, expectedLen) + + // Finally, ensure that the signature produced is valid. + txCopy := testTx.Copy() + txCopy.TxIn[0].Witness = wire.TxWitness{sig} + vm, err := NewEngine( + txOut.PkScript, txCopy, 0, StandardVerifyFlags, + nil, sigHashes, txOut.Value, prevFetcher, + ) + require.NoError(t, err) + + require.NoError(t, vm.Execute()) + }) + } +} + +// TestRawTxInTapscriptSignature thats that we're able to produce valid schnorr +// signatures for a simple tapscript spend, for various sighash types. +func TestRawTxInTapscriptSignature(t *testing.T) { + t.Parallel() + + privKey, err := btcec.NewPrivateKey() + require.NoError(t, err) + + internalKey := privKey.PubKey() + + // Our script will be a simple OP_CHECKSIG as the sole leaf of a + // tapscript tree. We'll also re-use the internal key as the key in the + // leaf. + builder := NewScriptBuilder() + builder.AddData(schnorr.SerializePubKey(internalKey)) + builder.AddOp(OP_CHECKSIG) + pkScript, err := builder.Script() + require.NoError(t, err) + + tapLeaf := NewBaseTapLeaf(pkScript) + tapScriptTree := AssembleTaprootScriptTree(tapLeaf) + + ctrlBlock := tapScriptTree.LeafMerkleProofs[0].ToControlBlock( + internalKey, + ) + + tapScriptRootHash := tapScriptTree.RootNode.TapHash() + outputKey := ComputeTaprootOutputKey( + internalKey, tapScriptRootHash[:], + ) + p2trScript, err := PayToTaprootScript(outputKey) + require.NoError(t, err) + + // We'll reuse this simple transaction for the tests below. It ends up + // spending from a bip86 P2TR output. + testTx := wire.NewMsgTx(2) + testTx.AddTxIn(&wire.TxIn{ + PreviousOutPoint: wire.OutPoint{ + Index: 1, + }, + }) + txOut := &wire.TxOut{ + Value: 1e8, PkScript: p2trScript, + } + testTx.AddTxOut(txOut) + + tests := []struct { + sigHashType SigHashType + }{ + { + sigHashType: SigHashDefault, + }, + { + sigHashType: SigHashAll, + }, + { + sigHashType: SigHashNone, + }, + { + sigHashType: SigHashSingle, + }, + { + sigHashType: SigHashSingle | SigHashAnyOneCanPay, + }, + { + sigHashType: SigHashNone | SigHashAnyOneCanPay, + }, + { + sigHashType: SigHashAll | SigHashAnyOneCanPay, + }, + } + for _, test := range tests { + name := fmt.Sprintf("sighash=%v", test.sigHashType) + t.Run(name, func(t *testing.T) { + prevFetcher := NewCannedPrevOutputFetcher( + txOut.PkScript, txOut.Value, + ) + sigHashes := NewTxSigHashes(testTx, prevFetcher) + + sig, err := RawTxInTapscriptSignature( + testTx, sigHashes, 0, txOut.Value, + txOut.PkScript, tapLeaf, test.sigHashType, + privKey, + ) + require.NoError(t, err) + + // If this isn't sighash default, then a sighash should + // be applied. Otherwise, it should be a normal sig. + expectedLen := schnorr.SignatureSize + if test.sigHashType != SigHashDefault { + expectedLen += 1 + } + require.Len(t, sig, expectedLen) + + // Now that we have the sig, we'll make a valid witness + // including the control block. + ctrlBlockBytes, err := ctrlBlock.ToBytes() + require.NoError(t, err) + txCopy := testTx.Copy() + txCopy.TxIn[0].Witness = wire.TxWitness{ + sig, pkScript, ctrlBlockBytes, + } + + // Finally, ensure that the signature produced is valid. + vm, err := NewEngine( + txOut.PkScript, txCopy, 0, StandardVerifyFlags, + nil, sigHashes, txOut.Value, prevFetcher, + ) + require.NoError(t, err) + + require.NoError(t, vm.Execute()) + }) + } +} diff --git a/txscript/sigvalidate.go b/txscript/sigvalidate.go new file mode 100644 index 0000000000..3cfe792638 --- /dev/null +++ b/txscript/sigvalidate.go @@ -0,0 +1,495 @@ +// Copyright (c) 2013-2022 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package txscript + +import ( + "fmt" + + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcec/v2/ecdsa" + "github.com/btcsuite/btcd/btcec/v2/schnorr" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/wire" +) + +// signatureVerifier is an abstract interface that allows the op code execution +// to abstract over the _type_ of signature validation being executed. At this +// point in Bitcoin's history, there're four possible sig validation contexts: +// pre-segwit, segwit v0, segwit v1 (taproot key spend validation), and the +// base tapscript verification. +type signatureVerifier interface { + // Verify returns whether or not the signature verifier context deems the + // signature to be valid for the given context. + Verify() verifyResult +} + +type verifyResult struct { + sigValid bool + sigMatch bool +} + +// baseSigVerifier is used to verify signatures for the _base_ system, meaning +// ECDSA signatures encoded in DER or BER encoding. +type baseSigVerifier struct { + vm *Engine + + pubKey *btcec.PublicKey + + sig *ecdsa.Signature + + fullSigBytes []byte + + sigBytes []byte + pkBytes []byte + + subScript []byte + + hashType SigHashType +} + +// parseBaseSigAndPubkey attempts to parse a signature and public key according +// to the base consensus rules, which expect an 33-byte public key and DER or +// BER encoded signature. +func parseBaseSigAndPubkey(pkBytes, fullSigBytes []byte, + vm *Engine) (*btcec.PublicKey, *ecdsa.Signature, SigHashType, error) { + + strictEncoding := vm.hasFlag(ScriptVerifyStrictEncoding) || + vm.hasFlag(ScriptVerifyDERSignatures) + + // Trim off hashtype from the signature string and check if the + // signature and pubkey conform to the strict encoding requirements + // depending on the flags. + // + // NOTE: When the strict encoding flags are set, any errors in the + // signature or public encoding here result in an immediate script error + // (and thus no result bool is pushed to the data stack). This differs + // from the logic below where any errors in parsing the signature is + // treated as the signature failure resulting in false being pushed to + // the data stack. This is required because the more general script + // validation consensus rules do not have the new strict encoding + // requirements enabled by the flags. + hashType := SigHashType(fullSigBytes[len(fullSigBytes)-1]) + sigBytes := fullSigBytes[:len(fullSigBytes)-1] + if err := vm.checkHashTypeEncoding(hashType); err != nil { + return nil, nil, 0, err + } + if err := vm.checkSignatureEncoding(sigBytes); err != nil { + return nil, nil, 0, err + } + if err := vm.checkPubKeyEncoding(pkBytes); err != nil { + return nil, nil, 0, err + } + + // First, parse the public key, which we expect to be in the proper + // encoding. + pubKey, err := btcec.ParsePubKey(pkBytes) + if err != nil { + return nil, nil, 0, err + } + + // Next, parse the signature which should be in DER or BER depending on + // the active script flags. + var signature *ecdsa.Signature + if strictEncoding { + signature, err = ecdsa.ParseDERSignature(sigBytes) + } else { + signature, err = ecdsa.ParseSignature(sigBytes) + } + if err != nil { + return nil, nil, 0, err + } + + return pubKey, signature, hashType, nil +} + +// newBaseSigVerifier returns a new instance of the base signature verifier. An +// error is returned if the signature, sighash, or public key aren't correctly +// encoded. +func newBaseSigVerifier(pkBytes, fullSigBytes []byte, + vm *Engine) (*baseSigVerifier, error) { + + pubKey, sig, hashType, err := parseBaseSigAndPubkey( + pkBytes, fullSigBytes, vm, + ) + if err != nil { + return nil, err + } + + // Get script starting from the most recent OP_CODESEPARATOR. + subScript := vm.subScript() + + return &baseSigVerifier{ + vm: vm, + pubKey: pubKey, + pkBytes: pkBytes, + sig: sig, + sigBytes: fullSigBytes[:len(fullSigBytes)-1], + subScript: subScript, + hashType: hashType, + fullSigBytes: fullSigBytes, + }, nil +} + +// verifySig attempts to verify the signature given the computed sighash. A nil +// error is returned if the signature is valid. +func (b *baseSigVerifier) verifySig(sigHash []byte) bool { + var valid bool + if b.vm.sigCache != nil { + var sigHashBytes chainhash.Hash + copy(sigHashBytes[:], sigHash[:]) + + valid = b.vm.sigCache.Exists(sigHashBytes, b.sigBytes, b.pkBytes) + if !valid && b.sig.Verify(sigHash, b.pubKey) { + b.vm.sigCache.Add(sigHashBytes, b.sigBytes, b.pkBytes) + valid = true + } + } else { + valid = b.sig.Verify(sigHash, b.pubKey) + } + + return valid +} + +// Verify returns whether or not the signature verifier context deems the +// signature to be valid for the given context. +// +// NOTE: This is part of the baseSigVerifier interface. +func (b *baseSigVerifier) Verify() verifyResult { + // Remove the signature since there is no way for a signature + // to sign itself. + subScript, match := removeOpcodeByData(b.subScript, b.fullSigBytes) + + sigHash := calcSignatureHash( + subScript, b.hashType, &b.vm.tx, b.vm.txIdx, + ) + + return verifyResult{ + sigValid: b.verifySig(sigHash), + sigMatch: match, + } +} + +// A compile-time assertion to ensure baseSigVerifier implements the +// signatureVerifier interface. +var _ signatureVerifier = (*baseSigVerifier)(nil) + +// baseSegwitSigVerifier implements signature verification for segwit v0. The +// only difference between this and the baseSigVerifier is how the sighash is +// computed. +type baseSegwitSigVerifier struct { + *baseSigVerifier +} + +// newBaseSegwitSigVerifier returns a new instance of the base segwit verifier. +func newBaseSegwitSigVerifier(pkBytes, fullSigBytes []byte, + vm *Engine) (*baseSegwitSigVerifier, error) { + + sigVerifier, err := newBaseSigVerifier(pkBytes, fullSigBytes, vm) + if err != nil { + return nil, err + } + + return &baseSegwitSigVerifier{ + baseSigVerifier: sigVerifier, + }, nil +} + +// Verify returns true if the signature verifier context deems the signature to +// be valid for the given context. +// +// NOTE: This is part of the baseSigVerifier interface. +func (s *baseSegwitSigVerifier) Verify() verifyResult { + var sigHashes *TxSigHashes + if s.vm.hashCache != nil { + sigHashes = s.vm.hashCache + } else { + sigHashes = NewTxSigHashes(&s.vm.tx, s.vm.prevOutFetcher) + } + + sigHash, err := calcWitnessSignatureHashRaw( + s.subScript, sigHashes, s.hashType, &s.vm.tx, s.vm.txIdx, + s.vm.inputAmount, + ) + if err != nil { + // TODO(roasbeef): this doesn't need to return an error, should + // instead be further up the stack? this only returns an error + // if the input index is greater than the number of inputs + return verifyResult{} + } + + return verifyResult{ + sigValid: s.verifySig(sigHash), + } +} + +// A compile-time assertion to ensure baseSegwitSigVerifier implements the +// signatureVerifier interface. +var _ signatureVerifier = (*baseSegwitSigVerifier)(nil) + +// taprootSigVerifier verifies signatures according to the segwit v1 rules, +// which are described in BIP 341. +type taprootSigVerifier struct { + pubKey *btcec.PublicKey + pkBytes []byte + + fullSigBytes []byte + sig *schnorr.Signature + + hashType SigHashType + + sigCache *SigCache + hashCache *TxSigHashes + + tx *wire.MsgTx + + inputIndex int + + annex []byte + + prevOuts PrevOutputFetcher +} + +// parseTaprootSigAndPubKey attempts to parse the public key and signature for +// a taproot spend that may be a keyspend or script path spend. This function +// returns an error if the pubkey is invalid, or the sig is. +func parseTaprootSigAndPubKey(pkBytes, rawSig []byte, +) (*btcec.PublicKey, *schnorr.Signature, SigHashType, error) { + + // Now that we have the raw key, we'll parse it into a schnorr public + // key we can work with. + pubKey, err := schnorr.ParsePubKey(pkBytes) + if err != nil { + return nil, nil, 0, err + } + + // Next, we'll parse the signature, which may or may not be appended + // with the desired sighash flag. + var ( + sig *schnorr.Signature + sigHashType SigHashType + ) + switch { + // If the signature is exactly 64 bytes, then we know we're using the + // implicit SIGHASH_DEFAULT sighash type. + case len(rawSig) == schnorr.SignatureSize: + // First, parse out the signature which is just the raw sig itself. + sig, err = schnorr.ParseSignature(rawSig) + if err != nil { + return nil, nil, 0, err + } + + // If the sig is 64 bytes, then we'll assume that it's the + // default sighash type, which is actually an alias for + // SIGHASH_ALL. + sigHashType = SigHashDefault + + // Otherwise, if this is a signature, with a sighash looking byte + // appended that isn't all zero, then we'll extract the sighash from + // the end of the signature. + case len(rawSig) == schnorr.SignatureSize+1 && rawSig[64] != 0: + // Extract the sighash type, then snip off the last byte so we can + // parse the signature. + sigHashType = SigHashType(rawSig[schnorr.SignatureSize]) + + rawSig = rawSig[:schnorr.SignatureSize] + sig, err = schnorr.ParseSignature(rawSig) + if err != nil { + return nil, nil, 0, err + } + + // Otherwise, this is an invalid signature, so we need to bail out. + default: + str := fmt.Sprintf("invalid sig len: %v", len(rawSig)) + return nil, nil, 0, scriptError(ErrInvalidTaprootSigLen, str) + } + + return pubKey, sig, sigHashType, nil +} + +// newTaprootSigVerifier returns a new instance of a taproot sig verifier given +// the necessary contextual information. +func newTaprootSigVerifier(pkBytes []byte, fullSigBytes []byte, + tx *wire.MsgTx, inputIndex int, prevOuts PrevOutputFetcher, + sigCache *SigCache, hashCache *TxSigHashes, + annex []byte) (*taprootSigVerifier, error) { + + pubKey, sig, sigHashType, err := parseTaprootSigAndPubKey( + pkBytes, fullSigBytes, + ) + if err != nil { + return nil, err + } + + return &taprootSigVerifier{ + pubKey: pubKey, + pkBytes: pkBytes, + sig: sig, + fullSigBytes: fullSigBytes, + hashType: sigHashType, + tx: tx, + inputIndex: inputIndex, + prevOuts: prevOuts, + sigCache: sigCache, + hashCache: hashCache, + annex: annex, + }, nil +} + +// verifySig attempts to verify a BIP 340 signature using the internal public +// key and signature, and the passed sigHash as the message digest. +func (t *taprootSigVerifier) verifySig(sigHash []byte) bool { + // At this point, we can check to see if this signature is already + // included in the sigCache and is valid or not (if one was passed in). + cacheKey, _ := chainhash.NewHash(sigHash) + if t.sigCache != nil { + if t.sigCache.Exists(*cacheKey, t.fullSigBytes, t.pkBytes) { + return true + } + } + + // If we didn't find the entry in the cache, then we'll perform full + // verification as normal, adding the entry to the cache if it's found + // to be valid. + sigValid := t.sig.Verify(sigHash, t.pubKey) + if sigValid { + if t.sigCache != nil { + // The sig is valid, so we'll add it to the cache. + t.sigCache.Add(*cacheKey, t.fullSigBytes, t.pkBytes) + } + + return true + } + + // Otherwise the sig is invalid if we get to this point. + return false +} + +// Verify returns whether or not the signature verifier context deems the +// signature to be valid for the given context. +// +// NOTE: This is part of the baseSigVerifier interface. +func (t *taprootSigVerifier) Verify() verifyResult { + var opts []TaprootSigHashOption + if t.annex != nil { + opts = append(opts, WithAnnex(t.annex)) + } + + // Before we attempt to verify the signature, we'll need to first + // compute the sighash based on the input and tx information. + sigHash, err := calcTaprootSignatureHashRaw( + t.hashCache, t.hashType, t.tx, t.inputIndex, t.prevOuts, + opts..., + ) + if err != nil { + // TODO(roasbeef): propagate the error here? + return verifyResult{} + } + + return verifyResult{ + sigValid: t.verifySig(sigHash), + } +} + +// A compile-time assertion to ensure taprootSigVerifier implements the +// signatureVerifier interface. +var _ signatureVerifier = (*taprootSigVerifier)(nil) + +// baseTapscriptSigVerifier verifies a signature for an input spending a +// tapscript leaf from the previous output. +type baseTapscriptSigVerifier struct { + *taprootSigVerifier + + vm *Engine +} + +// newBaseTapscriptSigVerifier returns a new sig verifier for tapscript input +// spends. If the public key or signature aren't correctly formatted, an error +// is returned. +func newBaseTapscriptSigVerifier(pkBytes, rawSig []byte, + vm *Engine) (*baseTapscriptSigVerifier, error) { + + switch len(pkBytes) { + // If the public key is zero bytes, then this is invalid, and will fail + // immediately. + case 0: + return nil, scriptError(ErrTaprootPubkeyIsEmpty, "") + + // If the public key is 32 byte as we expect, then we'll parse things + // as normal. + case 32: + baseTaprootVerifier, err := newTaprootSigVerifier( + pkBytes, rawSig, &vm.tx, vm.txIdx, vm.prevOutFetcher, + vm.sigCache, vm.hashCache, vm.taprootCtx.annex, + ) + if err != nil { + return nil, err + } + + return &baseTapscriptSigVerifier{ + taprootSigVerifier: baseTaprootVerifier, + vm: vm, + }, nil + + // Otherwise, we consider this to be an unknown public key, which means + // that we'll just assume the sig to be valid. + default: + // However, if the flag preventing usage of unknown key types + // is active, then we'll return that error. + if vm.hasFlag(ScriptVerifyDiscourageUpgradeablePubkeyType) { + str := fmt.Sprintf("pubkey of length %v was used", + len(pkBytes)) + return nil, scriptError( + ErrDiscourageUpgradeablePubKeyType, str, + ) + } + + return &baseTapscriptSigVerifier{ + taprootSigVerifier: &taprootSigVerifier{}, + }, nil + } +} + +// Verify returns whether or not the signature verifier context deems the +// signature to be valid for the given context. +// +// NOTE: This is part of the baseSigVerifier interface. +func (b *baseTapscriptSigVerifier) Verify() verifyResult { + // If the public key is blank, then that means it wasn't 0 or 32 bytes, + // so we'll treat this as an unknown public key version and return + // that it's valid. + if b.pubKey == nil { + return verifyResult{ + sigValid: true, + } + } + + var opts []TaprootSigHashOption + opts = append(opts, WithBaseTapscriptVersion( + b.vm.taprootCtx.codeSepPos, b.vm.taprootCtx.tapLeafHash[:], + )) + + if b.vm.taprootCtx.annex != nil { + opts = append(opts, WithAnnex(b.vm.taprootCtx.annex)) + } + + // Otherwise, we'll compute the sighash using the tapscript message + // extensions and return the outcome. + sigHash, err := calcTaprootSignatureHashRaw( + b.hashCache, b.hashType, b.tx, b.inputIndex, b.prevOuts, + opts..., + ) + if err != nil { + // TODO(roasbeef): propagate the error here? + return verifyResult{} + } + + return verifyResult{ + sigValid: b.verifySig(sigHash), + } +} + +// A compile-time assertion to ensure baseTapscriptSigVerifier implements the +// signatureVerifier interface. +var _ signatureVerifier = (*baseTapscriptSigVerifier)(nil) diff --git a/txscript/stack.go b/txscript/stack.go index eb1d8cfdfe..900a030b2d 100644 --- a/txscript/stack.go +++ b/txscript/stack.go @@ -86,7 +86,7 @@ func (s *stack) PopInt() (scriptNum, error) { return 0, err } - return makeScriptNum(so, s.verifyMinimalData, defaultScriptNumLen) + return MakeScriptNum(so, s.verifyMinimalData, maxScriptNumLen) } // PopBool pops the value off the top of the stack, converts it into a bool, and @@ -123,7 +123,7 @@ func (s *stack) PeekInt(idx int32) (scriptNum, error) { return 0, err } - return makeScriptNum(so, s.verifyMinimalData, defaultScriptNumLen) + return MakeScriptNum(so, s.verifyMinimalData, maxScriptNumLen) } // PeekBool returns the Nth item on the stack as a bool without removing it. diff --git a/txscript/standard.go b/txscript/standard.go index a7e929d101..809a900a2a 100644 --- a/txscript/standard.go +++ b/txscript/standard.go @@ -1,4 +1,4 @@ -// Copyright (c) 2013-2017 The btcsuite developers +// Copyright (c) 2013-2020 The btcsuite developers // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. @@ -7,9 +7,9 @@ package txscript import ( "fmt" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) const ( @@ -42,7 +42,12 @@ const ( ScriptVerifyWitness | ScriptVerifyDiscourageUpgradeableWitnessProgram | ScriptVerifyMinimalIf | - ScriptVerifyWitnessPubKeyType + ScriptVerifyWitnessPubKeyType | + ScriptVerifyTaproot | + ScriptVerifyDiscourageUpgradeableTaprootVersion | + ScriptVerifyDiscourageOpSuccess | + ScriptVerifyDiscourageUpgradeablePubkeyType | + ScriptVerifyConstScriptCode ) // ScriptClass is an enumeration for the list of standard types of script. @@ -58,6 +63,8 @@ const ( WitnessV0ScriptHashTy // Pay to witness script hash. MultiSigTy // Multi signature. NullDataTy // Empty data-only (provably prunable). + WitnessV1TaprootTy // Taproot output + WitnessUnknownTy // Witness unknown ) // scriptClassToName houses the human-readable strings which describe each @@ -71,6 +78,8 @@ var scriptClassToName = []string{ WitnessV0ScriptHashTy: "witness_v0_scripthash", MultiSigTy: "multisig", NullDataTy: "nulldata", + WitnessV1TaprootTy: "witness_v1_taproot", + WitnessUnknownTy: "witness_unknown", } // String implements the Stringer interface by returning the name of @@ -83,97 +92,468 @@ func (t ScriptClass) String() string { return scriptClassToName[t] } -// isPubkey returns true if the script passed is a pay-to-pubkey transaction, -// false otherwise. -func isPubkey(pops []parsedOpcode) bool { - // Valid pubkeys are either 33 or 65 bytes. - return len(pops) == 2 && - (len(pops[0].data) == 33 || len(pops[0].data) == 65) && - pops[1].opcode.value == OP_CHECKSIG +// extractCompressedPubKey extracts a compressed public key from the passed +// script if it is a standard pay-to-compressed-secp256k1-pubkey script. It +// will return nil otherwise. +func extractCompressedPubKey(script []byte) []byte { + // A pay-to-compressed-pubkey script is of the form: + // OP_DATA_33 <33-byte compressed pubkey> OP_CHECKSIG + + // All compressed secp256k1 public keys must start with 0x02 or 0x03. + if len(script) == 35 && + script[34] == OP_CHECKSIG && + script[0] == OP_DATA_33 && + (script[1] == 0x02 || script[1] == 0x03) { + + return script[1:34] + } + + return nil } -// isPubkeyHash returns true if the script passed is a pay-to-pubkey-hash -// transaction, false otherwise. -func isPubkeyHash(pops []parsedOpcode) bool { - return len(pops) == 5 && - pops[0].opcode.value == OP_DUP && - pops[1].opcode.value == OP_HASH160 && - pops[2].opcode.value == OP_DATA_20 && - pops[3].opcode.value == OP_EQUALVERIFY && - pops[4].opcode.value == OP_CHECKSIG +// extractUncompressedPubKey extracts an uncompressed public key from the +// passed script if it is a standard pay-to-uncompressed-secp256k1-pubkey +// script. It will return nil otherwise. +func extractUncompressedPubKey(script []byte) []byte { + // A pay-to-uncompressed-pubkey script is of the form: + // OP_DATA_65 <65-byte uncompressed pubkey> OP_CHECKSIG + // + // All non-hybrid uncompressed secp256k1 public keys must start with 0x04. + // Hybrid uncompressed secp256k1 public keys start with 0x06 or 0x07: + // - 0x06 => hybrid format for even Y coords + // - 0x07 => hybrid format for odd Y coords + if len(script) == 67 && + script[66] == OP_CHECKSIG && + script[0] == OP_DATA_65 && + (script[1] == 0x04 || script[1] == 0x06 || script[1] == 0x07) { + + return script[1:66] + } + return nil +} +// extractPubKey extracts either compressed or uncompressed public key from the +// passed script if it is a either a standard pay-to-compressed-secp256k1-pubkey +// or pay-to-uncompressed-secp256k1-pubkey script, respectively. It will return +// nil otherwise. +func extractPubKey(script []byte) []byte { + if pubKey := extractCompressedPubKey(script); pubKey != nil { + return pubKey + } + return extractUncompressedPubKey(script) } -// isMultiSig returns true if the passed script is a multisig transaction, false -// otherwise. -func isMultiSig(pops []parsedOpcode) bool { - // The absolute minimum is 1 pubkey: - // OP_0/OP_1-16 OP_1 OP_CHECKMULTISIG - l := len(pops) - if l < 4 { - return false +// isPubKeyScript returns whether or not the passed script is either a standard +// pay-to-compressed-secp256k1-pubkey or pay-to-uncompressed-secp256k1-pubkey +// script. +func isPubKeyScript(script []byte) bool { + return extractPubKey(script) != nil +} + +// extractPubKeyHash extracts the public key hash from the passed script if it +// is a standard pay-to-pubkey-hash script. It will return nil otherwise. +func extractPubKeyHash(script []byte) []byte { + // A pay-to-pubkey-hash script is of the form: + // OP_DUP OP_HASH160 OP_DATA_20 <20-byte hash> OP_EQUALVERIFY OP_CHECKSIG + if len(script) == 25 && + script[0] == OP_DUP && + script[1] == OP_HASH160 && + script[2] == OP_DATA_20 && + script[23] == OP_EQUALVERIFY && + script[24] == OP_CHECKSIG { + + return script[3:23] } - if !isSmallInt(pops[0].opcode) { - return false + + return nil +} + +// isPubKeyHashScript returns whether or not the passed script is a standard +// pay-to-pubkey-hash script. +func isPubKeyHashScript(script []byte) bool { + return extractPubKeyHash(script) != nil +} + +// extractScriptHash extracts the script hash from the passed script if it is a +// standard pay-to-script-hash script. It will return nil otherwise. +// +// NOTE: This function is only valid for version 0 opcodes. Since the function +// does not accept a script version, the results are undefined for other script +// versions. +func extractScriptHash(script []byte) []byte { + // A pay-to-script-hash script is of the form: + // OP_HASH160 OP_DATA_20 <20-byte scripthash> OP_EQUAL + if len(script) == 23 && + script[0] == OP_HASH160 && + script[1] == OP_DATA_20 && + script[22] == OP_EQUAL { + + return script[2:22] } - if !isSmallInt(pops[l-2].opcode) { + + return nil +} + +// isScriptHashScript returns whether or not the passed script is a standard +// pay-to-script-hash script. +func isScriptHashScript(script []byte) bool { + return extractScriptHash(script) != nil +} + +// multiSigDetails houses details extracted from a standard multisig script. +type multiSigDetails struct { + requiredSigs int + numPubKeys int + pubKeys [][]byte + valid bool +} + +// extractMultisigScriptDetails attempts to extract details from the passed +// script if it is a standard multisig script. The returned details struct will +// have the valid flag set to false otherwise. +// +// The extract pubkeys flag indicates whether or not the pubkeys themselves +// should also be extracted and is provided because extracting them results in +// an allocation that the caller might wish to avoid. The pubKeys member of +// the returned details struct will be nil when the flag is false. +// +// NOTE: This function is only valid for version 0 scripts. The returned +// details struct will always be empty and have the valid flag set to false for +// other script versions. +func extractMultisigScriptDetails(scriptVersion uint16, script []byte, extractPubKeys bool) multiSigDetails { + // The only currently supported script version is 0. + if scriptVersion != 0 { + return multiSigDetails{} + } + + // A multi-signature script is of the form: + // NUM_SIGS PUBKEY PUBKEY PUBKEY ... NUM_PUBKEYS OP_CHECKMULTISIG + + // The script can't possibly be a multisig script if it doesn't end with + // OP_CHECKMULTISIG or have at least two small integer pushes preceding it. + // Fail fast to avoid more work below. + if len(script) < 3 || script[len(script)-1] != OP_CHECKMULTISIG { + return multiSigDetails{} + } + + // The first opcode must be a small integer specifying the number of + // signatures required. + tokenizer := MakeScriptTokenizer(scriptVersion, script) + if !tokenizer.Next() || !IsSmallInt(tokenizer.Opcode()) { + return multiSigDetails{} + } + requiredSigs := AsSmallInt(tokenizer.Opcode()) + + // The next series of opcodes must either push public keys or be a small + // integer specifying the number of public keys. + var numPubKeys int + var pubKeys [][]byte + if extractPubKeys { + pubKeys = make([][]byte, 0, MaxPubKeysPerMultiSig) + } + for tokenizer.Next() { + if IsSmallInt(tokenizer.Opcode()) { + break + } + + data := tokenizer.Data() + numPubKeys++ + if !isStrictPubKeyEncoding(data) { + continue + } + if extractPubKeys { + pubKeys = append(pubKeys, data) + } + } + if tokenizer.Done() { + return multiSigDetails{} + } + + // The next opcode must be a small integer specifying the number of public + // keys required. + op := tokenizer.Opcode() + if !IsSmallInt(op) || AsSmallInt(op) != numPubKeys { + return multiSigDetails{} + } + + // There must only be a single opcode left unparsed which will be + // OP_CHECKMULTISIG per the check above. + if int32(len(tokenizer.Script()))-tokenizer.ByteIndex() != 1 { + return multiSigDetails{} + } + + return multiSigDetails{ + requiredSigs: requiredSigs, + numPubKeys: numPubKeys, + pubKeys: pubKeys, + valid: true, + } +} + +// isMultisigScript returns whether or not the passed script is a standard +// multisig script. +// +// NOTE: This function is only valid for version 0 scripts. It will always +// return false for other script versions. +func isMultisigScript(scriptVersion uint16, script []byte) bool { + // Since this is only checking the form of the script, don't extract the + // public keys to avoid the allocation. + details := extractMultisigScriptDetails(scriptVersion, script, false) + return details.valid +} + +// IsMultisigScript returns whether or not the passed script is a standard +// multisignature script. +// +// NOTE: This function is only valid for version 0 scripts. Since the function +// does not accept a script version, the results are undefined for other script +// versions. +// +// The error is DEPRECATED and will be removed in the major version bump. +func IsMultisigScript(script []byte) (bool, error) { + const scriptVersion = 0 + return isMultisigScript(scriptVersion, script), nil +} + +// IsMultisigSigScript returns whether or not the passed script appears to be a +// signature script which consists of a pay-to-script-hash multi-signature +// redeem script. Determining if a signature script is actually a redemption of +// pay-to-script-hash requires the associated public key script which is often +// expensive to obtain. Therefore, this makes a fast best effort guess that has +// a high probability of being correct by checking if the signature script ends +// with a data push and treating that data push as if it were a p2sh redeem +// script +// +// NOTE: This function is only valid for version 0 scripts. Since the function +// does not accept a script version, the results are undefined for other script +// versions. +func IsMultisigSigScript(script []byte) bool { + const scriptVersion = 0 + + // The script can't possibly be a multisig signature script if it doesn't + // end with OP_CHECKMULTISIG in the redeem script or have at least two small + // integers preceding it, and the redeem script itself must be preceded by + // at least a data push opcode. Fail fast to avoid more work below. + if len(script) < 4 || script[len(script)-1] != OP_CHECKMULTISIG { return false } - if pops[l-1].opcode.value != OP_CHECKMULTISIG { + + // Parse through the script to find the last opcode and any data it might + // push and treat it as a p2sh redeem script even though it might not + // actually be one. + possibleRedeemScript := finalOpcodeData(scriptVersion, script) + if possibleRedeemScript == nil { return false } - // Verify the number of pubkeys specified matches the actual number - // of pubkeys provided. - if l-2-1 != asSmallInt(pops[l-2].opcode) { + // Finally, return if that possible redeem script is a multisig script. + return isMultisigScript(scriptVersion, possibleRedeemScript) +} + +// extractWitnessPubKeyHash extracts the witness public key hash from the passed +// script if it is a standard pay-to-witness-pubkey-hash script. It will return +// nil otherwise. +func extractWitnessPubKeyHash(script []byte) []byte { + // A pay-to-witness-pubkey-hash script is of the form: + // OP_0 OP_DATA_20 <20-byte-hash> + if len(script) == witnessV0PubKeyHashLen && + script[0] == OP_0 && + script[1] == OP_DATA_20 { + + return script[2:witnessV0PubKeyHashLen] + } + + return nil +} + +// isWitnessPubKeyHashScript returns whether or not the passed script is a +// standard pay-to-witness-pubkey-hash script. +func isWitnessPubKeyHashScript(script []byte) bool { + return extractWitnessPubKeyHash(script) != nil +} + +// extractWitnessV0ScriptHash extracts the witness script hash from the passed +// script if it is standard pay-to-witness-script-hash script. It will return +// nil otherwise. +func extractWitnessV0ScriptHash(script []byte) []byte { + // A pay-to-witness-script-hash script is of the form: + // OP_0 OP_DATA_32 <32-byte-hash> + if len(script) == witnessV0ScriptHashLen && + script[0] == OP_0 && + script[1] == OP_DATA_32 { + + return script[2:34] + } + + return nil +} + +// extractWitnessV1KeyBytes extracts the raw public key bytes script if it is +// standard pay-to-witness-script-hash v1 script. It will return nil otherwise. +func extractWitnessV1KeyBytes(script []byte) []byte { + // A pay-to-witness-script-hash script is of the form: + // OP_1 OP_DATA_32 <32-byte-hash> + if len(script) == witnessV1TaprootLen && + script[0] == OP_1 && + script[1] == OP_DATA_32 { + + return script[2:34] + } + + return nil +} + +// isWitnessScriptHashScript returns whether or not the passed script is a +// standard pay-to-witness-script-hash script. +func isWitnessScriptHashScript(script []byte) bool { + return extractWitnessV0ScriptHash(script) != nil +} + +// extractWitnessProgramInfo returns the version and program if the passed +// script constitutes a valid witness program. The last return value indicates +// whether or not the script is a valid witness program. +func extractWitnessProgramInfo(script []byte) (int, []byte, bool) { + // Skip parsing if we know the program is invalid based on size. + if len(script) < 4 || len(script) > 42 { + return 0, nil, false + } + + const scriptVersion = 0 + tokenizer := MakeScriptTokenizer(scriptVersion, script) + + // The first opcode must be a small int. + if !tokenizer.Next() || + !IsSmallInt(tokenizer.Opcode()) { + + return 0, nil, false + } + version := AsSmallInt(tokenizer.Opcode()) + + // The second opcode must be a canonical data push, the length of the + // data push is bounded to 40 by the initial check on overall script + // length. + if !tokenizer.Next() || + !isCanonicalPush(tokenizer.Opcode(), tokenizer.Data()) { + + return 0, nil, false + } + program := tokenizer.Data() + + // The witness program is valid if there are no more opcodes, and we + // terminated without a parsing error. + valid := tokenizer.Done() && tokenizer.Err() == nil + + return version, program, valid +} + +// isWitnessProgramScript returns true if the passed script is a witness +// program, and false otherwise. A witness program MUST adhere to the following +// constraints: there must be exactly two pops (program version and the program +// itself), the first opcode MUST be a small integer (0-16), the push data MUST +// be canonical, and finally the size of the push data must be between 2 and 40 +// bytes. +// +// The length of the script must be between 4 and 42 bytes. The +// smallest program is the witness version, followed by a data push of +// 2 bytes. The largest allowed witness program has a data push of +// 40-bytes. +func isWitnessProgramScript(script []byte) bool { + _, _, valid := extractWitnessProgramInfo(script) + return valid +} + +// isWitnessTaprootScript returns true if the passed script is for a +// pay-to-witness-taproot output, false otherwise. +func isWitnessTaprootScript(script []byte) bool { + return extractWitnessV1KeyBytes(script) != nil +} + +// isAnnexedWitness returns true if the passed witness has a final push +// that is a witness annex. +func isAnnexedWitness(witness wire.TxWitness) bool { + if len(witness) < 2 { return false } - for _, pop := range pops[1 : l-2] { - // Valid pubkeys are either 33 or 65 bytes. - if len(pop.data) != 33 && len(pop.data) != 65 { - return false - } + lastElement := witness[len(witness)-1] + return len(lastElement) > 0 && lastElement[0] == TaprootAnnexTag +} + +// extractAnnex attempts to extract the annex from the passed witness. If the +// witness doesn't contain an annex, then an error is returned. +func extractAnnex(witness [][]byte) ([]byte, error) { + if !isAnnexedWitness(witness) { + return nil, scriptError(ErrWitnessHasNoAnnex, "") } - return true + + lastElement := witness[len(witness)-1] + return lastElement, nil } -// isNullData returns true if the passed script is a null data transaction, -// false otherwise. -func isNullData(pops []parsedOpcode) bool { - // A nulldata transaction is either a single OP_RETURN or an - // OP_RETURN SMALLDATA (where SMALLDATA is a data push up to - // MaxDataCarrierSize bytes). - l := len(pops) - if l == 1 && pops[0].opcode.value == OP_RETURN { +// isNullDataScript returns whether or not the passed script is a standard +// null data script. +// +// NOTE: This function is only valid for version 0 scripts. It will always +// return false for other script versions. +func isNullDataScript(scriptVersion uint16, script []byte) bool { + // The only currently supported script version is 0. + if scriptVersion != 0 { + return false + } + + // A null script is of the form: + // OP_RETURN + // + // Thus, it can either be a single OP_RETURN or an OP_RETURN followed by a + // data push up to MaxDataCarrierSize bytes. + + // The script can't possibly be a null data script if it doesn't start + // with OP_RETURN. Fail fast to avoid more work below. + if len(script) < 1 || script[0] != OP_RETURN { + return false + } + + // Single OP_RETURN. + if len(script) == 1 { return true } - return l == 2 && - pops[0].opcode.value == OP_RETURN && - (isSmallInt(pops[1].opcode) || pops[1].opcode.value <= - OP_PUSHDATA4) && - len(pops[1].data) <= MaxDataCarrierSize + // OP_RETURN followed by data push up to MaxDataCarrierSize bytes. + tokenizer := MakeScriptTokenizer(scriptVersion, script[1:]) + return tokenizer.Next() && tokenizer.Done() && + (IsSmallInt(tokenizer.Opcode()) || tokenizer.Opcode() <= OP_PUSHDATA4) && + len(tokenizer.Data()) <= MaxDataCarrierSize } // scriptType returns the type of the script being inspected from the known -// standard types. -func typeOfScript(pops []parsedOpcode) ScriptClass { - if isPubkey(pops) { - return PubKeyTy - } else if isPubkeyHash(pops) { - return PubKeyHashTy - } else if isWitnessPubKeyHash(pops) { - return WitnessV0PubKeyHashTy - } else if isScriptHash(pops) { - return ScriptHashTy - } else if isWitnessScriptHash(pops) { - return WitnessV0ScriptHashTy - } else if isMultiSig(pops) { - return MultiSigTy - } else if isNullData(pops) { - return NullDataTy +// standard types. The version version should be 0 if the script is segwit v0 +// or prior, and 1 for segwit v1 (taproot) scripts. +func typeOfScript(scriptVersion uint16, script []byte) ScriptClass { + switch scriptVersion { + case BaseSegwitWitnessVersion: + switch { + case isPubKeyScript(script): + return PubKeyTy + case isPubKeyHashScript(script): + return PubKeyHashTy + case isScriptHashScript(script): + return ScriptHashTy + case isWitnessPubKeyHashScript(script): + return WitnessV0PubKeyHashTy + case isWitnessScriptHashScript(script): + return WitnessV0ScriptHashTy + case isMultisigScript(scriptVersion, script): + return MultiSigTy + case isNullDataScript(scriptVersion, script): + return NullDataTy + } + case TaprootWitnessVersion: + switch { + case isWitnessTaprootScript(script): + return WitnessV1TaprootTy + } } + return NonStandardTy } @@ -181,11 +561,31 @@ func typeOfScript(pops []parsedOpcode) ScriptClass { // // NonStandardTy will be returned when the script does not parse. func GetScriptClass(script []byte) ScriptClass { - pops, err := parseScript(script) - if err != nil { - return NonStandardTy + const scriptVersionSegWit = 0 + classSegWit := typeOfScript(scriptVersionSegWit, script) + + if classSegWit != NonStandardTy { + return classSegWit } - return typeOfScript(pops) + + const scriptVersionTaproot = 1 + return typeOfScript(scriptVersionTaproot, script) +} + +// NewScriptClass returns the ScriptClass corresponding to the string name +// provided as argument. ErrUnsupportedScriptType error is returned if the +// name doesn't correspond to any known ScriptClass. +// +// Not to be confused with GetScriptClass. +func NewScriptClass(name string) (*ScriptClass, error) { + for i, n := range scriptClassToName { + if n == name { + value := ScriptClass(i) + return &value, nil + } + } + + return nil, fmt.Errorf("%w: %s", ErrUnsupportedScriptType, name) } // expectedInputs returns the number of arguments required by a script. @@ -193,7 +593,11 @@ func GetScriptClass(script []byte) ScriptClass { // then -1 is returned. We are an internal function and thus assume that class // is the real class of pops (and we can thus assume things that were determined // while finding out the type). -func expectedInputs(pops []parsedOpcode, class ScriptClass) int { +// +// NOTE: This function is only valid for version 0 scripts. Since the function +// does not accept a script version, the results are undefined for other script +// versions. +func expectedInputs(script []byte, class ScriptClass) int { switch class { case PubKeyTy: return 1 @@ -212,6 +616,10 @@ func expectedInputs(pops []parsedOpcode, class ScriptClass) int { // Not including script. That is handled by the caller. return 1 + case WitnessV1TaprootTy: + // Not including script. That is handled by the caller. + return 1 + case MultiSigTy: // Standard multisig has a push a small number for the number // of sigs and number of keys. Check the first push instruction @@ -220,7 +628,7 @@ func expectedInputs(pops []parsedOpcode, class ScriptClass) int { // the original bitcoind bug where OP_CHECKMULTISIG pops an // additional item from the stack, add an extra expected input // for the extra push that is required to compensate. - return asSmallInt(pops[0].opcode) + 1 + return AsSmallInt(script[0]) + 1 case NullDataTy: fallthrough @@ -252,53 +660,61 @@ type ScriptInfo struct { // pair. It will error if the pair is in someway invalid such that they can not // be analysed, i.e. if they do not parse or the pkScript is not a push-only // script +// +// NOTE: This function is only valid for version 0 scripts. Since the function +// does not accept a script version, the results are undefined for other script +// versions. +// +// DEPRECATED. This will be removed in the next major version bump. func CalcScriptInfo(sigScript, pkScript []byte, witness wire.TxWitness, bip16, segwit bool) (*ScriptInfo, error) { - sigPops, err := parseScript(sigScript) - if err != nil { + // Count the number of opcodes in the signature script while also ensuring + // that successfully parses. Since there is a check below to ensure the + // script is push only, this equates to the number of inputs to the public + // key script. + const scriptVersion = 0 + var numInputs int + tokenizer := MakeScriptTokenizer(scriptVersion, sigScript) + for tokenizer.Next() { + numInputs++ + } + if err := tokenizer.Err(); err != nil { return nil, err } - pkPops, err := parseScript(pkScript) - if err != nil { + if err := checkScriptParses(scriptVersion, pkScript); err != nil { return nil, err } - // Push only sigScript makes little sense. - si := new(ScriptInfo) - si.PkScriptClass = typeOfScript(pkPops) - // Can't have a signature script that doesn't just push data. - if !isPushOnly(sigPops) { + if !IsPushOnlyScript(sigScript) { return nil, scriptError(ErrNotPushOnly, "signature script is not push only") } - si.ExpectedInputs = expectedInputs(pkPops, si.PkScriptClass) + si := new(ScriptInfo) + si.PkScriptClass = typeOfScript(scriptVersion, pkScript) + + si.ExpectedInputs = expectedInputs(pkScript, si.PkScriptClass) switch { // Count sigops taking into account pay-to-script-hash. case si.PkScriptClass == ScriptHashTy && bip16 && !segwit: - // The pay-to-hash-script is the final data push of the - // signature script. - script := sigPops[len(sigPops)-1].data - shPops, err := parseScript(script) - if err != nil { - return nil, err - } - - shInputs := expectedInputs(shPops, typeOfScript(shPops)) - if shInputs == -1 { + // The redeem script is the final data push of the signature script. + redeemScript := finalOpcodeData(scriptVersion, sigScript) + reedeemClass := typeOfScript(scriptVersion, redeemScript) + rsInputs := expectedInputs(redeemScript, reedeemClass) + if rsInputs == -1 { si.ExpectedInputs = -1 } else { - si.ExpectedInputs += shInputs + si.ExpectedInputs += rsInputs } - si.SigOps = getSigOpCount(shPops, true) + si.SigOps = countSigOpsV0(redeemScript, true) // All entries pushed to stack (or are OP_RESERVED and exec // will fail). - si.NumInputs = len(sigPops) + si.NumInputs = numInputs // If segwit is active, and this is a regular p2wkh output, then we'll // treat the script as a p2pkh output in essence. @@ -314,8 +730,8 @@ func CalcScriptInfo(sigScript, pkScript []byte, witness wire.TxWitness, // Extract the pushed witness program from the sigScript so we // can determine the number of expected inputs. - pkPops, _ := parseScript(sigScript[1:]) - shInputs := expectedInputs(pkPops, typeOfScript(pkPops)) + redeemClass := typeOfScript(scriptVersion, sigScript[1:]) + shInputs := expectedInputs(sigScript[1:], redeemClass) if shInputs == -1 { si.ExpectedInputs = -1 } else { @@ -325,17 +741,14 @@ func CalcScriptInfo(sigScript, pkScript []byte, witness wire.TxWitness, si.SigOps = GetWitnessSigOpCount(sigScript, pkScript, witness) si.NumInputs = len(witness) - si.NumInputs += len(sigPops) + si.NumInputs += numInputs // If segwit is active, and this is a p2wsh output, then we'll need to // examine the witness script to generate accurate script info. case si.PkScriptClass == WitnessV0ScriptHashTy && segwit: - // The witness script is the final element of the witness - // stack. witnessScript := witness[len(witness)-1] - pops, _ := parseScript(witnessScript) - - shInputs := expectedInputs(pops, typeOfScript(pops)) + redeemClass := typeOfScript(scriptVersion, witnessScript) + shInputs := expectedInputs(witnessScript, redeemClass) if shInputs == -1 { si.ExpectedInputs = -1 } else { @@ -346,11 +759,11 @@ func CalcScriptInfo(sigScript, pkScript []byte, witness wire.TxWitness, si.NumInputs = len(witness) default: - si.SigOps = getSigOpCount(pkPops, true) + si.SigOps = countSigOpsV0(pkScript, true) // All entries pushed to stack (or are OP_RESERVED and exec // will fail). - si.NumInputs = len(sigPops) + si.NumInputs = numInputs } return si, nil @@ -359,27 +772,21 @@ func CalcScriptInfo(sigScript, pkScript []byte, witness wire.TxWitness, // CalcMultiSigStats returns the number of public keys and signatures from // a multi-signature transaction script. The passed script MUST already be // known to be a multi-signature script. +// +// NOTE: This function is only valid for version 0 scripts. Since the function +// does not accept a script version, the results are undefined for other script +// versions. func CalcMultiSigStats(script []byte) (int, int, error) { - pops, err := parseScript(script) - if err != nil { - return 0, 0, err - } - - // A multi-signature script is of the pattern: - // NUM_SIGS PUBKEY PUBKEY PUBKEY... NUM_PUBKEYS OP_CHECKMULTISIG - // Therefore the number of signatures is the oldest item on the stack - // and the number of pubkeys is the 2nd to last. Also, the absolute - // minimum for a multi-signature script is 1 pubkey, so at least 4 - // items must be on the stack per: - // OP_1 PUBKEY OP_1 OP_CHECKMULTISIG - if len(pops) < 4 { + // The public keys are not needed here, so pass false to avoid the extra + // allocation. + const scriptVersion = 0 + details := extractMultisigScriptDetails(scriptVersion, script, false) + if !details.valid { str := fmt.Sprintf("script %x is not a multisig script", script) return 0, 0, scriptError(ErrNotMultisigScript, str) } - numSigs := asSmallInt(pops[0].opcode) - numPubKeys := asSmallInt(pops[len(pops)-2].opcode) - return numPubKeys, numSigs, nil + return details.numPubKeys, details.requiredSigs, nil } // payToPubKeyHashScript creates a new script to pay a transaction @@ -410,6 +817,12 @@ func payToWitnessScriptHashScript(scriptHash []byte) ([]byte, error) { return NewScriptBuilder().AddOp(OP_0).AddData(scriptHash).Script() } +// payToWitnessTaprootScript creates a new script to pay to a version 1 +// (taproot) witness program. The passed hash is expected to be valid. +func payToWitnessTaprootScript(rawKey []byte) ([]byte, error) { + return NewScriptBuilder().AddOp(OP_1).AddData(rawKey).Script() +} + // payToPubkeyScript creates a new script to pay a transaction output to a // public key. It is expected that the input is a valid pubkey. func payToPubKeyScript(serializedPubKey []byte) ([]byte, error) { @@ -456,6 +869,12 @@ func PayToAddrScript(addr btcutil.Address) ([]byte, error) { nilAddrErrStr) } return payToWitnessScriptHashScript(addr.ScriptAddress()) + case *btcutil.AddressTaproot: + if addr == nil { + return nil, scriptError(ErrUnsupportedAddress, + nilAddrErrStr) + } + return payToWitnessTaprootScript(addr.ScriptAddress()) } str := fmt.Sprintf("unable to generate payment script for unsupported "+ @@ -501,127 +920,126 @@ func MultiSigScript(pubkeys []*btcutil.AddressPubKey, nrequired int) ([]byte, er // PushedData returns an array of byte slices containing any pushed data found // in the passed script. This includes OP_0, but not OP_1 - OP_16. func PushedData(script []byte) ([][]byte, error) { - pops, err := parseScript(script) - if err != nil { - return nil, err - } + const scriptVersion = 0 var data [][]byte - for _, pop := range pops { - if pop.data != nil { - data = append(data, pop.data) - } else if pop.opcode.value == OP_0 { + tokenizer := MakeScriptTokenizer(scriptVersion, script) + for tokenizer.Next() { + if tokenizer.Data() != nil { + data = append(data, tokenizer.Data()) + } else if tokenizer.Opcode() == OP_0 { data = append(data, nil) } } + if err := tokenizer.Err(); err != nil { + return nil, err + } return data, nil } +// pubKeyHashToAddrs is a convenience function to attempt to convert the +// passed hash to a pay-to-pubkey-hash address housed within an address +// slice. It is used to consolidate common code. +func pubKeyHashToAddrs(hash []byte, params *chaincfg.Params) []btcutil.Address { + // Skip the pubkey hash if it's invalid for some reason. + var addrs []btcutil.Address + addr, err := btcutil.NewAddressPubKeyHash(hash, params) + if err == nil { + addrs = append(addrs, addr) + } + return addrs +} + +// scriptHashToAddrs is a convenience function to attempt to convert the passed +// hash to a pay-to-script-hash address housed within an address slice. It is +// used to consolidate common code. +func scriptHashToAddrs(hash []byte, params *chaincfg.Params) []btcutil.Address { + // Skip the hash if it's invalid for some reason. + var addrs []btcutil.Address + addr, err := btcutil.NewAddressScriptHashFromHash(hash, params) + if err == nil { + addrs = append(addrs, addr) + } + return addrs +} + // ExtractPkScriptAddrs returns the type of script, addresses and required // signatures associated with the passed PkScript. Note that it only works for // 'standard' transaction script types. Any data such as public keys which are // invalid are omitted from the results. -func ExtractPkScriptAddrs(pkScript []byte, chainParams *chaincfg.Params) (ScriptClass, []btcutil.Address, int, error) { - var addrs []btcutil.Address - var requiredSigs int +func ExtractPkScriptAddrs(pkScript []byte, + chainParams *chaincfg.Params) (ScriptClass, []btcutil.Address, int, error) { - // No valid addresses or required signatures if the script doesn't - // parse. - pops, err := parseScript(pkScript) - if err != nil { - return NonStandardTy, nil, 0, err + // Check for pay-to-pubkey-hash script. + if hash := extractPubKeyHash(pkScript); hash != nil { + return PubKeyHashTy, pubKeyHashToAddrs(hash, chainParams), 1, nil } - scriptClass := typeOfScript(pops) - switch scriptClass { - case PubKeyHashTy: - // A pay-to-pubkey-hash script is of the form: - // OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG - // Therefore the pubkey hash is the 3rd item on the stack. - // Skip the pubkey hash if it's invalid for some reason. - requiredSigs = 1 - addr, err := btcutil.NewAddressPubKeyHash(pops[2].data, - chainParams) + // Check for pay-to-script-hash. + if hash := extractScriptHash(pkScript); hash != nil { + return ScriptHashTy, scriptHashToAddrs(hash, chainParams), 1, nil + } + + // Check for pay-to-pubkey script. + if data := extractPubKey(pkScript); data != nil { + var addrs []btcutil.Address + addr, err := btcutil.NewAddressPubKey(data, chainParams) if err == nil { addrs = append(addrs, addr) } + return PubKeyTy, addrs, 1, nil + } - case WitnessV0PubKeyHashTy: - // A pay-to-witness-pubkey-hash script is of thw form: - // OP_0 <20-byte hash> - // Therefore, the pubkey hash is the second item on the stack. - // Skip the pubkey hash if it's invalid for some reason. - requiredSigs = 1 - addr, err := btcutil.NewAddressWitnessPubKeyHash(pops[1].data, - chainParams) - if err == nil { - addrs = append(addrs, addr) + // Check for multi-signature script. + const scriptVersion = 0 + details := extractMultisigScriptDetails(scriptVersion, pkScript, true) + if details.valid { + // Convert the public keys while skipping any that are invalid. + addrs := make([]btcutil.Address, 0, len(details.pubKeys)) + for _, pubkey := range details.pubKeys { + addr, err := btcutil.NewAddressPubKey(pubkey, chainParams) + if err == nil { + addrs = append(addrs, addr) + } } + return MultiSigTy, addrs, details.requiredSigs, nil + } - case PubKeyTy: - // A pay-to-pubkey script is of the form: - // OP_CHECKSIG - // Therefore the pubkey is the first item on the stack. - // Skip the pubkey if it's invalid for some reason. - requiredSigs = 1 - addr, err := btcutil.NewAddressPubKey(pops[0].data, chainParams) + // Check for null data script. + if isNullDataScript(scriptVersion, pkScript) { + // Null data transactions have no addresses or required signatures. + return NullDataTy, nil, 0, nil + } + + if hash := extractWitnessPubKeyHash(pkScript); hash != nil { + var addrs []btcutil.Address + addr, err := btcutil.NewAddressWitnessPubKeyHash(hash, chainParams) if err == nil { addrs = append(addrs, addr) } + return WitnessV0PubKeyHashTy, addrs, 1, nil + } - case ScriptHashTy: - // A pay-to-script-hash script is of the form: - // OP_HASH160 OP_EQUAL - // Therefore the script hash is the 2nd item on the stack. - // Skip the script hash if it's invalid for some reason. - requiredSigs = 1 - addr, err := btcutil.NewAddressScriptHashFromHash(pops[1].data, - chainParams) + if hash := extractWitnessV0ScriptHash(pkScript); hash != nil { + var addrs []btcutil.Address + addr, err := btcutil.NewAddressWitnessScriptHash(hash, chainParams) if err == nil { addrs = append(addrs, addr) } + return WitnessV0ScriptHashTy, addrs, 1, nil + } - case WitnessV0ScriptHashTy: - // A pay-to-witness-script-hash script is of the form: - // OP_0 <32-byte hash> - // Therefore, the script hash is the second item on the stack. - // Skip the script hash if it's invalid for some reason. - requiredSigs = 1 - addr, err := btcutil.NewAddressWitnessScriptHash(pops[1].data, - chainParams) + if rawKey := extractWitnessV1KeyBytes(pkScript); rawKey != nil { + var addrs []btcutil.Address + addr, err := btcutil.NewAddressTaproot(rawKey, chainParams) if err == nil { addrs = append(addrs, addr) } - - case MultiSigTy: - // A multi-signature script is of the form: - // ... OP_CHECKMULTISIG - // Therefore the number of required signatures is the 1st item - // on the stack and the number of public keys is the 2nd to last - // item on the stack. - requiredSigs = asSmallInt(pops[0].opcode) - numPubKeys := asSmallInt(pops[len(pops)-2].opcode) - - // Extract the public keys while skipping any that are invalid. - addrs = make([]btcutil.Address, 0, numPubKeys) - for i := 0; i < numPubKeys; i++ { - addr, err := btcutil.NewAddressPubKey(pops[i+1].data, - chainParams) - if err == nil { - addrs = append(addrs, addr) - } - } - - case NullDataTy: - // Null data transactions have no addresses or required - // signatures. - - case NonStandardTy: - // Don't attempt to extract addresses or required signatures for - // nonstandard transactions. + return WitnessV1TaprootTy, addrs, 1, nil } - return scriptClass, addrs, requiredSigs, nil + // If none of the above passed, then the address must be non-standard. + return NonStandardTy, nil, 0, nil } // AtomicSwapDataPushes houses the data pushes found in atomic swap contracts. @@ -644,64 +1062,102 @@ type AtomicSwapDataPushes struct { // // This function is only defined in the txscript package due to API limitations // which prevent callers using txscript to parse nonstandard scripts. +// +// DEPRECATED. This will be removed in the next major version bump. The error +// should also likely be removed if the code is reimplemented by any callers +// since any errors result in a nil result anyway. func ExtractAtomicSwapDataPushes(version uint16, pkScript []byte) (*AtomicSwapDataPushes, error) { - pops, err := parseScript(pkScript) - if err != nil { - return nil, err + // An atomic swap is of the form: + // IF + // SIZE EQUALVERIFY SHA256 <32-byte secret> EQUALVERIFY DUP + // HASH160 <20-byte recipient hash> + // ELSE + // CHECKLOCKTIMEVERIFY DROP DUP HASH160 <20-byte refund hash> + // ENDIF + // EQUALVERIFY CHECKSIG + type templateMatch struct { + expectCanonicalInt bool + maxIntBytes int + opcode byte + extractedInt int64 + extractedData []byte } - - if len(pops) != 20 { - return nil, nil - } - isAtomicSwap := pops[0].opcode.value == OP_IF && - pops[1].opcode.value == OP_SIZE && - canonicalPush(pops[2]) && - pops[3].opcode.value == OP_EQUALVERIFY && - pops[4].opcode.value == OP_SHA256 && - pops[5].opcode.value == OP_DATA_32 && - pops[6].opcode.value == OP_EQUALVERIFY && - pops[7].opcode.value == OP_DUP && - pops[8].opcode.value == OP_HASH160 && - pops[9].opcode.value == OP_DATA_20 && - pops[10].opcode.value == OP_ELSE && - canonicalPush(pops[11]) && - pops[12].opcode.value == OP_CHECKLOCKTIMEVERIFY && - pops[13].opcode.value == OP_DROP && - pops[14].opcode.value == OP_DUP && - pops[15].opcode.value == OP_HASH160 && - pops[16].opcode.value == OP_DATA_20 && - pops[17].opcode.value == OP_ENDIF && - pops[18].opcode.value == OP_EQUALVERIFY && - pops[19].opcode.value == OP_CHECKSIG - if !isAtomicSwap { - return nil, nil + var template = [20]templateMatch{ + {opcode: OP_IF}, + {opcode: OP_SIZE}, + {expectCanonicalInt: true, maxIntBytes: maxScriptNumLen}, + {opcode: OP_EQUALVERIFY}, + {opcode: OP_SHA256}, + {opcode: OP_DATA_32}, + {opcode: OP_EQUALVERIFY}, + {opcode: OP_DUP}, + {opcode: OP_HASH160}, + {opcode: OP_DATA_20}, + {opcode: OP_ELSE}, + {expectCanonicalInt: true, maxIntBytes: cltvMaxScriptNumLen}, + {opcode: OP_CHECKLOCKTIMEVERIFY}, + {opcode: OP_DROP}, + {opcode: OP_DUP}, + {opcode: OP_HASH160}, + {opcode: OP_DATA_20}, + {opcode: OP_ENDIF}, + {opcode: OP_EQUALVERIFY}, + {opcode: OP_CHECKSIG}, } - pushes := new(AtomicSwapDataPushes) - copy(pushes.SecretHash[:], pops[5].data) - copy(pushes.RecipientHash160[:], pops[9].data) - copy(pushes.RefundHash160[:], pops[16].data) - if pops[2].data != nil { - locktime, err := makeScriptNum(pops[2].data, true, 5) - if err != nil { + var templateOffset int + tokenizer := MakeScriptTokenizer(version, pkScript) + for tokenizer.Next() { + // Not an atomic swap script if it has more opcodes than expected in the + // template. + if templateOffset >= len(template) { return nil, nil } - pushes.SecretSize = int64(locktime) - } else if op := pops[2].opcode; isSmallInt(op) { - pushes.SecretSize = int64(asSmallInt(op)) - } else { - return nil, nil - } - if pops[11].data != nil { - locktime, err := makeScriptNum(pops[11].data, true, 5) - if err != nil { - return nil, nil + + op := tokenizer.Opcode() + data := tokenizer.Data() + tplEntry := &template[templateOffset] + if tplEntry.expectCanonicalInt { + switch { + case data != nil: + val, err := MakeScriptNum(data, true, tplEntry.maxIntBytes) + if err != nil { + return nil, err + } + tplEntry.extractedInt = int64(val) + + case IsSmallInt(op): + tplEntry.extractedInt = int64(AsSmallInt(op)) + + // Not an atomic swap script if the opcode does not push an int. + default: + return nil, nil + } + } else { + if op != tplEntry.opcode { + return nil, nil + } + + tplEntry.extractedData = data } - pushes.LockTime = int64(locktime) - } else if op := pops[11].opcode; isSmallInt(op) { - pushes.LockTime = int64(asSmallInt(op)) - } else { + + templateOffset++ + } + if err := tokenizer.Err(); err != nil { + return nil, err + } + if !tokenizer.Done() || templateOffset != len(template) { return nil, nil } - return pushes, nil + + // At this point, the script appears to be an atomic swap, so populate and + // return the extacted data. + pushes := AtomicSwapDataPushes{ + SecretSize: template[2].extractedInt, + LockTime: template[11].extractedInt, + } + copy(pushes.SecretHash[:], template[5].extractedData) + copy(pushes.RecipientHash160[:], template[9].extractedData) + copy(pushes.RefundHash160[:], template[16].extractedData) + return &pushes, nil } diff --git a/txscript/standard_test.go b/txscript/standard_test.go index e24d5f615b..4993a65260 100644 --- a/txscript/standard_test.go +++ b/txscript/standard_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2013-2017 The btcsuite developers +// Copyright (c) 2013-2020 The btcsuite developers // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. @@ -7,12 +7,13 @@ package txscript import ( "bytes" "encoding/hex" + "errors" "reflect" "testing" + "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" ) // mustParseShortForm parses the passed short form script and returns the @@ -70,6 +71,20 @@ func newAddressScriptHash(scriptHash []byte) btcutil.Address { return addr } +// newAddressTaproot returns a new btcutil.AddressTaproot from the +// provided hash. It panics if an error occurs. This is only used in the tests +// as a helper since the only way it can fail is if there is an error in the +// test source code. +func newAddressTaproot(scriptHash []byte) btcutil.Address { + addr, err := btcutil.NewAddressTaproot(scriptHash, + &chaincfg.MainNetParams) + if err != nil { + panic("invalid script hash in test source") + } + + return addr +} + // TestExtractPkScriptAddrs ensures that extracting the type, addresses, and // number of required signatures from PkScripts works as intended. func TestExtractPkScriptAddrs(t *testing.T) { @@ -310,8 +325,16 @@ func TestExtractPkScriptAddrs(t *testing.T) { reqSigs: 1, class: MultiSigTy, }, - // from real tx: 691dd277dc0e90a462a3d652a1171686de49cf19067cd33c7df0392833fb986a, vout 44 - // invalid public keys + { + name: "v1 p2tr witness-script-hash", + script: hexToBytes("51201a82f7457a9ba6ab1074e9f50" + + "053eefc637f8b046e389b636766bdc7d1f676f8"), + addrs: []btcutil.Address{newAddressTaproot( + hexToBytes("1a82f7457a9ba6ab1074e9f50053eefc6" + + "37f8b046e389b636766bdc7d1f676f8"))}, + reqSigs: 1, + class: WitnessV1TaprootTy, + }, { name: "1 of 3 multisig with invalid pubkeys 2", script: hexToBytes("514134633365633235396337346461636" + @@ -636,6 +659,27 @@ func TestPayToAddrScript(t *testing.T) { err) } + p2wsh, err := btcutil.NewAddressWitnessScriptHash(hexToBytes("e981bd992a43650657"+ + "d705ef7a30b2adc75a927ed42a4cf6b3da0f865a475fb4"), &chaincfg.MainNetParams) + if err != nil { + t.Fatalf("Unable to create p2wsh address: %v", + err) + } + + p2tr, err := btcutil.NewAddressTaproot(hexToBytes("3a8e170b546c3b122ab9c175e"+ + "ff36fb344db2684fe96497eb51b440e75232709"), &chaincfg.MainNetParams) + if err != nil { + t.Fatalf("Unable to create p2tr address: %v", + err) + } + + p2wpkh, err := btcutil.NewAddressWitnessPubKeyHash(hexToBytes("748e50366adb8"+ + "ae4b0255e406a28f99d24b73cbc"), &chaincfg.MainNetParams) + if err != nil { + t.Fatalf("Unable to create p2wpkh address: %v", + err) + } + // Errors used in the tests below defined here for convenience and to // keep the horizontal test size shorter. errUnsupportedAddress := scriptError(ErrUnsupportedAddress, "") @@ -682,11 +726,34 @@ func TestPayToAddrScript(t *testing.T) { "CHECKSIG", nil, }, + // pay-to-witness-script-hash address on mainnet. + { + p2wsh, + "OP_0 DATA_32 0xe981bd992a43650657d705ef7a30b2adc75a927ed" + + "42a4cf6b3da0f865a475fb4", + nil, + }, + // pay-to-taproot address on mainnet. + { + p2tr, + "OP_1 DATA_32 0x3a8e170b546c3b122ab9c175eff36fb344db2684" + + "fe96497eb51b440e75232709", + nil, + }, + // pay-to-witness-pubkey-hash address on mainnet. + { + p2wpkh, + "OP_0 DATA_20 0x748e50366adb8ae4b0255e406a28f99d24b73cbc", + nil, + }, // Supported address types with nil pointers. {(*btcutil.AddressPubKeyHash)(nil), "", errUnsupportedAddress}, {(*btcutil.AddressScriptHash)(nil), "", errUnsupportedAddress}, {(*btcutil.AddressPubKey)(nil), "", errUnsupportedAddress}, + {(*btcutil.AddressWitnessPubKeyHash)(nil), "", errUnsupportedAddress}, + {(*btcutil.AddressWitnessScriptHash)(nil), "", errUnsupportedAddress}, + {(*btcutil.AddressTaproot)(nil), "", errUnsupportedAddress}, // Unsupported address type. {&bogusAddress{}, "", errUnsupportedAddress}, @@ -817,7 +884,7 @@ func TestMultiSigScript(t *testing.T) { } } -// TestCalcMultiSigStats ensures the CalcMutliSigStats function returns the +// TestCalcMultiSigStats ensures the CalcMultiSigStats function returns the // expected errors. func TestCalcMultiSigStats(t *testing.T) { t.Parallel() @@ -831,7 +898,7 @@ func TestCalcMultiSigStats(t *testing.T) { name: "short script", script: "0x046708afdb0fe5548271967f1a67130b7105cd6a828" + "e03909a67962e0ea1f61d", - err: scriptError(ErrMalformedPush, ""), + err: scriptError(ErrNotMultisigScript, ""), }, { name: "stack underflow", @@ -842,11 +909,7 @@ func TestCalcMultiSigStats(t *testing.T) { }, { name: "multisig script", - script: "0 DATA_72 0x30450220106a3e4ef0b51b764a2887226" + - "2ffef55846514dacbdcbbdd652c849d395b4384022100" + - "e03ae554c3cbb40600d31dd46fc33f25e47bf8525b1fe" + - "07282e3b6ecb5f3bb2801 CODESEPARATOR 1 DATA_33 " + - "0x0232abdc893e7f0631364d7fd01cb33d24da45329a0" + + script: "1 DATA_33 0x0232abdc893e7f0631364d7fd01cb33d24da45329a0" + "0357b3a7886211ab414d55a 1 CHECKMULTISIG", err: nil, }, @@ -1213,3 +1276,40 @@ func TestNullDataScript(t *testing.T) { } } } + +// TestNewScriptClass tests whether NewScriptClass returns a valid ScriptClass. +func TestNewScriptClass(t *testing.T) { + tests := []struct { + name string + scriptName string + want *ScriptClass + wantErr error + }{ + { + name: "NewScriptClass - ok", + scriptName: NullDataTy.String(), + want: func() *ScriptClass { + s := NullDataTy + return &s + }(), + }, + { + name: "NewScriptClass - invalid", + scriptName: "foo", + wantErr: ErrUnsupportedScriptType, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := NewScriptClass(tt.scriptName) + if err != nil && !errors.Is(err, tt.wantErr) { + t.Errorf("NewScriptClass() error = %v, wantErr %v", err, tt.wantErr) + return + } + + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("NewScriptClass() got = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/txscript/taproot.go b/txscript/taproot.go new file mode 100644 index 0000000000..ee26cae967 --- /dev/null +++ b/txscript/taproot.go @@ -0,0 +1,784 @@ +// Copyright (c) 2013-2022 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package txscript + +import ( + "bytes" + "fmt" + + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcec/v2/schnorr" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/wire" + secp "github.com/decred/dcrd/dcrec/secp256k1/v4" +) + +// TapscriptLeafVersion represents the various possible versions of a tapscript +// leaf version. Leaf versions are used to define, or introduce new script +// semantics, under the base taproot execution model. +// +// TODO(roasbeef): add validation here as well re proper prefix, etc? +type TapscriptLeafVersion uint8 + +const ( + // BaseLeafVersion is the base tapscript leaf version. The semantics of + // this version are defined in BIP 342. + BaseLeafVersion TapscriptLeafVersion = 0xc0 +) + +const ( + // ControlBlockBaseSize is the base size of a control block. This + // includes the initial byte for the leaf version, and then serialized + // schnorr public key. + ControlBlockBaseSize = 33 + + // ControlBlockNodeSize is the size of a given merkle branch hash in + // the control block. + ControlBlockNodeSize = 32 + + // ControlBlockMaxNodeCount is the max number of nodes that can be + // included in a control block. This value represents a merkle tree of + // depth 2^128. + ControlBlockMaxNodeCount = 128 + + // ControlBlockMaxSize is the max possible size of a control block. + // This simulates revealing a leaf from the largest possible tapscript + // tree. + ControlBlockMaxSize = ControlBlockBaseSize + (ControlBlockNodeSize * + ControlBlockMaxNodeCount) +) + +// VerifyTaprootKeySpend attempts to verify a top-level taproot key spend, +// returning a non-nil error if the passed signature is invalid. If a sigCache +// is passed in, then the sig cache will be consulted to skip full verification +// of a signature that has already been seen. Witness program here should be +// the 32-byte x-only schnorr output public key. +// +// NOTE: The TxSigHashes MUST be passed in and fully populated. +func VerifyTaprootKeySpend(witnessProgram []byte, rawSig []byte, tx *wire.MsgTx, + inputIndex int, prevOuts PrevOutputFetcher, hashCache *TxSigHashes, + sigCache *SigCache) error { + + // First, we'll need to extract the public key from the witness + // program. + rawKey := witnessProgram + + // Extract the annex if it exists, so we can compute the proper + // sighash below. + var annex []byte + witness := tx.TxIn[inputIndex].Witness + if isAnnexedWitness(witness) { + annex, _ = extractAnnex(witness) + } + + // Now that we have the public key, we can create a new top-level + // keyspend verifier that'll handle all the sighash and schnorr + // specifics for us. + keySpendVerifier, err := newTaprootSigVerifier( + rawKey, rawSig, tx, inputIndex, prevOuts, sigCache, + hashCache, annex, + ) + if err != nil { + return err + } + + result := keySpendVerifier.Verify() + if result.sigValid { + return nil + } + + return scriptError(ErrTaprootSigInvalid, "") +} + +// ControlBlock houses the structured witness input for a taproot spend. This +// includes the internal taproot key, the leaf version, and finally a nearly +// complete merkle inclusion proof for the main taproot commitment. +// +// TODO(roasbeef): method to serialize control block that commits to even +// y-bit, which pops up everywhere even tho 32 byte keys +type ControlBlock struct { + // InternalKey is the internal public key in the taproot commitment. + InternalKey *btcec.PublicKey + + // OutputKeyYIsOdd denotes if the y coordinate of the output key (the + // key placed in the actual taproot output is odd. + OutputKeyYIsOdd bool + + // LeafVersion is the specified leaf version of the tapscript leaf that + // the InclusionProof below is based off of. + LeafVersion TapscriptLeafVersion + + // InclusionProof is a series of merkle branches that when hashed + // pairwise, starting with the revealed script, will yield the taproot + // commitment root. + InclusionProof []byte +} + +// ToBytes returns the control block in a format suitable for using as part of +// a witness spending a tapscript output. +func (c *ControlBlock) ToBytes() ([]byte, error) { + var b bytes.Buffer + + // The first byte of the control block is the leaf version byte XOR'd with + // the parity of the y coordinate of the public key. + yParity := byte(0) + if c.OutputKeyYIsOdd { + yParity = 1 + } + + // The first byte is a combination of the leaf version, using the lowest + // bit to encode the single bit that denotes if the yo coordinate if odd or + // even. + leafVersionAndParity := byte(c.LeafVersion) | yParity + if err := b.WriteByte(leafVersionAndParity); err != nil { + return nil, err + } + + // Next, we encode the raw 32 byte schnorr public key + if _, err := b.Write(schnorr.SerializePubKey(c.InternalKey)); err != nil { + return nil, err + } + + // Finally, we'll write out the inclusion proof as is, without any length + // prefix. + if _, err := b.Write(c.InclusionProof); err != nil { + return nil, err + } + + return b.Bytes(), nil +} + +// RootHash calculates the root hash of a tapscript given the revealed script. +func (c *ControlBlock) RootHash(revealedScript []byte) []byte { + // We'll start by creating a new tapleaf from the revealed script, + // this'll serve as the initial hash we'll use to incrementally + // reconstruct the merkle root using the control block elements. + merkleAccumulator := NewTapLeaf(c.LeafVersion, revealedScript).TapHash() + + // Now that we have our initial hash, we'll parse the control block one + // node at a time to build up our merkle accumulator into the taproot + // commitment. + // + // The control block is a series of nodes that serve as an inclusion + // proof as we can start hashing with our leaf, with each internal + // branch, until we reach the root. + numNodes := len(c.InclusionProof) / ControlBlockNodeSize + for nodeOffset := 0; nodeOffset < numNodes; nodeOffset++ { + // Extract the new node using our index to serve as a 32-byte + // offset. + leafOffset := 32 * nodeOffset + nextNode := c.InclusionProof[leafOffset : leafOffset+32] + + merkleAccumulator = tapBranchHash(merkleAccumulator[:], nextNode) + } + + return merkleAccumulator[:] +} + +// ParseControlBlock attempts to parse the raw bytes of a control block. An +// error is returned if the control block isn't well formed, or can't be +// parsed. +func ParseControlBlock(ctrlBlock []byte) (*ControlBlock, error) { + // The control block minimally must contain 33 bytes (for the leaf + // version and internal key) along with at least a single value + // comprising the merkle proof. If not, then it's invalid. + switch { + // The control block must minimally have 33 bytes for the internal + // public key and script leaf version. + case len(ctrlBlock) < ControlBlockBaseSize: + str := fmt.Sprintf("min size is %v bytes, control block "+ + "is %v bytes", ControlBlockBaseSize, len(ctrlBlock)) + return nil, scriptError(ErrControlBlockTooSmall, str) + + // The control block can't be larger than a proof for the largest + // possible tapscript merkle tree with 2^128 leaves. + case len(ctrlBlock) > ControlBlockMaxSize: + str := fmt.Sprintf("max size is %v, control block is %v bytes", + ControlBlockMaxSize, len(ctrlBlock)) + return nil, scriptError(ErrControlBlockTooLarge, str) + + // Ignoring the fixed sized portion, we expect the total number of + // remaining bytes to be a multiple of the node size, which is 32 + // bytes. + case (len(ctrlBlock)-ControlBlockBaseSize)%ControlBlockNodeSize != 0: + str := fmt.Sprintf("control block proof is not a multiple "+ + "of 32: %v", len(ctrlBlock)-ControlBlockBaseSize) + return nil, scriptError(ErrControlBlockInvalidLength, str) + } + + // With the basic sanity checking complete, we can now parse the + // control block. + leafVersion := TapscriptLeafVersion(ctrlBlock[0] & TaprootLeafMask) + + // Extract the parity of the y coordinate of the internal key. + var yIsOdd bool + if ctrlBlock[0]&0x01 == 0x01 { + yIsOdd = true + } + + // Next, we'll parse the public key, which is the 32 bytes following + // the leaf version. + rawKey := ctrlBlock[1:33] + pubKey, err := schnorr.ParsePubKey(rawKey) + if err != nil { + return nil, err + } + + // The rest of the bytes are the control block itself, which encodes a + // merkle proof of inclusion. + proofBytes := ctrlBlock[33:] + + return &ControlBlock{ + InternalKey: pubKey, + OutputKeyYIsOdd: yIsOdd, + LeafVersion: leafVersion, + InclusionProof: proofBytes, + }, nil +} + +// ComputeTaprootOutputKey calculates a top-level taproot output key given an +// internal key, and tapscript merkle root. The final key is derived as: +// taprootKey = internalKey + (h_tapTweak(internalKey || merkleRoot)*G). +func ComputeTaprootOutputKey(pubKey *btcec.PublicKey, + scriptRoot []byte) *btcec.PublicKey { + + // This routine only operates on x-only public keys where the public + // key always has an even y coordinate, so we'll re-parse it as such. + internalKey, _ := schnorr.ParsePubKey(schnorr.SerializePubKey(pubKey)) + + // First, we'll compute the tap tweak hash that commits to the internal + // key and the merkle script root. + tapTweakHash := chainhash.TaggedHash( + chainhash.TagTapTweak, schnorr.SerializePubKey(internalKey), + scriptRoot, + ) + + // With the tap tweak computed, we'll need to convert the merkle root + // into something in the domain we can manipulate: a scalar value mod + // N. + var tweakScalar btcec.ModNScalar + tweakScalar.SetBytes((*[32]byte)(tapTweakHash)) + + // Next, we'll need to convert the internal key to jacobian coordinates + // as the routines we need only operate on this type. + var internalPoint btcec.JacobianPoint + internalKey.AsJacobian(&internalPoint) + + // With our intermediate data obtained, we'll now compute: + // + // taprootKey = internalPoint + (tapTweak*G). + var tPoint, taprootKey btcec.JacobianPoint + btcec.ScalarBaseMultNonConst(&tweakScalar, &tPoint) + btcec.AddNonConst(&internalPoint, &tPoint, &taprootKey) + + // Finally, we'll convert the key back to affine coordinates so we can + // return the format of public key we usually use. + taprootKey.ToAffine() + + return btcec.NewPublicKey(&taprootKey.X, &taprootKey.Y) +} + +// ComputeTaprootKeyNoScript calculates the top-level taproot output key given +// an internal key, and a desire that the only way an output can be spent is +// with the keyspend path. This is useful for normal wallet operations that +// don't need any other additional spending conditions. +func ComputeTaprootKeyNoScript(internalKey *btcec.PublicKey) *btcec.PublicKey { + // We'll compute a custom tap tweak hash that just commits to the key, + // rather than an actual root hash. + fakeScriptroot := []byte{} + + return ComputeTaprootOutputKey(internalKey, fakeScriptroot) +} + +// TweakTaprootPrivKey applies the same operation as ComputeTaprootOutputKey, +// but on the private key instead. The final key is derived as: privKey + +// h_tapTweak(internalKey || merkleRoot) % N, where N is the order of the +// secp256k1 curve, and merkleRoot is the root hash of the tapscript tree. +func TweakTaprootPrivKey(privKey btcec.PrivateKey, + scriptRoot []byte) *btcec.PrivateKey { + + // If the corresponding public key has an odd y coordinate, then we'll + // negate the private key as specified in BIP 341. + privKeyScalar := privKey.Key + pubKeyBytes := privKey.PubKey().SerializeCompressed() + if pubKeyBytes[0] == secp.PubKeyFormatCompressedOdd { + privKeyScalar.Negate() + } + + // Next, we'll compute the tap tweak hash that commits to the internal + // key and the merkle script root. We'll snip off the extra parity byte + // from the compressed serialization and use that directly. + schnorrKeyBytes := pubKeyBytes[1:] + tapTweakHash := chainhash.TaggedHash( + chainhash.TagTapTweak, schnorrKeyBytes, scriptRoot, + ) + + // Map the private key to a ModNScalar which is needed to perform + // operation mod the curve order. + var tweakScalar btcec.ModNScalar + tweakScalar.SetBytes((*[32]byte)(tapTweakHash)) + + // Now that we have the private key in its may negated form, we'll add + // the script root as a tweak. As we're using a ModNScalar all + // operations are already normalized mod the curve order. + privTweak := privKeyScalar.Add(&tweakScalar) + + return btcec.PrivKeyFromScalar(privTweak) +} + +// VerifyTaprootLeafCommitment attempts to verify a taproot commitment of the +// revealed script within the taprootWitnessProgram (a schnorr public key) +// given the required information included in the control block. An error is +// returned if the reconstructed taproot commitment (a function of the merkle +// root and the internal key) doesn't match the passed witness program. +func VerifyTaprootLeafCommitment(controlBlock *ControlBlock, + taprootWitnessProgram []byte, revealedScript []byte) error { + + // First, we'll calculate the root hash from the given proof and + // revealed script. + rootHash := controlBlock.RootHash(revealedScript) + + // Next, we'll construct the final commitment (creating the external or + // taproot output key) as a function of this commitment and the + // included internal key: taprootKey = internalKey + (tPoint*G). + taprootKey := ComputeTaprootOutputKey( + controlBlock.InternalKey, rootHash, + ) + + // If we convert the taproot key to a witness program (we just need to + // serialize the public key), then it should exactly match the witness + // program passed in. + expectedWitnessProgram := schnorr.SerializePubKey(taprootKey) + if !bytes.Equal(expectedWitnessProgram, taprootWitnessProgram) { + + return scriptError(ErrTaprootMerkleProofInvalid, "") + } + + // Finally, we'll verify that the parity of the y coordinate of the + // public key we've derived matches the control block. + derivedYIsOdd := (taprootKey.SerializeCompressed()[0] == + secp.PubKeyFormatCompressedOdd) + if controlBlock.OutputKeyYIsOdd != derivedYIsOdd { + str := fmt.Sprintf("control block y is odd: %v, derived "+ + "parity is odd: %v", controlBlock.OutputKeyYIsOdd, + derivedYIsOdd) + return scriptError(ErrTaprootOutputKeyParityMismatch, str) + } + + // Otherwise, if we reach here, the commitment opening is valid and + // execution can continue. + return nil +} + +// TapNode represents an abstract node in a tapscript merkle tree. A node is +// either a branch or a leaf. +type TapNode interface { + // TapHash returns the hash of the node. This will either be a tagged + // hash derived from a branch, or a leaf. + TapHash() chainhash.Hash + + // Left returns the left node. If this is a leaf node, this may be nil. + Left() TapNode + + // Right returns the right node. If this is a leaf node, this may be + // nil. + Right() TapNode +} + +// TapLeaf represents a leaf in a tapscript tree. A leaf has two components: +// the leaf version, and the script associated with that leaf version. +type TapLeaf struct { + // LeafVersion is the leaf version of this leaf. + LeafVersion TapscriptLeafVersion + + // Script is the script to be validated based on the specified leaf + // version. + Script []byte +} + +// Left rights the left node for this leaf. As this is a leaf the left node is +// nil. +func (t TapLeaf) Left() TapNode { + return nil +} + +// Right rights the right node for this leaf. As this is a leaf the right node +// is nil. +func (t TapLeaf) Right() TapNode { + return nil +} + +// NewBaseTapLeaf returns a new TapLeaf for the specified script, using the +// current base leaf version (BIP 342). +func NewBaseTapLeaf(script []byte) TapLeaf { + return TapLeaf{ + Script: script, + LeafVersion: BaseLeafVersion, + } +} + +// NewTapLeaf returns a new TapLeaf with the given leaf version and script to +// be committed to. +func NewTapLeaf(leafVersion TapscriptLeafVersion, script []byte) TapLeaf { + return TapLeaf{ + LeafVersion: leafVersion, + Script: script, + } +} + +// TapHash returns the hash digest of the target taproot script leaf. The +// digest is computed as: h_tapleaf(leafVersion || compactSizeof(script) || +// script). +func (t TapLeaf) TapHash() chainhash.Hash { + // TODO(roasbeef): cache these and the branch due to the recursive + // call, so memoize + + // The leaf encoding is: leafVersion || compactSizeof(script) || + // script, where compactSizeof returns the compact size needed to + // encode the value. + var leafEncoding bytes.Buffer + + _ = leafEncoding.WriteByte(byte(t.LeafVersion)) + _ = wire.WriteVarBytes(&leafEncoding, 0, t.Script) + + return *chainhash.TaggedHash(chainhash.TagTapLeaf, leafEncoding.Bytes()) +} + +// TapBranch represents an internal branch in the tapscript tree. The left or +// right nodes may either be another branch, leaves, or a combination of both. +type TapBranch struct { + // leftNode is the left node, this cannot be nil. + leftNode TapNode + + // rightNode is the right node, this cannot be nil. + rightNode TapNode +} + +// NewTapBranch creates a new internal branch from a left and right node. +func NewTapBranch(l, r TapNode) TapBranch { + + return TapBranch{ + leftNode: l, + rightNode: r, + } +} + +// Left is the left node of the branch, this might be a leaf or another +// branch. +func (t TapBranch) Left() TapNode { + return t.leftNode +} + +// Right is the right node of a branch, this might be a leaf or another branch. +func (t TapBranch) Right() TapNode { + return t.rightNode +} + +// TapHash returns the hash digest of the taproot internal branch given a left +// and right node. The final hash digest is: h_tapbranch(leftNode || +// rightNode), where leftNode is the lexicographically smaller of the two nodes. +func (t TapBranch) TapHash() chainhash.Hash { + leftHash := t.leftNode.TapHash() + rightHash := t.rightNode.TapHash() + return tapBranchHash(leftHash[:], rightHash[:]) +} + +// tapBranchHash takes the raw tap hashes of the right and left nodes and +// hashes them into a branch. See The TapBranch method for the specifics. +func tapBranchHash(l, r []byte) chainhash.Hash { + if bytes.Compare(l[:], r[:]) > 0 { + l, r = r, l + } + + return *chainhash.TaggedHash( + chainhash.TagTapBranch, l[:], r[:], + ) +} + +// TapscriptProof is a proof of inclusion that a given leaf (a script and leaf +// version) is included within a top-level taproot output commitment. +type TapscriptProof struct { + // TapLeaf is the leaf that we want to prove inclusion for. + TapLeaf + + // RootNode is the root of the tapscript tree, this will be used to + // compute what the final output key looks like. + RootNode TapNode + + // InclusionProof is the tail end of the control block that contains + // the series of hashes (the sibling hashes up the tree), that when + // hashed together allow us to re-derive the top level taproot output. + InclusionProof []byte +} + +// ToControlBlock maps the tapscript proof into a fully valid control block +// that can be used as a witness item for a tapscript spend. +func (t *TapscriptProof) ToControlBlock(internalKey *btcec.PublicKey) ControlBlock { + // Compute the total level output commitment based on the populated + // root node. + rootHash := t.RootNode.TapHash() + taprootKey := ComputeTaprootOutputKey( + internalKey, rootHash[:], + ) + + // With the commitment computed we can obtain the bit that denotes if + // the resulting key has an odd y coordinate or not. + var outputKeyYIsOdd bool + if taprootKey.SerializeCompressed()[0] == + secp.PubKeyFormatCompressedOdd { + + outputKeyYIsOdd = true + } + + return ControlBlock{ + InternalKey: internalKey, + OutputKeyYIsOdd: outputKeyYIsOdd, + LeafVersion: t.TapLeaf.LeafVersion, + InclusionProof: t.InclusionProof, + } +} + +// IndexedTapScriptTree reprints a fully contracted tapscript tree. The +// RootNode can be used to traverse down the full tree. In addition, complete +// inclusion proofs for each leaf are included as well, with an index into the +// slice of proof based on the tap leaf hash of a given leaf. +type IndexedTapScriptTree struct { + // RootNode is the root of the tapscript tree. RootNode.TapHash() can + // be used to extract the hash needed to derive the taptweak committed + // to in the taproot output. + RootNode TapNode + + // LeafMerkleProofs is a slice that houses the series of merkle + // inclusion proofs for each leaf based on the input order of the + // leaves. + LeafMerkleProofs []TapscriptProof + + // LeafProofIndex maps the TapHash() of a given leaf node to the index + // within the LeafMerkleProofs array above. This can be used to + // retrieve the inclusion proof for a given script when constructing + // the witness stack and control block for spending a tapscript path. + LeafProofIndex map[chainhash.Hash]int +} + +// NewIndexedTapScriptTree creates a new empty tapscript tree that has enough +// space to hold information for the specified amount of leaves. +func NewIndexedTapScriptTree(numLeaves int) *IndexedTapScriptTree { + return &IndexedTapScriptTree{ + LeafMerkleProofs: make([]TapscriptProof, numLeaves), + LeafProofIndex: make(map[chainhash.Hash]int, numLeaves), + } +} + +// hashTapNodes takes a left and right now, and returns the left and right tap +// hashes, along with the new combined node. If both nodes are nil, nil +// pointers are returned. If the right now is nil, then the left node is passed +// in, which effectively will "lift" the node up in the tree as long as it +// doesn't have any siblings. +func hashTapNodes(left, right TapNode) (*chainhash.Hash, *chainhash.Hash, TapNode) { + switch { + // If there's no left child, then this is a "nil" portion of the array + // tree, so well thread thru nil. + case left == nil: + return nil, nil, nil + + // If there's no right child, then this is a single node that'll be + // passed all the way up the tree as it has no children. + case right == nil: + return nil, nil, left + } + + // The result of hashing two nodes will always be a branch, so we start + // with that. + leftHash := left.TapHash() + rightHash := right.TapHash() + + return &leftHash, &rightHash, NewTapBranch(left, right) +} + +// leafDescendants is a recursive algorithm that returns all the leaf nodes +// that are a decedents of this tree. This is used to collect the series of +// nodes we need to extend the inclusion proof of each time we go up in the +// tree. +func leafDescendants(node TapNode) []TapNode { + // A leaf node has no decedents, so we just return it directly. + if node.Left() == nil && node.Right() == nil { + return []TapNode{node} + } + + // Otherwise, get the descendants of the left and right sub-trees to + // return. + leftLeaves := leafDescendants(node.Left()) + rightLeaves := leafDescendants(node.Right()) + + return append(leftLeaves, rightLeaves...) +} + +// AssembleTaprootScriptTree constructs a new fully indexed tapscript tree +// given a series of leaf nodes. A combination of a recursive data structure, +// and an array-based representation are used to both generate the tree and +// also accumulate all the necessary inclusion proofs in the same path. See the +// comment of blockchain.BuildMerkleTreeStore for further details. +func AssembleTaprootScriptTree(leaves ...TapLeaf) *IndexedTapScriptTree { + // If there's only a single leaf, then that becomes our root. + if len(leaves) == 1 { + // A lone leaf has no additional inclusion proof, as a verifier + // will just hash the leaf as the sole branch. + leaf := leaves[0] + return &IndexedTapScriptTree{ + RootNode: leaf, + LeafProofIndex: map[chainhash.Hash]int{ + leaf.TapHash(): 0, + }, + LeafMerkleProofs: []TapscriptProof{ + { + TapLeaf: leaf, + RootNode: leaf, + InclusionProof: nil, + }, + }, + } + } + + // We'll start out by populating the leaf index which maps a leave's + // taphash to its index within the tree. + scriptTree := NewIndexedTapScriptTree(len(leaves)) + for i, leaf := range leaves { + leafHash := leaf.TapHash() + scriptTree.LeafProofIndex[leafHash] = i + } + + var branches []TapBranch + for i := 0; i < len(leaves); i += 2 { + // If there's only a single leaf left, then we'll merge this + // with the last branch we have. + if i == len(leaves)-1 { + branchToMerge := branches[len(branches)-1] + leaf := leaves[i] + newBranch := NewTapBranch(branchToMerge, leaf) + + branches[len(branches)-1] = newBranch + + // The leaf includes the existing branch within its + // inclusion proof. + branchHash := branchToMerge.TapHash() + + scriptTree.LeafMerkleProofs[i].TapLeaf = leaf + scriptTree.LeafMerkleProofs[i].InclusionProof = append( + scriptTree.LeafMerkleProofs[i].InclusionProof, + branchHash[:]..., + ) + + // We'll also add this right hash to the inclusion of + // the left and right nodes of the branch. + lastLeafHash := leaf.TapHash() + + leftLeafHash := branchToMerge.Left().TapHash() + leftLeafIndex := scriptTree.LeafProofIndex[leftLeafHash] + scriptTree.LeafMerkleProofs[leftLeafIndex].InclusionProof = append( + scriptTree.LeafMerkleProofs[leftLeafIndex].InclusionProof, + lastLeafHash[:]..., + ) + + rightLeafHash := branchToMerge.Right().TapHash() + rightLeafIndex := scriptTree.LeafProofIndex[rightLeafHash] + scriptTree.LeafMerkleProofs[rightLeafIndex].InclusionProof = append( + scriptTree.LeafMerkleProofs[rightLeafIndex].InclusionProof, + lastLeafHash[:]..., + ) + + continue + } + + // While we still have leaves left, we'll combine two of them + // into a new branch node. + left, right := leaves[i], leaves[i+1] + nextBranch := NewTapBranch(left, right) + branches = append(branches, nextBranch) + + // The left node will use the right node as part of its + // inclusion proof, and vice versa. + leftHash := left.TapHash() + rightHash := right.TapHash() + + scriptTree.LeafMerkleProofs[i].TapLeaf = left + scriptTree.LeafMerkleProofs[i].InclusionProof = append( + scriptTree.LeafMerkleProofs[i].InclusionProof, + rightHash[:]..., + ) + + scriptTree.LeafMerkleProofs[i+1].TapLeaf = right + scriptTree.LeafMerkleProofs[i+1].InclusionProof = append( + scriptTree.LeafMerkleProofs[i+1].InclusionProof, + leftHash[:]..., + ) + } + + // In this second phase, we'll merge all the leaf branches we have one + // by one until we have our final root. + var rootNode TapNode + for len(branches) != 0 { + // When we only have a single branch left, then that becomes + // our root. + if len(branches) == 1 { + rootNode = branches[0] + break + } + + left, right := branches[0], branches[1] + + newBranch := NewTapBranch(left, right) + + branches = branches[2:] + + branches = append(branches, newBranch) + + // Accumulate the sibling hash of this new branch for all the + // leaves that are its children. + leftLeafDescendants := leafDescendants(left) + rightLeafDescendants := leafDescendants(right) + + leftHash, rightHash := left.TapHash(), right.TapHash() + + // For each left hash that's a leaf descendants, well add the + // right sibling as that sibling is needed to construct the new + // internal branch we just created. We also do the same for the + // siblings of the right node. + for _, leftLeaf := range leftLeafDescendants { + leafHash := leftLeaf.TapHash() + leafIndex := scriptTree.LeafProofIndex[leafHash] + + scriptTree.LeafMerkleProofs[leafIndex].InclusionProof = append( + scriptTree.LeafMerkleProofs[leafIndex].InclusionProof, + rightHash[:]..., + ) + } + for _, rightLeaf := range rightLeafDescendants { + leafHash := rightLeaf.TapHash() + leafIndex := scriptTree.LeafProofIndex[leafHash] + + scriptTree.LeafMerkleProofs[leafIndex].InclusionProof = append( + scriptTree.LeafMerkleProofs[leafIndex].InclusionProof, + leftHash[:]..., + ) + } + } + + // Populate the top level root node pointer, as well as the pointer in + // each proof. + scriptTree.RootNode = rootNode + for i := range scriptTree.LeafMerkleProofs { + scriptTree.LeafMerkleProofs[i].RootNode = rootNode + } + + return scriptTree +} + +// PayToTaprootScript creates a pk script for a pay-to-taproot output key. +func PayToTaprootScript(taprootKey *btcec.PublicKey) ([]byte, error) { + return NewScriptBuilder(). + AddOp(OP_1). + AddData(schnorr.SerializePubKey(taprootKey)). + Script() +} diff --git a/txscript/taproot_test.go b/txscript/taproot_test.go new file mode 100644 index 0000000000..9c5bb573a4 --- /dev/null +++ b/txscript/taproot_test.go @@ -0,0 +1,399 @@ +// Copyright (c) 2013-2022 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package txscript + +import ( + "bytes" + "encoding/hex" + "fmt" + prand "math/rand" + "testing" + "testing/quick" + + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcec/v2/schnorr" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/btcutil/hdkeychain" + "github.com/btcsuite/btcd/chaincfg" + secp "github.com/decred/dcrd/dcrec/secp256k1/v4" + "github.com/stretchr/testify/require" +) + +var ( + testPubBytes, _ = hex.DecodeString("F9308A019258C31049344F85F89D5229B" + + "531C845836F99B08601F113BCE036F9") + + // rootKey is the test root key defined in the test vectors: + // https://github.com/bitcoin/bips/blob/master/bip-0086.mediawiki + rootKey, _ = hdkeychain.NewKeyFromString( + "xprv9s21ZrQH143K3GJpoapnV8SFfukcVBSfeCficPSGfubmSFDxo1kuHnLi" + + "sriDvSnRRuL2Qrg5ggqHKNVpxR86QEC8w35uxmGoggxtQTPvfUu", + ) + + // accountPath is the base path for BIP86 (m/86'/0'/0'). + accountPath = []uint32{ + 86 + hdkeychain.HardenedKeyStart, hdkeychain.HardenedKeyStart, + hdkeychain.HardenedKeyStart, + } + expectedExternalAddresses = []string{ + "bc1p5cyxnuxmeuwuvkwfem96lqzszd02n6xdcjrs20cac6yqjjwudpxqkedrcr", + "bc1p4qhjn9zdvkux4e44uhx8tc55attvtyu358kutcqkudyccelu0was9fqzwh", + } + expectedInternalAddresses = []string{ + "bc1p3qkhfews2uk44qtvauqyr2ttdsw7svhkl9nkm9s9c3x4ax5h60wqwruhk7", + } +) + +// TestControlBlockParsing tests that we're able to generate and parse a valid +// control block. +func TestControlBlockParsing(t *testing.T) { + t.Parallel() + + var testCases = []struct { + controlBlockGen func() []byte + valid bool + }{ + // An invalid control block, it's only 5 bytes and needs to be + // at least 33 bytes. + { + controlBlockGen: func() []byte { + return bytes.Repeat([]byte{0x00}, 5) + }, + valid: false, + }, + + // An invalid control block, it's greater than the largest + // accepted control block. + { + controlBlockGen: func() []byte { + return bytes.Repeat([]byte{0x00}, ControlBlockMaxSize+1) + }, + valid: false, + }, + + // An invalid control block, it isn't a multiple of 32 bytes + // enough though it has a valid starting byte length. + { + controlBlockGen: func() []byte { + return bytes.Repeat([]byte{0x00}, ControlBlockBaseSize+34) + }, + valid: false, + }, + + // A valid control block, of the largest possible size. + { + controlBlockGen: func() []byte { + privKey, _ := btcec.NewPrivateKey() + pubKey := privKey.PubKey() + + yIsOdd := (pubKey.SerializeCompressed()[0] == + secp.PubKeyFormatCompressedOdd) + + ctrl := ControlBlock{ + InternalKey: pubKey, + OutputKeyYIsOdd: yIsOdd, + LeafVersion: BaseLeafVersion, + InclusionProof: bytes.Repeat( + []byte{0x00}, + ControlBlockMaxSize-ControlBlockBaseSize, + ), + } + + ctrlBytes, _ := ctrl.ToBytes() + return ctrlBytes + }, + valid: true, + }, + + // A valid control block, only has a single element in the + // proof as the tree only has a single element. + { + controlBlockGen: func() []byte { + privKey, _ := btcec.NewPrivateKey() + pubKey := privKey.PubKey() + + yIsOdd := (pubKey.SerializeCompressed()[0] == + secp.PubKeyFormatCompressedOdd) + + ctrl := ControlBlock{ + InternalKey: pubKey, + OutputKeyYIsOdd: yIsOdd, + LeafVersion: BaseLeafVersion, + InclusionProof: bytes.Repeat( + []byte{0x00}, ControlBlockNodeSize, + ), + } + + ctrlBytes, _ := ctrl.ToBytes() + return ctrlBytes + }, + valid: true, + }, + } + for i, testCase := range testCases { + ctrlBlockBytes := testCase.controlBlockGen() + + ctrlBlock, err := ParseControlBlock(ctrlBlockBytes) + switch { + case testCase.valid && err != nil: + t.Fatalf("#%v: unable to parse valid control block: %v", i, err) + + case !testCase.valid && err == nil: + t.Fatalf("#%v: invalid control block should have failed: %v", i, err) + } + + if !testCase.valid { + continue + } + + // If we serialize the control block, we should get the exact same + // set of bytes as the input. + ctrlBytes, err := ctrlBlock.ToBytes() + if err != nil { + t.Fatalf("#%v: unable to encode bytes: %v", i, err) + } + if !bytes.Equal(ctrlBytes, ctrlBlockBytes) { + t.Fatalf("#%v: encoding mismatch: expected %x, "+ + "got %x", i, ctrlBlockBytes, ctrlBytes) + } + } +} + +// TestTaprootScriptSpendTweak tests that for any 32-byte hypothetical script +// root, the resulting tweaked public key is the same as tweaking the private +// key, then generating a public key from that. This test a quickcheck test to +// assert the following invariant: +// +// - taproot_tweak_pubkey(pubkey_gen(seckey), h)[1] == +// pubkey_gen(taproot_tweak_seckey(seckey, h)) +func TestTaprootScriptSpendTweak(t *testing.T) { + t.Parallel() + + // Assert that if we use this x value as the hash of the script root, + // then if we generate a tweaked public key, it's the same key as if we + // used that key to generate the tweaked + // private key, and then generated the public key from that. + f := func(x [32]byte) bool { + privKey, err := btcec.NewPrivateKey() + if err != nil { + return false + } + + // Generate the tweaked public key using the x value as the + // script root. + tweakedPub := ComputeTaprootOutputKey(privKey.PubKey(), x[:]) + + // Now we'll generate the corresponding tweaked private key. + tweakedPriv := TweakTaprootPrivKey(*privKey, x[:]) + + // The public key for this private key should be the same as + // the tweaked public key we generate above. + return tweakedPub.IsEqual(tweakedPriv.PubKey()) && + bytes.Equal( + schnorr.SerializePubKey(tweakedPub), + schnorr.SerializePubKey(tweakedPriv.PubKey()), + ) + } + + if err := quick.Check(f, nil); err != nil { + t.Fatalf("tweaked public/private key mapping is "+ + "incorrect: %v", err) + } + +} + +// TestTaprootTweakNoMutation tests that the underlying private key passed into +// TweakTaprootPrivKey is never mutated. +func TestTaprootTweakNoMutation(t *testing.T) { + t.Parallel() + + // Assert that given a random tweak, and a random private key, that if + // we tweak the private key it remains unaffected. + f := func(privBytes, tweak [32]byte) bool { + privKey, _ := btcec.PrivKeyFromBytes(privBytes[:]) + + // Now we'll generate the corresponding tweaked private key. + tweakedPriv := TweakTaprootPrivKey(*privKey, tweak[:]) + + // The tweaked private key and the original private key should + // NOT be the same. + if *privKey == *tweakedPriv { + t.Logf("private key was mutated") + return false + } + + // We should be able to re-derive the private key from raw + // bytes and have that match up again. + privKeyCopy, _ := btcec.PrivKeyFromBytes(privBytes[:]) + if *privKey != *privKeyCopy { + t.Logf("private doesn't match") + return false + } + + return true + } + + if err := quick.Check(f, nil); err != nil { + t.Fatalf("private key modified: %v", err) + } +} + +// TestTaprootConstructKeyPath tests the key spend only taproot construction. +func TestTaprootConstructKeyPath(t *testing.T) { + checkPath := func(branch uint32, expectedAddresses []string) { + path, err := derivePath(rootKey, append(accountPath, branch)) + require.NoError(t, err) + + for index, expectedAddr := range expectedAddresses { + extendedKey, err := path.Derive(uint32(index)) + require.NoError(t, err) + + pubKey, err := extendedKey.ECPubKey() + require.NoError(t, err) + + tapKey := ComputeTaprootKeyNoScript(pubKey) + + addr, err := btcutil.NewAddressTaproot( + schnorr.SerializePubKey(tapKey), + &chaincfg.MainNetParams, + ) + require.NoError(t, err) + + require.Equal(t, expectedAddr, addr.String()) + } + } + checkPath(0, expectedExternalAddresses) + checkPath(1, expectedInternalAddresses) +} + +func derivePath(key *hdkeychain.ExtendedKey, path []uint32) ( + *hdkeychain.ExtendedKey, error) { + + var ( + currentKey = key + err error + ) + for _, pathPart := range path { + currentKey, err = currentKey.Derive(pathPart) + if err != nil { + return nil, err + } + } + return currentKey, nil +} + +// TestTapscriptCommitmentVerification that given a valid control block, proof +// we're able to both generate and validate validate script tree leaf inclusion +// proofs. +func TestTapscriptCommitmentVerification(t *testing.T) { + t.Parallel() + + // make from 0 to 1 leaf + // ensure verifies properly + testCases := []struct { + numLeaves int + + valid bool + + treeMutateFunc func(*IndexedTapScriptTree) + + ctrlBlockMutateFunc func(*ControlBlock) + }{ + // A valid merkle proof of a single leaf. + { + numLeaves: 1, + valid: true, + }, + + // A valid series of merkle proofs with an odd number of leaves. + { + numLeaves: 3, + valid: true, + }, + + // A valid series of merkle proofs with an even number of leaves. + { + numLeaves: 4, + valid: true, + }, + + // An invalid merkle proof, we modify the last byte of one of + // the leaves. + { + numLeaves: 4, + valid: false, + treeMutateFunc: func(t *IndexedTapScriptTree) { + for _, leafProof := range t.LeafMerkleProofs { + leafProof.InclusionProof[0] ^= 1 + } + }, + }, + + { + // An invalid series of proofs, we modify the control + // block to not match the parity of the final output + // key commitment. + numLeaves: 2, + valid: false, + ctrlBlockMutateFunc: func(c *ControlBlock) { + c.OutputKeyYIsOdd = !c.OutputKeyYIsOdd + }, + }, + } + for _, testCase := range testCases { + testName := fmt.Sprintf("num_leaves=%v, valid=%v, treeMutate=%v, "+ + "ctrlBlockMutate=%v", testCase.numLeaves, testCase.valid, + testCase.treeMutateFunc == nil, testCase.ctrlBlockMutateFunc == nil) + + t.Run(testName, func(t *testing.T) { + tapScriptLeaves := make([]TapLeaf, testCase.numLeaves) + for i := 0; i < len(tapScriptLeaves); i++ { + numLeafBytes := prand.Intn(1000) + scriptBytes := make([]byte, numLeafBytes) + if _, err := prand.Read(scriptBytes[:]); err != nil { + t.Fatalf("unable to read rand bytes: %v", err) + } + tapScriptLeaves[i] = NewBaseTapLeaf(scriptBytes) + } + + scriptTree := AssembleTaprootScriptTree(tapScriptLeaves...) + + if testCase.treeMutateFunc != nil { + testCase.treeMutateFunc(scriptTree) + } + + internalKey, _ := btcec.NewPrivateKey() + + rootHash := scriptTree.RootNode.TapHash() + outputKey := ComputeTaprootOutputKey( + internalKey.PubKey(), rootHash[:], + ) + + for _, leafProof := range scriptTree.LeafMerkleProofs { + ctrlBlock := leafProof.ToControlBlock( + internalKey.PubKey(), + ) + + if testCase.ctrlBlockMutateFunc != nil { + testCase.ctrlBlockMutateFunc(&ctrlBlock) + } + + err := VerifyTaprootLeafCommitment( + &ctrlBlock, schnorr.SerializePubKey(outputKey), + leafProof.TapLeaf.Script, + ) + valid := err == nil + + if valid != testCase.valid { + t.Fatalf("test case mismatch: expected "+ + "valid=%v, got valid=%v", testCase.valid, + valid) + } + } + + // TODO(roasbeef): index correctness + }) + } +} diff --git a/txscript/tokenizer.go b/txscript/tokenizer.go new file mode 100644 index 0000000000..4c7c883a27 --- /dev/null +++ b/txscript/tokenizer.go @@ -0,0 +1,209 @@ +// Copyright (c) 2019 The Decred developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package txscript + +import ( + "encoding/binary" + "fmt" +) + +// opcodeArrayRef is used to break initialization cycles. +var opcodeArrayRef *[256]opcode + +func init() { + opcodeArrayRef = &opcodeArray +} + +// ScriptTokenizer provides a facility for easily and efficiently tokenizing +// transaction scripts without creating allocations. Each successive opcode is +// parsed with the Next function, which returns false when iteration is +// complete, either due to successfully tokenizing the entire script or +// encountering a parse error. In the case of failure, the Err function may be +// used to obtain the specific parse error. +// +// Upon successfully parsing an opcode, the opcode and data associated with it +// may be obtained via the Opcode and Data functions, respectively. +// +// The ByteIndex function may be used to obtain the tokenizer's current offset +// into the raw script. +type ScriptTokenizer struct { + script []byte + version uint16 + offset int32 + opcodePos int32 + op *opcode + data []byte + err error +} + +// Done returns true when either all opcodes have been exhausted or a parse +// failure was encountered and therefore the state has an associated error. +func (t *ScriptTokenizer) Done() bool { + return t.err != nil || t.offset >= int32(len(t.script)) +} + +// Next attempts to parse the next opcode and returns whether or not it was +// successful. It will not be successful if invoked when already at the end of +// the script, a parse failure is encountered, or an associated error already +// exists due to a previous parse failure. +// +// In the case of a true return, the parsed opcode and data can be obtained with +// the associated functions and the offset into the script will either point to +// the next opcode or the end of the script if the final opcode was parsed. +// +// In the case of a false return, the parsed opcode and data will be the last +// successfully parsed values (if any) and the offset into the script will +// either point to the failing opcode or the end of the script if the function +// was invoked when already at the end of the script. +// +// Invoking this function when already at the end of the script is not +// considered an error and will simply return false. +func (t *ScriptTokenizer) Next() bool { + if t.Done() { + return false + } + + // Increment the op code position each time we attempt to parse the + // next op code. Note that since the starting value is -1 (no op codes + // parsed), by incrementing here, we start at 0, then 1, and so on for + // the other op codes. + t.opcodePos++ + + op := &opcodeArrayRef[t.script[t.offset]] + switch { + // No additional data. Note that some of the opcodes, notably OP_1NEGATE, + // OP_0, and OP_[1-16] represent the data themselves. + case op.length == 1: + t.offset++ + t.op = op + t.data = nil + return true + + // Data pushes of specific lengths -- OP_DATA_[1-75]. + case op.length > 1: + script := t.script[t.offset:] + if len(script) < op.length { + str := fmt.Sprintf("opcode %s requires %d bytes, but script only "+ + "has %d remaining", op.name, op.length, len(script)) + t.err = scriptError(ErrMalformedPush, str) + return false + } + + // Move the offset forward and set the opcode and data accordingly. + t.offset += int32(op.length) + t.op = op + t.data = script[1:op.length] + return true + + // Data pushes with parsed lengths -- OP_PUSHDATA{1,2,4}. + case op.length < 0: + script := t.script[t.offset+1:] + if len(script) < -op.length { + str := fmt.Sprintf("opcode %s requires %d bytes, but script only "+ + "has %d remaining", op.name, -op.length, len(script)) + t.err = scriptError(ErrMalformedPush, str) + return false + } + + // Next -length bytes are little endian length of data. + var dataLen int32 + switch op.length { + case -1: + dataLen = int32(script[0]) + case -2: + dataLen = int32(binary.LittleEndian.Uint16(script[:2])) + case -4: + dataLen = int32(binary.LittleEndian.Uint32(script[:4])) + default: + // In practice it should be impossible to hit this + // check as each op code is predefined, and only uses + // the specified lengths. + str := fmt.Sprintf("invalid opcode length %d", op.length) + t.err = scriptError(ErrMalformedPush, str) + return false + } + + // Move to the beginning of the data. + script = script[-op.length:] + + // Disallow entries that do not fit script or were sign extended. + if dataLen > int32(len(script)) || dataLen < 0 { + str := fmt.Sprintf("opcode %s pushes %d bytes, but script only "+ + "has %d remaining", op.name, dataLen, len(script)) + t.err = scriptError(ErrMalformedPush, str) + return false + } + + // Move the offset forward and set the opcode and data accordingly. + t.offset += 1 + int32(-op.length) + dataLen + t.op = op + t.data = script[:dataLen] + return true + } + + // The only remaining case is an opcode with length zero which is + // impossible. + panic("unreachable") +} + +// Script returns the full script associated with the tokenizer. +func (t *ScriptTokenizer) Script() []byte { + return t.script +} + +// ByteIndex returns the current offset into the full script that will be parsed +// next and therefore also implies everything before it has already been parsed. +func (t *ScriptTokenizer) ByteIndex() int32 { + return t.offset +} + +// OpcodePosition returns the current op code counter. Unlike the ByteIndex +// above (referred to as the program counter or pc at times), this is +// incremented with each node op code, and isn't incremented more than once for +// push datas. +// +// NOTE: If no op codes have been parsed, this returns -1. +func (t *ScriptTokenizer) OpcodePosition() int32 { + return t.opcodePos +} + +// Opcode returns the current opcode associated with the tokenizer. +func (t *ScriptTokenizer) Opcode() byte { + return t.op.value +} + +// Data returns the data associated with the most recently successfully parsed +// opcode. +func (t *ScriptTokenizer) Data() []byte { + return t.data +} + +// Err returns any errors currently associated with the tokenizer. This will +// only be non-nil in the case a parsing error was encountered. +func (t *ScriptTokenizer) Err() error { + return t.err +} + +// MakeScriptTokenizer returns a new instance of a script tokenizer. Passing +// an unsupported script version will result in the returned tokenizer +// immediately having an err set accordingly. +// +// See the docs for ScriptTokenizer for more details. +func MakeScriptTokenizer(scriptVersion uint16, script []byte) ScriptTokenizer { + // Only version 0 scripts are currently supported. + var err error + if scriptVersion != 0 { + str := fmt.Sprintf("script version %d is not supported", scriptVersion) + err = scriptError(ErrUnsupportedScriptVersion, str) + + } + return ScriptTokenizer{ + version: scriptVersion, + script: script, + err: err, + // We use a value of negative 1 here so the first op code has a value of 0. + opcodePos: -1, + } +} diff --git a/txscript/tokenizer_test.go b/txscript/tokenizer_test.go new file mode 100644 index 0000000000..fd008bfc54 --- /dev/null +++ b/txscript/tokenizer_test.go @@ -0,0 +1,259 @@ +// Copyright (c) 2019 The Decred developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package txscript + +import ( + "bytes" + "fmt" + "testing" +) + +// TestScriptTokenizer ensures a wide variety of behavior provided by the script +// tokenizer performs as expected. +func TestScriptTokenizer(t *testing.T) { + t.Skip() + + type expectedResult struct { + op byte // expected parsed opcode + data []byte // expected parsed data + index int32 // expected index into raw script after parsing token + } + + type tokenizerTest struct { + name string // test description + script []byte // the script to tokenize + expected []expectedResult // the expected info after parsing each token + finalIdx int32 // the expected final byte index + err error // expected error + } + + // Add both positive and negative tests for OP_DATA_1 through OP_DATA_75. + const numTestsHint = 100 // Make prealloc linter happy. + tests := make([]tokenizerTest, 0, numTestsHint) + for op := byte(OP_DATA_1); op < OP_DATA_75; op++ { + data := bytes.Repeat([]byte{0x01}, int(op)) + tests = append(tests, tokenizerTest{ + name: fmt.Sprintf("OP_DATA_%d", op), + script: append([]byte{op}, data...), + expected: []expectedResult{{op, data, 1 + int32(op)}}, + finalIdx: 1 + int32(op), + err: nil, + }) + + // Create test that provides one less byte than the data push requires. + tests = append(tests, tokenizerTest{ + name: fmt.Sprintf("short OP_DATA_%d", op), + script: append([]byte{op}, data[1:]...), + expected: nil, + finalIdx: 0, + err: scriptError(ErrMalformedPush, ""), + }) + } + + // Add both positive and negative tests for OP_PUSHDATA{1,2,4}. + data := mustParseShortForm("0x01{76}") + tests = append(tests, []tokenizerTest{{ + name: "OP_PUSHDATA1", + script: mustParseShortForm("OP_PUSHDATA1 0x4c 0x01{76}"), + expected: []expectedResult{{OP_PUSHDATA1, data, 2 + int32(len(data))}}, + finalIdx: 2 + int32(len(data)), + err: nil, + }, { + name: "OP_PUSHDATA1 no data length", + script: mustParseShortForm("OP_PUSHDATA1"), + expected: nil, + finalIdx: 0, + err: scriptError(ErrMalformedPush, ""), + }, { + name: "OP_PUSHDATA1 short data by 1 byte", + script: mustParseShortForm("OP_PUSHDATA1 0x4c 0x01{75}"), + expected: nil, + finalIdx: 0, + err: scriptError(ErrMalformedPush, ""), + }, { + name: "OP_PUSHDATA2", + script: mustParseShortForm("OP_PUSHDATA2 0x4c00 0x01{76}"), + expected: []expectedResult{{OP_PUSHDATA2, data, 3 + int32(len(data))}}, + finalIdx: 3 + int32(len(data)), + err: nil, + }, { + name: "OP_PUSHDATA2 no data length", + script: mustParseShortForm("OP_PUSHDATA2"), + expected: nil, + finalIdx: 0, + err: scriptError(ErrMalformedPush, ""), + }, { + name: "OP_PUSHDATA2 short data by 1 byte", + script: mustParseShortForm("OP_PUSHDATA2 0x4c00 0x01{75}"), + expected: nil, + finalIdx: 0, + err: scriptError(ErrMalformedPush, ""), + }, { + name: "OP_PUSHDATA4", + script: mustParseShortForm("OP_PUSHDATA4 0x4c000000 0x01{76}"), + expected: []expectedResult{{OP_PUSHDATA4, data, 5 + int32(len(data))}}, + finalIdx: 5 + int32(len(data)), + err: nil, + }, { + name: "OP_PUSHDATA4 no data length", + script: mustParseShortForm("OP_PUSHDATA4"), + expected: nil, + finalIdx: 0, + err: scriptError(ErrMalformedPush, ""), + }, { + name: "OP_PUSHDATA4 short data by 1 byte", + script: mustParseShortForm("OP_PUSHDATA4 0x4c000000 0x01{75}"), + expected: nil, + finalIdx: 0, + err: scriptError(ErrMalformedPush, ""), + }}...) + + // Add tests for OP_0, and OP_1 through OP_16 (small integers/true/false). + opcodes := []byte{OP_0} + for op := byte(OP_1); op < OP_16; op++ { + opcodes = append(opcodes, op) + } + for _, op := range opcodes { + tests = append(tests, tokenizerTest{ + name: fmt.Sprintf("OP_%d", op), + script: []byte{op}, + expected: []expectedResult{{op, nil, 1}}, + finalIdx: 1, + err: nil, + }) + } + + // Add various positive and negative tests for multi-opcode scripts. + tests = append(tests, []tokenizerTest{{ + name: "pay-to-pubkey-hash", + script: mustParseShortForm("DUP HASH160 DATA_20 0x01{20} EQUAL CHECKSIG"), + expected: []expectedResult{ + {OP_DUP, nil, 1}, {OP_HASH160, nil, 2}, + {OP_DATA_20, mustParseShortForm("0x01{20}"), 23}, + {OP_EQUAL, nil, 24}, {OP_CHECKSIG, nil, 25}, + }, + finalIdx: 25, + err: nil, + }, { + name: "almost pay-to-pubkey-hash (short data)", + script: mustParseShortForm("DUP HASH160 DATA_20 0x01{17} EQUAL CHECKSIG"), + expected: []expectedResult{ + {OP_DUP, nil, 1}, {OP_HASH160, nil, 2}, + }, + finalIdx: 2, + err: scriptError(ErrMalformedPush, ""), + }, { + name: "almost pay-to-pubkey-hash (overlapped data)", + script: mustParseShortForm("DUP HASH160 DATA_20 0x01{19} EQUAL CHECKSIG"), + expected: []expectedResult{ + {OP_DUP, nil, 1}, {OP_HASH160, nil, 2}, + {OP_DATA_20, mustParseShortForm("0x01{19} EQUAL"), 23}, + {OP_CHECKSIG, nil, 24}, + }, + finalIdx: 24, + err: nil, + }, { + name: "pay-to-script-hash", + script: mustParseShortForm("HASH160 DATA_20 0x01{20} EQUAL"), + expected: []expectedResult{ + {OP_HASH160, nil, 1}, + {OP_DATA_20, mustParseShortForm("0x01{20}"), 22}, + {OP_EQUAL, nil, 23}, + }, + finalIdx: 23, + err: nil, + }, { + name: "almost pay-to-script-hash (short data)", + script: mustParseShortForm("HASH160 DATA_20 0x01{18} EQUAL"), + expected: []expectedResult{ + {OP_HASH160, nil, 1}, + }, + finalIdx: 1, + err: scriptError(ErrMalformedPush, ""), + }, { + name: "almost pay-to-script-hash (overlapped data)", + script: mustParseShortForm("HASH160 DATA_20 0x01{19} EQUAL"), + expected: []expectedResult{ + {OP_HASH160, nil, 1}, + {OP_DATA_20, mustParseShortForm("0x01{19} EQUAL"), 22}, + }, + finalIdx: 22, + err: nil, + }}...) + + const scriptVersion = 0 + for _, test := range tests { + tokenizer := MakeScriptTokenizer(scriptVersion, test.script) + var opcodeNum int + for tokenizer.Next() { + // Ensure Next never returns true when there is an error set. + if err := tokenizer.Err(); err != nil { + t.Fatalf("%q: Next returned true when tokenizer has err: %v", + test.name, err) + } + + // Ensure the test data expects a token to be parsed. + op := tokenizer.Opcode() + data := tokenizer.Data() + if opcodeNum >= len(test.expected) { + t.Fatalf("%q: unexpected token '%d' (data: '%x')", test.name, + op, data) + } + expected := &test.expected[opcodeNum] + + // Ensure the opcode and data are the expected values. + if op != expected.op { + t.Fatalf("%q: unexpected opcode -- got %v, want %v", test.name, + op, expected.op) + } + if !bytes.Equal(data, expected.data) { + t.Fatalf("%q: unexpected data -- got %x, want %x", test.name, + data, expected.data) + } + + tokenizerIdx := tokenizer.ByteIndex() + if tokenizerIdx != expected.index { + t.Fatalf("%q: unexpected byte index -- got %d, want %d", + test.name, tokenizerIdx, expected.index) + } + + opcodeNum++ + } + + // Ensure the tokenizer claims it is done. This should be the case + // regardless of whether or not there was a parse error. + if !tokenizer.Done() { + t.Fatalf("%q: tokenizer claims it is not done", test.name) + } + + // Ensure the error is as expected. + if test.err == nil && tokenizer.Err() != nil { + t.Fatalf("%q: unexpected tokenizer err -- got %v, want nil", + test.name, tokenizer.Err()) + } else if test.err != nil { + if !IsErrorCode(tokenizer.Err(), test.err.(Error).ErrorCode) { + t.Fatalf("%q: unexpected tokenizer err -- got %v, want %v", + test.name, tokenizer.Err(), test.err.(Error).ErrorCode) + } + } + + // Ensure the final index is the expected value. + tokenizerIdx := tokenizer.ByteIndex() + if tokenizerIdx != test.finalIdx { + t.Fatalf("%q: unexpected final byte index -- got %d, want %d", + test.name, tokenizerIdx, test.finalIdx) + } + } +} + +// TestScriptTokenizerUnsupportedVersion ensures the tokenizer fails immediately +// with an unsupported script version. +func TestScriptTokenizerUnsupportedVersion(t *testing.T) { + const scriptVersion = 65535 + tokenizer := MakeScriptTokenizer(scriptVersion, nil) + if !IsErrorCode(tokenizer.Err(), ErrUnsupportedScriptVersion) { + t.Fatalf("script tokenizer did not error with unsupported version") + } +} diff --git a/upnp.go b/upnp.go index feb256d072..d06cf52f0d 100644 --- a/upnp.go +++ b/upnp.go @@ -36,6 +36,7 @@ import ( "bytes" "encoding/xml" "errors" + "fmt" "net" "net/http" "os" @@ -200,7 +201,7 @@ func getChildDevice(d *device, deviceType string) *device { return nil } -// getChildDevice searches the service list of device for a service with the +// getChildService searches the service list of device for a service with the // given type. func getChildService(d *device, serviceType string) *service { for i := range d.ServiceList.Service { @@ -229,7 +230,7 @@ func getServiceURL(rootURL string) (url string, err error) { } defer r.Body.Close() if r.StatusCode >= 400 { - err = errors.New(string(r.StatusCode)) + err = errors.New(fmt.Sprint(r.StatusCode)) return } var root root diff --git a/version.go b/version.go index fba55b5a37..e02315d434 100644 --- a/version.go +++ b/version.go @@ -17,8 +17,8 @@ const semanticAlphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr // versioning 2.0.0 spec (http://semver.org/). const ( appMajor uint = 0 - appMinor uint = 20 - appPatch uint = 1 + appMinor uint = 24 + appPatch uint = 2 // appPreRelease MUST only contain characters from semanticAlphabet // per the semantic versioning spec. diff --git a/wire/README.md b/wire/README.md index 646bc0a309..8660bbfd54 100644 --- a/wire/README.md +++ b/wire/README.md @@ -1,9 +1,9 @@ wire ==== -[![Build Status](http://img.shields.io/travis/btcsuite/btcd.svg)](https://travis-ci.org/btcsuite/btcd) +[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions) [![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) -[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/btcsuite/btcd/wire) +[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/wire) ======= Package wire implements the bitcoin wire protocol. A comprehensive suite of diff --git a/wire/bench_test.go b/wire/bench_test.go index f6637d4210..2f63fa30a6 100644 --- a/wire/bench_test.go +++ b/wire/bench_test.go @@ -8,6 +8,7 @@ import ( "bytes" "compress/bzip2" "fmt" + "io" "io/ioutil" "net" "os" @@ -63,38 +64,48 @@ var genesisCoinbaseTx = MsgTx{ // BenchmarkWriteVarInt1 performs a benchmark on how long it takes to write // a single byte variable length integer. func BenchmarkWriteVarInt1(b *testing.B) { + b.ReportAllocs() + for i := 0; i < b.N; i++ { - WriteVarInt(ioutil.Discard, 0, 1) + WriteVarInt(io.Discard, 0, 1) } } // BenchmarkWriteVarInt3 performs a benchmark on how long it takes to write // a three byte variable length integer. func BenchmarkWriteVarInt3(b *testing.B) { + b.ReportAllocs() + for i := 0; i < b.N; i++ { - WriteVarInt(ioutil.Discard, 0, 65535) + WriteVarInt(io.Discard, 0, 65535) } } // BenchmarkWriteVarInt5 performs a benchmark on how long it takes to write // a five byte variable length integer. func BenchmarkWriteVarInt5(b *testing.B) { + b.ReportAllocs() + for i := 0; i < b.N; i++ { - WriteVarInt(ioutil.Discard, 0, 4294967295) + WriteVarInt(io.Discard, 0, 4294967295) } } // BenchmarkWriteVarInt9 performs a benchmark on how long it takes to write // a nine byte variable length integer. func BenchmarkWriteVarInt9(b *testing.B) { + b.ReportAllocs() + for i := 0; i < b.N; i++ { - WriteVarInt(ioutil.Discard, 0, 18446744073709551615) + WriteVarInt(io.Discard, 0, 18446744073709551615) } } // BenchmarkReadVarInt1 performs a benchmark on how long it takes to read // a single byte variable length integer. func BenchmarkReadVarInt1(b *testing.B) { + b.ReportAllocs() + buf := []byte{0x01} r := bytes.NewReader(buf) for i := 0; i < b.N; i++ { @@ -106,6 +117,8 @@ func BenchmarkReadVarInt1(b *testing.B) { // BenchmarkReadVarInt3 performs a benchmark on how long it takes to read // a three byte variable length integer. func BenchmarkReadVarInt3(b *testing.B) { + b.ReportAllocs() + buf := []byte{0x0fd, 0xff, 0xff} r := bytes.NewReader(buf) for i := 0; i < b.N; i++ { @@ -117,6 +130,8 @@ func BenchmarkReadVarInt3(b *testing.B) { // BenchmarkReadVarInt5 performs a benchmark on how long it takes to read // a five byte variable length integer. func BenchmarkReadVarInt5(b *testing.B) { + b.ReportAllocs() + buf := []byte{0xfe, 0xff, 0xff, 0xff, 0xff} r := bytes.NewReader(buf) for i := 0; i < b.N; i++ { @@ -128,6 +143,8 @@ func BenchmarkReadVarInt5(b *testing.B) { // BenchmarkReadVarInt9 performs a benchmark on how long it takes to read // a nine byte variable length integer. func BenchmarkReadVarInt9(b *testing.B) { + b.ReportAllocs() + buf := []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff} r := bytes.NewReader(buf) for i := 0; i < b.N; i++ { @@ -136,9 +153,119 @@ func BenchmarkReadVarInt9(b *testing.B) { } } +// BenchmarkWriteVarIntBuf1 performs a benchmark on how long it takes to write +// a single byte variable length integer. +func BenchmarkWriteVarIntBuf1(b *testing.B) { + b.ReportAllocs() + + buffer := binarySerializer.Borrow() + for i := 0; i < b.N; i++ { + WriteVarIntBuf(io.Discard, 0, 1, buffer) + } + binarySerializer.Return(buffer) +} + +// BenchmarkWriteVarIntBuf3 performs a benchmark on how long it takes to write +// a three byte variable length integer. +func BenchmarkWriteVarIntBuf3(b *testing.B) { + b.ReportAllocs() + + buffer := binarySerializer.Borrow() + for i := 0; i < b.N; i++ { + WriteVarIntBuf(io.Discard, 0, 65535, buffer) + } + binarySerializer.Return(buffer) +} + +// BenchmarkWriteVarIntBuf5 performs a benchmark on how long it takes to write +// a five byte variable length integer. +func BenchmarkWriteVarIntBuf5(b *testing.B) { + b.ReportAllocs() + + buffer := binarySerializer.Borrow() + for i := 0; i < b.N; i++ { + WriteVarIntBuf(io.Discard, 0, 4294967295, buffer) + } + binarySerializer.Return(buffer) +} + +// BenchmarkWriteVarIntBuf9 performs a benchmark on how long it takes to write +// a nine byte variable length integer. +func BenchmarkWriteVarIntBuf9(b *testing.B) { + b.ReportAllocs() + + buffer := binarySerializer.Borrow() + for i := 0; i < b.N; i++ { + WriteVarIntBuf(io.Discard, 0, 18446744073709551615, buffer) + } + binarySerializer.Return(buffer) +} + +// BenchmarkReadVarIntBuf1 performs a benchmark on how long it takes to read +// a single byte variable length integer. +func BenchmarkReadVarIntBuf1(b *testing.B) { + b.ReportAllocs() + + buffer := binarySerializer.Borrow() + buf := []byte{0x01} + r := bytes.NewReader(buf) + for i := 0; i < b.N; i++ { + r.Seek(0, 0) + ReadVarIntBuf(r, 0, buffer) + } + binarySerializer.Return(buffer) +} + +// BenchmarkReadVarIntBuf3 performs a benchmark on how long it takes to read +// a three byte variable length integer. +func BenchmarkReadVarIntBuf3(b *testing.B) { + b.ReportAllocs() + + buffer := binarySerializer.Borrow() + buf := []byte{0x0fd, 0xff, 0xff} + r := bytes.NewReader(buf) + for i := 0; i < b.N; i++ { + r.Seek(0, 0) + ReadVarIntBuf(r, 0, buffer) + } + binarySerializer.Return(buffer) +} + +// BenchmarkReadVarIntBuf5 performs a benchmark on how long it takes to read +// a five byte variable length integer. +func BenchmarkReadVarIntBuf5(b *testing.B) { + b.ReportAllocs() + + buffer := binarySerializer.Borrow() + buf := []byte{0xfe, 0xff, 0xff, 0xff, 0xff} + r := bytes.NewReader(buf) + for i := 0; i < b.N; i++ { + r.Seek(0, 0) + ReadVarIntBuf(r, 0, buffer) + } + binarySerializer.Return(buffer) +} + +// BenchmarkReadVarIntBuf9 performs a benchmark on how long it takes to read +// a nine byte variable length integer. +func BenchmarkReadVarIntBuf9(b *testing.B) { + b.ReportAllocs() + + buffer := binarySerializer.Borrow() + buf := []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff} + r := bytes.NewReader(buf) + for i := 0; i < b.N; i++ { + r.Seek(0, 0) + ReadVarIntBuf(r, 0, buffer) + } + binarySerializer.Return(buffer) +} + // BenchmarkReadVarStr4 performs a benchmark on how long it takes to read a // four byte variable length string. func BenchmarkReadVarStr4(b *testing.B) { + b.ReportAllocs() + buf := []byte{0x04, 't', 'e', 's', 't'} r := bytes.NewReader(buf) for i := 0; i < b.N; i++ { @@ -150,6 +277,8 @@ func BenchmarkReadVarStr4(b *testing.B) { // BenchmarkReadVarStr10 performs a benchmark on how long it takes to read a // ten byte variable length string. func BenchmarkReadVarStr10(b *testing.B) { + b.ReportAllocs() + buf := []byte{0x0a, 't', 'e', 's', 't', '0', '1', '2', '3', '4', '5'} r := bytes.NewReader(buf) for i := 0; i < b.N; i++ { @@ -161,22 +290,83 @@ func BenchmarkReadVarStr10(b *testing.B) { // BenchmarkWriteVarStr4 performs a benchmark on how long it takes to write a // four byte variable length string. func BenchmarkWriteVarStr4(b *testing.B) { + b.ReportAllocs() + for i := 0; i < b.N; i++ { - WriteVarString(ioutil.Discard, 0, "test") + WriteVarString(io.Discard, 0, "test") } } // BenchmarkWriteVarStr10 performs a benchmark on how long it takes to write a // ten byte variable length string. func BenchmarkWriteVarStr10(b *testing.B) { + b.ReportAllocs() + + for i := 0; i < b.N; i++ { + WriteVarString(io.Discard, 0, "test012345") + } +} + +// BenchmarkReadVarStrBuf4 performs a benchmark on how long it takes to read a +// four byte variable length string. +func BenchmarkReadVarStrBuf4(b *testing.B) { + b.ReportAllocs() + + buffer := binarySerializer.Borrow() + buf := []byte{0x04, 't', 'e', 's', 't'} + r := bytes.NewReader(buf) for i := 0; i < b.N; i++ { - WriteVarString(ioutil.Discard, 0, "test012345") + r.Seek(0, 0) + readVarStringBuf(r, 0, buffer) } + binarySerializer.Return(buffer) +} + +// BenchmarkReadVarStrBuf10 performs a benchmark on how long it takes to read a +// ten byte variable length string. +func BenchmarkReadVarStrBuf10(b *testing.B) { + b.ReportAllocs() + + buffer := binarySerializer.Borrow() + buf := []byte{0x0a, 't', 'e', 's', 't', '0', '1', '2', '3', '4', '5'} + r := bytes.NewReader(buf) + for i := 0; i < b.N; i++ { + r.Seek(0, 0) + readVarStringBuf(r, 0, buf) + } + binarySerializer.Return(buffer) +} + +// BenchmarkWriteVarStrBuf4 performs a benchmark on how long it takes to write a +// four byte variable length string. +func BenchmarkWriteVarStrBuf4(b *testing.B) { + b.ReportAllocs() + + buf := binarySerializer.Borrow() + for i := 0; i < b.N; i++ { + writeVarStringBuf(io.Discard, 0, "test", buf) + } + binarySerializer.Return(buf) +} + +// BenchmarkWriteVarStrBuf10 performs a benchmark on how long it takes to write +// a ten byte variable length string. +func BenchmarkWriteVarStrBuf10(b *testing.B) { + b.ReportAllocs() + + buf := binarySerializer.Borrow() + for i := 0; i < b.N; i++ { + writeVarStringBuf(io.Discard, 0, "test012345", buf) + } + binarySerializer.Return(buf) } // BenchmarkReadOutPoint performs a benchmark on how long it takes to read a // transaction output point. func BenchmarkReadOutPoint(b *testing.B) { + b.ReportAllocs() + + buffer := binarySerializer.Borrow() buf := []byte{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -188,25 +378,77 @@ func BenchmarkReadOutPoint(b *testing.B) { var op OutPoint for i := 0; i < b.N; i++ { r.Seek(0, 0) - readOutPoint(r, 0, 0, &op) + readOutPointBuf(r, 0, 0, &op, buffer) } + binarySerializer.Return(buffer) } // BenchmarkWriteOutPoint performs a benchmark on how long it takes to write a // transaction output point. func BenchmarkWriteOutPoint(b *testing.B) { + b.ReportAllocs() + op := &OutPoint{ Hash: chainhash.Hash{}, Index: 0, } for i := 0; i < b.N; i++ { - writeOutPoint(ioutil.Discard, 0, 0, op) + WriteOutPoint(io.Discard, 0, 0, op) } } +// BenchmarkWriteOutPointBuf performs a benchmark on how long it takes to write a +// transaction output point. +func BenchmarkWriteOutPointBuf(b *testing.B) { + b.ReportAllocs() + + buf := binarySerializer.Borrow() + op := &OutPoint{ + Hash: chainhash.Hash{}, + Index: 0, + } + for i := 0; i < b.N; i++ { + writeOutPointBuf(io.Discard, 0, 0, op, buf) + } + binarySerializer.Return(buf) +} + // BenchmarkReadTxOut performs a benchmark on how long it takes to read a // transaction output. func BenchmarkReadTxOut(b *testing.B) { + b.ReportAllocs() + + buf := []byte{ + 0x00, 0xf2, 0x05, 0x2a, 0x01, 0x00, 0x00, 0x00, // Transaction amount + 0x43, // Varint for length of pk script + 0x41, // OP_DATA_65 + 0x04, 0x96, 0xb5, 0x38, 0xe8, 0x53, 0x51, 0x9c, + 0x72, 0x6a, 0x2c, 0x91, 0xe6, 0x1e, 0xc1, 0x16, + 0x00, 0xae, 0x13, 0x90, 0x81, 0x3a, 0x62, 0x7c, + 0x66, 0xfb, 0x8b, 0xe7, 0x94, 0x7b, 0xe6, 0x3c, + 0x52, 0xda, 0x75, 0x89, 0x37, 0x95, 0x15, 0xd4, + 0xe0, 0xa6, 0x04, 0xf8, 0x14, 0x17, 0x81, 0xe6, + 0x22, 0x94, 0x72, 0x11, 0x66, 0xbf, 0x62, 0x1e, + 0x73, 0xa8, 0x2c, 0xbf, 0x23, 0x42, 0xc8, 0x58, + 0xee, // 65-byte signature + 0xac, // OP_CHECKSIG + } + r := bytes.NewReader(buf) + var txOut TxOut + for i := 0; i < b.N; i++ { + r.Seek(0, 0) + ReadTxOut(r, 0, 0, &txOut) + } +} + +// BenchmarkReadTxOutBuf performs a benchmark on how long it takes to read a +// transaction output. +func BenchmarkReadTxOutBuf(b *testing.B) { + b.ReportAllocs() + + scriptBuffer := scriptPool.Borrow() + sbuf := scriptBuffer[:] + buffer := binarySerializer.Borrow() buf := []byte{ 0x00, 0xf2, 0x05, 0x2a, 0x01, 0x00, 0x00, 0x00, // Transaction amount 0x43, // Varint for length of pk script @@ -226,23 +468,44 @@ func BenchmarkReadTxOut(b *testing.B) { var txOut TxOut for i := 0; i < b.N; i++ { r.Seek(0, 0) - readTxOut(r, 0, 0, &txOut) - scriptPool.Return(txOut.PkScript) + readTxOutBuf(r, 0, 0, &txOut, buffer, sbuf) } + binarySerializer.Return(buffer) + scriptPool.Return(scriptBuffer) } // BenchmarkWriteTxOut performs a benchmark on how long it takes to write // a transaction output. func BenchmarkWriteTxOut(b *testing.B) { + b.ReportAllocs() + txOut := blockOne.Transactions[0].TxOut[0] for i := 0; i < b.N; i++ { - WriteTxOut(ioutil.Discard, 0, 0, txOut) + WriteTxOut(io.Discard, 0, 0, txOut) } } +// BenchmarkWriteTxOutBuf performs a benchmark on how long it takes to write +// a transaction output. +func BenchmarkWriteTxOutBuf(b *testing.B) { + b.ReportAllocs() + + buf := binarySerializer.Borrow() + txOut := blockOne.Transactions[0].TxOut[0] + for i := 0; i < b.N; i++ { + WriteTxOutBuf(io.Discard, 0, 0, txOut, buf) + } + binarySerializer.Return(buf) +} + // BenchmarkReadTxIn performs a benchmark on how long it takes to read a // transaction input. func BenchmarkReadTxIn(b *testing.B) { + b.ReportAllocs() + + scriptBuffer := scriptPool.Borrow() + sbuf := scriptBuffer[:] + buffer := binarySerializer.Borrow() buf := []byte{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -257,18 +520,23 @@ func BenchmarkReadTxIn(b *testing.B) { var txIn TxIn for i := 0; i < b.N; i++ { r.Seek(0, 0) - readTxIn(r, 0, 0, &txIn) - scriptPool.Return(txIn.SignatureScript) + readTxInBuf(r, 0, 0, &txIn, buffer, sbuf) } + binarySerializer.Return(buffer) + scriptPool.Return(scriptBuffer) } // BenchmarkWriteTxIn performs a benchmark on how long it takes to write // a transaction input. func BenchmarkWriteTxIn(b *testing.B) { + b.ReportAllocs() + + buf := binarySerializer.Borrow() txIn := blockOne.Transactions[0].TxIn[0] for i := 0; i < b.N; i++ { - writeTxIn(ioutil.Discard, 0, 0, txIn) + writeTxInBuf(io.Discard, 0, 0, txIn, buf) } + binarySerializer.Return(buf) } // BenchmarkDeserializeTx performs a benchmark on how long it takes to @@ -281,7 +549,7 @@ func BenchmarkDeserializeTxSmall(b *testing.B) { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // // Previous output hash - 0xff, 0xff, 0xff, 0xff, // Prevous output index + 0xff, 0xff, 0xff, 0xff, // Previous output index 0x07, // Varint for length of signature script 0x04, 0xff, 0xff, 0x00, 0x1d, 0x01, 0x04, // Signature script 0xff, 0xff, 0xff, 0xff, // Sequence @@ -302,6 +570,9 @@ func BenchmarkDeserializeTxSmall(b *testing.B) { 0x00, 0x00, 0x00, 0x00, // Lock time } + b.ReportAllocs() + b.ResetTimer() + r := bytes.NewReader(buf) var tx MsgTx for i := 0; i < b.N; i++ { @@ -313,6 +584,7 @@ func BenchmarkDeserializeTxSmall(b *testing.B) { // BenchmarkDeserializeTxLarge performs a benchmark on how long it takes to // deserialize a very large transaction. func BenchmarkDeserializeTxLarge(b *testing.B) { + // tx bb41a757f405890fb0f5856228e23b715702d714d59bf2b1feb70d8b2b4e3e08 // from the main block chain. fi, err := os.Open("testdata/megatx.bin.bz2") @@ -325,6 +597,9 @@ func BenchmarkDeserializeTxLarge(b *testing.B) { b.Fatalf("Failed to read transaction data: %v", err) } + b.ReportAllocs() + b.ResetTimer() + r := bytes.NewReader(buf) var tx MsgTx for i := 0; i < b.N; i++ { @@ -333,19 +608,132 @@ func BenchmarkDeserializeTxLarge(b *testing.B) { } } +func BenchmarkDeserializeBlock(b *testing.B) { + buf, err := os.ReadFile( + "testdata/block-00000000000000000021868c2cefc52a480d173c849412fe81c4e5ab806f94ab.blk", + ) + if err != nil { + b.Fatalf("Failed to read block data: %v", err) + } + + b.ReportAllocs() + b.ResetTimer() + + r := bytes.NewReader(buf) + var block MsgBlock + for i := 0; i < b.N; i++ { + r.Seek(0, 0) + block.Deserialize(r) + } +} + +func BenchmarkSerializeBlock(b *testing.B) { + buf, err := os.ReadFile( + "testdata/block-00000000000000000021868c2cefc52a480d173c849412fe81c4e5ab806f94ab.blk", + ) + if err != nil { + b.Fatalf("Failed to read block data: %v", err) + } + + var block MsgBlock + err = block.Deserialize(bytes.NewReader(buf)) + if err != nil { + panic(err.Error()) + } + + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + block.Serialize(io.Discard) + } +} + // BenchmarkSerializeTx performs a benchmark on how long it takes to serialize // a transaction. func BenchmarkSerializeTx(b *testing.B) { + b.ReportAllocs() + tx := blockOne.Transactions[0] for i := 0; i < b.N; i++ { - tx.Serialize(ioutil.Discard) + tx.Serialize(io.Discard) } } +// BenchmarkSerializeTxSmall performs a benchmark on how long it takes to +// serialize a transaction. +func BenchmarkSerializeTxSmall(b *testing.B) { + buf := []byte{ + 0x01, 0x00, 0x00, 0x00, // Version + 0x01, // Varint for number of input transactions + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // // Previous output hash + 0xff, 0xff, 0xff, 0xff, // Previous output index + 0x07, // Varint for length of signature script + 0x04, 0xff, 0xff, 0x00, 0x1d, 0x01, 0x04, // Signature script + 0xff, 0xff, 0xff, 0xff, // Sequence + 0x01, // Varint for number of output transactions + 0x00, 0xf2, 0x05, 0x2a, 0x01, 0x00, 0x00, 0x00, // Transaction amount + 0x43, // Varint for length of pk script + 0x41, // OP_DATA_65 + 0x04, 0x96, 0xb5, 0x38, 0xe8, 0x53, 0x51, 0x9c, + 0x72, 0x6a, 0x2c, 0x91, 0xe6, 0x1e, 0xc1, 0x16, + 0x00, 0xae, 0x13, 0x90, 0x81, 0x3a, 0x62, 0x7c, + 0x66, 0xfb, 0x8b, 0xe7, 0x94, 0x7b, 0xe6, 0x3c, + 0x52, 0xda, 0x75, 0x89, 0x37, 0x95, 0x15, 0xd4, + 0xe0, 0xa6, 0x04, 0xf8, 0x14, 0x17, 0x81, 0xe6, + 0x22, 0x94, 0x72, 0x11, 0x66, 0xbf, 0x62, 0x1e, + 0x73, 0xa8, 0x2c, 0xbf, 0x23, 0x42, 0xc8, 0x58, + 0xee, // 65-byte signature + 0xac, // OP_CHECKSIG + 0x00, 0x00, 0x00, 0x00, // Lock time + } + + var tx MsgTx + tx.Deserialize(bytes.NewReader(buf)) + + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + tx.Serialize(io.Discard) + } +} + +// BenchmarkSerializeTxLarge performs a benchmark on how long it takes to +// serialize a transaction. +func BenchmarkSerializeTxLarge(b *testing.B) { + // tx bb41a757f405890fb0f5856228e23b715702d714d59bf2b1feb70d8b2b4e3e08 + // from the main block chain. + fi, err := os.Open("testdata/megatx.bin.bz2") + if err != nil { + b.Fatalf("Failed to read transaction data: %v", err) + } + defer fi.Close() + buf, err := ioutil.ReadAll(bzip2.NewReader(fi)) + if err != nil { + b.Fatalf("Failed to read transaction data: %v", err) + } + + var tx MsgTx + tx.Deserialize(bytes.NewReader(buf)) + + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + tx.Serialize(io.Discard) + } +} + // BenchmarkReadBlockHeader performs a benchmark on how long it takes to // deserialize a block header. func BenchmarkReadBlockHeader(b *testing.B) { + b.ReportAllocs() + buf := []byte{ 0x01, 0x00, 0x00, 0x00, // Version 1 0x6f, 0xe2, 0x8c, 0x0a, 0xb6, 0xf1, 0xb3, 0x72, @@ -369,18 +757,65 @@ func BenchmarkReadBlockHeader(b *testing.B) { } } +// BenchmarkReadBlockHeaderBuf performs a benchmark on how long it takes to +// deserialize a block header. +func BenchmarkReadBlockHeaderBuf(b *testing.B) { + b.ReportAllocs() + + buffer := binarySerializer.Borrow() + buf := []byte{ + 0x01, 0x00, 0x00, 0x00, // Version 1 + 0x6f, 0xe2, 0x8c, 0x0a, 0xb6, 0xf1, 0xb3, 0x72, + 0xc1, 0xa6, 0xa2, 0x46, 0xae, 0x63, 0xf7, 0x4f, + 0x93, 0x1e, 0x83, 0x65, 0xe1, 0x5a, 0x08, 0x9c, + 0x68, 0xd6, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, // PrevBlock + 0x3b, 0xa3, 0xed, 0xfd, 0x7a, 0x7b, 0x12, 0xb2, + 0x7a, 0xc7, 0x2c, 0x3e, 0x67, 0x76, 0x8f, 0x61, + 0x7f, 0xc8, 0x1b, 0xc3, 0x88, 0x8a, 0x51, 0x32, + 0x3a, 0x9f, 0xb8, 0xaa, 0x4b, 0x1e, 0x5e, 0x4a, // MerkleRoot + 0x29, 0xab, 0x5f, 0x49, // Timestamp + 0xff, 0xff, 0x00, 0x1d, // Bits + 0xf3, 0xe0, 0x01, 0x00, // Nonce + 0x00, // TxnCount Varint + } + r := bytes.NewReader(buf) + var header BlockHeader + for i := 0; i < b.N; i++ { + r.Seek(0, 0) + readBlockHeaderBuf(r, 0, &header, buffer) + } + binarySerializer.Return(buffer) +} + // BenchmarkWriteBlockHeader performs a benchmark on how long it takes to // serialize a block header. func BenchmarkWriteBlockHeader(b *testing.B) { + b.ReportAllocs() + + header := blockOne.Header + for i := 0; i < b.N; i++ { + writeBlockHeader(io.Discard, 0, &header) + } +} + +// BenchmarkWriteBlockHeaderBuf performs a benchmark on how long it takes to +// serialize a block header. +func BenchmarkWriteBlockHeaderBuf(b *testing.B) { + b.ReportAllocs() + + buf := binarySerializer.Borrow() header := blockOne.Header for i := 0; i < b.N; i++ { - writeBlockHeader(ioutil.Discard, 0, &header) + writeBlockHeaderBuf(io.Discard, 0, &header, buf) } + binarySerializer.Return(buf) } // BenchmarkDecodeGetHeaders performs a benchmark on how long it takes to // decode a getheaders message with the maximum number of block locator hashes. func BenchmarkDecodeGetHeaders(b *testing.B) { + b.ReportAllocs() + // Create a message with the maximum number of block locators. pver := ProtocolVersion var m MsgGetHeaders @@ -411,6 +846,8 @@ func BenchmarkDecodeGetHeaders(b *testing.B) { // BenchmarkDecodeHeaders performs a benchmark on how long it takes to // decode a headers message with the maximum number of headers. func BenchmarkDecodeHeaders(b *testing.B) { + b.ReportAllocs() + // Create a message with the maximum number of headers. pver := ProtocolVersion var m MsgHeaders @@ -441,6 +878,8 @@ func BenchmarkDecodeHeaders(b *testing.B) { // BenchmarkDecodeGetBlocks performs a benchmark on how long it takes to // decode a getblocks message with the maximum number of block locator hashes. func BenchmarkDecodeGetBlocks(b *testing.B) { + b.ReportAllocs() + // Create a message with the maximum number of block locators. pver := ProtocolVersion var m MsgGetBlocks @@ -471,6 +910,8 @@ func BenchmarkDecodeGetBlocks(b *testing.B) { // BenchmarkDecodeAddr performs a benchmark on how long it takes to decode an // addr message with the maximum number of addresses. func BenchmarkDecodeAddr(b *testing.B) { + b.ReportAllocs() + // Create a message with the maximum number of addresses. pver := ProtocolVersion ip := net.ParseIP("127.0.0.1") @@ -516,6 +957,9 @@ func BenchmarkDecodeInv(b *testing.B) { } buf := bb.Bytes() + b.ReportAllocs() + b.ResetTimer() + r := bytes.NewReader(buf) var msg MsgInv b.ResetTimer() @@ -528,6 +972,8 @@ func BenchmarkDecodeInv(b *testing.B) { // BenchmarkDecodeNotFound performs a benchmark on how long it takes to decode // a notfound message with the maximum number of entries. func BenchmarkDecodeNotFound(b *testing.B) { + b.ReportAllocs() + // Create a message with the maximum number of entries. pver := ProtocolVersion var m MsgNotFound @@ -558,6 +1004,8 @@ func BenchmarkDecodeNotFound(b *testing.B) { // BenchmarkDecodeMerkleBlock performs a benchmark on how long it takes to // decode a reasonably sized merkleblock message. func BenchmarkDecodeMerkleBlock(b *testing.B) { + b.ReportAllocs() + // Create a message with random data. pver := ProtocolVersion var m MsgMerkleBlock @@ -596,6 +1044,8 @@ func BenchmarkDecodeMerkleBlock(b *testing.B) { // BenchmarkTxHash performs a benchmark on how long it takes to hash a // transaction. func BenchmarkTxHash(b *testing.B) { + b.ReportAllocs() + for i := 0; i < b.N; i++ { genesisCoinbaseTx.TxHash() } @@ -604,6 +1054,8 @@ func BenchmarkTxHash(b *testing.B) { // BenchmarkDoubleHashB performs a benchmark on how long it takes to perform a // double hash returning a byte slice. func BenchmarkDoubleHashB(b *testing.B) { + b.ReportAllocs() + var buf bytes.Buffer if err := genesisCoinbaseTx.Serialize(&buf); err != nil { b.Errorf("Serialize: unexpected error: %v", err) @@ -620,6 +1072,8 @@ func BenchmarkDoubleHashB(b *testing.B) { // BenchmarkDoubleHashH performs a benchmark on how long it takes to perform // a double hash returning a chainhash.Hash. func BenchmarkDoubleHashH(b *testing.B) { + b.ReportAllocs() + var buf bytes.Buffer if err := genesisCoinbaseTx.Serialize(&buf); err != nil { b.Errorf("Serialize: unexpected error: %v", err) diff --git a/wire/blockheader.go b/wire/blockheader.go index 9c9c2237e6..b5bce44e5b 100644 --- a/wire/blockheader.go +++ b/wire/blockheader.go @@ -5,7 +5,6 @@ package wire import ( - "bytes" "io" "time" @@ -46,14 +45,9 @@ const blockHeaderLen = 80 // BlockHash computes the block identifier hash for the given block header. func (h *BlockHeader) BlockHash() chainhash.Hash { - // Encode the header and double sha256 everything prior to the number of - // transactions. Ignore the error returns since there is no way the - // encode could fail except being out of memory which would cause a - // run-time panic. - buf := bytes.NewBuffer(make([]byte, 0, MaxBlockHeaderPayload)) - _ = writeBlockHeader(buf, 0, h) - - return chainhash.DoubleHashH(buf.Bytes()) + return chainhash.DoubleHashRaw(func(w io.Writer) error { + return writeBlockHeader(w, 0, h) + }) } // BtcDecode decodes r using the bitcoin protocol encoding into the receiver. @@ -113,16 +107,109 @@ func NewBlockHeader(version int32, prevHash, merkleRootHash *chainhash.Hash, // readBlockHeader reads a bitcoin block header from r. See Deserialize for // decoding block headers stored to disk, such as in a database, as opposed to // decoding from the wire. +// +// DEPRECATED: Use readBlockHeaderBuf instead. func readBlockHeader(r io.Reader, pver uint32, bh *BlockHeader) error { - return readElements(r, &bh.Version, &bh.PrevBlock, &bh.MerkleRoot, - (*uint32Time)(&bh.Timestamp), &bh.Bits, &bh.Nonce) + buf := binarySerializer.Borrow() + err := readBlockHeaderBuf(r, pver, bh, buf) + binarySerializer.Return(buf) + return err +} + +// readBlockHeaderBuf reads a bitcoin block header from r. See Deserialize for +// decoding block headers stored to disk, such as in a database, as opposed to +// decoding from the wire. +// +// If b is non-nil, the provided buffer will be used for serializing small +// values. Otherwise a buffer will be drawn from the binarySerializer's pool +// and return when the method finishes. +// +// NOTE: b MUST either be nil or at least an 8-byte slice. +func readBlockHeaderBuf(r io.Reader, pver uint32, bh *BlockHeader, + buf []byte) error { + + if _, err := io.ReadFull(r, buf[:4]); err != nil { + return err + } + bh.Version = int32(littleEndian.Uint32(buf[:4])) + + if _, err := io.ReadFull(r, bh.PrevBlock[:]); err != nil { + return err + } + + if _, err := io.ReadFull(r, bh.MerkleRoot[:]); err != nil { + return err + } + + if _, err := io.ReadFull(r, buf[:4]); err != nil { + return err + } + bh.Timestamp = time.Unix(int64(littleEndian.Uint32(buf[:4])), 0) + + if _, err := io.ReadFull(r, buf[:4]); err != nil { + return err + } + bh.Bits = littleEndian.Uint32(buf[:4]) + + if _, err := io.ReadFull(r, buf[:4]); err != nil { + return err + } + bh.Nonce = littleEndian.Uint32(buf[:4]) + + return nil } // writeBlockHeader writes a bitcoin block header to w. See Serialize for // encoding block headers to be stored to disk, such as in a database, as // opposed to encoding for the wire. +// +// DEPRECATED: Use writeBlockHeaderBuf instead. func writeBlockHeader(w io.Writer, pver uint32, bh *BlockHeader) error { - sec := uint32(bh.Timestamp.Unix()) - return writeElements(w, bh.Version, &bh.PrevBlock, &bh.MerkleRoot, - sec, bh.Bits, bh.Nonce) + buf := binarySerializer.Borrow() + err := writeBlockHeaderBuf(w, pver, bh, buf) + binarySerializer.Return(buf) + return err +} + +// writeBlockHeaderBuf writes a bitcoin block header to w. See Serialize for +// encoding block headers to be stored to disk, such as in a database, as +// opposed to encoding for the wire. +// +// If b is non-nil, the provided buffer will be used for serializing small +// values. Otherwise a buffer will be drawn from the binarySerializer's pool +// and return when the method finishes. +// +// NOTE: b MUST either be nil or at least an 8-byte slice. +func writeBlockHeaderBuf(w io.Writer, pver uint32, bh *BlockHeader, + buf []byte) error { + + littleEndian.PutUint32(buf[:4], uint32(bh.Version)) + if _, err := w.Write(buf[:4]); err != nil { + return err + } + + if _, err := w.Write(bh.PrevBlock[:]); err != nil { + return err + } + + if _, err := w.Write(bh.MerkleRoot[:]); err != nil { + return err + } + + littleEndian.PutUint32(buf[:4], uint32(bh.Timestamp.Unix())) + if _, err := w.Write(buf[:4]); err != nil { + return err + } + + littleEndian.PutUint32(buf[:4], bh.Bits) + if _, err := w.Write(buf[:4]); err != nil { + return err + } + + littleEndian.PutUint32(buf[:4], bh.Nonce) + if _, err := w.Write(buf[:4]); err != nil { + return err + } + + return nil } diff --git a/wire/common.go b/wire/common.go index 42c1797b32..d3a82c46c0 100644 --- a/wire/common.go +++ b/wire/common.go @@ -73,12 +73,13 @@ func (l binaryFreeList) Return(buf []byte) { // free list and returns it as a uint8. func (l binaryFreeList) Uint8(r io.Reader) (uint8, error) { buf := l.Borrow()[:1] + defer l.Return(buf) + if _, err := io.ReadFull(r, buf); err != nil { - l.Return(buf) return 0, err } rv := buf[0] - l.Return(buf) + return rv, nil } @@ -87,12 +88,13 @@ func (l binaryFreeList) Uint8(r io.Reader) (uint8, error) { // the resulting uint16. func (l binaryFreeList) Uint16(r io.Reader, byteOrder binary.ByteOrder) (uint16, error) { buf := l.Borrow()[:2] + defer l.Return(buf) + if _, err := io.ReadFull(r, buf); err != nil { - l.Return(buf) return 0, err } rv := byteOrder.Uint16(buf) - l.Return(buf) + return rv, nil } @@ -101,12 +103,13 @@ func (l binaryFreeList) Uint16(r io.Reader, byteOrder binary.ByteOrder) (uint16, // the resulting uint32. func (l binaryFreeList) Uint32(r io.Reader, byteOrder binary.ByteOrder) (uint32, error) { buf := l.Borrow()[:4] + defer l.Return(buf) + if _, err := io.ReadFull(r, buf); err != nil { - l.Return(buf) return 0, err } rv := byteOrder.Uint32(buf) - l.Return(buf) + return rv, nil } @@ -115,12 +118,13 @@ func (l binaryFreeList) Uint32(r io.Reader, byteOrder binary.ByteOrder) (uint32, // the resulting uint64. func (l binaryFreeList) Uint64(r io.Reader, byteOrder binary.ByteOrder) (uint64, error) { buf := l.Borrow()[:8] + defer l.Return(buf) + if _, err := io.ReadFull(r, buf); err != nil { - l.Return(buf) return 0, err } rv := byteOrder.Uint64(buf) - l.Return(buf) + return rv, nil } @@ -128,9 +132,11 @@ func (l binaryFreeList) Uint64(r io.Reader, byteOrder binary.ByteOrder) (uint64, // writes the resulting byte to the given writer. func (l binaryFreeList) PutUint8(w io.Writer, val uint8) error { buf := l.Borrow()[:1] + defer l.Return(buf) + buf[0] = val _, err := w.Write(buf) - l.Return(buf) + return err } @@ -139,9 +145,11 @@ func (l binaryFreeList) PutUint8(w io.Writer, val uint8) error { // writer. func (l binaryFreeList) PutUint16(w io.Writer, byteOrder binary.ByteOrder, val uint16) error { buf := l.Borrow()[:2] + defer l.Return(buf) + byteOrder.PutUint16(buf, val) _, err := w.Write(buf) - l.Return(buf) + return err } @@ -150,9 +158,11 @@ func (l binaryFreeList) PutUint16(w io.Writer, byteOrder binary.ByteOrder, val u // writer. func (l binaryFreeList) PutUint32(w io.Writer, byteOrder binary.ByteOrder, val uint32) error { buf := l.Borrow()[:4] + defer l.Return(buf) + byteOrder.PutUint32(buf, val) _, err := w.Write(buf) - l.Return(buf) + return err } @@ -161,9 +171,11 @@ func (l binaryFreeList) PutUint32(w io.Writer, byteOrder binary.ByteOrder, val u // writer. func (l binaryFreeList) PutUint64(w io.Writer, byteOrder binary.ByteOrder, val uint64) error { buf := l.Borrow()[:8] + defer l.Return(buf) + byteOrder.PutUint64(buf, val) _, err := w.Write(buf) - l.Return(buf) + return err } @@ -474,19 +486,30 @@ func writeElements(w io.Writer, elements ...interface{}) error { // ReadVarInt reads a variable length integer from r and returns it as a uint64. func ReadVarInt(r io.Reader, pver uint32) (uint64, error) { - discriminant, err := binarySerializer.Uint8(r) - if err != nil { + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + n, err := ReadVarIntBuf(r, pver, buf) + return n, err +} + +// ReadVarIntBuf reads a variable length integer from r using a preallocated +// scratch buffer and returns it as a uint64. +// +// NOTE: buf MUST at least an 8-byte slice. +func ReadVarIntBuf(r io.Reader, pver uint32, buf []byte) (uint64, error) { + if _, err := io.ReadFull(r, buf[:1]); err != nil { return 0, err } + discriminant := buf[0] var rv uint64 switch discriminant { case 0xff: - sv, err := binarySerializer.Uint64(r, littleEndian) - if err != nil { + if _, err := io.ReadFull(r, buf); err != nil { return 0, err } - rv = sv + rv = littleEndian.Uint64(buf) // The encoding is not canonical if the value could have been // encoded using fewer bytes. @@ -497,11 +520,10 @@ func ReadVarInt(r io.Reader, pver uint32) (uint64, error) { } case 0xfe: - sv, err := binarySerializer.Uint32(r, littleEndian) - if err != nil { + if _, err := io.ReadFull(r, buf[:4]); err != nil { return 0, err } - rv = uint64(sv) + rv = uint64(littleEndian.Uint32(buf[:4])) // The encoding is not canonical if the value could have been // encoded using fewer bytes. @@ -512,11 +534,10 @@ func ReadVarInt(r io.Reader, pver uint32) (uint64, error) { } case 0xfd: - sv, err := binarySerializer.Uint16(r, littleEndian) - if err != nil { + if _, err := io.ReadFull(r, buf[:2]); err != nil { return 0, err } - rv = uint64(sv) + rv = uint64(littleEndian.Uint16(buf[:2])) // The encoding is not canonical if the value could have been // encoded using fewer bytes. @@ -536,31 +557,46 @@ func ReadVarInt(r io.Reader, pver uint32) (uint64, error) { // WriteVarInt serializes val to w using a variable number of bytes depending // on its value. func WriteVarInt(w io.Writer, pver uint32, val uint64) error { - if val < 0xfd { - return binarySerializer.PutUint8(w, uint8(val)) - } + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) - if val <= math.MaxUint16 { - err := binarySerializer.PutUint8(w, 0xfd) - if err != nil { - return err - } - return binarySerializer.PutUint16(w, littleEndian, uint16(val)) - } + err := WriteVarIntBuf(w, pver, val, buf) + return err +} - if val <= math.MaxUint32 { - err := binarySerializer.PutUint8(w, 0xfe) - if err != nil { +// WriteVarIntBuf serializes val to w using a variable number of bytes depending +// on its value using a preallocated scratch buffer. +// +// NOTE: buf MUST at least an 8-byte slice. +func WriteVarIntBuf(w io.Writer, pver uint32, val uint64, buf []byte) error { + switch { + case val < 0xfd: + buf[0] = uint8(val) + _, err := w.Write(buf[:1]) + return err + + case val <= math.MaxUint16: + buf[0] = 0xfd + littleEndian.PutUint16(buf[1:3], uint16(val)) + _, err := w.Write(buf[:3]) + return err + + case val <= math.MaxUint32: + buf[0] = 0xfe + littleEndian.PutUint32(buf[1:5], uint32(val)) + _, err := w.Write(buf[:5]) + return err + + default: + buf[0] = 0xff + if _, err := w.Write(buf[:1]); err != nil { return err } - return binarySerializer.PutUint32(w, littleEndian, uint32(val)) - } - err := binarySerializer.PutUint8(w, 0xff) - if err != nil { + littleEndian.PutUint64(buf, val) + _, err := w.Write(buf) return err } - return binarySerializer.PutUint64(w, littleEndian, val) } // VarIntSerializeSize returns the number of bytes it would take to serialize @@ -593,7 +629,27 @@ func VarIntSerializeSize(val uint64) int { // maximum block payload size since it helps protect against memory exhaustion // attacks and forced panics through malformed messages. func ReadVarString(r io.Reader, pver uint32) (string, error) { - count, err := ReadVarInt(r, pver) + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + str, err := readVarStringBuf(r, pver, buf) + return str, err +} + +// readVarStringBuf reads a variable length string from r and returns it as a Go +// string. A variable length string is encoded as a variable length integer +// containing the length of the string followed by the bytes that represent the +// string itself. An error is returned if the length is greater than the +// maximum block payload size since it helps protect against memory exhaustion +// attacks and forced panics through malformed messages. +// +// If b is non-nil, the provided buffer will be used for serializing small +// values. Otherwise a buffer will be drawn from the binarySerializer's pool +// and return when the method finishes. +// +// NOTE: b MUST either be nil or at least an 8-byte slice. +func readVarStringBuf(r io.Reader, pver uint32, buf []byte) (string, error) { + count, err := ReadVarIntBuf(r, pver, buf) if err != nil { return "", err } @@ -607,22 +663,40 @@ func ReadVarString(r io.Reader, pver uint32) (string, error) { return "", messageError("ReadVarString", str) } - buf := make([]byte, count) - _, err = io.ReadFull(r, buf) + str := make([]byte, count) + _, err = io.ReadFull(r, str) if err != nil { return "", err } - return string(buf), nil + return string(str), nil } // WriteVarString serializes str to w as a variable length integer containing // the length of the string followed by the bytes that represent the string // itself. func WriteVarString(w io.Writer, pver uint32, str string) error { - err := WriteVarInt(w, pver, uint64(len(str))) + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + err := writeVarStringBuf(w, pver, str, buf) + return err +} + +// writeVarStringBuf serializes str to w as a variable length integer containing +// the length of the string followed by the bytes that represent the string +// itself. +// +// If b is non-nil, the provided buffer will be used for serializing small +// values. Otherwise a buffer will be drawn from the binarySerializer's pool +// and return when the method finishes. +// +// NOTE: b MUST either be nil or at least an 8-byte slice. +func writeVarStringBuf(w io.Writer, pver uint32, str string, buf []byte) error { + err := WriteVarIntBuf(w, pver, uint64(len(str)), buf) if err != nil { return err } + _, err = w.Write([]byte(str)) return err } @@ -637,7 +711,26 @@ func WriteVarString(w io.Writer, pver uint32, str string) error { func ReadVarBytes(r io.Reader, pver uint32, maxAllowed uint32, fieldName string) ([]byte, error) { - count, err := ReadVarInt(r, pver) + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + b, err := ReadVarBytesBuf(r, pver, buf, maxAllowed, fieldName) + return b, err +} + +// ReadVarBytesBuf reads a variable length byte array. A byte array is encoded +// as a varInt containing the length of the array followed by the bytes +// themselves. An error is returned if the length is greater than the +// passed maxAllowed parameter which helps protect against memory exhaustion +// attacks and forced panics through malformed messages. The fieldName +// parameter is only used for the error message so it provides more context in +// the error. If b is non-nil, the provided buffer will be used for serializing +// small values. Otherwise a buffer will be drawn from the binarySerializer's +// pool and return when the method finishes. +func ReadVarBytesBuf(r io.Reader, pver uint32, buf []byte, maxAllowed uint32, + fieldName string) ([]byte, error) { + + count, err := ReadVarIntBuf(r, pver, buf) if err != nil { return nil, err } @@ -651,19 +744,33 @@ func ReadVarBytes(r io.Reader, pver uint32, maxAllowed uint32, return nil, messageError("ReadVarBytes", str) } - b := make([]byte, count) - _, err = io.ReadFull(r, b) + bytes := make([]byte, count) + _, err = io.ReadFull(r, bytes) if err != nil { return nil, err } - return b, nil + return bytes, nil } // WriteVarBytes serializes a variable length byte array to w as a varInt // containing the number of bytes, followed by the bytes themselves. func WriteVarBytes(w io.Writer, pver uint32, bytes []byte) error { + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + err := WriteVarBytesBuf(w, pver, bytes, buf) + return err +} + +// WriteVarBytesBuf serializes a variable length byte array to w as a varInt +// containing the number of bytes, followed by the bytes themselves. If b is +// non-nil, the provided buffer will be used for serializing small values. +// Otherwise a buffer will be drawn from the binarySerializer's pool and return +// when the method finishes. +func WriteVarBytesBuf(w io.Writer, pver uint32, bytes, buf []byte) error { slen := uint64(len(bytes)) - err := WriteVarInt(w, pver, slen) + + err := WriteVarIntBuf(w, pver, slen, buf) if err != nil { return err } diff --git a/wire/common_test.go b/wire/common_test.go index fa963d4b5d..46e3fa6613 100644 --- a/wire/common_test.go +++ b/wire/common_test.go @@ -118,15 +118,15 @@ func TestElementWire(t *testing.T) { }, }, { - ServiceFlag(SFNodeNetwork), + SFNodeNetwork, []byte{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, }, { - InvType(InvTypeTx), + InvTypeTx, []byte{0x01, 0x00, 0x00, 0x00}, }, { - BitcoinNet(MainNet), + MainNet, []byte{0xf9, 0xbe, 0xb4, 0xd9}, }, // Type not supported by the "fast" path and requires reflection. @@ -211,9 +211,9 @@ func TestElementWireErrors(t *testing.T) { }), 0, io.ErrShortWrite, io.EOF, }, - {ServiceFlag(SFNodeNetwork), 0, io.ErrShortWrite, io.EOF}, - {InvType(InvTypeTx), 0, io.ErrShortWrite, io.EOF}, - {BitcoinNet(MainNet), 0, io.ErrShortWrite, io.EOF}, + {SFNodeNetwork, 0, io.ErrShortWrite, io.EOF}, + {InvTypeTx, 0, io.ErrShortWrite, io.EOF}, + {MainNet, 0, io.ErrShortWrite, io.EOF}, } t.Logf("Running %d tests", len(tests)) diff --git a/wire/doc.go b/wire/doc.go index b8b8c56fff..5e03ff20a1 100644 --- a/wire/doc.go +++ b/wire/doc.go @@ -14,7 +14,7 @@ supported bitcoin messages to and from the wire. This package does not deal with the specifics of message handling such as what to do when a message is received. This provides the caller with a high level of flexibility. -Bitcoin Message Overview +# Bitcoin Message Overview The bitcoin protocol consists of exchanging messages between peers. Each message is preceded by a header which identifies information about it such as @@ -30,7 +30,7 @@ messages, all of the details of marshalling and unmarshalling to and from the wire using bitcoin encoding are handled so the caller doesn't have to concern themselves with the specifics. -Message Interaction +# Message Interaction The following provides a quick summary of how the bitcoin messages are intended to interact with one another. As stated above, these interactions are not @@ -62,13 +62,13 @@ interactions in no particular order. in BIP0031. The BIP0031Version constant can be used to detect a recent enough protocol version for this purpose (version > BIP0031Version). -Common Parameters +# Common Parameters There are several common parameters that arise when using this package to read and write bitcoin messages. The following sections provide a quick overview of these parameters so the next sections can build on them. -Protocol Version +# Protocol Version The protocol version should be negotiated with the remote peer at a higher level than this package via the version (MsgVersion) message exchange, however, @@ -77,7 +77,7 @@ latest protocol version this package supports and is typically the value to use for all outbound connections before a potentially lower protocol version is negotiated. -Bitcoin Network +# Bitcoin Network The bitcoin network is a magic number which is used to identify the start of a message and which bitcoin network the message applies to. This package provides @@ -88,7 +88,7 @@ the following constants: wire.TestNet3 (Test network version 3) wire.SimNet (Simulation test network) -Determining Message Type +# Determining Message Type As discussed in the bitcoin message overview section, this package reads and writes bitcoin messages using a generic interface named Message. In @@ -106,7 +106,7 @@ switch or type assertion. An example of a type switch follows: fmt.Printf("Number of tx in block: %v", msg.Header.TxnCount) } -Reading Messages +# Reading Messages In order to unmarshall bitcoin messages from the wire, use the ReadMessage function. It accepts any io.Reader, but typically this will be a net.Conn to @@ -121,7 +121,7 @@ a remote node running a bitcoin peer. Example syntax is: // Log and handle the error } -Writing Messages +# Writing Messages In order to marshall bitcoin messages to the wire, use the WriteMessage function. It accepts any io.Writer, but typically this will be a net.Conn to @@ -139,7 +139,7 @@ from a remote peer is: // Log and handle the error } -Errors +# Errors Errors returned by this package are either the raw errors provided by underlying calls to read/write from streams such as io.EOF, io.ErrUnexpectedEOF, and @@ -147,7 +147,7 @@ io.ErrShortWrite, or of type wire.MessageError. This allows the caller to differentiate between general IO errors and malformed messages through type assertions. -Bitcoin Improvement Proposals +# Bitcoin Improvement Proposals This package includes spec changes outlined by the following BIPs: diff --git a/wire/fixedIO_test.go b/wire/fixedIO_test.go index 731c463892..0952a9b476 100644 --- a/wire/fixedIO_test.go +++ b/wire/fixedIO_test.go @@ -9,7 +9,7 @@ import ( "io" ) -// fixedWriter implements the io.Writer interface and intentially allows +// fixedWriter implements the io.Writer interface and intentionally allows // testing of error paths by forcing short writes. type fixedWriter struct { b []byte @@ -44,7 +44,7 @@ func newFixedWriter(max int) io.Writer { return &fw } -// fixedReader implements the io.Reader interface and intentially allows +// fixedReader implements the io.Reader interface and intentionally allows // testing of error paths by forcing short reads. type fixedReader struct { buf []byte @@ -68,7 +68,7 @@ func (fr *fixedReader) Read(p []byte) (n int, err error) { func newFixedReader(max int, buf []byte) io.Reader { b := make([]byte, max) if buf != nil { - copy(b[:], buf) + copy(b, buf) } iobuf := bytes.NewBuffer(b) diff --git a/wire/invvect.go b/wire/invvect.go index 1e706642b4..c0756a8f1c 100644 --- a/wire/invvect.go +++ b/wire/invvect.go @@ -74,13 +74,37 @@ func NewInvVect(typ InvType, hash *chainhash.Hash) *InvVect { } } -// readInvVect reads an encoded InvVect from r depending on the protocol +// readInvVectBuf reads an encoded InvVect from r depending on the protocol // version. -func readInvVect(r io.Reader, pver uint32, iv *InvVect) error { - return readElements(r, &iv.Type, &iv.Hash) +// +// If b is non-nil, the provided buffer will be used for serializing small +// values. Otherwise a buffer will be drawn from the binarySerializer's pool +// and return when the method finishes. +// +// NOTE: b MUST either be nil or at least an 8-byte slice. +func readInvVectBuf(r io.Reader, pver uint32, iv *InvVect, buf []byte) error { + if _, err := io.ReadFull(r, buf[:4]); err != nil { + return err + } + iv.Type = InvType(littleEndian.Uint32(buf[:4])) + + _, err := io.ReadFull(r, iv.Hash[:]) + return err } -// writeInvVect serializes an InvVect to w depending on the protocol version. -func writeInvVect(w io.Writer, pver uint32, iv *InvVect) error { - return writeElements(w, iv.Type, &iv.Hash) +// writeInvVectBuf serializes an InvVect to w depending on the protocol version. +// +// If b is non-nil, the provided buffer will be used for serializing small +// values. Otherwise a buffer will be drawn from the binarySerializer's pool +// and return when the method finishes. +// +// NOTE: b MUST either be nil or at least an 8-byte slice. +func writeInvVectBuf(w io.Writer, pver uint32, iv *InvVect, buf []byte) error { + littleEndian.PutUint32(buf[:4], uint32(iv.Type)) + if _, err := w.Write(buf[:4]); err != nil { + return err + } + + _, err := w.Write(iv.Hash[:]) + return err } diff --git a/wire/invvect_test.go b/wire/invvect_test.go index 1d02c09817..cf29d0a2ff 100644 --- a/wire/invvect_test.go +++ b/wire/invvect_test.go @@ -238,10 +238,11 @@ func TestInvVectWire(t *testing.T) { } t.Logf("Running %d tests", len(tests)) + var b [8]byte for i, test := range tests { // Encode to wire format. var buf bytes.Buffer - err := writeInvVect(&buf, test.pver, &test.in) + err := writeInvVectBuf(&buf, test.pver, &test.in, b[:]) if err != nil { t.Errorf("writeInvVect #%d error %v", i, err) continue @@ -255,7 +256,7 @@ func TestInvVectWire(t *testing.T) { // Decode the message from wire format. var iv InvVect rbuf := bytes.NewReader(test.buf) - err = readInvVect(rbuf, test.pver, &iv) + err = readInvVectBuf(rbuf, test.pver, &iv, b[:]) if err != nil { t.Errorf("readInvVect #%d error %v", i, err) continue diff --git a/wire/message.go b/wire/message.go index e937647702..95f7013ebb 100644 --- a/wire/message.go +++ b/wire/message.go @@ -1,4 +1,4 @@ -// Copyright (c) 2013-2016 The btcsuite developers +// Copyright (c) 2013-2024 The btcsuite developers // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. @@ -32,6 +32,7 @@ const ( CmdVerAck = "verack" CmdGetAddr = "getaddr" CmdAddr = "addr" + CmdAddrV2 = "addrv2" CmdGetBlocks = "getblocks" CmdInv = "inv" CmdGetData = "getdata" @@ -57,6 +58,8 @@ const ( CmdCFilter = "cfilter" CmdCFHeaders = "cfheaders" CmdCFCheckpt = "cfcheckpt" + CmdSendAddrV2 = "sendaddrv2" + CmdWTxIdRelay = "wtxidrelay" ) // MessageEncoding represents the wire message encoding format to be used. @@ -77,6 +80,13 @@ const ( // protocol. var LatestEncoding = WitnessEncoding +// ErrUnknownMessage is the error returned when decoding an unknown message. +var ErrUnknownMessage = fmt.Errorf("received unknown message") + +// ErrInvalidHandshake is the error returned when a peer sends us a known +// message that does not belong in the version-verack handshake. +var ErrInvalidHandshake = fmt.Errorf("invalid message during handshake") + // Message is an interface that describes a bitcoin message. A type that // implements Message has complete control over the representation of its data // and may therefore contain additional or fewer fields than those which @@ -99,12 +109,18 @@ func makeEmptyMessage(command string) (Message, error) { case CmdVerAck: msg = &MsgVerAck{} + case CmdSendAddrV2: + msg = &MsgSendAddrV2{} + case CmdGetAddr: msg = &MsgGetAddr{} case CmdAddr: msg = &MsgAddr{} + case CmdAddrV2: + msg = &MsgAddrV2{} + case CmdGetBlocks: msg = &MsgGetBlocks{} @@ -181,7 +197,7 @@ func makeEmptyMessage(command string) (Message, error) { msg = &MsgCFCheckpt{} default: - return nil, fmt.Errorf("unhandled command [%s]", command) + return nil, ErrUnknownMessage } return msg, nil } @@ -213,7 +229,7 @@ func readMessageHeader(r io.Reader) (int, *messageHeader, error) { readElements(hr, &hdr.magic, &command, &hdr.length, &hdr.checksum) // Strip trailing zeros from command string. - hdr.command = string(bytes.TrimRight(command[:], string(0))) + hdr.command = string(bytes.TrimRight(command[:], "\x00")) return n, &hdr, nil } @@ -374,9 +390,10 @@ func ReadMessageWithEncodingN(r io.Reader, pver uint32, btcnet BitcoinNet, // Create struct of appropriate message type based on the command. msg, err := makeEmptyMessage(command) if err != nil { + // makeEmptyMessage can only return ErrUnknownMessage and it is + // important that we bubble it up to the caller. discardInput(r, hdr.length) - return totalBytes, nil, nil, messageError("ReadMessage", - err.Error()) + return totalBytes, nil, nil, err } // Check for maximum length based on the message type as a malicious client @@ -401,7 +418,7 @@ func ReadMessageWithEncodingN(r io.Reader, pver uint32, btcnet BitcoinNet, // Test checksum. checksum := chainhash.DoubleHashB(payload)[0:4] - if !bytes.Equal(checksum[:], hdr.checksum[:]) { + if !bytes.Equal(checksum, hdr.checksum[:]) { str := fmt.Sprintf("payload checksum failed - header "+ "indicates %v, but actual checksum is %v.", hdr.checksum, checksum) diff --git a/wire/message_test.go b/wire/message_test.go index 3a422e66ba..7ba2e0639f 100644 --- a/wire/message_test.go +++ b/wire/message_test.go @@ -295,7 +295,7 @@ func TestReadMessageWireErrors(t *testing.T) { pver, btcnet, len(unsupportedCommandBytes), - &MessageError{}, + ErrUnknownMessage, 24, }, @@ -345,7 +345,7 @@ func TestReadMessageWireErrors(t *testing.T) { pver, btcnet, len(discardBytes), - &MessageError{}, + ErrUnknownMessage, 24, }, } diff --git a/wire/msgaddrv2.go b/wire/msgaddrv2.go new file mode 100644 index 0000000000..4db4a1334a --- /dev/null +++ b/wire/msgaddrv2.go @@ -0,0 +1,102 @@ +package wire + +import ( + "fmt" + "io" +) + +// MaxV2AddrPerMsg is the maximum number of version 2 addresses that will exist +// in a single addrv2 message (MsgAddrV2). +const MaxV2AddrPerMsg = 1000 + +// MsgAddrV2 implements the Message interface and represents a bitcoin addrv2 +// message that can support longer-length addresses like torv3, cjdns, and i2p. +// It is used to gossip addresses on the network. Each message is limited to +// MaxV2AddrPerMsg addresses. This is the same limit as MsgAddr. +type MsgAddrV2 struct { + AddrList []*NetAddressV2 +} + +// BtcDecode decodes r using the bitcoin protocol into a MsgAddrV2. +func (m *MsgAddrV2) BtcDecode(r io.Reader, pver uint32, + enc MessageEncoding) error { + + count, err := ReadVarInt(r, pver) + if err != nil { + return err + } + + // Limit to max addresses per message. + if count > MaxV2AddrPerMsg { + str := fmt.Sprintf("too many addresses for message [count %v,"+ + " max %v]", count, MaxV2AddrPerMsg) + return messageError("MsgAddrV2.BtcDecode", str) + } + + addrList := make([]NetAddressV2, count) + m.AddrList = make([]*NetAddressV2, 0, count) + for i := uint64(0); i < count; i++ { + na := &addrList[i] + err := readNetAddressV2(r, pver, na) + switch err { + case ErrSkippedNetworkID: + // This may be a network ID we don't know of, but is + // still valid. We can safely skip those. + continue + case ErrInvalidAddressSize: + // The encoding used by the peer does not follow + // BIP-155 and we should stop processing this message. + return err + } + + m.AddrList = append(m.AddrList, na) + } + + return nil +} + +// BtcEncode encodes the MsgAddrV2 into a writer w. +func (m *MsgAddrV2) BtcEncode(w io.Writer, pver uint32, + enc MessageEncoding) error { + + count := len(m.AddrList) + if count > MaxV2AddrPerMsg { + str := fmt.Sprintf("too many addresses for message [count %v,"+ + " max %v]", count, MaxV2AddrPerMsg) + return messageError("MsgAddrV2.BtcEncode", str) + } + + err := WriteVarInt(w, pver, uint64(count)) + if err != nil { + return err + } + + for _, na := range m.AddrList { + err = writeNetAddressV2(w, pver, na) + if err != nil { + return err + } + } + + return nil +} + +// Command returns the protocol command string for MsgAddrV2. +func (m *MsgAddrV2) Command() string { + return CmdAddrV2 +} + +// MaxPayloadLength returns the maximum length payload possible for MsgAddrV2. +func (m *MsgAddrV2) MaxPayloadLength(pver uint32) uint32 { + // The varint that can store the maximum number of addresses is 3 bytes + // long. The maximum payload is then 3 + 1000 * maxNetAddressV2Payload. + return 3 + (MaxV2AddrPerMsg * maxNetAddressV2Payload()) +} + +// NewMsgAddrV2 returns a new bitcoin addrv2 message that conforms to the +// Message interface. +func NewMsgAddrV2() *MsgAddrV2 { + return &MsgAddrV2{ + AddrList: make([]*NetAddressV2, 0, MaxV2AddrPerMsg), + } +} diff --git a/wire/msgaddrv2_test.go b/wire/msgaddrv2_test.go new file mode 100644 index 0000000000..213d699c96 --- /dev/null +++ b/wire/msgaddrv2_test.go @@ -0,0 +1,73 @@ +package wire + +import ( + "bytes" + "io" + "testing" +) + +// TestAddrV2Decode checks that decoding an addrv2 message off the wire behaves +// as expected. This means ignoring certain addresses, and failing in certain +// failure scenarios. +func TestAddrV2Decode(t *testing.T) { + tests := []struct { + buf []byte + expectedError bool + expectedAddrs int + }{ + // Exceeding max addresses. + { + []byte{0xfd, 0xff, 0xff}, + true, + 0, + }, + + // Invalid address size. + { + []byte{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05}, + true, + 0, + }, + + // One valid address and one skipped address + { + []byte{ + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, + 0x7f, 0x00, 0x00, 0x01, 0x22, 0x22, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x10, 0xfd, 0x87, 0xd8, + 0x7e, 0xeb, 0x43, 0xff, 0xfe, 0xcc, 0x39, 0xa8, + 0x73, 0x69, 0x15, 0xff, 0xff, 0x22, 0x22, + }, + false, + 1, + }, + } + + t.Logf("Running %d tests", len(tests)) + for i, test := range tests { + r := bytes.NewReader(test.buf) + m := &MsgAddrV2{} + + err := m.BtcDecode(r, 0, LatestEncoding) + if test.expectedError { + if err == nil { + t.Errorf("Test #%d expected error", i) + } + + continue + } else if err != nil { + t.Errorf("Test #%d unexpected error %v", i, err) + } + + // Trying to read more should give EOF. + var b [1]byte + if _, err := r.Read(b[:]); err != io.EOF { + t.Errorf("Test #%d did not cleanly finish reading", i) + } + + if len(m.AddrList) != test.expectedAddrs { + t.Errorf("Test #%d expected %d addrs, instead of %d", + i, test.expectedAddrs, len(m.AddrList)) + } + } +} diff --git a/wire/msgalert.go b/wire/msgalert.go index 71c4e220fe..b99ac89de9 100644 --- a/wire/msgalert.go +++ b/wire/msgalert.go @@ -83,7 +83,7 @@ const maxAlertSize = MaxMessagePayload - maxSignatureSize - MaxVarIntPayload - 1 // fit into a maximum size alert. // // maxAlertSize = fixedAlertSize + max(SetCancel) + max(SetSubVer) + 3*(string) -// for caculating maximum number of cancel IDs, set all other var sizes to 0 +// for calculating maximum number of cancel IDs, set all other var sizes to 0 // maxAlertSize = fixedAlertSize + (MaxVarIntPayload-1) + x*sizeOf(int32) // x = (maxAlertSize - fixedAlertSize - MaxVarIntPayload + 1) / 4 const maxCountSetCancel = (maxAlertSize - fixedAlertSize - MaxVarIntPayload + 1) / 4 @@ -92,7 +92,7 @@ const maxCountSetCancel = (maxAlertSize - fixedAlertSize - MaxVarIntPayload + 1) // fit into a maximum size alert. // // maxAlertSize = fixedAlertSize + max(SetCancel) + max(SetSubVer) + 3*(string) -// for caculating maximum number of subversions, set all other var sizes to 0 +// for calculating maximum number of subversions, set all other var sizes to 0 // maxAlertSize = fixedAlertSize + (MaxVarIntPayload-1) + x*sizeOf(string) // x = (maxAlertSize - fixedAlertSize - MaxVarIntPayload + 1) / sizeOf(string) // subversion would typically be something like "/Satoshi:0.7.2/" (15 bytes) diff --git a/wire/msgblock.go b/wire/msgblock.go index 4172949dc3..59dbbb1c06 100644 --- a/wire/msgblock.go +++ b/wire/msgblock.go @@ -45,6 +45,20 @@ type MsgBlock struct { Transactions []*MsgTx } +// Copy creates a deep copy of MsgBlock. +func (msg *MsgBlock) Copy() *MsgBlock { + block := &MsgBlock{ + Header: msg.Header, + Transactions: make([]*MsgTx, len(msg.Transactions)), + } + + for i, tx := range msg.Transactions { + block.Transactions[i] = tx.Copy() + } + + return block +} + // AddTransaction adds a transaction to the message. func (msg *MsgBlock) AddTransaction(tx *MsgTx) error { msg.Transactions = append(msg.Transactions, tx) @@ -62,12 +76,15 @@ func (msg *MsgBlock) ClearTransactions() { // See Deserialize for decoding blocks stored to disk, such as in a database, as // opposed to decoding blocks from the wire. func (msg *MsgBlock) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error { - err := readBlockHeader(r, pver, &msg.Header) + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + err := readBlockHeaderBuf(r, pver, &msg.Header, buf) if err != nil { return err } - txCount, err := ReadVarInt(r, pver) + txCount, err := ReadVarIntBuf(r, pver, buf) if err != nil { return err } @@ -81,10 +98,13 @@ func (msg *MsgBlock) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) er return messageError("MsgBlock.BtcDecode", str) } + scriptBuf := scriptPool.Borrow() + defer scriptPool.Return(scriptBuf) + msg.Transactions = make([]*MsgTx, 0, txCount) for i := uint64(0); i < txCount; i++ { tx := MsgTx{} - err := tx.BtcDecode(r, pver, enc) + err := tx.btcDecode(r, pver, enc, buf, scriptBuf[:]) if err != nil { return err } @@ -129,15 +149,18 @@ func (msg *MsgBlock) DeserializeNoWitness(r io.Reader) error { func (msg *MsgBlock) DeserializeTxLoc(r *bytes.Buffer) ([]TxLoc, error) { fullLen := r.Len() + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + // At the current time, there is no difference between the wire encoding // at protocol version 0 and the stable long-term storage format. As // a result, make use of existing wire protocol functions. - err := readBlockHeader(r, 0, &msg.Header) + err := readBlockHeaderBuf(r, 0, &msg.Header, buf) if err != nil { return nil, err } - txCount, err := ReadVarInt(r, 0) + txCount, err := ReadVarIntBuf(r, 0, buf) if err != nil { return nil, err } @@ -151,6 +174,9 @@ func (msg *MsgBlock) DeserializeTxLoc(r *bytes.Buffer) ([]TxLoc, error) { return nil, messageError("MsgBlock.DeserializeTxLoc", str) } + scriptBuf := scriptPool.Borrow() + defer scriptPool.Return(scriptBuf) + // Deserialize each transaction while keeping track of its location // within the byte stream. msg.Transactions = make([]*MsgTx, 0, txCount) @@ -158,7 +184,7 @@ func (msg *MsgBlock) DeserializeTxLoc(r *bytes.Buffer) ([]TxLoc, error) { for i := uint64(0); i < txCount; i++ { txLocs[i].TxStart = fullLen - r.Len() tx := MsgTx{} - err := tx.Deserialize(r) + err := tx.btcDecode(r, 0, WitnessEncoding, buf, scriptBuf[:]) if err != nil { return nil, err } @@ -174,18 +200,21 @@ func (msg *MsgBlock) DeserializeTxLoc(r *bytes.Buffer) ([]TxLoc, error) { // See Serialize for encoding blocks to be stored to disk, such as in a // database, as opposed to encoding blocks for the wire. func (msg *MsgBlock) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error { - err := writeBlockHeader(w, pver, &msg.Header) + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + err := writeBlockHeaderBuf(w, pver, &msg.Header, buf) if err != nil { return err } - err = WriteVarInt(w, pver, uint64(len(msg.Transactions))) + err = WriteVarIntBuf(w, pver, uint64(len(msg.Transactions)), buf) if err != nil { return err } for _, tx := range msg.Transactions { - err = tx.BtcEncode(w, pver, enc) + err = tx.btcEncode(w, pver, enc, buf) if err != nil { return err } @@ -216,7 +245,7 @@ func (msg *MsgBlock) Serialize(w io.Writer) error { // SerializeNoWitness encodes a block to w using an identical format to // Serialize, with all (if any) witness data stripped from all transactions. -// This method is provided in additon to the regular Serialize, in order to +// This method is provided in addition to the regular Serialize, in order to // allow one to selectively encode transaction witness data to non-upgraded // peers which are unaware of the new encoding. func (msg *MsgBlock) SerializeNoWitness(w io.Writer) error { diff --git a/wire/msgblock_test.go b/wire/msgblock_test.go index 2a861b208b..f0e938697c 100644 --- a/wire/msgblock_test.go +++ b/wire/msgblock_test.go @@ -562,7 +562,7 @@ var blockOneBytes = []byte{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Previous output hash - 0xff, 0xff, 0xff, 0xff, // Prevous output index + 0xff, 0xff, 0xff, 0xff, // Previous output index 0x07, // Varint for length of signature script 0x04, 0xff, 0xff, 0x00, 0x1d, 0x01, 0x04, // Signature script (coinbase) 0xff, 0xff, 0xff, 0xff, // Sequence diff --git a/wire/msgcfcheckpt.go b/wire/msgcfcheckpt.go index fc3fd53295..397a3c137a 100644 --- a/wire/msgcfcheckpt.go +++ b/wire/msgcfcheckpt.go @@ -52,20 +52,22 @@ func (msg *MsgCFCheckpt) AddCFHeader(header *chainhash.Hash) error { // BtcDecode decodes r using the bitcoin protocol encoding into the receiver. // This is part of the Message interface implementation. func (msg *MsgCFCheckpt) BtcDecode(r io.Reader, pver uint32, _ MessageEncoding) error { + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + // Read filter type - err := readElement(r, &msg.FilterType) - if err != nil { + if _, err := io.ReadFull(r, buf[:1]); err != nil { return err } + msg.FilterType = FilterType(buf[0]) // Read stop hash - err = readElement(r, &msg.StopHash) - if err != nil { + if _, err := io.ReadFull(r, msg.StopHash[:]); err != nil { return err } // Read number of filter headers - count, err := ReadVarInt(r, pver) + count, err := ReadVarIntBuf(r, pver, buf) if err != nil { return err } @@ -80,7 +82,7 @@ func (msg *MsgCFCheckpt) BtcDecode(r io.Reader, pver uint32, _ MessageEncoding) msg.FilterHeaders = make([]*chainhash.Hash, count) for i := uint64(0); i < count; i++ { var cfh chainhash.Hash - err := readElement(r, &cfh) + _, err := io.ReadFull(r, cfh[:]) if err != nil { return err } @@ -93,27 +95,29 @@ func (msg *MsgCFCheckpt) BtcDecode(r io.Reader, pver uint32, _ MessageEncoding) // BtcEncode encodes the receiver to w using the bitcoin protocol encoding. // This is part of the Message interface implementation. func (msg *MsgCFCheckpt) BtcEncode(w io.Writer, pver uint32, _ MessageEncoding) error { + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + // Write filter type - err := writeElement(w, msg.FilterType) - if err != nil { + buf[0] = byte(msg.FilterType) + if _, err := w.Write(buf[:1]); err != nil { return err } // Write stop hash - err = writeElement(w, msg.StopHash) - if err != nil { + if _, err := w.Write(msg.StopHash[:]); err != nil { return err } // Write length of FilterHeaders slice count := len(msg.FilterHeaders) - err = WriteVarInt(w, pver, uint64(count)) + err := WriteVarIntBuf(w, pver, uint64(count), buf) if err != nil { return err } for _, cfh := range msg.FilterHeaders { - err := writeElement(w, cfh) + _, err := w.Write(cfh[:]) if err != nil { return err } diff --git a/wire/msgcfheaders.go b/wire/msgcfheaders.go index 40d30f9b46..e1af2c324d 100644 --- a/wire/msgcfheaders.go +++ b/wire/msgcfheaders.go @@ -48,26 +48,27 @@ func (msg *MsgCFHeaders) AddCFHash(hash *chainhash.Hash) error { // BtcDecode decodes r using the bitcoin protocol encoding into the receiver. // This is part of the Message interface implementation. func (msg *MsgCFHeaders) BtcDecode(r io.Reader, pver uint32, _ MessageEncoding) error { + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + // Read filter type - err := readElement(r, &msg.FilterType) - if err != nil { + if _, err := io.ReadFull(r, buf[:1]); err != nil { return err } + msg.FilterType = FilterType(buf[0]) // Read stop hash - err = readElement(r, &msg.StopHash) - if err != nil { + if _, err := io.ReadFull(r, msg.StopHash[:]); err != nil { return err } // Read prev filter header - err = readElement(r, &msg.PrevFilterHeader) - if err != nil { + if _, err := io.ReadFull(r, msg.PrevFilterHeader[:]); err != nil { return err } // Read number of filter headers - count, err := ReadVarInt(r, pver) + count, err := ReadVarIntBuf(r, pver, buf) if err != nil { return err } @@ -85,7 +86,7 @@ func (msg *MsgCFHeaders) BtcDecode(r io.Reader, pver uint32, _ MessageEncoding) msg.FilterHashes = make([]*chainhash.Hash, 0, count) for i := uint64(0); i < count; i++ { var cfh chainhash.Hash - err := readElement(r, &cfh) + _, err := io.ReadFull(r, cfh[:]) if err != nil { return err } @@ -98,40 +99,40 @@ func (msg *MsgCFHeaders) BtcDecode(r io.Reader, pver uint32, _ MessageEncoding) // BtcEncode encodes the receiver to w using the bitcoin protocol encoding. // This is part of the Message interface implementation. func (msg *MsgCFHeaders) BtcEncode(w io.Writer, pver uint32, _ MessageEncoding) error { + count := len(msg.FilterHashes) + if count > MaxCFHeadersPerMsg { + str := fmt.Sprintf("too many committed filter headers for "+ + "message [count %v, max %v]", count, + MaxBlockHeadersPerMsg) + return messageError("MsgCFHeaders.BtcEncode", str) + } + + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + // Write filter type - err := writeElement(w, msg.FilterType) - if err != nil { + buf[0] = byte(msg.FilterType) + if _, err := w.Write(buf[:1]); err != nil { return err } // Write stop hash - err = writeElement(w, msg.StopHash) - if err != nil { + if _, err := w.Write(msg.StopHash[:]); err != nil { return err } // Write prev filter header - err = writeElement(w, msg.PrevFilterHeader) - if err != nil { + if _, err := w.Write(msg.PrevFilterHeader[:]); err != nil { return err } - // Limit to max committed headers per message. - count := len(msg.FilterHashes) - if count > MaxCFHeadersPerMsg { - str := fmt.Sprintf("too many committed filter headers for "+ - "message [count %v, max %v]", count, - MaxBlockHeadersPerMsg) - return messageError("MsgCFHeaders.BtcEncode", str) - } - - err = WriteVarInt(w, pver, uint64(count)) + err := WriteVarIntBuf(w, pver, uint64(count), buf) if err != nil { return err } for _, cfh := range msg.FilterHashes { - err := writeElement(w, cfh) + _, err := w.Write(cfh[:]) if err != nil { return err } diff --git a/wire/msgcfilter.go b/wire/msgcfilter.go index 097590b2ce..d7cf16378a 100644 --- a/wire/msgcfilter.go +++ b/wire/msgcfilter.go @@ -38,19 +38,22 @@ type MsgCFilter struct { // This is part of the Message interface implementation. func (msg *MsgCFilter) BtcDecode(r io.Reader, pver uint32, _ MessageEncoding) error { // Read filter type - err := readElement(r, &msg.FilterType) - if err != nil { + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + if _, err := io.ReadFull(r, buf[:1]); err != nil { return err } + msg.FilterType = FilterType(buf[0]) // Read the hash of the filter's block - err = readElement(r, &msg.BlockHash) - if err != nil { + if _, err := io.ReadFull(r, msg.BlockHash[:]); err != nil { return err } // Read filter data - msg.Data, err = ReadVarBytes(r, pver, MaxCFilterDataSize, + var err error + msg.Data, err = ReadVarBytesBuf(r, pver, buf, MaxCFilterDataSize, "cfilter data") return err } @@ -65,17 +68,20 @@ func (msg *MsgCFilter) BtcEncode(w io.Writer, pver uint32, _ MessageEncoding) er return messageError("MsgCFilter.BtcEncode", str) } - err := writeElement(w, msg.FilterType) - if err != nil { + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + buf[0] = byte(msg.FilterType) + if _, err := w.Write(buf[:1]); err != nil { return err } - err = writeElement(w, msg.BlockHash) - if err != nil { + if _, err := w.Write(msg.BlockHash[:]); err != nil { return err } - return WriteVarBytes(w, pver, msg.Data) + err := WriteVarBytesBuf(w, pver, msg.Data, buf) + return err } // Deserialize decodes a filter from r into the receiver using a format that is diff --git a/wire/msggetblocks.go b/wire/msggetblocks.go index caf4400ca4..da8bb878d2 100644 --- a/wire/msggetblocks.go +++ b/wire/msggetblocks.go @@ -51,16 +51,20 @@ func (msg *MsgGetBlocks) AddBlockLocatorHash(hash *chainhash.Hash) error { // BtcDecode decodes r using the bitcoin protocol encoding into the receiver. // This is part of the Message interface implementation. func (msg *MsgGetBlocks) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error { - err := readElement(r, &msg.ProtocolVersion) - if err != nil { + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + if _, err := io.ReadFull(r, buf[:4]); err != nil { return err } + msg.ProtocolVersion = littleEndian.Uint32(buf[:4]) // Read num block locator hashes and limit to max. - count, err := ReadVarInt(r, pver) + count, err := ReadVarIntBuf(r, pver, buf) if err != nil { return err } + if count > MaxBlockLocatorsPerMsg { str := fmt.Sprintf("too many block locator hashes for message "+ "[count %v, max %v]", count, MaxBlockLocatorsPerMsg) @@ -73,14 +77,15 @@ func (msg *MsgGetBlocks) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding msg.BlockLocatorHashes = make([]*chainhash.Hash, 0, count) for i := uint64(0); i < count; i++ { hash := &locatorHashes[i] - err := readElement(r, hash) + _, err := io.ReadFull(r, hash[:]) if err != nil { return err } msg.AddBlockLocatorHash(hash) } - return readElement(r, &msg.HashStop) + _, err = io.ReadFull(r, msg.HashStop[:]) + return err } // BtcEncode encodes the receiver to w using the bitcoin protocol encoding. @@ -93,24 +98,28 @@ func (msg *MsgGetBlocks) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding return messageError("MsgGetBlocks.BtcEncode", str) } - err := writeElement(w, msg.ProtocolVersion) - if err != nil { + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + littleEndian.PutUint32(buf[:4], msg.ProtocolVersion) + if _, err := w.Write(buf[:4]); err != nil { return err } - err = WriteVarInt(w, pver, uint64(count)) + err := WriteVarIntBuf(w, pver, uint64(count), buf) if err != nil { return err } for _, hash := range msg.BlockLocatorHashes { - err = writeElement(w, hash) + _, err := w.Write(hash[:]) if err != nil { return err } } - return writeElement(w, &msg.HashStop) + _, err = w.Write(msg.HashStop[:]) + return err } // Command returns the protocol command string for the message. This is part diff --git a/wire/msggetcfcheckpt.go b/wire/msggetcfcheckpt.go index c30a86cecd..c57aa5adaf 100644 --- a/wire/msggetcfcheckpt.go +++ b/wire/msggetcfcheckpt.go @@ -21,23 +21,31 @@ type MsgGetCFCheckpt struct { // BtcDecode decodes r using the bitcoin protocol encoding into the receiver. // This is part of the Message interface implementation. func (msg *MsgGetCFCheckpt) BtcDecode(r io.Reader, pver uint32, _ MessageEncoding) error { - err := readElement(r, &msg.FilterType) - if err != nil { + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + if _, err := io.ReadFull(r, buf[:1]); err != nil { return err } + msg.FilterType = FilterType(buf[0]) - return readElement(r, &msg.StopHash) + _, err := io.ReadFull(r, msg.StopHash[:]) + return err } // BtcEncode encodes the receiver to w using the bitcoin protocol encoding. // This is part of the Message interface implementation. func (msg *MsgGetCFCheckpt) BtcEncode(w io.Writer, pver uint32, _ MessageEncoding) error { - err := writeElement(w, msg.FilterType) - if err != nil { + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + buf[0] = byte(msg.FilterType) + if _, err := w.Write(buf[:1]); err != nil { return err } - return writeElement(w, &msg.StopHash) + _, err := w.Write(msg.StopHash[:]) + return err } // Command returns the protocol command string for the message. This is part diff --git a/wire/msggetcfheaders.go b/wire/msggetcfheaders.go index 03a1caf72f..e26f439808 100644 --- a/wire/msggetcfheaders.go +++ b/wire/msggetcfheaders.go @@ -22,33 +22,41 @@ type MsgGetCFHeaders struct { // BtcDecode decodes r using the bitcoin protocol encoding into the receiver. // This is part of the Message interface implementation. func (msg *MsgGetCFHeaders) BtcDecode(r io.Reader, pver uint32, _ MessageEncoding) error { - err := readElement(r, &msg.FilterType) - if err != nil { + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + if _, err := io.ReadFull(r, buf[:1]); err != nil { return err } + msg.FilterType = FilterType(buf[0]) - err = readElement(r, &msg.StartHeight) - if err != nil { + if _, err := io.ReadFull(r, buf[:4]); err != nil { return err } + msg.StartHeight = littleEndian.Uint32(buf[:4]) - return readElement(r, &msg.StopHash) + _, err := io.ReadFull(r, msg.StopHash[:]) + return err } // BtcEncode encodes the receiver to w using the bitcoin protocol encoding. // This is part of the Message interface implementation. func (msg *MsgGetCFHeaders) BtcEncode(w io.Writer, pver uint32, _ MessageEncoding) error { - err := writeElement(w, msg.FilterType) - if err != nil { + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + buf[0] = byte(msg.FilterType) + if _, err := w.Write(buf[:1]); err != nil { return err } - err = writeElement(w, &msg.StartHeight) - if err != nil { + littleEndian.PutUint32(buf[:4], msg.StartHeight) + if _, err := w.Write(buf[:4]); err != nil { return err } - return writeElement(w, &msg.StopHash) + _, err := w.Write(msg.StopHash[:]) + return err } // Command returns the protocol command string for the message. This is part diff --git a/wire/msggetcfilters.go b/wire/msggetcfilters.go index 8002413826..1e6e225587 100644 --- a/wire/msggetcfilters.go +++ b/wire/msggetcfilters.go @@ -26,33 +26,41 @@ type MsgGetCFilters struct { // BtcDecode decodes r using the bitcoin protocol encoding into the receiver. // This is part of the Message interface implementation. func (msg *MsgGetCFilters) BtcDecode(r io.Reader, pver uint32, _ MessageEncoding) error { - err := readElement(r, &msg.FilterType) - if err != nil { + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + if _, err := io.ReadFull(r, buf[:1]); err != nil { return err } + msg.FilterType = FilterType(buf[0]) - err = readElement(r, &msg.StartHeight) - if err != nil { + if _, err := io.ReadFull(r, buf[:4]); err != nil { return err } + msg.StartHeight = littleEndian.Uint32(buf[:4]) - return readElement(r, &msg.StopHash) + _, err := io.ReadFull(r, msg.StopHash[:]) + return err } // BtcEncode encodes the receiver to w using the bitcoin protocol encoding. // This is part of the Message interface implementation. func (msg *MsgGetCFilters) BtcEncode(w io.Writer, pver uint32, _ MessageEncoding) error { - err := writeElement(w, msg.FilterType) - if err != nil { + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + buf[0] = byte(msg.FilterType) + if _, err := w.Write(buf[:1]); err != nil { return err } - err = writeElement(w, &msg.StartHeight) - if err != nil { + littleEndian.PutUint32(buf[:4], msg.StartHeight) + if _, err := w.Write(buf[:4]); err != nil { return err } - return writeElement(w, &msg.StopHash) + _, err := w.Write(msg.StopHash[:]) + return err } // Command returns the protocol command string for the message. This is part diff --git a/wire/msggetdata.go b/wire/msggetdata.go index 5837fac5ba..f306845677 100644 --- a/wire/msggetdata.go +++ b/wire/msggetdata.go @@ -38,7 +38,10 @@ func (msg *MsgGetData) AddInvVect(iv *InvVect) error { // BtcDecode decodes r using the bitcoin protocol encoding into the receiver. // This is part of the Message interface implementation. func (msg *MsgGetData) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error { - count, err := ReadVarInt(r, pver) + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + count, err := ReadVarIntBuf(r, pver, buf) if err != nil { return err } @@ -55,7 +58,7 @@ func (msg *MsgGetData) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) msg.InvList = make([]*InvVect, 0, count) for i := uint64(0); i < count; i++ { iv := &invList[i] - err := readInvVect(r, pver, iv) + err := readInvVectBuf(r, pver, iv, buf) if err != nil { return err } @@ -75,13 +78,16 @@ func (msg *MsgGetData) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) return messageError("MsgGetData.BtcEncode", str) } - err := WriteVarInt(w, pver, uint64(count)) + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + err := WriteVarIntBuf(w, pver, uint64(count), buf) if err != nil { return err } for _, iv := range msg.InvList { - err := writeInvVect(w, pver, iv) + err := writeInvVectBuf(w, pver, iv, buf) if err != nil { return err } diff --git a/wire/msggetheaders.go b/wire/msggetheaders.go index 0bbe42cb03..38e5c6bfcd 100644 --- a/wire/msggetheaders.go +++ b/wire/msggetheaders.go @@ -23,7 +23,7 @@ import ( // // The algorithm for building the block locator hashes should be to add the // hashes in reverse order until you reach the genesis block. In order to keep -// the list of locator hashes to a resonable number of entries, first add the +// the list of locator hashes to a reasonable number of entries, first add the // most recent 10 block hashes, then double the step each loop iteration to // exponentially decrease the number of hashes the further away from head and // closer to the genesis block you get. @@ -48,16 +48,20 @@ func (msg *MsgGetHeaders) AddBlockLocatorHash(hash *chainhash.Hash) error { // BtcDecode decodes r using the bitcoin protocol encoding into the receiver. // This is part of the Message interface implementation. func (msg *MsgGetHeaders) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error { - err := readElement(r, &msg.ProtocolVersion) - if err != nil { + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + if _, err := io.ReadFull(r, buf[:4]); err != nil { return err } + msg.ProtocolVersion = littleEndian.Uint32(buf[:4]) // Read num block locator hashes and limit to max. - count, err := ReadVarInt(r, pver) + count, err := ReadVarIntBuf(r, pver, buf) if err != nil { return err } + if count > MaxBlockLocatorsPerMsg { str := fmt.Sprintf("too many block locator hashes for message "+ "[count %v, max %v]", count, MaxBlockLocatorsPerMsg) @@ -70,14 +74,15 @@ func (msg *MsgGetHeaders) BtcDecode(r io.Reader, pver uint32, enc MessageEncodin msg.BlockLocatorHashes = make([]*chainhash.Hash, 0, count) for i := uint64(0); i < count; i++ { hash := &locatorHashes[i] - err := readElement(r, hash) + _, err := io.ReadFull(r, hash[:]) if err != nil { return err } msg.AddBlockLocatorHash(hash) } - return readElement(r, &msg.HashStop) + _, err = io.ReadFull(r, msg.HashStop[:]) + return err } // BtcEncode encodes the receiver to w using the bitcoin protocol encoding. @@ -91,24 +96,28 @@ func (msg *MsgGetHeaders) BtcEncode(w io.Writer, pver uint32, enc MessageEncodin return messageError("MsgGetHeaders.BtcEncode", str) } - err := writeElement(w, msg.ProtocolVersion) - if err != nil { + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + littleEndian.PutUint32(buf[:4], msg.ProtocolVersion) + if _, err := w.Write(buf[:4]); err != nil { return err } - err = WriteVarInt(w, pver, uint64(count)) + err := WriteVarIntBuf(w, pver, uint64(count), buf) if err != nil { return err } for _, hash := range msg.BlockLocatorHashes { - err := writeElement(w, hash) + _, err := w.Write(hash[:]) if err != nil { return err } } - return writeElement(w, &msg.HashStop) + _, err = w.Write(msg.HashStop[:]) + return err } // Command returns the protocol command string for the message. This is part diff --git a/wire/msgheaders.go b/wire/msgheaders.go index 7d18d930e0..46edc59395 100644 --- a/wire/msgheaders.go +++ b/wire/msgheaders.go @@ -37,7 +37,10 @@ func (msg *MsgHeaders) AddBlockHeader(bh *BlockHeader) error { // BtcDecode decodes r using the bitcoin protocol encoding into the receiver. // This is part of the Message interface implementation. func (msg *MsgHeaders) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error { - count, err := ReadVarInt(r, pver) + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + count, err := ReadVarIntBuf(r, pver, buf) if err != nil { return err } @@ -55,12 +58,12 @@ func (msg *MsgHeaders) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) msg.Headers = make([]*BlockHeader, 0, count) for i := uint64(0); i < count; i++ { bh := &headers[i] - err := readBlockHeader(r, pver, bh) + err := readBlockHeaderBuf(r, pver, bh, buf) if err != nil { return err } - txCount, err := ReadVarInt(r, pver) + txCount, err := ReadVarIntBuf(r, pver, buf) if err != nil { return err } @@ -88,13 +91,16 @@ func (msg *MsgHeaders) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) return messageError("MsgHeaders.BtcEncode", str) } - err := WriteVarInt(w, pver, uint64(count)) + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + err := WriteVarIntBuf(w, pver, uint64(count), buf) if err != nil { return err } for _, bh := range msg.Headers { - err := writeBlockHeader(w, pver, bh) + err := writeBlockHeaderBuf(w, pver, bh, buf) if err != nil { return err } @@ -103,7 +109,7 @@ func (msg *MsgHeaders) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) // of transactions on header messages. This is really just an // artifact of the way the original implementation serializes // block headers, but it is required. - err = WriteVarInt(w, pver, 0) + err = WriteVarIntBuf(w, pver, 0, buf) if err != nil { return err } diff --git a/wire/msginv.go b/wire/msginv.go index 5377b179c3..4be528dec6 100644 --- a/wire/msginv.go +++ b/wire/msginv.go @@ -46,7 +46,10 @@ func (msg *MsgInv) AddInvVect(iv *InvVect) error { // BtcDecode decodes r using the bitcoin protocol encoding into the receiver. // This is part of the Message interface implementation. func (msg *MsgInv) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error { - count, err := ReadVarInt(r, pver) + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + count, err := ReadVarIntBuf(r, pver, buf) if err != nil { return err } @@ -63,7 +66,7 @@ func (msg *MsgInv) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) erro msg.InvList = make([]*InvVect, 0, count) for i := uint64(0); i < count; i++ { iv := &invList[i] - err := readInvVect(r, pver, iv) + err := readInvVectBuf(r, pver, iv, buf) if err != nil { return err } @@ -83,13 +86,16 @@ func (msg *MsgInv) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) erro return messageError("MsgInv.BtcEncode", str) } - err := WriteVarInt(w, pver, uint64(count)) + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + err := WriteVarIntBuf(w, pver, uint64(count), buf) if err != nil { return err } for _, iv := range msg.InvList { - err := writeInvVect(w, pver, iv) + err := writeInvVectBuf(w, pver, iv, buf) if err != nil { return err } diff --git a/wire/msgmerkleblock.go b/wire/msgmerkleblock.go index d2ee472178..eacbdc5847 100644 --- a/wire/msgmerkleblock.go +++ b/wire/msgmerkleblock.go @@ -49,18 +49,21 @@ func (msg *MsgMerkleBlock) BtcDecode(r io.Reader, pver uint32, enc MessageEncodi return messageError("MsgMerkleBlock.BtcDecode", str) } - err := readBlockHeader(r, pver, &msg.Header) + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + err := readBlockHeaderBuf(r, pver, &msg.Header, buf) if err != nil { return err } - err = readElement(r, &msg.Transactions) - if err != nil { + if _, err := io.ReadFull(r, buf[:4]); err != nil { return err } + msg.Transactions = littleEndian.Uint32(buf[:4]) // Read num block locator hashes and limit to max. - count, err := ReadVarInt(r, pver) + count, err := ReadVarIntBuf(r, pver, buf) if err != nil { return err } @@ -76,14 +79,14 @@ func (msg *MsgMerkleBlock) BtcDecode(r io.Reader, pver uint32, enc MessageEncodi msg.Hashes = make([]*chainhash.Hash, 0, count) for i := uint64(0); i < count; i++ { hash := &hashes[i] - err := readElement(r, hash) + _, err := io.ReadFull(r, hash[:]) if err != nil { return err } msg.AddTxHash(hash) } - msg.Flags, err = ReadVarBytes(r, pver, maxFlagsPerMerkleBlock, + msg.Flags, err = ReadVarBytesBuf(r, pver, buf, maxFlagsPerMerkleBlock, "merkle block flags size") return err } @@ -111,28 +114,32 @@ func (msg *MsgMerkleBlock) BtcEncode(w io.Writer, pver uint32, enc MessageEncodi return messageError("MsgMerkleBlock.BtcDecode", str) } - err := writeBlockHeader(w, pver, &msg.Header) + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + err := writeBlockHeaderBuf(w, pver, &msg.Header, buf) if err != nil { return err } - err = writeElement(w, msg.Transactions) - if err != nil { + littleEndian.PutUint32(buf[:4], msg.Transactions) + if _, err := w.Write(buf[:4]); err != nil { return err } - err = WriteVarInt(w, pver, uint64(numHashes)) + err = WriteVarIntBuf(w, pver, uint64(numHashes), buf) if err != nil { return err } for _, hash := range msg.Hashes { - err = writeElement(w, hash) + _, err := w.Write(hash[:]) if err != nil { return err } } - return WriteVarBytes(w, pver, msg.Flags) + err = WriteVarBytesBuf(w, pver, msg.Flags, buf) + return err } // Command returns the protocol command string for the message. This is part diff --git a/wire/msgnotfound.go b/wire/msgnotfound.go index e867681668..23486d48b6 100644 --- a/wire/msgnotfound.go +++ b/wire/msgnotfound.go @@ -35,7 +35,10 @@ func (msg *MsgNotFound) AddInvVect(iv *InvVect) error { // BtcDecode decodes r using the bitcoin protocol encoding into the receiver. // This is part of the Message interface implementation. func (msg *MsgNotFound) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error { - count, err := ReadVarInt(r, pver) + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + count, err := ReadVarIntBuf(r, pver, buf) if err != nil { return err } @@ -52,7 +55,7 @@ func (msg *MsgNotFound) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) msg.InvList = make([]*InvVect, 0, count) for i := uint64(0); i < count; i++ { iv := &invList[i] - err := readInvVect(r, pver, iv) + err := readInvVectBuf(r, pver, iv, buf) if err != nil { return err } @@ -72,13 +75,16 @@ func (msg *MsgNotFound) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) return messageError("MsgNotFound.BtcEncode", str) } - err := WriteVarInt(w, pver, uint64(count)) + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + err := WriteVarIntBuf(w, pver, uint64(count), buf) if err != nil { return err } for _, iv := range msg.InvList { - err := writeInvVect(w, pver, iv) + err := writeInvVectBuf(w, pver, iv, buf) if err != nil { return err } diff --git a/wire/msgping.go b/wire/msgping.go index b2f346e0e1..dd5e61e6bf 100644 --- a/wire/msgping.go +++ b/wire/msgping.go @@ -32,10 +32,11 @@ func (msg *MsgPing) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) err // NOTE: > is not a mistake here. The BIP0031 was defined as AFTER // the version unlike most others. if pver > BIP0031Version { - err := readElement(r, &msg.Nonce) + nonce, err := binarySerializer.Uint64(r, littleEndian) if err != nil { return err } + msg.Nonce = nonce } return nil @@ -48,7 +49,7 @@ func (msg *MsgPing) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) err // NOTE: > is not a mistake here. The BIP0031 was defined as AFTER // the version unlike most others. if pver > BIP0031Version { - err := writeElement(w, msg.Nonce) + err := binarySerializer.PutUint64(w, littleEndian, msg.Nonce) if err != nil { return err } diff --git a/wire/msgpong.go b/wire/msgpong.go index eec80d8d5b..01e83792ef 100644 --- a/wire/msgpong.go +++ b/wire/msgpong.go @@ -31,7 +31,13 @@ func (msg *MsgPong) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) err return messageError("MsgPong.BtcDecode", str) } - return readElement(r, &msg.Nonce) + nonce, err := binarySerializer.Uint64(r, littleEndian) + if err != nil { + return err + } + msg.Nonce = nonce + + return nil } // BtcEncode encodes the receiver to w using the bitcoin protocol encoding. @@ -45,7 +51,7 @@ func (msg *MsgPong) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) err return messageError("MsgPong.BtcEncode", str) } - return writeElement(w, msg.Nonce) + return binarySerializer.PutUint64(w, littleEndian, msg.Nonce) } // Command returns the protocol command string for the message. This is part diff --git a/wire/msgreject.go b/wire/msgreject.go index a00eeff6f6..ea16dd19f4 100644 --- a/wire/msgreject.go +++ b/wire/msgreject.go @@ -81,21 +81,24 @@ func (msg *MsgReject) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) e } // Command that was rejected. - cmd, err := ReadVarString(r, pver) + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + cmd, err := readVarStringBuf(r, pver, buf) if err != nil { return err } msg.Cmd = cmd // Code indicating why the command was rejected. - err = readElement(r, &msg.Code) - if err != nil { + if _, err := io.ReadFull(r, buf[:1]); err != nil { return err } + msg.Code = RejectCode(buf[0]) // Human readable string with specific details (over and above the // reject code above) about why the command was rejected. - reason, err := ReadVarString(r, pver) + reason, err := readVarStringBuf(r, pver, buf) if err != nil { return err } @@ -104,7 +107,7 @@ func (msg *MsgReject) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) e // CmdBlock and CmdTx messages have an additional hash field that // identifies the specific block or transaction. if msg.Cmd == CmdBlock || msg.Cmd == CmdTx { - err := readElement(r, &msg.Hash) + _, err := io.ReadFull(r, msg.Hash[:]) if err != nil { return err } @@ -123,20 +126,23 @@ func (msg *MsgReject) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) e } // Command that was rejected. - err := WriteVarString(w, pver, msg.Cmd) + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + err := writeVarStringBuf(w, pver, msg.Cmd, buf) if err != nil { return err } // Code indicating why the command was rejected. - err = writeElement(w, msg.Code) - if err != nil { + buf[0] = byte(msg.Code) + if _, err := w.Write(buf[:1]); err != nil { return err } // Human readable string with specific details (over and above the // reject code above) about why the command was rejected. - err = WriteVarString(w, pver, msg.Reason) + err = writeVarStringBuf(w, pver, msg.Reason, buf) if err != nil { return err } @@ -144,7 +150,7 @@ func (msg *MsgReject) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) e // CmdBlock and CmdTx messages have an additional hash field that // identifies the specific block or transaction. if msg.Cmd == CmdBlock || msg.Cmd == CmdTx { - err := writeElement(w, &msg.Hash) + _, err := w.Write(msg.Hash[:]) if err != nil { return err } diff --git a/wire/msgsendaddrv2.go b/wire/msgsendaddrv2.go new file mode 100644 index 0000000000..7be30d118d --- /dev/null +++ b/wire/msgsendaddrv2.go @@ -0,0 +1,55 @@ +package wire + +import ( + "fmt" + "io" +) + +// MsgSendAddrV2 defines a bitcoin sendaddrv2 message which is used for a peer +// to signal support for receiving ADDRV2 messages (BIP155). It implements the +// Message interface. +// +// This message has no payload. +type MsgSendAddrV2 struct{} + +// BtcDecode decodes r using the bitcoin protocol encoding into the receiver. +// This is part of the Message interface implementation. +func (msg *MsgSendAddrV2) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error { + if pver < AddrV2Version { + str := fmt.Sprintf("sendaddrv2 message invalid for protocol "+ + "version %d", pver) + return messageError("MsgSendAddrV2.BtcDecode", str) + } + + return nil +} + +// BtcEncode encodes the receiver to w using the bitcoin protocol encoding. +// This is part of the Message interface implementation. +func (msg *MsgSendAddrV2) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error { + if pver < AddrV2Version { + str := fmt.Sprintf("sendaddrv2 message invalid for protocol "+ + "version %d", pver) + return messageError("MsgSendAddrV2.BtcEncode", str) + } + + return nil +} + +// Command returns the protocol command string for the message. This is part +// of the Message interface implementation. +func (msg *MsgSendAddrV2) Command() string { + return CmdSendAddrV2 +} + +// MaxPayloadLength returns the maximum length the payload can be for the +// receiver. This is part of the Message interface implementation. +func (msg *MsgSendAddrV2) MaxPayloadLength(pver uint32) uint32 { + return 0 +} + +// NewMsgSendAddrV2 returns a new bitcoin sendaddrv2 message that conforms to the +// Message interface. +func NewMsgSendAddrV2() *MsgSendAddrV2 { + return &MsgSendAddrV2{} +} diff --git a/wire/msgsendaddrv2_test.go b/wire/msgsendaddrv2_test.go new file mode 100644 index 0000000000..9161c08acc --- /dev/null +++ b/wire/msgsendaddrv2_test.go @@ -0,0 +1,193 @@ +// Copyright (c) 2024 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package wire + +import ( + "bytes" + "reflect" + "testing" + + "github.com/davecgh/go-spew/spew" +) + +// TestSendAddrV2 tests the MsgSendAddrV2 API against the latest protocol +// version. +func TestSendAddrV2(t *testing.T) { + pver := ProtocolVersion + enc := BaseEncoding + + // Ensure the command is expected value. + wantCmd := "sendaddrv2" + msg := NewMsgSendAddrV2() + if cmd := msg.Command(); cmd != wantCmd { + t.Errorf("NewMsgSendAddrV2: wrong command - got %v want %v", + cmd, wantCmd) + } + + // Ensure max payload is expected value. + wantPayload := uint32(0) + maxPayload := msg.MaxPayloadLength(pver) + if maxPayload != wantPayload { + t.Errorf("MaxPayloadLength: wrong max payload length for "+ + "protocol version %d - got %v, want %v", pver, + maxPayload, wantPayload) + } + + // Test encode with latest protocol version. + var buf bytes.Buffer + err := msg.BtcEncode(&buf, pver, enc) + if err != nil { + t.Errorf("encode of MsgSendAddrV2 failed %v err <%v>", msg, + err) + } + + // Older protocol versions should fail encode since message didn't + // exist yet. + oldPver := AddrV2Version - 1 + err = msg.BtcEncode(&buf, oldPver, enc) + if err == nil { + s := "encode of MsgSendAddrV2 passed for old protocol " + + "version %v err <%v>" + t.Errorf(s, msg, err) + } + + // Test decode with latest protocol version. + readmsg := NewMsgSendAddrV2() + err = readmsg.BtcDecode(&buf, pver, enc) + if err != nil { + t.Errorf("decode of MsgSendAddrV2 failed [%v] err <%v>", buf, + err) + } + + // Older protocol versions should fail decode since message didn't + // exist yet. + err = readmsg.BtcDecode(&buf, oldPver, enc) + if err == nil { + s := "decode of MsgSendAddrV2 passed for old protocol " + + "version %v err <%v>" + t.Errorf(s, msg, err) + } +} + +// TestSendAddrV2BIP0130 tests the MsgSendAddrV2 API against the protocol +// prior to version AddrV2Version. +func TestSendAddrV2BIP0130(t *testing.T) { + // Use the protocol version just prior to AddrV2Version changes. + pver := AddrV2Version - 1 + enc := BaseEncoding + + msg := NewMsgSendAddrV2() + + // Test encode with old protocol version. + var buf bytes.Buffer + err := msg.BtcEncode(&buf, pver, enc) + if err == nil { + t.Errorf("encode of MsgSendAddrV2 succeeded when it should " + + "have failed") + } + + // Test decode with old protocol version. + readmsg := NewMsgSendAddrV2() + err = readmsg.BtcDecode(&buf, pver, enc) + if err == nil { + t.Errorf("decode of MsgSendAddrV2 succeeded when it should " + + "have failed") + } +} + +// TestSendAddrV2CrossProtocol tests the MsgSendAddrV2 API when encoding with +// the latest protocol version and decoding with AddrV2Version. +func TestSendAddrV2CrossProtocol(t *testing.T) { + enc := BaseEncoding + msg := NewMsgSendAddrV2() + + // Encode with latest protocol version. + var buf bytes.Buffer + err := msg.BtcEncode(&buf, ProtocolVersion, enc) + if err != nil { + t.Errorf("encode of MsgSendAddrV2 failed %v err <%v>", msg, + err) + } + + // Decode with old protocol version. + readmsg := NewMsgSendAddrV2() + err = readmsg.BtcDecode(&buf, AddrV2Version, enc) + if err != nil { + t.Errorf("decode of MsgSendAddrV2 failed [%v] err <%v>", buf, + err) + } +} + +// TestSendAddrV2Wire tests the MsgSendAddrV2 wire encode and decode for +// various protocol versions. +func TestSendAddrV2Wire(t *testing.T) { + msgSendAddrV2 := NewMsgSendAddrV2() + msgSendAddrV2Encoded := []byte{} + + tests := []struct { + in *MsgSendAddrV2 // Message to encode + out *MsgSendAddrV2 // Expected decoded message + buf []byte // Wire encoding + pver uint32 // Protocol version for wire encoding + enc MessageEncoding // Message encoding format + }{ + // Latest protocol version. + { + msgSendAddrV2, + msgSendAddrV2, + msgSendAddrV2Encoded, + ProtocolVersion, + BaseEncoding, + }, + + // Protocol version AddrV2Version+1 + { + msgSendAddrV2, + msgSendAddrV2, + msgSendAddrV2Encoded, + AddrV2Version + 1, + BaseEncoding, + }, + + // Protocol version AddrV2Version + { + msgSendAddrV2, + msgSendAddrV2, + msgSendAddrV2Encoded, + AddrV2Version, + BaseEncoding, + }, + } + + t.Logf("Running %d tests", len(tests)) + for i, test := range tests { + // Encode the message to wire format. + var buf bytes.Buffer + err := test.in.BtcEncode(&buf, test.pver, test.enc) + if err != nil { + t.Errorf("BtcEncode #%d error %v", i, err) + continue + } + if !bytes.Equal(buf.Bytes(), test.buf) { + t.Errorf("BtcEncode #%d\n got: %s want: %s", i, + spew.Sdump(buf.Bytes()), spew.Sdump(test.buf)) + continue + } + + // Decode the message from wire format. + var msg MsgSendAddrV2 + rbuf := bytes.NewReader(test.buf) + err = msg.BtcDecode(rbuf, test.pver, test.enc) + if err != nil { + t.Errorf("BtcDecode #%d error %v", i, err) + continue + } + if !reflect.DeepEqual(&msg, test.out) { + t.Errorf("BtcDecode #%d\n got: %s want: %s", i, + spew.Sdump(msg), spew.Sdump(test.out)) + continue + } + } +} diff --git a/wire/msgtx.go b/wire/msgtx.go index 4f10ef9f98..e4f3051c47 100644 --- a/wire/msgtx.go +++ b/wire/msgtx.go @@ -5,10 +5,12 @@ package wire import ( - "bytes" + "encoding/hex" + "errors" "fmt" "io" "strconv" + "strings" "github.com/btcsuite/btcd/chaincfg/chainhash" ) @@ -92,31 +94,70 @@ const ( // scripts per transaction being simultaneously deserialized by 125 // peers. Thus, the peak usage of the free list is 12,500 * 512 = // 6,400,000 bytes. - freeListMaxItems = 12500 + freeListMaxItems = 125 // maxWitnessItemsPerInput is the maximum number of witness items to // be read for the witness data for a single TxIn. This number is - // derived using a possble lower bound for the encoding of a witness + // derived using a possible lower bound for the encoding of a witness // item: 1 byte for length + 1 byte for the witness item itself, or two // bytes. This value is then divided by the currently allowed maximum - // "cost" for a transaction. - maxWitnessItemsPerInput = 500000 + // "cost" for a transaction. We use this for an upper bound for the + // buffer and consensus makes sure that the weight of a transaction + // cannot be more than 4000000. + maxWitnessItemsPerInput = 4_000_000 // maxWitnessItemSize is the maximum allowed size for an item within - // an input's witness data. This number is derived from the fact that - // for script validation, each pushed item onto the stack must be less - // than 10k bytes. - maxWitnessItemSize = 11000 + // an input's witness data. This value is bounded by the largest + // possible block size, post segwit v1 (taproot). + maxWitnessItemSize = 4_000_000 ) -// witnessMarkerBytes are a pair of bytes specific to the witness encoding. If -// this sequence is encoutered, then it indicates a transaction has iwtness -// data. The first byte is an always 0x00 marker byte, which allows decoders to -// distinguish a serialized transaction with witnesses from a regular (legacy) -// one. The second byte is the Flag field, which at the moment is always 0x01, -// but may be extended in the future to accommodate auxiliary non-committed -// fields. -var witessMarkerBytes = []byte{0x00, 0x01} +var ( + // errSuperfluousWitnessRecord is returned during tx deserialization when + // a tx has the witness marker flag set but has no witnesses. + errSuperfluousWitnessRecord = fmt.Errorf( + "witness flag set but tx has no witnesses", + ) +) + +// TxFlagMarker is the first byte of the FLAG field in a bitcoin tx +// message. It allows decoders to distinguish a regular serialized +// transaction from one that would require a different parsing logic. +// +// Position of FLAG in a bitcoin tx message: +// +// ┌─────────┬────────────────────┬─────────────┬─────┐ +// │ VERSION │ FLAG │ TX-IN-COUNT │ ... │ +// │ 4 bytes │ 2 bytes (optional) │ varint │ │ +// └─────────┴────────────────────┴─────────────┴─────┘ +// +// Zooming into the FLAG field: +// +// ┌── FLAG ─────────────┬────────┐ +// │ TxFlagMarker (0x00) │ TxFlag │ +// │ 1 byte │ 1 byte │ +// └─────────────────────┴────────┘ +const TxFlagMarker = 0x00 + +// TxFlag is the second byte of the FLAG field in a bitcoin tx message. +// It indicates the decoding logic to use in the transaction parser, if +// TxFlagMarker is detected in the tx message. +// +// As of writing this, only the witness flag (0x01) is supported, but may be +// extended in the future to accommodate auxiliary non-committed fields. +type TxFlag = byte + +const ( + // WitnessFlag is a flag specific to witness encoding. If the TxFlagMarker + // is encountered followed by the WitnessFlag, then it indicates a + // transaction has witness data. This allows decoders to distinguish a + // serialized transaction with witnesses from a legacy one. + WitnessFlag TxFlag = 0x01 +) + +const scriptSlabSize = 1 << 22 + +type scriptSlab [scriptSlabSize]byte // scriptFreeList defines a free list of byte slices (up to the maximum number // defined by the freeListMaxItems constant) that have a cap according to the @@ -126,7 +167,7 @@ var witessMarkerBytes = []byte{0x00, 0x01} // // The caller can obtain a buffer from the free list by calling the Borrow // function and should return it via the Return function when done using it. -type scriptFreeList chan []byte +type scriptFreeList chan *scriptSlab // Borrow returns a byte slice from the free list with a length according the // provided size. A new buffer is allocated if there are any items available. @@ -135,18 +176,14 @@ type scriptFreeList chan []byte // a new buffer of the appropriate size is allocated and returned. It is safe // to attempt to return said buffer via the Return function as it will be // ignored and allowed to go the garbage collector. -func (c scriptFreeList) Borrow(size uint64) []byte { - if size > freeListMaxScriptSize { - return make([]byte, size) - } - - var buf []byte +func (c scriptFreeList) Borrow() *scriptSlab { + var buf *scriptSlab select { case buf = <-c: default: - buf = make([]byte, freeListMaxScriptSize) + buf = new(scriptSlab) } - return buf[:size] + return buf } // Return puts the provided byte slice back on the free list when it has a cap @@ -154,13 +191,7 @@ func (c scriptFreeList) Borrow(size uint64) []byte { // the Borrow function. Any slices that are not of the appropriate size, such // as those whose size is greater than the largest allowed free list item size // are simply ignored so they can go to the garbage collector. -func (c scriptFreeList) Return(buf []byte) { - // Ignore any buffers returned that aren't the expected size for the - // free list. - if cap(buf) != freeListMaxScriptSize { - return - } - +func (c scriptFreeList) Return(buf *scriptSlab) { // Return the buffer to the free list when it's not full. Otherwise let // it be garbage collected. select { @@ -173,7 +204,7 @@ func (c scriptFreeList) Return(buf []byte) { // Create the concurrent safe free list to use for script deserialization. As // previously described, this free list is maintained to significantly reduce // the number of allocations. -var scriptPool scriptFreeList = make(chan []byte, freeListMaxItems) +var scriptPool = make(scriptFreeList, freeListMaxItems) // OutPoint defines a bitcoin data type that is used to track previous // transaction outputs. @@ -191,6 +222,34 @@ func NewOutPoint(hash *chainhash.Hash, index uint32) *OutPoint { } } +// NewOutPointFromString returns a new bitcoin transaction outpoint parsed from +// the provided string, which should be in the format "hash:index". +func NewOutPointFromString(outpoint string) (*OutPoint, error) { + parts := strings.Split(outpoint, ":") + if len(parts) != 2 { + return nil, errors.New("outpoint should be of the form txid:index") + } + + if len(parts[0]) != chainhash.MaxHashStringSize { + return nil, errors.New("outpoint txid should be 64 hex chars") + } + + hash, err := chainhash.NewHashFromStr(parts[0]) + if err != nil { + return nil, err + } + + outputIndex, err := strconv.ParseUint(parts[1], 10, 32) + if err != nil { + return nil, fmt.Errorf("invalid output index: %v", err) + } + + return &OutPoint{ + Hash: *hash, + Index: uint32(outputIndex), + }, nil +} + // String returns the OutPoint in the human-readable form "hash:index". func (o OutPoint) String() string { // Allocate enough for hash string, colon, and 10 digits. Although @@ -240,7 +299,7 @@ func NewTxIn(prevOut *OutPoint, signatureScript []byte, witness [][]byte) *TxIn // a slice of byte slices, or a stack with one or many elements. type TxWitness [][]byte -// SerializeSize returns the number of bytes it would take to serialize the the +// SerializeSize returns the number of bytes it would take to serialize the // transaction input's witness. func (t TxWitness) SerializeSize() int { // A varint to signal the number of elements the witness has. @@ -257,6 +316,22 @@ func (t TxWitness) SerializeSize() int { return n } +// ToHexStrings formats the witness stack as a slice of hex-encoded strings. +func (t TxWitness) ToHexStrings() []string { + // Ensure nil is returned when there are no entries versus an empty + // slice so it can properly be omitted as necessary. + if len(t) == 0 { + return nil + } + + result := make([]string, len(t)) + for idx, wit := range t { + result[idx] = hex.EncodeToString(wit) + } + + return result +} + // TxOut defines a bitcoin transaction output. type TxOut struct { Value int64 @@ -305,13 +380,12 @@ func (msg *MsgTx) AddTxOut(to *TxOut) { // TxHash generates the Hash for the transaction. func (msg *MsgTx) TxHash() chainhash.Hash { - // Encode the transaction and calculate double sha256 on the result. - // Ignore the error returns since the only way the encode could fail - // is being out of memory or due to nil pointers, both of which would - // cause a run-time panic. - buf := bytes.NewBuffer(make([]byte, 0, msg.SerializeSizeStripped())) - _ = msg.SerializeNoWitness(buf) - return chainhash.DoubleHashH(buf.Bytes()) + return chainhash.DoubleHashRaw(msg.SerializeNoWitness) +} + +// TxID generates the transaction ID of the transaction. +func (msg *MsgTx) TxID() string { + return msg.TxHash().String() } // WitnessHash generates the hash of the transaction serialized according to @@ -321,9 +395,7 @@ func (msg *MsgTx) TxHash() chainhash.Hash { // is the same as its txid. func (msg *MsgTx) WitnessHash() chainhash.Hash { if msg.HasWitness() { - buf := bytes.NewBuffer(make([]byte, 0, msg.SerializeSize())) - _ = msg.Serialize(buf) - return chainhash.DoubleHashH(buf.Bytes()) + return chainhash.DoubleHashRaw(msg.Serialize) } return msg.TxHash() @@ -409,36 +481,49 @@ func (msg *MsgTx) Copy() *MsgTx { // See Deserialize for decoding transactions stored to disk, such as in a // database, as opposed to decoding transactions from the wire. func (msg *MsgTx) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error { - version, err := binarySerializer.Uint32(r, littleEndian) - if err != nil { + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + sbuf := scriptPool.Borrow() + defer scriptPool.Return(sbuf) + + err := msg.btcDecode(r, pver, enc, buf, sbuf[:]) + return err +} + +func (msg *MsgTx) btcDecode(r io.Reader, pver uint32, enc MessageEncoding, + buf, sbuf []byte) error { + + if _, err := io.ReadFull(r, buf[:4]); err != nil { return err } - msg.Version = int32(version) + msg.Version = int32(littleEndian.Uint32(buf[:4])) - count, err := ReadVarInt(r, pver) + count, err := ReadVarIntBuf(r, pver, buf) if err != nil { return err } - // A count of zero (meaning no TxIn's to the uninitiated) indicates - // this is a transaction with witness data. - var flag [1]byte - if count == 0 && enc == WitnessEncoding { - // Next, we need to read the flag, which is a single byte. + // A count of zero (meaning no TxIn's to the uninitiated) means that the + // value is a TxFlagMarker, and hence indicates the presence of a flag. + var flag [1]TxFlag + if count == TxFlagMarker && enc == WitnessEncoding { + // The count varint was in fact the flag marker byte. Next, we need to + // read the flag value, which is a single byte. if _, err = io.ReadFull(r, flag[:]); err != nil { return err } - // At the moment, the flag MUST be 0x01. In the future other - // flag types may be supported. - if flag[0] != 0x01 { + // At the moment, the flag MUST be WitnessFlag (0x01). In the future + // other flag types may be supported. + if flag[0] != WitnessFlag { str := fmt.Sprintf("witness tx but flag byte is %x", flag) return messageError("MsgTx.BtcDecode", str) } // With the Segregated Witness specific fields decoded, we can // now read in the actual txin count. - count, err = ReadVarInt(r, pver) + count, err = ReadVarIntBuf(r, pver, buf) if err != nil { return err } @@ -454,35 +539,6 @@ func (msg *MsgTx) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error return messageError("MsgTx.BtcDecode", str) } - // returnScriptBuffers is a closure that returns any script buffers that - // were borrowed from the pool when there are any deserialization - // errors. This is only valid to call before the final step which - // replaces the scripts with the location in a contiguous buffer and - // returns them. - returnScriptBuffers := func() { - for _, txIn := range msg.TxIn { - if txIn == nil { - continue - } - - if txIn.SignatureScript != nil { - scriptPool.Return(txIn.SignatureScript) - } - - for _, witnessElem := range txIn.Witness { - if witnessElem != nil { - scriptPool.Return(witnessElem) - } - } - } - for _, txOut := range msg.TxOut { - if txOut == nil || txOut.PkScript == nil { - continue - } - scriptPool.Return(txOut.PkScript) - } - } - // Deserialize the inputs. var totalScriptSize uint64 txIns := make([]TxIn, count) @@ -492,17 +548,16 @@ func (msg *MsgTx) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error // and needs to be returned to the pool on error. ti := &txIns[i] msg.TxIn[i] = ti - err = readTxIn(r, pver, msg.Version, ti) + err = readTxInBuf(r, pver, msg.Version, ti, buf, sbuf) if err != nil { - returnScriptBuffers() return err } totalScriptSize += uint64(len(ti.SignatureScript)) + sbuf = sbuf[len(ti.SignatureScript):] } - count, err = ReadVarInt(r, pver) + count, err = ReadVarIntBuf(r, pver, buf) if err != nil { - returnScriptBuffers() return err } @@ -510,7 +565,6 @@ func (msg *MsgTx) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error // message. It would be possible to cause memory exhaustion and panics // without a sane upper bound on this count. if count > uint64(maxTxOutPerMessage) { - returnScriptBuffers() str := fmt.Sprintf("too many output transactions to fit into "+ "max message size [count %d, max %d]", count, maxTxOutPerMessage) @@ -525,12 +579,12 @@ func (msg *MsgTx) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error // and needs to be returned to the pool on error. to := &txOuts[i] msg.TxOut[i] = to - err = readTxOut(r, pver, msg.Version, to) + err = readTxOutBuf(r, pver, msg.Version, to, buf, sbuf) if err != nil { - returnScriptBuffers() return err } totalScriptSize += uint64(len(to.PkScript)) + sbuf = sbuf[len(to.PkScript):] } // If the transaction's flag byte isn't 0x00 at this point, then one or @@ -540,16 +594,14 @@ func (msg *MsgTx) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error // For each input, the witness is encoded as a stack // with one or more items. Therefore, we first read a // varint which encodes the number of stack items. - witCount, err := ReadVarInt(r, pver) + witCount, err := ReadVarIntBuf(r, pver, buf) if err != nil { - returnScriptBuffers() return err } // Prevent a possible memory exhaustion attack by // limiting the witCount value to a sane upper bound. if witCount > maxWitnessItemsPerInput { - returnScriptBuffers() str := fmt.Sprintf("too many witness items to fit "+ "into max message size [count %d, max %d]", witCount, maxWitnessItemsPerInput) @@ -561,22 +613,28 @@ func (msg *MsgTx) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error // item itself. txin.Witness = make([][]byte, witCount) for j := uint64(0); j < witCount; j++ { - txin.Witness[j], err = readScript(r, pver, - maxWitnessItemSize, "script witness item") + txin.Witness[j], err = readScriptBuf( + r, pver, buf, sbuf, "script witness item", + ) if err != nil { - returnScriptBuffers() return err } totalScriptSize += uint64(len(txin.Witness[j])) + sbuf = sbuf[len(txin.Witness[j]):] } } + + // Check that if the witness flag is set that we actually have + // witnesses. This check is also done by bitcoind. + if !msg.HasWitness() { + return errSuperfluousWitnessRecord + } } - msg.LockTime, err = binarySerializer.Uint32(r, littleEndian) - if err != nil { - returnScriptBuffers() + if _, err := io.ReadFull(r, buf[:4]); err != nil { return err } + msg.LockTime = littleEndian.Uint32(buf[:4]) // Create a single allocation to house all of the scripts and set each // input signature script and output public key script to the @@ -607,9 +665,6 @@ func (msg *MsgTx) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error msg.TxIn[i].SignatureScript = scripts[offset:end:end] offset += scriptSize - // Return the temporary script buffer to the pool. - scriptPool.Return(signatureScript) - for j := 0; j < len(msg.TxIn[i].Witness); j++ { // Copy each item within the witness stack for this // input into the contiguous buffer at the appropriate @@ -623,10 +678,6 @@ func (msg *MsgTx) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error end := offset + witnessElemSize msg.TxIn[i].Witness[j] = scripts[offset:end:end] offset += witnessElemSize - - // Return the temporary buffer used for the witness stack - // item to the pool. - scriptPool.Return(witnessElem) } } for i := 0; i < len(msg.TxOut); i++ { @@ -641,9 +692,6 @@ func (msg *MsgTx) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error end := offset + scriptSize msg.TxOut[i].PkScript = scripts[offset:end:end] offset += scriptSize - - // Return the temporary script buffer to the pool. - scriptPool.Return(pkScript) } return nil @@ -679,8 +727,18 @@ func (msg *MsgTx) DeserializeNoWitness(r io.Reader) error { // See Serialize for encoding transactions to be stored to disk, such as in a // database, as opposed to encoding transactions for the wire. func (msg *MsgTx) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error { - err := binarySerializer.PutUint32(w, littleEndian, uint32(msg.Version)) - if err != nil { + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + err := msg.btcEncode(w, pver, enc, buf) + return err +} + +func (msg *MsgTx) btcEncode(w io.Writer, pver uint32, enc MessageEncoding, + buf []byte) error { + + littleEndian.PutUint32(buf[:4], uint32(msg.Version)) + if _, err := w.Write(buf[:4]); err != nil { return err } @@ -690,39 +748,36 @@ func (msg *MsgTx) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error // defined in BIP0144. doWitness := enc == WitnessEncoding && msg.HasWitness() if doWitness { - // After the txn's Version field, we include two additional - // bytes specific to the witness encoding. The first byte is an - // always 0x00 marker byte, which allows decoders to - // distinguish a serialized transaction with witnesses from a - // regular (legacy) one. The second byte is the Flag field, - // which at the moment is always 0x01, but may be extended in - // the future to accommodate auxiliary non-committed fields. - if _, err := w.Write(witessMarkerBytes); err != nil { + // After the transaction's Version field, we include two additional + // bytes specific to the witness encoding. This byte sequence is known + // as a flag. The first byte is a marker byte (TxFlagMarker) and the + // second one is the flag value to indicate presence of witness data. + if _, err := w.Write([]byte{TxFlagMarker, WitnessFlag}); err != nil { return err } } count := uint64(len(msg.TxIn)) - err = WriteVarInt(w, pver, count) + err := WriteVarIntBuf(w, pver, count, buf) if err != nil { return err } for _, ti := range msg.TxIn { - err = writeTxIn(w, pver, msg.Version, ti) + err = writeTxInBuf(w, pver, msg.Version, ti, buf) if err != nil { return err } } count = uint64(len(msg.TxOut)) - err = WriteVarInt(w, pver, count) + err = WriteVarIntBuf(w, pver, count, buf) if err != nil { return err } for _, to := range msg.TxOut { - err = WriteTxOut(w, pver, msg.Version, to) + err = WriteTxOutBuf(w, pver, msg.Version, to, buf) if err != nil { return err } @@ -733,14 +788,16 @@ func (msg *MsgTx) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error // within the transaction. if doWitness { for _, ti := range msg.TxIn { - err = writeTxWitness(w, pver, msg.Version, ti.Witness) + err = writeTxWitnessBuf(w, pver, msg.Version, ti.Witness, buf) if err != nil { return err } } } - return binarySerializer.PutUint32(w, littleEndian, msg.LockTime) + littleEndian.PutUint32(buf[:4], msg.LockTime) + _, err = w.Write(buf[:4]) + return err } // HasWitness returns false if none of the inputs within the transaction @@ -897,26 +954,58 @@ func NewMsgTx(version int32) *MsgTx { } } -// readOutPoint reads the next sequence of bytes from r as an OutPoint. -func readOutPoint(r io.Reader, pver uint32, version int32, op *OutPoint) error { +// readOutPointBuf reads the next sequence of bytes from r as an OutPoint. +// +// If b is non-nil, the provided buffer will be used for serializing small +// values. Otherwise a buffer will be drawn from the binarySerializer's pool +// and return when the method finishes. +// +// NOTE: b MUST either be nil or at least an 8-byte slice. +func readOutPointBuf(r io.Reader, pver uint32, version int32, op *OutPoint, + buf []byte) error { + _, err := io.ReadFull(r, op.Hash[:]) if err != nil { return err } - op.Index, err = binarySerializer.Uint32(r, littleEndian) + if _, err := io.ReadFull(r, buf[:4]); err != nil { + return err + } + op.Index = littleEndian.Uint32(buf[:4]) + + return nil +} + +// WriteOutPoint encodes op to the bitcoin protocol encoding for an OutPoint to +// w. +func WriteOutPoint(w io.Writer, pver uint32, version int32, op *OutPoint) error { + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + err := writeOutPointBuf(w, pver, version, op, buf) return err } -// writeOutPoint encodes op to the bitcoin protocol encoding for an OutPoint +// writeOutPointBuf encodes op to the bitcoin protocol encoding for an OutPoint // to w. -func writeOutPoint(w io.Writer, pver uint32, version int32, op *OutPoint) error { +// +// If b is non-nil, the provided buffer will be used for serializing small +// values. Otherwise a buffer will be drawn from the binarySerializer's pool +// and return when the method finishes. +// +// NOTE: b MUST either be nil or at least an 8-byte slice. +func writeOutPointBuf(w io.Writer, pver uint32, version int32, op *OutPoint, + buf []byte) error { + _, err := w.Write(op.Hash[:]) if err != nil { return err } - return binarySerializer.PutUint32(w, littleEndian, op.Index) + littleEndian.PutUint32(buf[:4], op.Index) + _, err = w.Write(buf[:4]) + return err } // readScript reads a variable length byte array that represents a transaction @@ -926,8 +1015,16 @@ func writeOutPoint(w io.Writer, pver uint32, version int32, op *OutPoint) error // memory exhaustion attacks and forced panics through malformed messages. The // fieldName parameter is only used for the error message so it provides more // context in the error. -func readScript(r io.Reader, pver uint32, maxAllowed uint32, fieldName string) ([]byte, error) { - count, err := ReadVarInt(r, pver) +// +// If b is non-nil, the provided buffer will be used for serializing small +// values. Otherwise a buffer will be drawn from the binarySerializer's pool +// and return when the method finishes. +// +// NOTE: b MUST either be nil or at least an 8-byte slice. +func readScriptBuf(r io.Reader, pver uint32, buf, s []byte, + fieldName string) ([]byte, error) { + + count, err := ReadVarIntBuf(r, pver, buf) if err != nil { return nil, err } @@ -935,64 +1032,102 @@ func readScript(r io.Reader, pver uint32, maxAllowed uint32, fieldName string) ( // Prevent byte array larger than the max message size. It would // be possible to cause memory exhaustion and panics without a sane // upper bound on this count. - if count > uint64(maxAllowed) { + if count > maxWitnessItemSize { str := fmt.Sprintf("%s is larger than the max allowed size "+ - "[count %d, max %d]", fieldName, count, maxAllowed) + "[count %d, max %d]", fieldName, count, maxWitnessItemSize) return nil, messageError("readScript", str) } - b := scriptPool.Borrow(count) - _, err = io.ReadFull(r, b) + _, err = io.ReadFull(r, s[:count]) if err != nil { - scriptPool.Return(b) return nil, err } - return b, nil + return s[:count], nil } -// readTxIn reads the next sequence of bytes from r as a transaction input +// readTxInBuf reads the next sequence of bytes from r as a transaction input // (TxIn). -func readTxIn(r io.Reader, pver uint32, version int32, ti *TxIn) error { - err := readOutPoint(r, pver, version, &ti.PreviousOutPoint) +// +// If b is non-nil, the provided buffer will be used for serializing small +// values. Otherwise a buffer will be drawn from the binarySerializer's pool +// and return when the method finishes. +// +// NOTE: b MUST either be nil or at least an 8-byte slice. +func readTxInBuf(r io.Reader, pver uint32, version int32, ti *TxIn, + buf, s []byte) error { + + err := readOutPointBuf(r, pver, version, &ti.PreviousOutPoint, buf) if err != nil { return err } - ti.SignatureScript, err = readScript(r, pver, MaxMessagePayload, - "transaction input signature script") + ti.SignatureScript, err = readScriptBuf( + r, pver, buf, s, "transaction input signature script", + ) if err != nil { return err } - return readElement(r, &ti.Sequence) + if _, err := io.ReadFull(r, buf[:4]); err != nil { + return err + } + + ti.Sequence = littleEndian.Uint32(buf[:4]) + + return nil } -// writeTxIn encodes ti to the bitcoin protocol encoding for a transaction -// input (TxIn) to w. -func writeTxIn(w io.Writer, pver uint32, version int32, ti *TxIn) error { - err := writeOutPoint(w, pver, version, &ti.PreviousOutPoint) +// writeTxInBuf encodes ti to the bitcoin protocol encoding for a transaction +// input (TxIn) to w. If b is non-nil, the provided buffer will be used for +// serializing small values. Otherwise a buffer will be drawn from the +// binarySerializer's pool and return when the method finishes. +func writeTxInBuf(w io.Writer, pver uint32, version int32, ti *TxIn, + buf []byte) error { + + err := writeOutPointBuf(w, pver, version, &ti.PreviousOutPoint, buf) if err != nil { return err } - err = WriteVarBytes(w, pver, ti.SignatureScript) + err = WriteVarBytesBuf(w, pver, ti.SignatureScript, buf) if err != nil { return err } - return binarySerializer.PutUint32(w, littleEndian, ti.Sequence) + littleEndian.PutUint32(buf[:4], ti.Sequence) + _, err = w.Write(buf[:4]) + + return err } -// readTxOut reads the next sequence of bytes from r as a transaction output +// ReadTxOut reads the next sequence of bytes from r as a transaction output // (TxOut). -func readTxOut(r io.Reader, pver uint32, version int32, to *TxOut) error { - err := readElement(r, &to.Value) +func ReadTxOut(r io.Reader, pver uint32, version int32, to *TxOut) error { + var s scriptSlab + + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + err := readTxOutBuf(r, pver, version, to, buf, s[:]) + return err +} + +// readTxOutBuf reads the next sequence of bytes from r as a transaction output +// (TxOut). If b is non-nil, the provided buffer will be used for serializing +// small values. Otherwise a buffer will be drawn from the binarySerializer's +// pool and return when the method finishes. +func readTxOutBuf(r io.Reader, pver uint32, version int32, to *TxOut, + buf, s []byte) error { + + _, err := io.ReadFull(r, buf) if err != nil { return err } + to.Value = int64(littleEndian.Uint64(buf)) - to.PkScript, err = readScript(r, pver, MaxMessagePayload, - "transaction output public key script") + to.PkScript, err = readScriptBuf( + r, pver, buf, s, "transaction output public key script", + ) return err } @@ -1002,26 +1137,49 @@ func readTxOut(r io.Reader, pver uint32, version int32, to *TxOut) error { // NOTE: This function is exported in order to allow txscript to compute the // new sighashes for witness transactions (BIP0143). func WriteTxOut(w io.Writer, pver uint32, version int32, to *TxOut) error { - err := binarySerializer.PutUint64(w, littleEndian, uint64(to.Value)) + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + err := WriteTxOutBuf(w, pver, version, to, buf) + return err +} + +// WriteTxOutBuf encodes to into the bitcoin protocol encoding for a transaction +// output (TxOut) to w. If b is non-nil, the provided buffer will be used for +// serializing small values. Otherwise a buffer will be drawn from the +// binarySerializer's pool and return when the method finishes. +// +// NOTE: This function is exported in order to allow txscript to compute the +// new sighashes for witness transactions (BIP0143). +func WriteTxOutBuf(w io.Writer, pver uint32, version int32, to *TxOut, + buf []byte) error { + + littleEndian.PutUint64(buf, uint64(to.Value)) + _, err := w.Write(buf) if err != nil { return err } - return WriteVarBytes(w, pver, to.PkScript) + return WriteVarBytesBuf(w, pver, to.PkScript, buf) } -// writeTxWitness encodes the bitcoin protocol encoding for a transaction -// input's witness into to w. -func writeTxWitness(w io.Writer, pver uint32, version int32, wit [][]byte) error { - err := WriteVarInt(w, pver, uint64(len(wit))) +// writeTxWitnessBuf encodes the bitcoin protocol encoding for a transaction +// input's witness into to w. If b is non-nil, the provided buffer will be used +// for serializing small values. Otherwise a buffer will be drawn from the +// binarySerializer's pool and return when the method finishes. +func writeTxWitnessBuf(w io.Writer, pver uint32, version int32, wit [][]byte, + buf []byte) error { + + err := WriteVarIntBuf(w, pver, uint64(len(wit)), buf) if err != nil { return err } for _, item := range wit { - err = WriteVarBytes(w, pver, item) + err = WriteVarBytesBuf(w, pver, item, buf) if err != nil { return err } } + return nil } diff --git a/wire/msgtx_test.go b/wire/msgtx_test.go index dd809f81e2..62d57098f3 100644 --- a/wire/msgtx_test.go +++ b/wire/msgtx_test.go @@ -6,6 +6,7 @@ package wire import ( "bytes" + "errors" "fmt" "io" "reflect" @@ -13,6 +14,7 @@ import ( "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/davecgh/go-spew/spew" + "github.com/stretchr/testify/require" ) // TestTx tests the MsgTx API. @@ -671,7 +673,7 @@ func TestTxOverflowErrors(t *testing.T) { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Previous output hash - 0xff, 0xff, 0xff, 0xff, // Prevous output index + 0xff, 0xff, 0xff, 0xff, // Previous output index 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // Varint for length of signature script }, pver, BaseEncoding, txVer, &MessageError{}, @@ -687,7 +689,7 @@ func TestTxOverflowErrors(t *testing.T) { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Previous output hash - 0xff, 0xff, 0xff, 0xff, // Prevous output index + 0xff, 0xff, 0xff, 0xff, // Previous output index 0x00, // Varint for length of signature script 0xff, 0xff, 0xff, 0xff, // Sequence 0x01, // Varint for number of output transactions @@ -732,7 +734,7 @@ func TestTxSerializeSizeStripped(t *testing.T) { in *MsgTx // Tx to encode size int // Expected serialized size }{ - // No inputs or outpus. + // No inputs or outputs. {noTx, 10}, // Transcaction with an input and an output. @@ -755,6 +757,34 @@ func TestTxSerializeSizeStripped(t *testing.T) { } } +// TestTxID performs tests to ensure the serialize size for various transactions +// is accurate. +func TestTxID(t *testing.T) { + // Empty tx message. + noTx := NewMsgTx(1) + noTx.Version = 1 + + tests := []struct { + in *MsgTx // Tx to encode. + txid string // Expected transaction ID. + }{ + // No inputs or outputs. + {noTx, "d21633ba23f70118185227be58a63527675641ad37967e2aa461559f577aec43"}, + + // Transaction with an input and an output. + {multiTx, "0100d15a522ff38de05c164ca0a56379a1b77dd1e4805a6534dc9b3d88290e9d"}, + + // Transaction with an input which includes witness data, and + // one output. + {multiWitnessTx, "0f167d1385a84d1518cfee208b653fc9163b605ccf1b75347e2850b3e2eb19f3"}, + } + + for i, test := range tests { + txid := test.in.TxID() + require.Equal(t, test.txid, txid, "test #%d", i) + } +} + // TestTxWitnessSize performs tests to ensure that the serialized size for // various types of transactions that include witness data is accurate. func TestTxWitnessSize(t *testing.T) { @@ -778,6 +808,96 @@ func TestTxWitnessSize(t *testing.T) { } } +// TestTxOutPointFromString performs tests to ensure that the outpoint string +// parser works as expected. +func TestTxOutPointFromString(t *testing.T) { + hashFromStr := func(hash string) chainhash.Hash { + h, _ := chainhash.NewHashFromStr(hash) + return *h + } + + tests := []struct { + name string + input string + result *OutPoint + err bool + }{ + { + name: "normal outpoint 1", + input: "2ebd15a7e758d5f4c7c74181b99e5b8586f88e0682dc13e09d92612a2b2bb0a2:1", + result: &OutPoint{ + Hash: hashFromStr("2ebd15a7e758d5f4c7c74181b99e5b8586f88e0682dc13e09d92612a2b2bb0a2"), + Index: 1, + }, + err: false, + }, + { + name: "normal outpoint 2", + input: "94c7762a68ff164352bd31fd95fa875204e811c09acef40ba781787eb28e3b55:42", + result: &OutPoint{ + Hash: hashFromStr("94c7762a68ff164352bd31fd95fa875204e811c09acef40ba781787eb28e3b55"), + Index: 42, + }, + err: false, + }, + { + name: "big index outpoint", + input: "94c7762a68ff164352bd31fd95fa875204e811c09acef40ba781787eb28e3b55:2147484242", + result: &OutPoint{ + Hash: hashFromStr("94c7762a68ff164352bd31fd95fa875204e811c09acef40ba781787eb28e3b55"), + Index: 2147484242, + }, + err: false, + }, + { + name: "normal outpoint 2 with 31-byte txid", + input: "c7762a68ff164352bd31fd95fa875204e811c09acef40ba781787eb28e3b55:42", + result: &OutPoint{ + Hash: hashFromStr("c7762a68ff164352bd31fd95fa875204e811c09acef40ba781787eb28e3b55"), + Index: 42, + }, + err: true, + }, + { + name: "bad string", + input: "not_outpoint_not_outpoint_not_outpoint", + result: nil, + err: true, + }, + { + name: "empty string", + input: "", + result: nil, + err: true, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + outpoint, err := NewOutPointFromString(test.input) + + isErr := (err != nil) + require.Equal(t, isErr, test.err) + + if !isErr { + require.Equal(t, test.result, outpoint) + } + }) + + } +} + +// TestTxSuperfluousWitnessRecord ensures that btcd fails to parse a tx with +// the witness marker flag set but without any actual witnesses. +func TestTxSuperfluousWitnessRecord(t *testing.T) { + m := &MsgTx{} + rbuf := bytes.NewReader(multiWitnessFlagNoWitness) + err := m.BtcDecode(rbuf, ProtocolVersion, WitnessEncoding) + if !errors.Is(err, errSuperfluousWitnessRecord) { + t.Fatalf("should have failed with %v", errSuperfluousWitnessRecord) + } +} + // multiTx is a MsgTx with an input and output and used in various tests. var multiTx = &MsgTx{ Version: 1, @@ -839,7 +959,7 @@ var multiTxEncoded = []byte{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Previous output hash - 0xff, 0xff, 0xff, 0xff, // Prevous output index + 0xff, 0xff, 0xff, 0xff, // Previous output index 0x07, // Varint for length of signature script 0x04, 0x31, 0xdc, 0x00, 0x1b, 0x01, 0x62, // Signature script 0xff, 0xff, 0xff, 0xff, // Sequence @@ -930,14 +1050,41 @@ var multiWitnessTx = &MsgTx{ }, } +// multiWitnessFlagNoWitness is the wire encoded bytes for multiWitnessTx with +// the witness flag set but with witnesses omitted. +var multiWitnessFlagNoWitness = []byte{ + 0x1, 0x0, 0x0, 0x0, // Version + TxFlagMarker, // Marker byte indicating 0 inputs, or a segwit encoded tx + WitnessFlag, // Flag byte + 0x1, // Varint for number of inputs + 0xa5, 0x33, 0x52, 0xd5, 0x13, 0x57, 0x66, 0xf0, + 0x30, 0x76, 0x59, 0x74, 0x18, 0x26, 0x3d, 0xa2, + 0xd9, 0xc9, 0x58, 0x31, 0x59, 0x68, 0xfe, 0xa8, + 0x23, 0x52, 0x94, 0x67, 0x48, 0x1f, 0xf9, 0xcd, // Previous output hash + 0x13, 0x0, 0x0, 0x0, // Little endian previous output index + 0x0, // No sig script (this is a witness input) + 0xff, 0xff, 0xff, 0xff, // Sequence + 0x1, // Varint for number of outputs + 0xb, 0x7, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, // Output amount + 0x16, // Varint for length of pk script + 0x0, // Version 0 witness program + 0x14, // OP_DATA_20 + 0x9d, 0xda, 0xc6, 0xf3, 0x9d, 0x51, 0xe0, 0x39, + 0x8e, 0x53, 0x2a, 0x22, 0xc4, 0x1b, 0xa1, 0x89, + 0x40, 0x6a, 0x85, 0x23, // 20-byte pub key hash + 0x00, // No item on the witness stack for the first input + 0x00, // No item on the witness stack for the second input + 0x0, 0x0, 0x0, 0x0, // Lock time +} + // multiWitnessTxEncoded is the wire encoded bytes for multiWitnessTx including inputs // with witness data using protocol version 70012 and is used in the various // tests. var multiWitnessTxEncoded = []byte{ 0x1, 0x0, 0x0, 0x0, // Version - 0x0, // Marker byte indicating 0 inputs, or a segwit encoded tx - 0x1, // Flag byte - 0x1, // Varint for number of inputs + TxFlagMarker, // Marker byte indicating 0 inputs, or a segwit encoded tx + WitnessFlag, // Flag byte + 0x1, // Varint for number of inputs 0xa5, 0x33, 0x52, 0xd5, 0x13, 0x57, 0x66, 0xf0, 0x30, 0x76, 0x59, 0x74, 0x18, 0x26, 0x3d, 0xa2, 0xd9, 0xc9, 0x58, 0x31, 0x59, 0x68, 0xfe, 0xa8, @@ -978,9 +1125,9 @@ var multiWitnessTxEncoded = []byte{ // being set to 0x01, the flag is 0x00, which should trigger a decoding error. var multiWitnessTxEncodedNonZeroFlag = []byte{ 0x1, 0x0, 0x0, 0x0, // Version - 0x0, // Marker byte indicating 0 inputs, or a segwit encoded tx - 0x0, // Incorrect flag byte (should be 0x01) - 0x1, // Varint for number of inputs + TxFlagMarker, // Marker byte indicating 0 inputs, or a segwit encoded tx + 0x0, // Incorrect flag byte (should be 0x01) + 0x1, // Varint for number of inputs 0xa5, 0x33, 0x52, 0xd5, 0x13, 0x57, 0x66, 0xf0, 0x30, 0x76, 0x59, 0x74, 0x18, 0x26, 0x3d, 0xa2, 0xd9, 0xc9, 0x58, 0x31, 0x59, 0x68, 0xfe, 0xa8, diff --git a/wire/msgversion.go b/wire/msgversion.go index 3077f12760..957bae395a 100644 --- a/wire/msgversion.go +++ b/wire/msgversion.go @@ -46,7 +46,7 @@ type MsgVersion struct { // connections. Nonce uint64 - // The user agent that generated messsage. This is a encoded as a varString + // The user agent that generated message. This is a encoded as a varString // on the wire. This has a max length of MaxUserAgentLen. UserAgent string diff --git a/wire/msgwtxidrelay.go b/wire/msgwtxidrelay.go new file mode 100644 index 0000000000..ab131bc5bd --- /dev/null +++ b/wire/msgwtxidrelay.go @@ -0,0 +1,59 @@ +// Copyright (c) 2024 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package wire + +import ( + "fmt" + "io" +) + +// MsgWTxIdRelay defines a bitcoin wtxidrelay message which is used for a peer +// to signal support for relaying witness transaction id (BIP141). It +// implements the Message interface. +// +// This message has no payload. +type MsgWTxIdRelay struct{} + +// BtcDecode decodes r using the bitcoin protocol encoding into the receiver. +// This is part of the Message interface implementation. +func (msg *MsgWTxIdRelay) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error { + if pver < AddrV2Version { + str := fmt.Sprintf("wtxidrelay message invalid for protocol "+ + "version %d", pver) + return messageError("MsgWTxIdRelay.BtcDecode", str) + } + + return nil +} + +// BtcEncode encodes the receiver to w using the bitcoin protocol encoding. +// This is part of the Message interface implementation. +func (msg *MsgWTxIdRelay) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error { + if pver < AddrV2Version { + str := fmt.Sprintf("wtxidrelay message invalid for protocol "+ + "version %d", pver) + return messageError("MsgWTxIdRelay.BtcEncode", str) + } + + return nil +} + +// Command returns the protocol command string for the message. This is part +// of the Message interface implementation. +func (msg *MsgWTxIdRelay) Command() string { + return CmdWTxIdRelay +} + +// MaxPayloadLength returns the maximum length the payload can be for the +// receiver. This is part of the Message interface implementation. +func (msg *MsgWTxIdRelay) MaxPayloadLength(pver uint32) uint32 { + return 0 +} + +// NewMsgWTxIdRelay returns a new bitcoin wtxidrelay message that conforms +// to the Message interface. +func NewMsgWTxIdRelay() *MsgWTxIdRelay { + return &MsgWTxIdRelay{} +} diff --git a/wire/msgwtxidrelay_test.go b/wire/msgwtxidrelay_test.go new file mode 100644 index 0000000000..7f519b4e93 --- /dev/null +++ b/wire/msgwtxidrelay_test.go @@ -0,0 +1,193 @@ +// Copyright (c) 2024 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package wire + +import ( + "bytes" + "reflect" + "testing" + + "github.com/davecgh/go-spew/spew" +) + +// TestWTxIdRelay tests the MsgWTxIdRelay API against the latest protocol +// version. +func TestWTxIdRelay(t *testing.T) { + pver := ProtocolVersion + enc := BaseEncoding + + // Ensure the command is expected value. + wantCmd := "wtxidrelay" + msg := NewMsgWTxIdRelay() + if cmd := msg.Command(); cmd != wantCmd { + t.Errorf("NewMsgWTxIdRelay: wrong command - got %v want %v", + cmd, wantCmd) + } + + // Ensure max payload is expected value. + wantPayload := uint32(0) + maxPayload := msg.MaxPayloadLength(pver) + if maxPayload != wantPayload { + t.Errorf("MaxPayloadLength: wrong max payload length for "+ + "protocol version %d - got %v, want %v", pver, + maxPayload, wantPayload) + } + + // Test encode with latest protocol version. + var buf bytes.Buffer + err := msg.BtcEncode(&buf, pver, enc) + if err != nil { + t.Errorf("encode of MsgWTxIdRelay failed %v err <%v>", msg, + err) + } + + // Older protocol versions should fail encode since message didn't + // exist yet. + oldPver := AddrV2Version - 1 + err = msg.BtcEncode(&buf, oldPver, enc) + if err == nil { + s := "encode of MsgWTxIdRelay passed for old protocol " + + "version %v err <%v>" + t.Errorf(s, msg, err) + } + + // Test decode with latest protocol version. + readmsg := NewMsgWTxIdRelay() + err = readmsg.BtcDecode(&buf, pver, enc) + if err != nil { + t.Errorf("decode of MsgWTxIdRelay failed [%v] err <%v>", buf, + err) + } + + // Older protocol versions should fail decode since message didn't + // exist yet. + err = readmsg.BtcDecode(&buf, oldPver, enc) + if err == nil { + s := "decode of MsgWTxIdRelay passed for old protocol " + + "version %v err <%v>" + t.Errorf(s, msg, err) + } +} + +// TestWTxIdRelayBIP0130 tests the MsgWTxIdRelay API against the protocol +// prior to version AddrV2Version. +func TestWTxIdRelayBIP0130(t *testing.T) { + // Use the protocol version just prior to AddrV2Version changes. + pver := AddrV2Version - 1 + enc := BaseEncoding + + msg := NewMsgWTxIdRelay() + + // Test encode with old protocol version. + var buf bytes.Buffer + err := msg.BtcEncode(&buf, pver, enc) + if err == nil { + t.Errorf("encode of MsgWTxIdRelay succeeded when it should " + + "have failed") + } + + // Test decode with old protocol version. + readmsg := NewMsgWTxIdRelay() + err = readmsg.BtcDecode(&buf, pver, enc) + if err == nil { + t.Errorf("decode of MsgWTxIdRelay succeeded when it should " + + "have failed") + } +} + +// TestWTxIdRelayCrossProtocol tests the MsgWTxIdRelay API when encoding with +// the latest protocol version and decoding with AddrV2Version. +func TestWTxIdRelayCrossProtocol(t *testing.T) { + enc := BaseEncoding + msg := NewMsgWTxIdRelay() + + // Encode with latest protocol version. + var buf bytes.Buffer + err := msg.BtcEncode(&buf, ProtocolVersion, enc) + if err != nil { + t.Errorf("encode of MsgWTxIdRelay failed %v err <%v>", msg, + err) + } + + // Decode with old protocol version. + readmsg := NewMsgWTxIdRelay() + err = readmsg.BtcDecode(&buf, AddrV2Version, enc) + if err != nil { + t.Errorf("decode of MsgWTxIdRelay failed [%v] err <%v>", buf, + err) + } +} + +// TestWTxIdRelayWire tests the MsgWTxIdRelay wire encode and decode for +// various protocol versions. +func TestWTxIdRelayWire(t *testing.T) { + msgWTxIdRelay := NewMsgWTxIdRelay() + msgWTxIdRelayEncoded := []byte{} + + tests := []struct { + in *MsgWTxIdRelay // Message to encode + out *MsgWTxIdRelay // Expected decoded message + buf []byte // Wire encoding + pver uint32 // Protocol version for wire encoding + enc MessageEncoding // Message encoding format + }{ + // Latest protocol version. + { + msgWTxIdRelay, + msgWTxIdRelay, + msgWTxIdRelayEncoded, + ProtocolVersion, + BaseEncoding, + }, + + // Protocol version AddrV2Version+1 + { + msgWTxIdRelay, + msgWTxIdRelay, + msgWTxIdRelayEncoded, + AddrV2Version + 1, + BaseEncoding, + }, + + // Protocol version AddrV2Version + { + msgWTxIdRelay, + msgWTxIdRelay, + msgWTxIdRelayEncoded, + AddrV2Version, + BaseEncoding, + }, + } + + t.Logf("Running %d tests", len(tests)) + for i, test := range tests { + // Encode the message to wire format. + var buf bytes.Buffer + err := test.in.BtcEncode(&buf, test.pver, test.enc) + if err != nil { + t.Errorf("BtcEncode #%d error %v", i, err) + continue + } + if !bytes.Equal(buf.Bytes(), test.buf) { + t.Errorf("BtcEncode #%d\n got: %s want: %s", i, + spew.Sdump(buf.Bytes()), spew.Sdump(test.buf)) + continue + } + + // Decode the message from wire format. + var msg MsgWTxIdRelay + rbuf := bytes.NewReader(test.buf) + err = msg.BtcDecode(rbuf, test.pver, test.enc) + if err != nil { + t.Errorf("BtcDecode #%d error %v", i, err) + continue + } + if !reflect.DeepEqual(&msg, test.out) { + t.Errorf("BtcDecode #%d\n got: %s want: %s", i, + spew.Sdump(msg), spew.Sdump(test.out)) + continue + } + } +} diff --git a/wire/netaddress.go b/wire/netaddress.go index 5a2610bccc..e5c8eeea17 100644 --- a/wire/netaddress.go +++ b/wire/netaddress.go @@ -5,7 +5,6 @@ package wire import ( - "encoding/binary" "io" "net" "time" @@ -89,31 +88,60 @@ func NewNetAddress(addr *net.TCPAddr, services ServiceFlag) *NetAddress { // version and whether or not the timestamp is included per ts. Some messages // like version do not include the timestamp. func readNetAddress(r io.Reader, pver uint32, na *NetAddress, ts bool) error { - var ip [16]byte + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + + err := readNetAddressBuf(r, pver, na, ts, buf) + return err +} + +// readNetAddressBuf reads an encoded NetAddress from r depending on the +// protocol version and whether or not the timestamp is included per ts. Some +// messages like version do not include the timestamp. +// +// If b is non-nil, the provided buffer will be used for serializing small +// values. Otherwise a buffer will be drawn from the binarySerializer's pool +// and return when the method finishes. +// +// NOTE: b MUST either be nil or at least an 8-byte slice. +func readNetAddressBuf(r io.Reader, pver uint32, na *NetAddress, ts bool, + buf []byte) error { + + var ( + timestamp time.Time + services ServiceFlag + ip [16]byte + port uint16 + ) // NOTE: The bitcoin protocol uses a uint32 for the timestamp so it will // stop working somewhere around 2106. Also timestamp wasn't added until // protocol version >= NetAddressTimeVersion if ts && pver >= NetAddressTimeVersion { - err := readElement(r, (*uint32Time)(&na.Timestamp)) - if err != nil { + if _, err := io.ReadFull(r, buf[:4]); err != nil { return err } + timestamp = time.Unix(int64(littleEndian.Uint32(buf[:4])), 0) } - err := readElements(r, &na.Services, &ip) - if err != nil { + if _, err := io.ReadFull(r, buf); err != nil { return err } + services = ServiceFlag(littleEndian.Uint64(buf)) + + if _, err := io.ReadFull(r, ip[:]); err != nil { + return err + } + // Sigh. Bitcoin protocol mixes little and big endian. - port, err := binarySerializer.Uint16(r, bigEndian) - if err != nil { + if _, err := io.ReadFull(r, buf[:2]); err != nil { return err } + port = bigEndian.Uint16(buf[:2]) *na = NetAddress{ - Timestamp: na.Timestamp, - Services: na.Services, + Timestamp: timestamp, + Services: services, IP: net.IP(ip[:]), Port: port, } @@ -124,26 +152,50 @@ func readNetAddress(r io.Reader, pver uint32, na *NetAddress, ts bool) error { // version and whether or not the timestamp is included per ts. Some messages // like version do not include the timestamp. func writeNetAddress(w io.Writer, pver uint32, na *NetAddress, ts bool) error { + buf := binarySerializer.Borrow() + defer binarySerializer.Return(buf) + err := writeNetAddressBuf(w, pver, na, ts, buf) + + return err +} + +// writeNetAddressBuf serializes a NetAddress to w depending on the protocol +// version and whether or not the timestamp is included per ts. Some messages +// like version do not include the timestamp. +// +// If b is non-nil, the provided buffer will be used for serializing small +// values. Otherwise a buffer will be drawn from the binarySerializer's pool +// and return when the method finishes. +// +// NOTE: b MUST either be nil or at least an 8-byte slice. +func writeNetAddressBuf(w io.Writer, pver uint32, na *NetAddress, ts bool, buf []byte) error { // NOTE: The bitcoin protocol uses a uint32 for the timestamp so it will // stop working somewhere around 2106. Also timestamp wasn't added until // until protocol version >= NetAddressTimeVersion. if ts && pver >= NetAddressTimeVersion { - err := writeElement(w, uint32(na.Timestamp.Unix())) - if err != nil { + littleEndian.PutUint32(buf[:4], uint32(na.Timestamp.Unix())) + if _, err := w.Write(buf[:4]); err != nil { return err } } + littleEndian.PutUint64(buf, uint64(na.Services)) + if _, err := w.Write(buf); err != nil { + return err + } + // Ensure to always write 16 bytes even if the ip is nil. var ip [16]byte if na.IP != nil { copy(ip[:], na.IP.To16()) } - err := writeElements(w, na.Services, ip) - if err != nil { + if _, err := w.Write(ip[:]); err != nil { return err } // Sigh. Bitcoin protocol mixes little and big endian. - return binary.Write(w, bigEndian, na.Port) + bigEndian.PutUint16(buf[:2], na.Port) + _, err := w.Write(buf[:2]) + + return err } diff --git a/wire/netaddressv2.go b/wire/netaddressv2.go new file mode 100644 index 0000000000..ccad266ace --- /dev/null +++ b/wire/netaddressv2.go @@ -0,0 +1,588 @@ +package wire + +import ( + "encoding/base32" + "encoding/binary" + "fmt" + "io" + "net" + "strings" + "time" + + "golang.org/x/crypto/sha3" +) + +const ( + // maxAddrV2Size is the maximum size an address may be in the addrv2 + // message. + maxAddrV2Size = 512 +) + +var ( + // ErrInvalidAddressSize is an error that means an incorrect address + // size was decoded for a networkID or that the address exceeded the + // maximum size for an unknown networkID. + ErrInvalidAddressSize = fmt.Errorf("invalid address size") + + // ErrSkippedNetworkID is returned when the cjdns, i2p, or unknown + // networks are encountered during decoding. btcd does not support i2p + // or cjdns addresses. In the case of an unknown networkID, this is so + // that a future BIP reserving a new networkID does not cause older + // addrv2-supporting btcd software to disconnect upon receiving the new + // addresses. This error can also be returned when an OnionCat-encoded + // torv2 address is received with the ipv6 networkID. This error + // signals to the caller to continue reading. + ErrSkippedNetworkID = fmt.Errorf("skipped networkID") +) + +// maxNetAddressV2Payload returns the max payload size for an address used in +// the addrv2 message. +func maxNetAddressV2Payload() uint32 { + // The timestamp takes up four bytes. + plen := uint32(4) + + // The ServiceFlag is a varint and its maximum size is 9 bytes. + plen += 9 + + // The netID is a single byte. + plen += 1 + + // The largest address is 512 bytes. Even though it will not be a valid + // address, we should read and ignore it. The preceding varint to + // store 512 bytes is 3 bytes long. This gives us a total of 515 bytes. + plen += 515 + + // The port is 2 bytes. + plen += 2 + + return plen +} + +// isOnionCatTor returns whether a given ip address is actually an encoded tor +// v2 address. The wire package is unable to use the addrmgr's IsOnionCatTor as +// doing so would give an import cycle. +func isOnionCatTor(ip net.IP) bool { + onionCatNet := net.IPNet{ + IP: net.ParseIP("fd87:d87e:eb43::"), + Mask: net.CIDRMask(48, 128), + } + return onionCatNet.Contains(ip) +} + +// NetAddressV2 defines information about a peer on the network including the +// last time it was seen, the services it supports, its address, and port. This +// struct is used in the addrv2 message (MsgAddrV2) and can contain larger +// addresses, like Tor. Additionally, it can contain any NetAddress address. +type NetAddressV2 struct { + // Last time the address was seen. This is, unfortunately, encoded as a + // uint32 on the wire and therefore is limited to 2106. This field is + // not present in the bitcoin version message (MsgVersion) nor was it + // added until protocol version >= NetAddressTimeVersion. + Timestamp time.Time + + // Services is a bitfield which identifies the services supported by + // the address. This is encoded in CompactSize. + Services ServiceFlag + + // Addr is the network address of the peer. This is a variable-length + // address. Network() returns the BIP-155 networkID which is a uint8 + // encoded as a string. String() returns the address as a string. + Addr net.Addr + + // Port is the port of the address. This is 0 if the network doesn't + // use ports. + Port uint16 +} + +// HasService returns whether the specified service is supported by the +// address. +func (na *NetAddressV2) HasService(service ServiceFlag) bool { + return na.Services&service == service +} + +// AddService adds a service to the Services bitfield. +func (na *NetAddressV2) AddService(service ServiceFlag) { + na.Services |= service +} + +// ToLegacy attempts to convert a NetAddressV2 to a legacy NetAddress. This +// only works for ipv4, ipv6, or torv2 addresses as they can be encoded with +// the OnionCat encoding. If this method is called on a torv3 address, nil will +// be returned. +func (na *NetAddressV2) ToLegacy() *NetAddress { + legacyNa := &NetAddress{ + Timestamp: na.Timestamp, + Services: na.Services, + Port: na.Port, + } + + switch a := na.Addr.(type) { + case *ipv4Addr: + legacyNa.IP = a.addr[:] + case *ipv6Addr: + legacyNa.IP = a.addr[:] + case *torv2Addr: + legacyNa.IP = a.onionCatEncoding() + case *torv3Addr: + return nil + } + + return legacyNa +} + +// IsTorV3 returns a bool that signals to the caller whether or not this is a +// torv3 address. +func (na *NetAddressV2) IsTorV3() bool { + _, ok := na.Addr.(*torv3Addr) + return ok +} + +// TorV3Key returns the first byte of the v3 public key. This is used in the +// addrmgr to calculate a key from a network group. +func (na *NetAddressV2) TorV3Key() byte { + // This should never be called on a non-torv3 address. + addr, ok := na.Addr.(*torv3Addr) + if !ok { + panic("unexpected TorV3Key call on non-torv3 address") + } + + return addr.addr[0] +} + +// NetAddressV2FromBytes creates a NetAddressV2 from a byte slice. It will +// also handle a torv2 address using the OnionCat encoding. +func NetAddressV2FromBytes(timestamp time.Time, services ServiceFlag, + addrBytes []byte, port uint16) *NetAddressV2 { + + var netAddr net.Addr + switch len(addrBytes) { + case ipv4Size: + addr := &ipv4Addr{} + addr.netID = ipv4 + copy(addr.addr[:], addrBytes) + netAddr = addr + case ipv6Size: + if isOnionCatTor(addrBytes) { + addr := &torv2Addr{} + addr.netID = torv2 + copy(addr.addr[:], addrBytes[6:]) + netAddr = addr + break + } + + addr := &ipv6Addr{} + addr.netID = ipv6 + copy(addr.addr[:], addrBytes) + netAddr = addr + case torv2Size: + addr := &torv2Addr{} + addr.netID = torv2 + copy(addr.addr[:], addrBytes) + netAddr = addr + case TorV3Size: + addr := &torv3Addr{} + addr.netID = torv3 + copy(addr.addr[:], addrBytes) + netAddr = addr + } + + return &NetAddressV2{ + Timestamp: timestamp, + Services: services, + Addr: netAddr, + Port: port, + } +} + +// writeNetAddressV2 writes a NetAddressV2 to a writer. +func writeNetAddressV2(w io.Writer, pver uint32, na *NetAddressV2) error { + err := writeElement(w, uint32(na.Timestamp.Unix())) + if err != nil { + return err + } + + if err := WriteVarInt(w, pver, uint64(na.Services)); err != nil { + return err + } + + var ( + netID networkID + address []byte + ) + + switch a := na.Addr.(type) { + case *ipv4Addr: + netID = a.netID + address = a.addr[:] + case *ipv6Addr: + netID = a.netID + address = a.addr[:] + case *torv2Addr: + netID = a.netID + address = a.addr[:] + case *torv3Addr: + netID = a.netID + address = a.addr[:] + default: + // This should not occur. + return fmt.Errorf("unexpected address type") + } + + if err := writeElement(w, netID); err != nil { + return err + } + + addressSize := uint64(len(address)) + if err := WriteVarInt(w, pver, addressSize); err != nil { + return err + } + + if err := writeElement(w, address); err != nil { + return err + } + + return binary.Write(w, bigEndian, na.Port) +} + +// readNetAddressV2 reads a NetAddressV2 from a reader. This function has +// checks that the corresponding write function doesn't. This is because +// reading from the peer is untrusted whereas writing assumes we have already +// validated the NetAddressV2. +func readNetAddressV2(r io.Reader, pver uint32, na *NetAddressV2) error { + err := readElement(r, (*uint32Time)(&na.Timestamp)) + if err != nil { + return err + } + + // Services is encoded as a variable length integer in addrv2. + services, err := ReadVarInt(r, pver) + if err != nil { + return err + } + na.Services = ServiceFlag(services) + + var netID uint8 + if err := readElement(r, &netID); err != nil { + return err + } + + decodedSize, err := ReadVarInt(r, pver) + if err != nil { + return err + } + + if !isKnownNetworkID(netID) { + // In the case of an unknown networkID, we'll read the address + // size and error with ErrInvalidAddressSize if it's greater + // than maxAddrV2Size. If the address size is within the valid + // range, we'll just read and discard the address. In this + // case, ErrSkippedNetworkID will be returned to signal to the + // caller to continue reading. + if decodedSize > maxAddrV2Size { + return ErrInvalidAddressSize + } + + // The +2 is the port field. + discardedAddrPort := make([]byte, decodedSize+2) + if err := readElement(r, &discardedAddrPort); err != nil { + return err + } + + return ErrSkippedNetworkID + } + + // If the netID is an i2p or cjdns address, we'll advance the reader + // and return a special error to signal to the caller to not use the + // passed NetAddressV2 struct. Otherwise, we'll just read the address + // and port without returning an error. + switch networkID(netID) { + case ipv4: + addr := &ipv4Addr{} + addr.netID = ipv4 + if decodedSize != uint64(ipv4Size) { + return ErrInvalidAddressSize + } + + if err := readElement(r, &addr.addr); err != nil { + return err + } + + na.Port, err = binarySerializer.Uint16(r, bigEndian) + if err != nil { + return err + } + + na.Addr = addr + case ipv6: + addr := &ipv6Addr{} + addr.netID = ipv6 + if decodedSize != uint64(ipv6Size) { + return ErrInvalidAddressSize + } + + if err := readElement(r, &addr.addr); err != nil { + return err + } + + na.Port, err = binarySerializer.Uint16(r, bigEndian) + if err != nil { + return err + } + + na.Addr = addr + + // BIP-155 says to ignore OnionCat addresses in addrv2 + // messages. + if isOnionCatTor(addr.addr[:]) { + return ErrSkippedNetworkID + } + case torv2: + addr := &torv2Addr{} + addr.netID = torv2 + if decodedSize != uint64(torv2Size) { + return ErrInvalidAddressSize + } + + if err := readElement(r, &addr.addr); err != nil { + return err + } + + na.Port, err = binarySerializer.Uint16(r, bigEndian) + if err != nil { + return err + } + + na.Addr = addr + case torv3: + addr := &torv3Addr{} + addr.netID = torv3 + if decodedSize != uint64(TorV3Size) { + return ErrInvalidAddressSize + } + + if err := readElement(r, &addr.addr); err != nil { + return err + } + + na.Port, err = binarySerializer.Uint16(r, bigEndian) + if err != nil { + return err + } + + // BIP-155 does not specify to validate the public key here. + // bitcoind does not validate the ed25519 pubkey. + na.Addr = addr + case i2p: + addr := &i2pAddr{} + addr.netID = i2p + if decodedSize != uint64(i2pSize) { + return ErrInvalidAddressSize + } + + if err := readElement(r, &addr.addr); err != nil { + return err + } + + na.Port, err = binarySerializer.Uint16(r, bigEndian) + if err != nil { + return err + } + + return ErrSkippedNetworkID + case cjdns: + addr := &cjdnsAddr{} + addr.netID = cjdns + if decodedSize != uint64(cjdnsSize) { + return ErrInvalidAddressSize + } + + if err := readElement(r, &addr.addr); err != nil { + return err + } + + na.Port, err = binarySerializer.Uint16(r, bigEndian) + if err != nil { + return err + } + + return ErrSkippedNetworkID + } + + return nil +} + +// networkID represents the network that a given address is in. CJDNS and I2P +// addresses are not included. +type networkID uint8 + +const ( + // ipv4 means the following address is ipv4. + ipv4 networkID = iota + 1 + + // ipv6 means the following address is ipv6. + ipv6 + + // torv2 means the following address is a torv2 hidden service address. + torv2 + + // torv3 means the following address is a torv3 hidden service address. + torv3 + + // i2p means the following address is an i2p address. + i2p + + // cjdns means the following address is a cjdns address. + cjdns +) + +const ( + // ipv4Size is the size of an ipv4 address. + ipv4Size = 4 + + // ipv6Size is the size of an ipv6 address. + ipv6Size = 16 + + // torv2Size is the size of a torv2 address. + torv2Size = 10 + + // TorV3Size is the size of a torv3 address in bytes. + TorV3Size = 32 + + // i2pSize is the size of an i2p address. + i2pSize = 32 + + // cjdnsSize is the size of a cjdns address. + cjdnsSize = 16 +) + +const ( + // TorV2EncodedSize is the size of a torv2 address encoded in base32 + // with the ".onion" suffix. + TorV2EncodedSize = 22 + + // TorV3EncodedSize is the size of a torv3 address encoded in base32 + // with the ".onion" suffix. + TorV3EncodedSize = 62 +) + +// isKnownNetworkID returns true if the networkID is one listed above and false +// otherwise. +func isKnownNetworkID(netID uint8) bool { + return uint8(ipv4) <= netID && netID <= uint8(cjdns) +} + +type ipv4Addr struct { + addr [ipv4Size]byte + netID networkID +} + +// Part of the net.Addr interface. +func (a *ipv4Addr) String() string { + return net.IP(a.addr[:]).String() +} + +// Part of the net.Addr interface. +func (a *ipv4Addr) Network() string { + return string(a.netID) +} + +// Compile-time constraints to check that ipv4Addr meets the net.Addr +// interface. +var _ net.Addr = (*ipv4Addr)(nil) + +type ipv6Addr struct { + addr [ipv6Size]byte + netID networkID +} + +// Part of the net.Addr interface. +func (a *ipv6Addr) String() string { + return net.IP(a.addr[:]).String() +} + +// Part of the net.Addr interface. +func (a *ipv6Addr) Network() string { + return string(a.netID) +} + +// Compile-time constraints to check that ipv6Addr meets the net.Addr +// interface. +var _ net.Addr = (*ipv4Addr)(nil) + +type torv2Addr struct { + addr [torv2Size]byte + netID networkID +} + +// Part of the net.Addr interface. +func (a *torv2Addr) String() string { + base32Hash := base32.StdEncoding.EncodeToString(a.addr[:]) + return strings.ToLower(base32Hash) + ".onion" +} + +// Part of the net.Addr interface. +func (a *torv2Addr) Network() string { + return string(a.netID) +} + +// onionCatEncoding returns a torv2 address as an ipv6 address. +func (a *torv2Addr) onionCatEncoding() net.IP { + prefix := []byte{0xfd, 0x87, 0xd8, 0x7e, 0xeb, 0x43} + return net.IP(append(prefix, a.addr[:]...)) +} + +// Compile-time constraints to check that torv2Addr meets the net.Addr +// interface. +var _ net.Addr = (*torv2Addr)(nil) + +type torv3Addr struct { + addr [TorV3Size]byte + netID networkID +} + +// Part of the net.Addr interface. +func (a *torv3Addr) String() string { + // BIP-155 describes the torv3 address format: + // onion_address = base32(PUBKEY | CHECKSUM | VERSION) + ".onion" + // CHECKSUM = H(".onion checksum" | PUBKEY | VERSION)[:2] + // PUBKEY = addr, which is the ed25519 pubkey of the hidden service. + // VERSION = '\x03' + // H() is the SHA3-256 cryptographic hash function. + + torV3Version := []byte("\x03") + checksumConst := []byte(".onion checksum") + + // Write never returns an error so there is no need to handle it. + h := sha3.New256() + h.Write(checksumConst) + h.Write(a.addr[:]) + h.Write(torV3Version) + truncatedChecksum := h.Sum(nil)[:2] + + var base32Input [35]byte + copy(base32Input[:32], a.addr[:]) + copy(base32Input[32:34], truncatedChecksum) + copy(base32Input[34:], torV3Version) + + base32Hash := base32.StdEncoding.EncodeToString(base32Input[:]) + return strings.ToLower(base32Hash) + ".onion" +} + +// Part of the net.Addr interface. +func (a *torv3Addr) Network() string { + return string(a.netID) +} + +// Compile-time constraints to check that torv3Addr meets the net.Addr +// interface. +var _ net.Addr = (*torv3Addr)(nil) + +type i2pAddr struct { + addr [i2pSize]byte + netID networkID +} + +type cjdnsAddr struct { + addr [cjdnsSize]byte + netID networkID +} diff --git a/wire/netaddressv2_test.go b/wire/netaddressv2_test.go new file mode 100644 index 0000000000..bd5084b009 --- /dev/null +++ b/wire/netaddressv2_test.go @@ -0,0 +1,285 @@ +package wire + +import ( + "bytes" + "io" + "testing" + "time" +) + +// TestNetAddressV2FromBytes tests that NetAddressV2FromBytes works as +// expected. +func TestNetAddressV2FromBytes(t *testing.T) { + tests := []struct { + addrBytes []byte + expectedString string + expectedNetwork string + }{ + // Ipv4 encoding + { + []byte{0x7f, 0x00, 0x00, 0x01}, + "127.0.0.1", + string(ipv4), + }, + + // Ipv6 encoding + { + []byte{ + 0x20, 0x01, 0x09, 0xe8, 0x26, 0x15, 0x73, 0x00, + 0x09, 0x54, 0x12, 0x63, 0xef, 0xc8, 0x2e, 0x34, + }, + "2001:9e8:2615:7300:954:1263:efc8:2e34", + string(ipv6), + }, + + // OnionCat encoding + { + []byte{ + 0xfd, 0x87, 0xd8, 0x7e, 0xeb, 0x43, 0xff, 0xfe, + 0xcc, 0x39, 0xa8, 0x73, 0x69, 0x15, 0xff, 0xff, + }, + "777myonionurl777.onion", + string(torv2), + }, + + // Torv2 encoding + { + []byte{ + 0xff, 0xfe, 0xcc, 0x39, 0xa8, 0x73, 0x69, 0x15, + 0xff, 0xff, + }, + "777myonionurl777.onion", + string(torv2), + }, + + // Torv3 encoding + { + []byte{ + 0xca, 0xd2, 0xd3, 0xc8, 0xdc, 0x9c, 0xc4, 0xd3, + 0x70, 0x33, 0x30, 0xc5, 0x23, 0xaf, 0x02, 0xed, + 0xc4, 0x9d, 0xf8, 0xc6, 0xb0, 0x4e, 0x74, 0x6d, + 0x3b, 0x51, 0x57, 0xa7, 0x15, 0xfe, 0x98, 0x35, + }, + "zljnhsg4ttcng4btgdcshlyc5xcj36ggwbhhi3j3kfl2ofp6ta26jlid.onion", + string(torv3), + }, + } + + t.Logf("Running %d tests", len(tests)) + for i, test := range tests { + na := NetAddressV2FromBytes(time.Time{}, 0, test.addrBytes, 0) + + if test.expectedNetwork != string(torv3) { + if na.ToLegacy() == nil { + t.Errorf("Test #%d has nil legacy encoding", i) + } + } else { + if !na.IsTorV3() { + t.Errorf("Test #%d is not torv3 address", i) + } + } + + if na.Addr.String() != test.expectedString { + t.Errorf("Test #%d did not match expected string", i) + } + + if na.Addr.Network() != test.expectedNetwork { + t.Errorf("Test #%d did not match expected network", i) + } + + var b bytes.Buffer + if err := writeNetAddressV2(&b, 0, na); err != nil { + t.Errorf("Test #%d failed writing address %v", i, err) + } + + // Assert that the written netID is equivalent to the above. + if string(b.Bytes()[5]) != test.expectedNetwork { + t.Errorf("Test #%d did not match expected network", i) + } + } +} + +// TestReadNetAddressV2 tests that readNetAddressV2 behaves as expected in +// different scenarios. +func TestReadNetAddressV2(t *testing.T) { + tests := []struct { + buf []byte + expectedNetwork string + expectedError error + }{ + // Invalid address size for unknown netID. + { + []byte{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfd, 0xff, + 0xff, + }, + "", + ErrInvalidAddressSize, + }, + + // Valid address size for unknown netID. + { + []byte{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x20, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x22, + 0x22, + }, + "", + ErrSkippedNetworkID, + }, + + // Invalid ipv4 size. + { + []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05}, + "", + ErrInvalidAddressSize, + }, + + // Valid ipv4 encoding. + { + []byte{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x7f, + 0x00, 0x00, 0x01, 0x22, 0x22, + }, + string(ipv4), + nil, + }, + + // Invalid ipv6 size. + { + []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfc}, + "", + ErrInvalidAddressSize, + }, + + // OnionCat encoding is skipped. + { + []byte{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0xfd, + 0x87, 0xd8, 0x7e, 0xeb, 0x43, 0xff, 0xfe, 0xcc, + 0x39, 0xa8, 0x73, 0x69, 0x15, 0xff, 0xff, 0x22, + 0x22, + }, + "", + ErrSkippedNetworkID, + }, + + // Valid ipv6 encoding. + { + []byte{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x22, + 0x22, + }, + string(ipv6), + nil, + }, + + // Invalid torv2 size. + { + []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02}, + "", + ErrInvalidAddressSize, + }, + + // Valid torv2 encoding. + { + []byte{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x22, + }, + string(torv2), + nil, + }, + + // Invalid torv3 size. + { + []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02}, + "", + ErrInvalidAddressSize, + }, + + // Valid torv3 encoding. + { + []byte{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x22, + 0x22, + }, + string(torv3), + nil, + }, + + // Invalid i2p size. + { + []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02}, + "", + ErrInvalidAddressSize, + }, + + // Valid i2p encoding. + { + []byte{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x20, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x22, + 0x22, + }, + string(i2p), + ErrSkippedNetworkID, + }, + + // Invalid cjdns size. + { + []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02}, + "", + ErrInvalidAddressSize, + }, + + // Valid cjdns encoding. + { + []byte{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x10, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x22, + }, + string(cjdns), + ErrSkippedNetworkID, + }, + } + + t.Logf("Running %d tests", len(tests)) + for i, test := range tests { + r := bytes.NewReader(test.buf) + na := &NetAddressV2{} + + err := readNetAddressV2(r, 0, na) + if err != test.expectedError { + t.Errorf("Test #%d had unexpected error %v", i, err) + } else if err != nil { + continue + } + + // Trying to read more should give EOF. + var b [1]byte + if _, err := r.Read(b[:]); err != io.EOF { + t.Errorf("Test #%d did not cleanly finish reading", i) + } + + if na.Addr.Network() != test.expectedNetwork { + t.Errorf("Test #%d had unexpected network %v", i, + na.Addr.Network()) + } + } +} diff --git a/wire/protocol.go b/wire/protocol.go index 8cc9838a55..4ed0922b3d 100644 --- a/wire/protocol.go +++ b/wire/protocol.go @@ -1,4 +1,4 @@ -// Copyright (c) 2013-2016 The btcsuite developers +// Copyright (c) 2013-2024 The btcsuite developers // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. @@ -13,7 +13,7 @@ import ( // XXX pedro: we will probably need to bump this. const ( // ProtocolVersion is the latest protocol version this package supports. - ProtocolVersion uint32 = 70013 + ProtocolVersion uint32 = 70016 // MultipleAddressVersion is the protocol version which added multiple // addresses per message (pver >= MultipleAddressVersion). @@ -51,6 +51,19 @@ const ( // FeeFilterVersion is the protocol version which added a new // feefilter message. FeeFilterVersion uint32 = 70013 + + // AddrV2Version is the protocol version which added two new messages. + // sendaddrv2 is sent during the version-verack handshake and signals + // support for sending and receiving the addrv2 message. In the future, + // new messages that occur during the version-verack handshake will not + // come with a protocol version bump. + AddrV2Version uint32 = 70016 +) + +const ( + // NodeNetworkLimitedBlockThreshold is the number of blocks that a node + // broadcasting SFNodeNetworkLimited MUST be able to serve from the tip. + NodeNetworkLimitedBlockThreshold = 288 ) // ServiceFlag identifies services supported by a bitcoin peer. @@ -86,18 +99,23 @@ const ( // SFNode2X is a flag used to indicate a peer is running the Segwit2X // software. SFNode2X + + // SFNodeNetWorkLimited is a flag used to indicate a peer supports serving + // the last 288 blocks. + SFNodeNetworkLimited = 1 << 10 ) // Map of service flags back to their constant names for pretty printing. var sfStrings = map[ServiceFlag]string{ - SFNodeNetwork: "SFNodeNetwork", - SFNodeGetUTXO: "SFNodeGetUTXO", - SFNodeBloom: "SFNodeBloom", - SFNodeWitness: "SFNodeWitness", - SFNodeXthin: "SFNodeXthin", - SFNodeBit5: "SFNodeBit5", - SFNodeCF: "SFNodeCF", - SFNode2X: "SFNode2X", + SFNodeNetwork: "SFNodeNetwork", + SFNodeGetUTXO: "SFNodeGetUTXO", + SFNodeBloom: "SFNodeBloom", + SFNodeWitness: "SFNodeWitness", + SFNodeXthin: "SFNodeXthin", + SFNodeBit5: "SFNodeBit5", + SFNodeCF: "SFNodeCF", + SFNode2X: "SFNode2X", + SFNodeNetworkLimited: "SFNodeNetworkLimited", } // orderedSFStrings is an ordered list of service flags from highest to @@ -111,6 +129,12 @@ var orderedSFStrings = []ServiceFlag{ SFNodeBit5, SFNodeCF, SFNode2X, + SFNodeNetworkLimited, +} + +// HasFlag returns a bool indicating if the service has the given flag. +func (f ServiceFlag) HasFlag(s ServiceFlag) bool { + return f&s == s } // String returns the ServiceFlag in human-readable form. diff --git a/wire/protocol_test.go b/wire/protocol_test.go index 60bd0533e5..eeeffb600a 100644 --- a/wire/protocol_test.go +++ b/wire/protocol_test.go @@ -4,7 +4,11 @@ package wire -import "testing" +import ( + "testing" + + "github.com/stretchr/testify/require" +) // TestServiceFlagStringer tests the stringized output for service flag types. func TestServiceFlagStringer(t *testing.T) { @@ -21,7 +25,8 @@ func TestServiceFlagStringer(t *testing.T) { {SFNodeBit5, "SFNodeBit5"}, {SFNodeCF, "SFNodeCF"}, {SFNode2X, "SFNode2X"}, - {0xffffffff, "SFNodeNetwork|SFNodeGetUTXO|SFNodeBloom|SFNodeWitness|SFNodeXthin|SFNodeBit5|SFNodeCF|SFNode2X|0xffffff00"}, + {SFNodeNetworkLimited, "SFNodeNetworkLimited"}, + {0xffffffff, "SFNodeNetwork|SFNodeGetUTXO|SFNodeBloom|SFNodeWitness|SFNodeXthin|SFNodeBit5|SFNodeCF|SFNode2X|SFNodeNetworkLimited|0xfffffb00"}, } t.Logf("Running %d tests", len(tests)) @@ -58,3 +63,19 @@ func TestBitcoinNetStringer(t *testing.T) { } } } + +func TestHasFlag(t *testing.T) { + tests := []struct { + in ServiceFlag + check ServiceFlag + want bool + }{ + {0, SFNodeNetwork, false}, + {SFNodeNetwork | SFNodeNetworkLimited | SFNodeWitness, SFNodeBloom, false}, + {SFNodeNetwork | SFNodeNetworkLimited | SFNodeWitness, SFNodeNetworkLimited, true}, + } + + for _, test := range tests { + require.Equal(t, test.want, test.in.HasFlag(test.check)) + } +} diff --git a/wire/testdata/block-0000000000000000001602407ac49862a7bca9d00f7f402db20b7be2f5de59d2.blk b/wire/testdata/block-0000000000000000001602407ac49862a7bca9d00f7f402db20b7be2f5de59d2.blk new file mode 100644 index 0000000000..aacdb7aa99 Binary files /dev/null and b/wire/testdata/block-0000000000000000001602407ac49862a7bca9d00f7f402db20b7be2f5de59d2.blk differ diff --git a/wire/testdata/block-00000000000000000021868c2cefc52a480d173c849412fe81c4e5ab806f94ab.blk b/wire/testdata/block-00000000000000000021868c2cefc52a480d173c849412fe81c4e5ab806f94ab.blk new file mode 100644 index 0000000000..cff5e0f35f Binary files /dev/null and b/wire/testdata/block-00000000000000000021868c2cefc52a480d173c849412fe81c4e5ab806f94ab.blk differ