func makeSpendableOutForTx(tx *wire.MsgTx, txOutIndex uint32) spendableOut {
	return spendableOut{
		prevOut: wire.OutPoint{
			Hash:  tx.TxHash(),
			Index: txOutIndex,
		},
		pkScript: tx.TxOut[0].PkScript,
		amount:   provautil.Amount(tx.TxOut[txOutIndex].Value),
	}
}
makeSpendableOutForTx returns a spendable output for the given transaction
and transaction output index within the transaction.
package fullblocktests
import (
	"errors"
	"fmt"
	"github.com/bitgo/prova/blockchain"
	"github.com/bitgo/prova/btcec"
	"github.com/bitgo/prova/chaincfg"
	"github.com/bitgo/prova/chaincfg/chainhash"
	"github.com/bitgo/prova/provautil"
	"github.com/bitgo/prova/txscript"
	"github.com/bitgo/prova/wire"
	"math"
	"math/rand"
	"runtime"
	"time"
)
var (
	privKey1, _ = btcec.PrivKeyFromBytes(btcec.S256(), []byte{
		0x2b, 0x8c, 0x52, 0xb7, 0x7b, 0x32, 0x7c, 0x75,
		0x5b, 0x9b, 0x37, 0x55, 0x00, 0xd3, 0xf4, 0xb2,
		0xda, 0x9b, 0x0a, 0x1f, 0xf6, 0x5f, 0x68, 0x91,
		0xd3, 0x11, 0xfe, 0x94, 0x29, 0x5b, 0xc2, 0x6a,
	})
	pubKey1     = (*btcec.PublicKey)(&privKey1.PublicKey)
	privKey2, _ = btcec.PrivKeyFromBytes(btcec.S256(), []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,
	})
	pubKey2     = (*btcec.PublicKey)(&privKey2.PublicKey)
	privKey3, _ = btcec.PrivKeyFromBytes(btcec.S256(), []byte{
		0x64, 0x89, 0xdd, 0x3e, 0x30, 0x88, 0xc2, 0xc4,
		0xd6, 0xbc, 0x44, 0x4e, 0x4c, 0x47, 0xf9, 0x2c,
		0x9b, 0xf2, 0x8d, 0x89, 0x65, 0x1a, 0x9e, 0x22,
		0x0d, 0xbc, 0x2c, 0x0d, 0x11, 0x81, 0xc5, 0xe4,
	})
	pubKey3 = (*btcec.PublicKey)(&privKey3.PublicKey)
	validatePrivKey, _ = btcec.PrivKeyFromBytes(btcec.S256(), []byte{
		0x40, 0x15, 0x28, 0x9a, 0x22, 0x86, 0x58, 0x04, 0x75, 0x20,
		0xf0, 0xd0, 0xab, 0xe7, 0xad, 0x49, 0xab, 0xc7, 0x7f, 0x6b,
		0xe0, 0xbe, 0x63, 0xb3, 0x6b, 0x94, 0xb8, 0x3c, 0x2d, 0x1f,
		0xd9, 0x77,
	})
	keyId1 = btcec.KeyID(1)
	keyId2 = btcec.KeyID(2)
	lookupKey = func(a provautil.Address) ([]txscript.PrivateKey, error) {
		return []txscript.PrivateKey{
			txscript.PrivateKey{privKey1, true},
			txscript.PrivateKey{privKey2, true},
		}, nil
	}
)
type TestInstance interface {
	FullBlockTestInstance()
}
type AcceptedBlock struct {
	Name         string
	Block        *wire.MsgBlock
	Height       uint32
	IsMainChain  bool
	IsOrphan     bool
	ThreadTips   map[provautil.ThreadID]*wire.OutPoint
	TotalSupply  uint64
	AdminKeySets map[btcec.KeySetType]btcec.PublicKeySet
	ASPKeyIdMap  btcec.KeyIdMap
}
var _ TestInstance = AcceptedBlock{}
func (b AcceptedBlock) FullBlockTestInstance() {}
type RejectedBlock struct {
	Name       string
	Block      *wire.MsgBlock
	Height     uint32
	RejectCode blockchain.ErrorCode
}
var _ TestInstance = RejectedBlock{}
func (b RejectedBlock) FullBlockTestInstance() {}
type OrphanOrRejectedBlock struct {
	Name   string
	Block  *wire.MsgBlock
	Height uint32
}
var _ TestInstance = OrphanOrRejectedBlock{}
func (b OrphanOrRejectedBlock) FullBlockTestInstance() {}
type ExpectedTip struct {
	Name   string
	Block  *wire.MsgBlock
	Height uint32
}
var _ TestInstance = ExpectedTip{}
func (b ExpectedTip) FullBlockTestInstance() {}
type RejectedNonCanonicalBlock struct {
	Name     string
	RawBlock []byte
	Height   uint32
}
func (b RejectedNonCanonicalBlock) FullBlockTestInstance() {}
type spendableOut struct {
	prevOut  wire.OutPoint
	pkScript []byte
	amount   provautil.Amount
}