From 957b22b0cb87b3f445f0c230c87e8226a3d6a26a Mon Sep 17 00:00:00 2001 From: AJ ONeal Date: Wed, 27 Mar 2024 00:35:21 -0600 Subject: [PATCH] ref: split appraise into component parts --- dashtx.js | 70 ++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 54 insertions(+), 16 deletions(-) diff --git a/dashtx.js b/dashtx.js index 808ece9..58bd5e0 100644 --- a/dashtx.js +++ b/dashtx.js @@ -9,6 +9,8 @@ * @prop {Uint32} MAX_INPUT_SIZE - 149 each (with padding) * @prop {Uint32} OUTPUT_SIZE - 34 each * @prop {TxAppraise} appraise + * @prop {TxAppraiseCounts} _appraiseCounts + * @prop {TxAppraiseMemos} _appraiseMemos * @prop {TxToDash} toDash * @prop {TxToSats} toSats * @prop {TxCreate} create @@ -133,34 +135,56 @@ var DashTx = ("object" === typeof module && exports) || {}; 25; // lockscript Tx.appraise = function (txInfo) { + let extraSize = Tx._appraiseMemos(txInfo.outputs); + let fees = Tx._appraiseCounts( + txInfo.inputs.length, + txInfo.outputs.length, + extraSize, + ); + + return fees; + }; + + Tx._appraiseCounts = function (numInputs, numOutputs, extraSize) { let min = Tx._HEADER_ONLY_SIZE; - min += Tx.utils.toVarIntSize(txInfo.inputs.length); - min += Tx.MIN_INPUT_SIZE * txInfo.inputs.length; + min += Tx.utils.toVarIntSize(numInputs); + min += Tx.MIN_INPUT_SIZE * numInputs; + + min += Tx.utils.toVarIntSize(numOutputs); + if (extraSize) { + min += extraSize; // memos, etc + } + + let maxPadding = Tx.MAX_INPUT_PAD * numInputs; + let max = min + maxPadding; + + let spread = max - min; + let halfSpread = Math.ceil(spread / 2); + let mid = min + halfSpread; + + let fees = { min, mid, max }; + return fees; + }; + + Tx._appraiseMemos = function (outputs) { + let size = 0; - min += Tx.utils.toVarIntSize(txInfo.outputs.length); - for (let output of txInfo.outputs) { + for (let output of outputs) { if (output.memo) { let memoSize = output.memo.length / 2; if (memoSize > MAX_U8) { - min += 2; + size += 2; } else if (memoSize >= OP_PUSHDATA1_INT) { - min += 1; + size += 1; } - min += OP_RETURN_HEADER_SIZE + memoSize; + size += OP_RETURN_HEADER_SIZE + memoSize; continue; } - min += Tx.OUTPUT_SIZE; + size += Tx.OUTPUT_SIZE; } - let maxPadding = Tx.MAX_INPUT_PAD * txInfo.inputs.length; - let max = min + maxPadding; - - let spread = max - min; - let halfSpread = Math.ceil(spread / 2); - let mid = min + halfSpread; - - return { min: min, mid: mid, max: max }; + return size; }; Tx.toDash = function (satoshis) { @@ -1392,6 +1416,20 @@ if ("object" === typeof module) { * @returns {TxFees} */ +/** + * @callback TxAppraiseCounts + * @param {Uint32} numInputs + * @param {Uint32} numOutputs + * @param {Uint32} [extraSize] - for memos + * @returns {TxFees} + */ + +/** + * @callback TxAppraiseMemos + * @param {Array} outputs + * @returns {Uint32} + */ + /** * @callback TxCreateHashable * @param {TxInfo} txInfo