- Notifications
You must be signed in to change notification settings - Fork112
An unspent transaction output (UTXO) selection module for bitcoin.
License
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
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Uh oh!
There was an error while loading.Please reload this page.
Contributors9
Uh oh!
There was an error while loading.Please reload this page.