80 lines
2.0 KiB
JavaScript
80 lines
2.0 KiB
JavaScript
'use strict';
|
|
|
|
/* eslint new-cap: "off" */
|
|
|
|
const bcoin = require('../..');
|
|
const assert = require('assert');
|
|
|
|
(async () => {
|
|
const master = bcoin.hd.generate();
|
|
const key = master.derivePath('m/44\'/0\'/0\'/0/0');
|
|
const keyring = new bcoin.wallet.WalletKey(key.privateKey);
|
|
const cb = new bcoin.MTX();
|
|
|
|
cb.addInput({
|
|
prevout: new bcoin.Outpoint(),
|
|
script: new bcoin.Script(),
|
|
sequence: 0xffffffff
|
|
});
|
|
|
|
// Send 50,000 satoshis to ourselves.
|
|
cb.addOutput({
|
|
address: keyring.getAddress(),
|
|
value: 50000
|
|
});
|
|
|
|
// Our available coins.
|
|
const coins = [];
|
|
|
|
// Convert the coinbase output to a Coin
|
|
// object and add it to our available coins.
|
|
// In reality you might get these coins from a wallet.
|
|
const coin = bcoin.Coin.fromTX(cb, 0, -1);
|
|
coins.push(coin);
|
|
|
|
// Create our redeeming transaction.
|
|
const mtx = new bcoin.MTX();
|
|
|
|
// Send 10,000 satoshis to ourself.
|
|
mtx.addOutput({
|
|
address: keyring.getAddress(),
|
|
value: 10000
|
|
});
|
|
|
|
// Now that we've created the output, we can do some coin selection (the
|
|
// output must be added first so we know how much money is needed and also so
|
|
// we can accurately estimate the size for fee calculation).
|
|
|
|
// Select coins from our array and add inputs.
|
|
// Calculate fee and add a change output.
|
|
await mtx.fund(coins, {
|
|
// Use a rate of 10,000 satoshis per kb.
|
|
// With the `fullnode` object, you can
|
|
// use the fee estimator for this instead
|
|
// of blindly guessing.
|
|
rate: 10000,
|
|
// Send the change back to ourselves.
|
|
changeAddress: keyring.getAddress()
|
|
});
|
|
|
|
// Sign input 0
|
|
mtx.sign(keyring);
|
|
|
|
// The transaction should now verify.
|
|
assert(mtx.verify());
|
|
|
|
// Commit our transaction and make it immutable.
|
|
// This turns it from an MTX into a TX.
|
|
const tx = mtx.toTX();
|
|
|
|
// The transaction should still verify.
|
|
// Regular transactions require a coin
|
|
// viewpoint to be passed in.
|
|
assert(tx.verify(mtx.view));
|
|
|
|
console.log(mtx);
|
|
})().catch((err) => {
|
|
console.error(err.stack);
|
|
process.exit(1);
|
|
});
|