bitcoin-tx-lib
Version: 
A Typescript library for building and signing Bitcoin transactions
58 lines (46 loc) • 1.87 kB
text/typescript
import { ECPairKey } from "../ecpairkey"
import { InputTransaction, OutputTransaction } from "../types"
import { bytesToHex, getBytesCount, numberToHexLE, numberToVarTnt } from "../utils"
import { Address } from "../utils/address"
import { addressToScriptPubKey } from "../utils/txutils"
export class BaseTransaction {
    public version: number = 2 
    public locktime: number = 0
    public pairKey: ECPairKey
    public cachedata: any = {}
    public inputs: InputTransaction[] = []
    public outputs: OutputTransaction[] =[]
    
    constructor(pairKey: ECPairKey) {
        this.pairKey = pairKey
    }
    
    public addInput(input: InputTransaction) 
    { 
        if(this.inputs.find(i => i.txid == input.txid))
            throw new Error("An input with this txid has already been added")
        if(getBytesCount(input.txid) != 32)
            throw new Error("Expected a valid txid")
        else if(!input.scriptPubKey)
            throw new Error("Expected scriptPubKey")
        // 0xfffffffd Replace By Fee (RBF) enabled BIP 125
        if(!input.sequence)
            input.sequence = "fffffffd"
        
        this.inputs.push(input)
    }
    public addOutput(output: OutputTransaction) 
    {
        if(!Address.isValid(output.address))
            throw new Error("Expected a valid address to output")
        if(output.amount <= 0)
            throw new Error("Expected a valid amount")
        this.outputs.push(output)
    }
    public outputsRaw() : string {
        return this.outputs.map(output => {
            let txoutput = String(numberToHexLE(output.amount, 64, "hex"))
            let scriptPubKey = addressToScriptPubKey(output.address)
            txoutput += String(numberToVarTnt(scriptPubKey.length, "hex"))
            txoutput += bytesToHex(scriptPubKey)
            return txoutput
        }).join("")
    }
}