JSPM

bitcore-coinselect

0.0.1
  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 2
  • Score
    100M100P100Q29805F
  • License MIT

A transaction input selection module for bitcoin.

Package Exports

  • bitcore-coinselect

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (bitcore-coinselect) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

coinselect

TRAVIS NPM

js-standard-style

An unspent transaction output (UTXO) selection module for bitcoin.

This was built for bitcoin-lib specifically. However, as the original version of coinselect uses value for bitcoins, while most block explorers use amount for them, the module must have been annoying, so this could be the exact solution for you!

##Instllation

npm install bitcore-coinselect --save

WARNING: Amount units are in satoshis, not Bitcoin.

Algorithms

Module Algorithm Re-orders UTXOs?
require('coinselect') Blackjack, with Accumulative fallback By Descending Amount
require('coinselect/accumulative') Accumulative - accumulates inputs until the target amount (+fees) is reached, skipping detrimental inputs -
require('coinselect/blackjack') Blackjack - accumulates inputs until the target amount (+fees) is matched, does not accumulate inputs that go over the target amount (within a threshold) -
require('coinselect/break') Break - breaks the input amouts into equal denominations of output (as provided) -
require('coinselect/split') Split - splits the input amounts evenly between all outputs, any provided output with .amount remains unchanged -

Note: Each algorithm will add a change output if the input - output - fee amount difference is over a dust threshold. This is calculated independently by utils.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 .amount) can be used to send-all, while leaving an appropriate amount for the fee.

Example

let coinSelect = require('coinselect')
let feeRate = 55 // satoshis per byte
let utxos = [
  ...,
  {
    txId: '...',
    vout: 0,
    ...,
    amount: 10000
  }
]
let targets = [
  ...,
  {
    address: '1EHNa6Q4Jz2uvNExL497mE43ikXhwF6kZm',
    amount: 5000
  }
]

// ...
let { inputs, outputs, fee } = coinSelect(utxos, targets, feeRate)

// the accumulated fee is always returned for analysis
console.log(fee)

// .inputs and .outputs will be undefined if no solution was found
if (!inputs || !outputs) return

let txb = new bitcoin.TransactionBuilder()

inputs.forEach(input => txb.addInput(input.txId, input.vout))
outputs.forEach(output => {
  // watch out, outputs may have been added that you need to provide
  // an output address/script for
  if (!output.address) {
    output.address = wallet.getChangeAddress()
    wallet.nextChangeAddress()
  }

  txb.addOutput(output.address, output.amount)
})

License MIT