UNPKG

@vbyte/btc-dev

Version:

Batteries-included toolset for plebian bitcoin development

53 lines (52 loc) 2.4 kB
import { Assert } from '@vbyte/micro-lib'; import { COINBASE, DEFAULT } from '../../const.js'; import { normalize_prevout, normalize_sequence, normalize_value } from './util.js'; import { assert_tx_template, assert_vin_template, assert_vout_template } from './validate.js'; export function create_coinbase_input(config) { assert_vin_template(config); Assert.exists(config.coinbase, 'coinbase is required'); const txid = COINBASE.TXID; const vout = COINBASE.VOUT; const coinbase = config.coinbase; const witness = config.witness ?? []; const sequence = normalize_sequence(config.sequence); return { coinbase, prevout: null, script_sig: null, sequence, witness, txid, vout }; } export function create_virtual_input(config) { assert_vin_template(config); Assert.is_empty(config.coinbase, 'coinbase is not allowed'); Assert.is_empty(config.prevout, 'prevout is not allowed'); const { txid, vout, script_sig = null, witness = [] } = config; const sequence = normalize_sequence(config.sequence); return { txid, vout, coinbase: null, prevout: null, script_sig, sequence, witness }; } export function create_spend_input(config) { assert_vin_template(config); Assert.exists(config.prevout, 'prevout is required'); const { txid, vout, script_sig = null, witness = [] } = config; const prevout = normalize_prevout(config.prevout); const sequence = normalize_sequence(config.sequence); return { txid, vout, coinbase: null, prevout, script_sig, sequence, witness }; } export function create_tx_input(config) { if (config.coinbase) return create_coinbase_input(config); if (config.prevout) return create_spend_input(config); return create_virtual_input(config); } export function create_tx_output(config) { assert_vout_template(config); const script_pk = config.script_pk; const value = normalize_value(config.value); return { script_pk, value }; } export function create_tx(config) { assert_tx_template(config); const { vin = [], vout = [] } = config ?? { vin: [], vout: [] }; const locktime = config.locktime ?? DEFAULT.LOCKTIME; const version = config.version ?? DEFAULT.VERSION; const inputs = vin.map(txin => create_tx_input(txin)); const outputs = vout.map(txout => create_tx_output(txout)); return { locktime, vin: inputs, vout: outputs, version }; }