From e38a4feb1dba63b938e7a6e01370928cb3413382 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Mon, 12 Nov 2018 13:12:21 +0300 Subject: [PATCH 1/4] Support multiple MN and multiple sb payouts in one block Should be 0.12.1/0.13 compatible --- lib/transactions.js | 61 +++++++++++++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 22 deletions(-) diff --git a/lib/transactions.js b/lib/transactions.js index dd952aed..1985a82c 100644 --- a/lib/transactions.js +++ b/lib/transactions.js @@ -131,23 +131,40 @@ var generateOutputTransactions = function(poolRecipient, recipients, rpcData){ var txOutputBuffers = []; + /* Dash 0.12.1/0.13 */ + if (rpcData.masternode) { + if (rpcData.masternode.payee) { + var payeeReward = 0; -/* Dash 12.1 */ -if (rpcData.masternode && rpcData.superblock) { - if (rpcData.masternode.payee) { - var payeeReward = 0; + payeeReward = rpcData.masternode.amount; + reward -= payeeReward; + rewardToPool -= payeeReward; - payeeReward = rpcData.masternode.amount; - reward -= payeeReward; - rewardToPool -= payeeReward; + var payeeScript = util.addressToScript(rpcData.masternode.payee); + txOutputBuffers.push(Buffer.concat([ + util.packInt64LE(payeeReward), + util.varIntBuffer(payeeScript.length), + payeeScript + ])); + } else if (rpcData.masternode.length > 0) { + for(var i in rpcData.masternode) { + var payeeReward = 0; + + payeeReward = rpcData.masternode[i].amount; + reward -= payeeReward; + rewardToPool -= payeeReward; + + var payeeScript = util.addressToScript(rpcData.masternode[i].payee); + txOutputBuffers.push(Buffer.concat([ + util.packInt64LE(payeeReward), + util.varIntBuffer(payeeScript.length), + payeeScript + ])); + } + } + } - var payeeScript = util.addressToScript(rpcData.masternode.payee); - txOutputBuffers.push(Buffer.concat([ - util.packInt64LE(payeeReward), - util.varIntBuffer(payeeScript.length), - payeeScript - ])); - } else if (rpcData.superblock.length > 0) { + if (rpcData.superblock && rpcData.superblock.length > 0) { for(var i in rpcData.superblock){ var payeeReward = 0; @@ -163,16 +180,16 @@ if (rpcData.masternode && rpcData.superblock) { ])); } } -} + /* End Dash 0.12.1/0.13 */ -if (rpcData.payee) { - var payeeReward = 0; + if (rpcData.payee) { + var payeeReward = 0; - if (rpcData.payee_amount) { - payeeReward = rpcData.payee_amount; - } else { - payeeReward = Math.ceil(reward / 5); - } + if (rpcData.payee_amount) { + payeeReward = rpcData.payee_amount; + } else { + payeeReward = Math.ceil(reward / 5); + } reward -= payeeReward; rewardToPool -= payeeReward; From 509d97cf447c5e67b897e9be19c9227bc3f6f636 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Thu, 13 Dec 2018 22:19:52 +0300 Subject: [PATCH 2/4] Support coinbase v3 with extra payload --- lib/transactions.js | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/transactions.js b/lib/transactions.js index 1985a82c..5e3c68c3 100644 --- a/lib/transactions.js +++ b/lib/transactions.js @@ -183,7 +183,7 @@ var generateOutputTransactions = function(poolRecipient, recipients, rpcData){ /* End Dash 0.12.1/0.13 */ if (rpcData.payee) { - var payeeReward = 0; + var payeeReward = 0; if (rpcData.payee_amount) { payeeReward = rpcData.payee_amount; @@ -244,8 +244,18 @@ exports.CreateGeneration = function(rpcData, publicKey, extraNoncePlaceholder, r var txInputsCount = 1; var txOutputsCount = 1; var txVersion = txMessages === true ? 2 : 1; + var txType = 0; + var txExtraPayload; var txLockTime = 0; + if (rpcData.coinbase_payload && rpcData.coinbase_payload.length > 0) { + txVersion = 3; + txType = 5; + txExtraPayload = new Buffer(rpcData.coinbase_payload, 'hex'); + } + + txVersion = txVersion + (txType << 16); + var txInPrevOutHash = ""; var txInPrevOutIndex = Math.pow(2, 32) - 1; var txInSequence = 0; @@ -304,6 +314,14 @@ exports.CreateGeneration = function(rpcData, publicKey, extraNoncePlaceholder, r txComment ]); + if (txExtraPayload !== undefined) { + var p2 = Buffer.concat([ + p2, + util.varIntBuffer(txExtraPayload.length), + txExtraPayload + ]); + } + return [p1, p2]; }; From df02fdb9628505020af27d7c50940e9aea63082a Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Tue, 18 Dec 2018 20:08:14 +0300 Subject: [PATCH 3/4] Use script instead of address for mn payments if available This allows p2psh in mn payouts and superblocks --- lib/transactions.js | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/transactions.js b/lib/transactions.js index 5e3c68c3..b617bd5f 100644 --- a/lib/transactions.js +++ b/lib/transactions.js @@ -154,7 +154,14 @@ var generateOutputTransactions = function(poolRecipient, recipients, rpcData){ reward -= payeeReward; rewardToPool -= payeeReward; - var payeeScript = util.addressToScript(rpcData.masternode[i].payee); + var payeeScript; + + if (rpcData.masternode[i].script) { + payeeScript = new Buffer(rpcData.masternode[i].script, 'hex'); + } else { + payeeScript = util.addressToScript(rpcData.masternode[i].payee); + } + txOutputBuffers.push(Buffer.concat([ util.packInt64LE(payeeReward), util.varIntBuffer(payeeScript.length), @@ -172,7 +179,14 @@ var generateOutputTransactions = function(poolRecipient, recipients, rpcData){ reward -= payeeReward; rewardToPool -= payeeReward; - var payeeScript = util.addressToScript(rpcData.superblock[i].payee); + var payeeScript; + + if (rpcData.superblock[i].script) { + payeeScript = new Buffer(rpcData.superblock[i].script, 'hex'); + } else { + payeeScript = util.addressToScript(rpcData.superblock[i].payee); + } + txOutputBuffers.push(Buffer.concat([ util.packInt64LE(payeeReward), util.varIntBuffer(payeeScript.length), From 3adc5fdc71d2fc26c04e7980b26481720a1e97dd Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Tue, 15 Jan 2019 20:40:59 +0300 Subject: [PATCH 4/4] Cleanup: Don't use enumeration to loop through "masternode" and "superblock" arrays, use iteration instead --- lib/transactions.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/transactions.js b/lib/transactions.js index b617bd5f..04ac236d 100644 --- a/lib/transactions.js +++ b/lib/transactions.js @@ -147,7 +147,7 @@ var generateOutputTransactions = function(poolRecipient, recipients, rpcData){ payeeScript ])); } else if (rpcData.masternode.length > 0) { - for(var i in rpcData.masternode) { + for (var i = 0; i < rpcData.masternode.length; i++) { var payeeReward = 0; payeeReward = rpcData.masternode[i].amount; @@ -172,7 +172,7 @@ var generateOutputTransactions = function(poolRecipient, recipients, rpcData){ } if (rpcData.superblock && rpcData.superblock.length > 0) { - for(var i in rpcData.superblock){ + for (var i = 0; i < rpcData.superblock.length; i++) { var payeeReward = 0; payeeReward = rpcData.superblock[i].amount;