text: '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);
  });
  