Finalize Transaction

From Open Transactions
Jump to navigation Jump to search

Initial Conditions

  • An unfinished transaction is ready for processing.
    • The transaction may or may not have have an output
    • The transaction is valid
      • Not too big
      • Inputs are sufficient to cover outputs and required fees
    • A change output does not yet exist in the transaction
      • A change output may be added without causing the transaction to exceed size limits OR no change will be required (as in the case of a split output)


  1. If the transaction contains no outputs and no inputs, then it may be discarded.
  2. The change amount is calculated by: Σ(txin) - ( Σ(txout) + fees )
    1. If the change amount is greater than zero:
      1. Add a change output of the appropriate value
      2. Increment the nextchangestart object in the withdrawal status list
  3. Calculate an ntxid for the transaction for tracking purposes.
  4. Loop through every (non-change) output in the transaction and update the withdrawal status object for the corresponding output.
    1. The withdrawal status object contain an entry for every output in the transaction, where each entry has an outpoints object containing a nil ntxid, an index matching the output position index, and a matching amount.
    2. Update the ntxid value from nil to the ntxid for the transaction.
  5. Add the fees from this transaction to the fees property of the withdrawal status object.
  6. Move the transaction to the finished transaction list.