1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
//! The `builder` module defines an abstract `TxBuilder` trait. A concrete implementation for
//! Bitcoin can be found in the `bitcoin` crate
use crate::{
enc::AddressEncoder,
ser::ByteFormat,
types::tx::{Input, Output, Transaction},
};
use std::io::Read;
/// A builder-pattern interface for constructing transactions. Implementations should accumulate
/// inputs, outputs, witnesses, and other TX data, and then `build()` a Transaction object from
/// the accumulated data.
pub trait TxBuilder: std::marker::Sized {
/// The Transaction type returned by `build()`
type Transaction: Transaction;
/// An AddressEncoder that handles encoding and decoding network addresses. This is used in
/// the `pay` function to decode addresses into associated `RecipientIdentifier`s.
type Encoder: AddressEncoder;
/// Instantiate a new builder
fn new() -> Self;
/// Instantiate a new builder from a transaction reference by cloning its properties
fn from_tx_ref(tx: &Self::Transaction) -> Self;
/// Instantiate a new builder from a transaction by taking ownership of its properties
fn from_tx(tx: Self::Transaction) -> Self;
/// Instantiate a new builder from a `std::io::Read` that contains a serialized tx
fn read_from_tx<R>(reader: &mut R) -> Result<Self, <Self::Transaction as Transaction>::TxError>
where
R: Read,
{
let tx = Self::Transaction::read_from(reader)?;
Ok(Self::from_tx(tx))
}
/// Instantiate a new builder from transaction hex
fn from_hex_tx(hex_str: &str) -> Result<Self, <Self::Transaction as Transaction>::TxError> {
let tx = Self::Transaction::deserialize_hex(hex_str)?;
Ok(Self::from_tx(tx))
}
/// Set or overwrite the transaction version.
///
/// If implementing a network without a version field, feel free to leave this as a NOP
fn version(self, version: u32) -> Self;
/// Spend an outpoint. Adds an unsigned input spending the associated outpoint with the
/// specified sequence number.
fn spend<I>(self, prevout: I, sequence: u32) -> Self
where
I: Into<<<Self::Transaction as Transaction>::TxIn as Input>::TxoIdentifier>;
/// Pay an Address. Adds an output paying `value` to `address.`
fn pay(
self,
value: <<Self::Transaction as Transaction>::TxOut as Output>::Value,
address: &<Self::Encoder as AddressEncoder>::Address,
) -> Self;
/// Insert an input at the specified index. Inputs after that are shifted to later indices.
///
/// ## Note
///
/// This may invalidate signatures made using ANYONECANPAY.
fn insert_input(self, index: usize, input: <Self::Transaction as Transaction>::TxIn) -> Self;
/// Add a set of inputs to the transaction.
fn extend_inputs<I>(self, inputs: I) -> Self
where
I: IntoIterator<Item = <Self::Transaction as Transaction>::TxIn>;
/// Insert an output at the specified index. Outputs after that are shifted to later indices.
///
/// ## Note
///
/// This may invalidate signatures made using SINGLE.
fn insert_output(self, index: usize, output: <Self::Transaction as Transaction>::TxOut)
-> Self;
/// Add a set of outputs to the transaction.
fn extend_outputs<I>(self, outputs: I) -> Self
where
I: IntoIterator<Item = <Self::Transaction as Transaction>::TxOut>;
/// Set or overwrite the transaction locktime.
///
/// If implementing a network without a locktime field, feel free to leave this as a NOP
fn locktime(self, locktime: u32) -> Self;
/// Consume the builder and produce a transaction from the builder's current state.
fn build(self) -> Result<Self::Transaction, <Self::Transaction as Transaction>::TxError>;
}