2017-01-17 01:19:02 +01:00
|
|
|
// Copyright (c) 2016 The Decred developers
|
|
|
|
// 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 wallet
|
|
|
|
|
|
|
|
import (
|
|
|
|
"time"
|
|
|
|
|
2021-08-26 00:58:28 +02:00
|
|
|
"github.com/lbryio/lbcd/chaincfg/chainhash"
|
2021-11-23 20:04:18 +01:00
|
|
|
"github.com/lbryio/lbcd/txscript"
|
2021-08-26 00:58:28 +02:00
|
|
|
"github.com/lbryio/lbcd/wire"
|
|
|
|
btcutil "github.com/lbryio/lbcutil"
|
2017-01-17 01:19:02 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
// Note: The following common types should never reference the Wallet type.
|
|
|
|
// Long term goal is to move these to their own package so that the database
|
|
|
|
// access APIs can create them directly for the wallet to return.
|
|
|
|
|
|
|
|
// BlockIdentity identifies a block, or the lack of one (used to describe an
|
|
|
|
// unmined transaction).
|
|
|
|
type BlockIdentity struct {
|
|
|
|
Hash chainhash.Hash
|
|
|
|
Height int32
|
|
|
|
}
|
|
|
|
|
|
|
|
// None returns whether there is no block described by the instance. When
|
|
|
|
// associated with a transaction, this indicates the transaction is unmined.
|
|
|
|
func (b *BlockIdentity) None() bool {
|
|
|
|
// BUG: Because dcrwallet uses both 0 and -1 in various places to refer
|
|
|
|
// to an unmined transaction this must check against both and may not
|
|
|
|
// ever be usable to represent the genesis block.
|
|
|
|
return *b == BlockIdentity{Height: -1} || *b == BlockIdentity{}
|
|
|
|
}
|
|
|
|
|
|
|
|
// OutputKind describes a kind of transaction output. This is used to
|
|
|
|
// differentiate between coinbase, stakebase, and normal outputs.
|
|
|
|
type OutputKind byte
|
|
|
|
|
|
|
|
// Defined OutputKind constants
|
|
|
|
const (
|
|
|
|
OutputKindNormal OutputKind = iota
|
|
|
|
OutputKindCoinbase
|
2021-11-23 20:04:18 +01:00
|
|
|
OutputKindStake
|
2017-01-17 01:19:02 +01:00
|
|
|
)
|
|
|
|
|
2021-11-23 20:04:18 +01:00
|
|
|
func isStake(pkScript []byte) bool {
|
|
|
|
if len(pkScript) > 0 &&
|
|
|
|
(pkScript[0] == txscript.OP_CLAIMNAME || pkScript[0] == txscript.OP_SUPPORTCLAIM ||
|
|
|
|
pkScript[0] == txscript.OP_UPDATECLAIM) {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2017-01-17 01:19:02 +01:00
|
|
|
// TransactionOutput describes an output that was or is at least partially
|
|
|
|
// controlled by the wallet. Depending on context, this could refer to an
|
|
|
|
// unspent output, or a spent one.
|
|
|
|
type TransactionOutput struct {
|
|
|
|
OutPoint wire.OutPoint
|
|
|
|
Output wire.TxOut
|
|
|
|
OutputKind OutputKind
|
|
|
|
// These should be added later when the DB can return them more
|
|
|
|
// efficiently:
|
|
|
|
//TxLockTime uint32
|
|
|
|
//TxExpiry uint32
|
|
|
|
ContainingBlock BlockIdentity
|
|
|
|
ReceiveTime time.Time
|
|
|
|
}
|
|
|
|
|
|
|
|
// OutputRedeemer identifies the transaction input which redeems an output.
|
|
|
|
type OutputRedeemer struct {
|
|
|
|
TxHash chainhash.Hash
|
|
|
|
InputIndex uint32
|
|
|
|
}
|
|
|
|
|
|
|
|
// P2SHMultiSigOutput describes a transaction output with a pay-to-script-hash
|
|
|
|
// output script and an imported redemption script. Along with common details
|
|
|
|
// of the output, this structure also includes the P2SH address the script was
|
|
|
|
// created from and the number of signatures required to redeem it.
|
|
|
|
//
|
|
|
|
// TODO: Could be useful to return how many of the required signatures can be
|
|
|
|
// created by this wallet.
|
|
|
|
type P2SHMultiSigOutput struct {
|
|
|
|
// TODO: Add a TransactionOutput member to this struct and remove these
|
|
|
|
// fields which are duplicated by it. This improves consistency. Only
|
|
|
|
// not done now because wtxmgr APIs don't support an efficient way of
|
|
|
|
// fetching other Transactionoutput data together with the rest of the
|
|
|
|
// multisig info.
|
|
|
|
OutPoint wire.OutPoint
|
|
|
|
OutputAmount btcutil.Amount
|
|
|
|
ContainingBlock BlockIdentity
|
|
|
|
|
|
|
|
P2SHAddress *btcutil.AddressScriptHash
|
|
|
|
RedeemScript []byte
|
|
|
|
M, N uint8 // M of N signatures required to redeem
|
|
|
|
Redeemer *OutputRedeemer // nil unless spent
|
|
|
|
}
|