3.1.13 • Published 2 years ago

coinselect v3.1.13

Weekly downloads
2,000
License
MIT
Repository
github
Last release
2 years ago

coinselect

TRAVIS NPM

js-standard-style

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

WARNING: Value units are in satoshis, not Bitcoin.

Algorithms

ModuleAlgorithmRe-orders UTXOs?
require('coinselect')Blackjack, with Accumulative fallbackBy 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 of output (as provided)-
require('coinselect/split')Split - splits the input values evenly between all outputs, any provided output with .value remains unchanged-

Note: Each algorithm will add a change output if the input - output - fee value 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 .value) 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,
    ...,
    value: 10000,
    // For use with PSBT:
    // not needed for coinSelect, but will be passed on to inputs later
    nonWitnessUtxo: Buffer.from('...full raw hex of txId tx...', 'hex'),
    // OR
    // if your utxo is a segwit output, you can use witnessUtxo instead
    witnessUtxo: {
      script: Buffer.from('... scriptPubkey hex...', 'hex'),
      value: 10000 // 0.0001 BTC and is the exact same as the value above
    }
  }
]
let targets = [
  ...,
  {
    address: '1EHNa6Q4Jz2uvNExL497mE43ikXhwF6kZm',
    value: 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 psbt = new bitcoin.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 for
  if (!output.address) {
    output.address = wallet.getChangeAddress()
    wallet.nextChangeAddress()
  }

  psbt.addOutput({
    address: output.address,
    value: output.value,
  })
})

License MIT

@thorswap-lib/multichain-corebcschainjs-walletphoton-libsbercoinjs-wallet@everything-registry/sub-chunk-1353myathhhh2023mint@pulsechain/generate-addresslibwallet-mnzlocjs-walletmyathhhhmyathhhhppymigretor-dexmnsig-clientmonapanbv-ur-codecmetrixjs-walletmbs-wallet-coremchainjs-lib@thorwallet/xchain-bitcoin@thorwallet/xchain-bitcoincash@thorwallet/xchain-litecoin@teleportdao/bitcoin@yaswap/bitcoin@yaswap/bitcoin-utils@yaswap/dogecoin@yaswap/litecoin@yaswap/yacoin-utils@yac-swap/bitcoin-utils@yac-swap/bitcoin@yac-swap/yacoin@yac-swap/yacoin-utilsalthashjs-wallet@zeeflex/walletabw-multichain-sdk@wagerr-wdk/ethereum-js-wallet-provider@wagerr-wdk/litecoin-js-wallet-provider@wagerr-wdk/wagerr-utilsagama-wallet-libbcsjs-wallet@atomicfinance/utils@atomicloans/bitcoin-ledger-provider@atomicfinance/bitcoin-utilsberrywallet-corebitverse-atomicals-jsbitcoin_rest_api@cobo/btc@consensys/bitcoin-snap@cypherock/wallet@daviortega/js-oipbtcbamjs-wallet@berrywallet/core@bytesalt/qtumjs-walletoip-hdmwqtumjs-walletrunebasejs-walletvipstarcoinjs-walletvipstarcoinjs-wallet-corewormhole-libwanchain-crosschainbtcwanchain-js-sdksiriusjssotoolchainsberjs-walletrealms-js@chainify/bitcoin@challengesoft/coingrig-core@coinmasters/toolbox-utxo@coingrig/core@gobob/sats-wagmi@dojima-wallet/connectionarcane-btc-walletatomicloans-chainabstractionlayeratomicals-jsatomicals-js-masteratomicals@ardenthq/sdk-btcbamswapjs-wallet@fantasygold/fantasygoldjs-wallet@hashprotocol/bitcoin-utilsdeocoinjs-wallet@chronobank/loginchlu-wallet-support-jscreativechain-platform-core@jelly-swap/btc-ledger-wallet@jelly-swap/btc-wallet@jelly-swap/btc-web-wallet@keepkey/chain-adapters@keevo/keevo-cli@liquality/bitcoin@liquality/bitcoin-utils@liquality/chainabstractionlayer@liquality/litecoin-js-wallet-provider@liquality-dev/bitcoin-js-wallet-provider@liquality-dev/ethereum-js-wallet-provider@mblackmblack/bitcoin-ledger-provider@maze2/sezame-sdk@neon-exchange/api-client-typescript-gunbot@neon-exchange/api-client-typescript-legacy@neon-exchange/api-client-typescript-mpc@nxswap/nxswap-core
3.1.13

2 years ago

3.1.12

4 years ago

3.1.11

7 years ago

3.1.10

7 years ago

3.1.9

7 years ago

3.1.8

7 years ago

3.1.7

7 years ago

3.1.5

7 years ago

3.1.4

7 years ago

3.1.3

7 years ago

3.1.2

7 years ago

3.1.1

7 years ago

3.1.0

7 years ago

3.0.5

8 years ago

3.0.2

8 years ago

3.0.1

8 years ago

3.0.0

8 years ago

2.0.1

8 years ago

2.0.0

8 years ago

1.0.1

8 years ago

1.0.0

8 years ago

0.3.1

9 years ago

0.3.0

9 years ago

0.2.0

9 years ago

0.1.1

9 years ago

0.1.0

9 years ago