- Notifications
You must be signed in to change notification settings - Fork106
An unspent transaction output (UTXO) selection module for bitcoin.
License
NotificationsYou must be signed in to change notification settings
bitcoinjs/coinselect
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
An unspent transaction output (UTXO) selection module for bitcoin.
WARNING: Value units are insatoshi
s,not Bitcoin.
Module | Algorithm | Re-orders UTXOs? |
---|---|---|
require('coinselect') | Blackjack, with Accumulative fallback | By Descending Value |
require('coinselect/accumulative') | Accumulative - accumulates inputs until the target value (+fees) is reached, skipping detrimental inputs | - |
require('coinselect/blackjack') | Blackjack - accumulates inputs until the target value (+fees) is matched, does not accumulate inputs that go over the target value (within a threshold) | - |
require('coinselect/break') | Break - breaks the input values into equal denominations ofoutput (as provided) | - |
require('coinselect/split') | Split - splits the input values evenly between alloutputs , any providedoutput with.value remains unchanged | - |
Note: Each algorithm will add a change output if theinput - output - fee
value difference is over a dust threshold.This is calculated independently byutils.finalize
, irrespective of the algorithm chosen, for the purposes of safety.
Pro-tip: if you want to send-all inputs to an output address,coinselect/split
with a partial output (.address
defined, no.value
) can be used to send-all, while leaving an appropriate amount for thefee
.
letcoinSelect=require('coinselect')letfeeRate=55// satoshis per byteletutxos=[ ...,{txId:'...',vout:0, ...,value:10000,// For use with PSBT:// not needed for coinSelect, but will be passed on to inputs laternonWitnessUtxo:Buffer.from('...full raw hex of txId tx...','hex'),// OR// if your utxo is a segwit output, you can use witnessUtxo insteadwitnessUtxo:{script:Buffer.from('... scriptPubkey hex...','hex'),value:10000// 0.0001 BTC and is the exact same as the value above}}]lettargets=[ ...,{address:'1EHNa6Q4Jz2uvNExL497mE43ikXhwF6kZm',value:5000}]// ...let{ inputs, outputs, fee}=coinSelect(utxos,targets,feeRate)// the accumulated fee is always returned for analysisconsole.log(fee)// .inputs and .outputs will be undefined if no solution was foundif(!inputs||!outputs)returnletpsbt=newbitcoin.Psbt()inputs.forEach(input=>psbt.addInput({hash:input.txId,index:input.vout,nonWitnessUtxo:input.nonWitnessUtxo,// OR (not both)witnessUtxo:input.witnessUtxo,}))outputs.forEach(output=>{// watch out, outputs may have been added that you need to provide// an output address/script forif(!output.address){output.address=wallet.getChangeAddress()wallet.nextChangeAddress()}psbt.addOutput({address:output.address,value:output.value,})})
LicenseMIT
About
An unspent transaction output (UTXO) selection module for bitcoin.
Topics
Resources
License
Stars
Watchers
Forks
Packages0
No packages published