2019-12-19 19:20:22 +01:00
|
|
|
// 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"
|
|
|
|
)
|
|
|
|
|
2020-01-16 02:40:21 +01:00
|
|
|
// 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 teh 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
|
2019-12-19 19:20:22 +01:00
|
|
|
}
|
|
|
|
|
2020-01-16 02:40:21 +01:00
|
|
|
unsignedTx := wire.NewMsgTx(version)
|
|
|
|
unsignedTx.LockTime = nLockTime
|
2019-12-19 19:20:22 +01:00
|
|
|
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))
|
2020-01-16 02:40:21 +01:00
|
|
|
|
|
|
|
// This new Psbt is "raw" and contains no key-value fields, so sanity
|
|
|
|
// checking with c.Cpsbt.SanityCheck() is not required.
|
|
|
|
return &Packet{
|
2019-12-19 19:20:22 +01:00
|
|
|
UnsignedTx: unsignedTx,
|
|
|
|
Inputs: pInputs,
|
|
|
|
Outputs: pOutputs,
|
|
|
|
Unknowns: nil,
|
2020-01-16 02:40:21 +01:00
|
|
|
}, nil
|
2019-12-19 19:20:22 +01:00
|
|
|
}
|