From af1c497629d077e489bec3413c7f01af5203f71b Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 11 Apr 2025 22:01:25 +0700 Subject: [PATCH 1/6] feat: override LLMQ params --- lib/constants/index.js | 77 +++++++++++++- lib/deterministicmnlist/QuorumEntry.js | 100 ++++-------------- lib/deterministicmnlist/SimplifiedMNList.js | 20 +++- .../payload/commitmenttxpayload.js | 5 +- 4 files changed, 116 insertions(+), 86 deletions(-) diff --git a/lib/constants/index.js b/lib/constants/index.js index c0151a29d..2d32135a9 100644 --- a/lib/constants/index.js +++ b/lib/constants/index.js @@ -1,4 +1,4 @@ -module.exports = { +const constants = { // Public key id size in bytes PUBKEY_ID_SIZE: 20, // Standard compact size variable, size in bytes @@ -106,3 +106,78 @@ module.exports = { BASIC_BLS_SCHEME_VERSION: 3, BASIC_BLS_SCHEME_HASH_QUORUM_INDEX_REQUIRED_VERSION: 4, }; + +constants.LLMQ_TYPE_PARAMS= { + [constants.LLMQ_TYPE_50_60]: { + size: 50, + threshold: 30, + maximumActiveQuorumsCount: 24, + }, + [constants.LLMQ_TYPES.LLMQ_TYPE_60_75]: { + size: 60, + threshold: 45, + maximumActiveQuorumsCount: 24, + }, + [constants.LLMQ_TYPES.LLMQ_TYPE_400_60]: { + size: 400, + threshold: 240, + maximumActiveQuorumsCount: 4, + }, + [constants.LLMQ_TYPES.LLMQ_TYPE_400_85]: { + size: 400, + threshold: 340, + maximumActiveQuorumsCount: 4, + }, + [constants.LLMQ_TYPES.LLMQ_TYPE_100_67]: { + size: 100, + threshold: 67, + maximumActiveQuorumsCount: 24, + }, + [constants.LLMQ_TYPES.LLMQ_TYPE_25_67]: { + size: 25, + threshold: 67, + maximumActiveQuorumsCount: 24, + }, + [constants.LLMQ_TYPES.LLMQ_TYPE_LLMQ_TEST]: { + size: 3, + threshold: 2, + maximumActiveQuorumsCount: 2, + }, + [constants.LLMQ_TYPES.LLMQ_TYPE_LLMQ_DEVNET]: { + size: 12, + threshold: 6, + maximumActiveQuorumsCount: 4, + }, + [constants.LLMQ_TYPES.LLMQ_TYPE_TEST_V17]: { + size: 3, + threshold: 2, + maximumActiveQuorumsCount: 2, + }, + [constants.LLMQ_TYPES.LLMQ_TYPE_TEST_DIP0024]: { + size: 4, + threshold: 2, + maximumActiveQuorumsCount: 2, + }, + [constants.LLMQ_TYPES.LLMQ_TYPE_TEST_INSTANTSEND]: { + size: 3, + threshold: 2, + maximumActiveQuorumsCount: 2, + }, + [constants.LLMQ_TYPES.LLMQ_DEVNET_DIP0024]: { + size: 8, + threshold: 4, + maximumActiveQuorumsCount: 2, + }, + [constants.LLMQ_TYPES.LLMQ_TEST_PLATFORM]: { + size: 3, + threshold: 2, + maximumActiveQuorumsCount: 2, + }, + [constants.LLMQ_TYPES.LLMQ_DEVNET_PLATFORM]: { + size: 12, + threshold: 8, + maximumActiveQuorumsCount: 4, + }, +}; + +module.exports = constants; diff --git a/lib/deterministicmnlist/QuorumEntry.js b/lib/deterministicmnlist/QuorumEntry.js index 217df121f..0616236ce 100644 --- a/lib/deterministicmnlist/QuorumEntry.js +++ b/lib/deterministicmnlist/QuorumEntry.js @@ -37,6 +37,7 @@ const { * @property {string} quorumVvecHash * @property {string} quorumSig * @property {string} membersSig + * @property {Object} [llmqOverride] */ /** @@ -56,6 +57,7 @@ const { * @property {string} quorumVvecHash * @property {string} quorumSig * @property {string} membersSig + * @property {Object} llmqOverride */ function QuorumEntry(arg) { if (arg) { @@ -85,12 +87,14 @@ function QuorumEntry(arg) { /** * Parse buffer and returns QuorumEntry * @param {Buffer} buffer + * @param {Object} [llmqOverride] * @return {QuorumEntry} */ -QuorumEntry.fromBuffer = function fromBuffer(buffer) { +QuorumEntry.fromBuffer = function fromBuffer(buffer, llmqOverride = {}) { const bufferReader = new BufferReader(buffer); const SMLQuorumEntry = new QuorumEntry(); SMLQuorumEntry.isVerified = false; + SMLQuorumEntry.llmqOverride = llmqOverride; if (buffer.length < 100) { SMLQuorumEntry.isOutdatedRPC = true; SMLQuorumEntry.version = bufferReader.readUInt16LE(); @@ -159,10 +163,11 @@ QuorumEntry.fromBuffer = function fromBuffer(buffer) { /** * @param {string} string + * @param {Object} llmqOverride * @return {QuorumEntry} */ -QuorumEntry.fromHexString = function fromString(string) { - return QuorumEntry.fromBuffer(Buffer.from(string, 'hex')); +QuorumEntry.fromHexString = function fromString(string, llmqOverride = {}) { + return QuorumEntry.fromBuffer(Buffer.from(string, 'hex'), llmqOverride); }; /** @@ -250,6 +255,7 @@ QuorumEntry.fromObject = function fromObject(obj) { SMLQuorumEntry.quorumVvecHash = obj.quorumVvecHash; SMLQuorumEntry.quorumSig = obj.quorumSig; SMLQuorumEntry.membersSig = obj.membersSig; + SMLQuorumEntry.llmqOverride = obj.llmqOverride; if (SMLQuorumEntry.signers === undefined) { SMLQuorumEntry.isOutdatedRPC = true; } @@ -334,88 +340,24 @@ QuorumEntry.prototype.toObject = function toObject() { return result; }; -QuorumEntry.getParams = function getParams(llmqType) { - const params = {}; - switch (llmqType) { - case constants.LLMQ_TYPES.LLMQ_TYPE_50_60: - params.size = 50; - params.threshold = 30; - params.maximumActiveQuorumsCount = 24; - return params; - case constants.LLMQ_TYPES.LLMQ_TYPE_60_75: - params.size = 60; - params.threshold = 45; - params.maximumActiveQuorumsCount = 32; - return params; - case constants.LLMQ_TYPES.LLMQ_TYPE_400_60: - params.size = 400; - params.threshold = 240; - params.maximumActiveQuorumsCount = 4; - return params; - case constants.LLMQ_TYPES.LLMQ_TYPE_400_85: - params.size = 400; - params.threshold = 340; - params.maximumActiveQuorumsCount = 4; - return params; - case constants.LLMQ_TYPES.LLMQ_TYPE_100_67: - params.size = 100; - params.threshold = 67; - params.maximumActiveQuorumsCount = 24; - return params; - case constants.LLMQ_TYPES.LLMQ_TYPE_25_67: - params.size = 25; - params.threshold = 67; - params.maximumActiveQuorumsCount = 24; - return params; - case constants.LLMQ_TYPES.LLMQ_TYPE_LLMQ_TEST: - params.size = 3; - params.threshold = 2; - params.maximumActiveQuorumsCount = 2; - return params; - case constants.LLMQ_TYPES.LLMQ_TYPE_LLMQ_DEVNET: - params.size = 12; - params.threshold = 6; - params.maximumActiveQuorumsCount = 4; - return params; - case constants.LLMQ_TYPES.LLMQ_TYPE_TEST_V17: - params.size = 3; - params.threshold = 2; - params.maximumActiveQuorumsCount = 2; - return params; - case constants.LLMQ_TYPES.LLMQ_TYPE_TEST_DIP0024: - params.size = 4; - params.threshold = 2; - params.maximumActiveQuorumsCount = 2; - return params; - case constants.LLMQ_TYPES.LLMQ_TYPE_TEST_INSTANTSEND: - params.size = 3; - params.threshold = 2; - params.maximumActiveQuorumsCount = 2; - return params; - case constants.LLMQ_TYPES.LLMQ_DEVNET_DIP0024: - params.size = 8; - params.threshold = 4; - params.maximumActiveQuorumsCount = 2; - return params; - case constants.LLMQ_TYPES.LLMQ_TEST_PLATFORM: - params.size = 3; - params.threshold = 2; - params.maximumActiveQuorumsCount = 2; - return params; - case constants.LLMQ_TYPES.LLMQ_DEVNET_PLATFORM: - params.size = 12; - params.threshold = 8; - params.maximumActiveQuorumsCount = 4; - return params; - default: - throw new Error(`Invalid llmq type ${llmqType}`); +QuorumEntry.getParams = function getParams(llmqType, llmqOverride = {}) { + let llmqParams = constants.LLMQ_TYPE_PARAMS; + if (Object.keys(llmqOverride).length > 0) { + llmqParams = _.merge({}, constants.LLMQ_TYPE_PARAMS, llmqOverride); } + + if (!llmqParams[llmqType]) { + throw new Error(`Invalid llmq type ${llmqType}`); + } + + return llmqParams[llmqType]; }; + /** * @return {number} */ QuorumEntry.prototype.getParams = function getParams() { - return QuorumEntry.getParams(this.llmqType); + return QuorumEntry.getParams(this.llmqType, this.llmqOverride); }; /** diff --git a/lib/deterministicmnlist/SimplifiedMNList.js b/lib/deterministicmnlist/SimplifiedMNList.js index b5c8aab78..5fe19a2d0 100644 --- a/lib/deterministicmnlist/SimplifiedMNList.js +++ b/lib/deterministicmnlist/SimplifiedMNList.js @@ -11,7 +11,12 @@ const Networks = require('../networks'); const Transaction = require('../transaction'); const { MASTERNODE_TYPE_HP } = require("../constants"); -function SimplifiedMNList(simplifiedMNListDiff) { +/** + * @param {SimplifiedMNListDiff} simplifiedMNListDiff + * @param {Object} llmqOverride + * @constructor + */ +function SimplifiedMNList(simplifiedMNListDiff = null, llmqOverride = {}) { this.baseBlockHash = constants.NULL_HASH; this.blockHash = constants.NULL_HASH; /** @@ -38,6 +43,7 @@ function SimplifiedMNList(simplifiedMNListDiff) { this.quorumsActive = false; this.cbTx = null; this.cbTxMerkleTree = null; + this.llmqOverride = llmqOverride; if (simplifiedMNListDiff) { this.applyDiff(simplifiedMNListDiff); } @@ -162,7 +168,8 @@ SimplifiedMNList.prototype.addAndMaybeRemoveQuorums = ? newGroupedQuorums[quorumType].length : 0; const maxAllowedQuorumsOfType = QuorumEntry.getParams( - Number(quorumType) + Number(quorumType), + this.llmqOverride, ).maximumActiveQuorumsCount; if ( @@ -573,8 +580,9 @@ SimplifiedMNList.prototype.toSimplifiedMNListDiff = /** * Recreates SML from json * @param {Object} smlJson + * @param {Object} llmqOverride */ -SimplifiedMNList.fromJSON = function fromJSON(smlJson) { +SimplifiedMNList.fromJSON = function fromJSON(smlJson, llmqOverride = {}) { const sml = new SimplifiedMNList(); sml.baseBlockHash = smlJson.baseBlockHash; sml.blockHash = smlJson.blockHash; @@ -592,7 +600,11 @@ SimplifiedMNList.fromJSON = function fromJSON(smlJson) { (mnRecord) => new SimplifiedMNListEntry(mnRecord) ); sml.quorumList = smlJson.quorumList.map( - (quorumEntry) => new QuorumEntry(quorumEntry) + (quorumEntry) => { + const quorum = new QuorumEntry(quorumEntry); + quorum.llmqOverride = llmqOverride; + return quorum; + } ); sml.validMNs = smlJson.validMNs.map( (mnRecord) => new SimplifiedMNListEntry(mnRecord) diff --git a/lib/transaction/payload/commitmenttxpayload.js b/lib/transaction/payload/commitmenttxpayload.js index 3140b0064..b3110457e 100644 --- a/lib/transaction/payload/commitmenttxpayload.js +++ b/lib/transaction/payload/commitmenttxpayload.js @@ -75,9 +75,10 @@ CommitmentTxPayload.prototype.constructor = AbstractPayload; /** * Parse raw payload * @param {Buffer} rawPayload + * @param {Object} llmqOverride * @return {CommitmentTxPayload} */ -CommitmentTxPayload.fromBuffer = function fromBuffer(rawPayload) { +CommitmentTxPayload.fromBuffer = function fromBuffer(rawPayload, llmqOverride = {}) { var payloadBufferReader = new BufferReader(rawPayload); var payload = new CommitmentTxPayload(); payload.version = payloadBufferReader.readUInt16LE(); @@ -92,7 +93,7 @@ CommitmentTxPayload.fromBuffer = function fromBuffer(rawPayload) { payload.quorumIndex = payloadBufferReader.readInt16LE(); } - const fixedCounterLength = QuorumEntry.getParams(payload.llmqtype).size; + const fixedCounterLength = QuorumEntry.getParams(payload.llmqtype, llmqOverride).size; payload.signersSize = payloadBufferReader.readVarintNum(); var signersBytesToRead = Math.floor((fixedCounterLength + 7) / 8) || 1; From b5de9b1745c22cc216e6ac18abc9c9d423743a3b Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 11 Apr 2025 22:56:02 +0700 Subject: [PATCH 2/6] fix: missing overrides --- lib/constants/index.js | 2 +- lib/deterministicmnlist/QuorumEntry.js | 22 ++++++------- lib/deterministicmnlist/SimplifiedMNList.js | 13 ++++---- .../SimplifiedMNListDiff.js | 32 ++++++++++++------- .../payload/commitmenttxpayload.js | 6 ++++ 5 files changed, 44 insertions(+), 31 deletions(-) diff --git a/lib/constants/index.js b/lib/constants/index.js index 2d32135a9..f48a98e15 100644 --- a/lib/constants/index.js +++ b/lib/constants/index.js @@ -108,7 +108,7 @@ const constants = { }; constants.LLMQ_TYPE_PARAMS= { - [constants.LLMQ_TYPE_50_60]: { + [constants.LLMQ_TYPES.LLMQ_TYPE_50_60]: { size: 50, threshold: 30, maximumActiveQuorumsCount: 24, diff --git a/lib/deterministicmnlist/QuorumEntry.js b/lib/deterministicmnlist/QuorumEntry.js index 0616236ce..e43b1f8c7 100644 --- a/lib/deterministicmnlist/QuorumEntry.js +++ b/lib/deterministicmnlist/QuorumEntry.js @@ -37,13 +37,13 @@ const { * @property {string} quorumVvecHash * @property {string} quorumSig * @property {string} membersSig - * @property {Object} [llmqOverride] */ /** * @class QuorumEntry * @param {string|Object|Buffer} [arg] - A Buffer, JSON string, * or Object representing a SMLQuorumEntry + * @param {Object} [llmqOverride] - LLMQ type override * @constructor * @property {number} version * @property {number} llmqType @@ -57,20 +57,19 @@ const { * @property {string} quorumVvecHash * @property {string} quorumSig * @property {string} membersSig - * @property {Object} llmqOverride */ -function QuorumEntry(arg) { +function QuorumEntry(arg, llmqOverride = {}) { if (arg) { if (arg instanceof QuorumEntry) { return arg.copy(); } if (BufferUtil.isBuffer(arg)) { - return QuorumEntry.fromBuffer(arg); + return QuorumEntry.fromBuffer(arg, llmqOverride); } if (_.isObject(arg)) { - return QuorumEntry.fromObject(arg); + return QuorumEntry.fromObject(arg, llmqOverride); } if (arg instanceof QuorumEntry) { @@ -78,7 +77,7 @@ function QuorumEntry(arg) { } if (isHexString(arg)) { - return QuorumEntry.fromHexString(arg); + return QuorumEntry.fromHexString(arg, llmqOverride); } throw new TypeError('Unrecognized argument for QuorumEntry'); } @@ -92,9 +91,8 @@ function QuorumEntry(arg) { */ QuorumEntry.fromBuffer = function fromBuffer(buffer, llmqOverride = {}) { const bufferReader = new BufferReader(buffer); - const SMLQuorumEntry = new QuorumEntry(); + const SMLQuorumEntry = new QuorumEntry({ }, llmqOverride); SMLQuorumEntry.isVerified = false; - SMLQuorumEntry.llmqOverride = llmqOverride; if (buffer.length < 100) { SMLQuorumEntry.isOutdatedRPC = true; SMLQuorumEntry.version = bufferReader.readUInt16LE(); @@ -237,10 +235,11 @@ QuorumEntry.prototype.toBufferForHashing = function toBufferForHashing() { /** * Create SMLQuorumEntry from an object * @param {SMLQuorumEntry} obj + * @param {Object} llmqOverride * @return {QuorumEntry} */ -QuorumEntry.fromObject = function fromObject(obj) { - const SMLQuorumEntry = new QuorumEntry(); +QuorumEntry.fromObject = function fromObject(obj, llmqOverride = {}) { + const SMLQuorumEntry = new QuorumEntry({}, llmqOverride); SMLQuorumEntry.isVerified = false; SMLQuorumEntry.isOutdatedRPC = false; SMLQuorumEntry.version = obj.version; @@ -255,7 +254,6 @@ QuorumEntry.fromObject = function fromObject(obj) { SMLQuorumEntry.quorumVvecHash = obj.quorumVvecHash; SMLQuorumEntry.quorumSig = obj.quorumSig; SMLQuorumEntry.membersSig = obj.membersSig; - SMLQuorumEntry.llmqOverride = obj.llmqOverride; if (SMLQuorumEntry.signers === undefined) { SMLQuorumEntry.isOutdatedRPC = true; } @@ -357,6 +355,8 @@ QuorumEntry.getParams = function getParams(llmqType, llmqOverride = {}) { * @return {number} */ QuorumEntry.prototype.getParams = function getParams() { + console.log('getParams') + console.dir(this.llmqOverride) return QuorumEntry.getParams(this.llmqType, this.llmqOverride); }; diff --git a/lib/deterministicmnlist/SimplifiedMNList.js b/lib/deterministicmnlist/SimplifiedMNList.js index 5fe19a2d0..4f5c49710 100644 --- a/lib/deterministicmnlist/SimplifiedMNList.js +++ b/lib/deterministicmnlist/SimplifiedMNList.js @@ -58,7 +58,7 @@ SimplifiedMNList.prototype.applyDiff = function applyDiff( simplifiedMNListDiff ) { // This will copy an instance of SimplifiedMNListDiff or create a new instance - const diff = new SimplifiedMNListDiff(simplifiedMNListDiff, this.network); + const diff = new SimplifiedMNListDiff(simplifiedMNListDiff, this.network, this.llmqOverride); // only when we apply the first diff we set the network if (!this.network) { @@ -167,6 +167,8 @@ SimplifiedMNList.prototype.addAndMaybeRemoveQuorums = const numberOfQuorumsToAdd = newGroupedQuorums[quorumType] ? newGroupedQuorums[quorumType].length : 0; + console.log('addAndMaybeRemoveQuorums') + console.dir(this.llmqOverride) const maxAllowedQuorumsOfType = QuorumEntry.getParams( Number(quorumType), this.llmqOverride, @@ -573,7 +575,8 @@ SimplifiedMNList.prototype.toSimplifiedMNListDiff = merkleRootQuorums: this.merkleRootQuorums, nVersion: this.nVersion, }, - network + network, + this.llmqOverride, ); }; @@ -600,11 +603,7 @@ SimplifiedMNList.fromJSON = function fromJSON(smlJson, llmqOverride = {}) { (mnRecord) => new SimplifiedMNListEntry(mnRecord) ); sml.quorumList = smlJson.quorumList.map( - (quorumEntry) => { - const quorum = new QuorumEntry(quorumEntry); - quorum.llmqOverride = llmqOverride; - return quorum; - } + (quorumEntry) => new QuorumEntry(quorumEntry, llmqOverride), ); sml.validMNs = smlJson.validMNs.map( (mnRecord) => new SimplifiedMNListEntry(mnRecord) diff --git a/lib/deterministicmnlist/SimplifiedMNListDiff.js b/lib/deterministicmnlist/SimplifiedMNListDiff.js index c01707fda..d96c6410c 100644 --- a/lib/deterministicmnlist/SimplifiedMNListDiff.js +++ b/lib/deterministicmnlist/SimplifiedMNListDiff.js @@ -14,6 +14,7 @@ const Networks = require('../networks'); /** * @param {Buffer|Object|string} [arg] - A Buffer, JSON string, or Object representing a MnListDiff * @param {string} [network] + * @param {Object} [llmqOverride] * @class SimplifiedMNListDiff * @property {string} baseBlockHash - sha256 * @property {string} blockHash - sha256 @@ -27,7 +28,7 @@ const Networks = require('../networks'); * @property {string} merkleRootMNList - merkle root of the whole mn list * @property {string} merkleRootQuorums - merkle root of the quorum list */ -function SimplifiedMNListDiff(arg, network) { +function SimplifiedMNListDiff(arg, network, llmqOverride = {}) { if (arg) { const validNetwork = Networks.get(network); @@ -35,13 +36,13 @@ function SimplifiedMNListDiff(arg, network) { return arg.copy(); } if (BufferUtil.isBuffer(arg)) { - return SimplifiedMNListDiff.fromBuffer(arg, validNetwork); + return SimplifiedMNListDiff.fromBuffer(arg, validNetwork, llmqOverride); } if (_.isObject(arg)) { - return SimplifiedMNListDiff.fromObject(arg, validNetwork); + return SimplifiedMNListDiff.fromObject(arg, validNetwork, llmqOverride); } if (isHexString(arg)) { - return SimplifiedMNListDiff.fromHexString(arg, validNetwork); + return SimplifiedMNListDiff.fromHexString(arg, validNetwork, llmqOverride); } throw new TypeError( 'Unrecognized argument passed to SimplifiedMNListDiff constructor' @@ -53,9 +54,10 @@ function SimplifiedMNListDiff(arg, network) { * Creates MnListDiff from a Buffer. * @param {Buffer} buffer * @param {string} [network] + * @param {Object} [llmqOverride] * @return {SimplifiedMNListDiff} */ -SimplifiedMNListDiff.fromBuffer = function fromBuffer(buffer, network) { +SimplifiedMNListDiff.fromBuffer = function fromBuffer(buffer, network, llmqOverride = {}) { const bufferReader = new BufferReader(Buffer.from(buffer)); const data = {}; @@ -127,28 +129,31 @@ SimplifiedMNListDiff.fromBuffer = function fromBuffer(buffer, network) { const quorumEntrySize = bufferReader.readVarintNum(); const entry = bufferReader.read(quorumEntrySize); - data.newQuorums.push(QuorumEntry.fromBuffer(entry)); + data.newQuorums.push(QuorumEntry.fromBuffer(entry, llmqOverride)); } data.merkleRootMNList = data.cbTx.extraPayload.merkleRootMNList; if (data.cbTx.extraPayload.version >= 2) { data.merkleRootQuorums = data.cbTx.extraPayload.merkleRootQuorums; } - return this.fromObject(data, network); + return this.fromObject(data, network, llmqOverride); }; /** * @param {string} hexString * @param {string} [network] + * @param {Object} [llmqOverride] * @return {SimplifiedMNListDiff} */ SimplifiedMNListDiff.fromHexString = function fromHexString( hexString, - network + network, + llmqOverride = {} ) { return SimplifiedMNListDiff.fromBuffer( Buffer.from(hexString, 'hex'), - network + network, + llmqOverride ); }; @@ -196,9 +201,10 @@ SimplifiedMNListDiff.prototype.toBuffer = function toBuffer() { * Creates MNListDiff from object * @param obj * @param {string|Network} [network] + * @param {Object} [llmqOverride] * @return {SimplifiedMNListDiff} */ -SimplifiedMNListDiff.fromObject = function fromObject(obj, network) { +SimplifiedMNListDiff.fromObject = function fromObject(obj, network, llmqOverride = {}) { const simplifiedMNListDiff = new SimplifiedMNListDiff(); const validNetwork = Networks.get(network); @@ -223,7 +229,7 @@ SimplifiedMNListDiff.fromObject = function fromObject(obj, network) { ); simplifiedMNListDiff.deletedQuorums = obj.deletedQuorums.slice(); simplifiedMNListDiff.newQuorums = obj.newQuorums.map( - (quorumEntry) => new QuorumEntry(quorumEntry) + (quorumEntry) => new QuorumEntry(quorumEntry, llmqOverride) ); simplifiedMNListDiff.merkleRootMNList = obj.merkleRootMNList; if (obj.merkleRootQuorums) { @@ -252,9 +258,10 @@ SimplifiedMNListDiff.fromObject = function fromObject(obj, network) { * This method constructs the diff from the JSON produced by JSON.sringify. * PLEASE DON'T PASS RESULT OF .toObject() to this method! * @param {Object} diffJSON + * @param {Object} [llmqOverride] * @return {SimplifiedMNListDiff} */ -SimplifiedMNListDiff.fromJSON = function fromJSON(diffJSON) { +SimplifiedMNListDiff.fromJSON = function fromJSON(diffJSON, llmqOverride= {}) { const cbTxMerkleTree = new PartialMerkleTree(); cbTxMerkleTree.totalTransactions = diffJSON.cbTxMerkleTree.totalTransactions; cbTxMerkleTree.merkleHashes = diffJSON.cbTxMerkleTree.merkleHashes; @@ -262,6 +269,7 @@ SimplifiedMNListDiff.fromJSON = function fromJSON(diffJSON) { return SimplifiedMNListDiff.fromObject( { + llmqOverride, ...diffJSON, cbTxMerkleTree, }, diff --git a/lib/transaction/payload/commitmenttxpayload.js b/lib/transaction/payload/commitmenttxpayload.js index b3110457e..fc7cd7da1 100644 --- a/lib/transaction/payload/commitmenttxpayload.js +++ b/lib/transaction/payload/commitmenttxpayload.js @@ -93,6 +93,9 @@ CommitmentTxPayload.fromBuffer = function fromBuffer(rawPayload, llmqOverride = payload.quorumIndex = payloadBufferReader.readInt16LE(); } + console.log('CommitmentTxPayload.fromBuffer') + console.dir(llmqOverride) + const fixedCounterLength = QuorumEntry.getParams(payload.llmqtype, llmqOverride).size; payload.signersSize = payloadBufferReader.readVarintNum(); @@ -240,6 +243,9 @@ CommitmentTxPayload.prototype.toJSON = function toJSON(options) { CommitmentTxPayload.prototype.toBuffer = function toBuffer(options) { this.validate(); + console.log('CommitmentTxPayload.toBuffer') + console.dir({}) + // This will validate quorum type QuorumEntry.getParams(this.llmqtype); From 842027dda7ee61d28c51f7ebd09f24a5ae5d056d Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 11 Apr 2025 22:56:38 +0700 Subject: [PATCH 3/6] chore: remove debug output --- lib/deterministicmnlist/QuorumEntry.js | 2 -- lib/deterministicmnlist/SimplifiedMNList.js | 2 -- lib/transaction/payload/commitmenttxpayload.js | 6 ------ 3 files changed, 10 deletions(-) diff --git a/lib/deterministicmnlist/QuorumEntry.js b/lib/deterministicmnlist/QuorumEntry.js index e43b1f8c7..f9fb0af3e 100644 --- a/lib/deterministicmnlist/QuorumEntry.js +++ b/lib/deterministicmnlist/QuorumEntry.js @@ -355,8 +355,6 @@ QuorumEntry.getParams = function getParams(llmqType, llmqOverride = {}) { * @return {number} */ QuorumEntry.prototype.getParams = function getParams() { - console.log('getParams') - console.dir(this.llmqOverride) return QuorumEntry.getParams(this.llmqType, this.llmqOverride); }; diff --git a/lib/deterministicmnlist/SimplifiedMNList.js b/lib/deterministicmnlist/SimplifiedMNList.js index 4f5c49710..3d974fc25 100644 --- a/lib/deterministicmnlist/SimplifiedMNList.js +++ b/lib/deterministicmnlist/SimplifiedMNList.js @@ -167,8 +167,6 @@ SimplifiedMNList.prototype.addAndMaybeRemoveQuorums = const numberOfQuorumsToAdd = newGroupedQuorums[quorumType] ? newGroupedQuorums[quorumType].length : 0; - console.log('addAndMaybeRemoveQuorums') - console.dir(this.llmqOverride) const maxAllowedQuorumsOfType = QuorumEntry.getParams( Number(quorumType), this.llmqOverride, diff --git a/lib/transaction/payload/commitmenttxpayload.js b/lib/transaction/payload/commitmenttxpayload.js index fc7cd7da1..b3110457e 100644 --- a/lib/transaction/payload/commitmenttxpayload.js +++ b/lib/transaction/payload/commitmenttxpayload.js @@ -93,9 +93,6 @@ CommitmentTxPayload.fromBuffer = function fromBuffer(rawPayload, llmqOverride = payload.quorumIndex = payloadBufferReader.readInt16LE(); } - console.log('CommitmentTxPayload.fromBuffer') - console.dir(llmqOverride) - const fixedCounterLength = QuorumEntry.getParams(payload.llmqtype, llmqOverride).size; payload.signersSize = payloadBufferReader.readVarintNum(); @@ -243,9 +240,6 @@ CommitmentTxPayload.prototype.toJSON = function toJSON(options) { CommitmentTxPayload.prototype.toBuffer = function toBuffer(options) { this.validate(); - console.log('CommitmentTxPayload.toBuffer') - console.dir({}) - // This will validate quorum type QuorumEntry.getParams(this.llmqtype); From be478c813ef28aa74389182964f1aa76cdaa777d Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 11 Apr 2025 23:10:02 +0700 Subject: [PATCH 4/6] fix: recursion in QuorumEntry constructor --- lib/deterministicmnlist/QuorumEntry.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/deterministicmnlist/QuorumEntry.js b/lib/deterministicmnlist/QuorumEntry.js index f9fb0af3e..35e9c4319 100644 --- a/lib/deterministicmnlist/QuorumEntry.js +++ b/lib/deterministicmnlist/QuorumEntry.js @@ -91,7 +91,8 @@ function QuorumEntry(arg, llmqOverride = {}) { */ QuorumEntry.fromBuffer = function fromBuffer(buffer, llmqOverride = {}) { const bufferReader = new BufferReader(buffer); - const SMLQuorumEntry = new QuorumEntry({ }, llmqOverride); + const SMLQuorumEntry = new QuorumEntry(); + SMLQuorumEntry.llmqOverride = llmqOverride; SMLQuorumEntry.isVerified = false; if (buffer.length < 100) { SMLQuorumEntry.isOutdatedRPC = true; @@ -239,7 +240,7 @@ QuorumEntry.prototype.toBufferForHashing = function toBufferForHashing() { * @return {QuorumEntry} */ QuorumEntry.fromObject = function fromObject(obj, llmqOverride = {}) { - const SMLQuorumEntry = new QuorumEntry({}, llmqOverride); + const SMLQuorumEntry = new QuorumEntry(); SMLQuorumEntry.isVerified = false; SMLQuorumEntry.isOutdatedRPC = false; SMLQuorumEntry.version = obj.version; @@ -254,6 +255,9 @@ QuorumEntry.fromObject = function fromObject(obj, llmqOverride = {}) { SMLQuorumEntry.quorumVvecHash = obj.quorumVvecHash; SMLQuorumEntry.quorumSig = obj.quorumSig; SMLQuorumEntry.membersSig = obj.membersSig; + + SMLQuorumEntry.llmqOverride = llmqOverride; + if (SMLQuorumEntry.signers === undefined) { SMLQuorumEntry.isOutdatedRPC = true; } From dd2968e080b84384b5190874d295dca42f33b6e5 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 11 Apr 2025 23:57:43 +0700 Subject: [PATCH 5/6] refactor: rename param --- lib/deterministicmnlist/QuorumEntry.js | 36 +++++++++---------- lib/deterministicmnlist/SimplifiedMNList.js | 18 +++++----- .../SimplifiedMNListDiff.js | 36 +++++++++---------- .../payload/commitmenttxpayload.js | 6 ++-- 4 files changed, 48 insertions(+), 48 deletions(-) diff --git a/lib/deterministicmnlist/QuorumEntry.js b/lib/deterministicmnlist/QuorumEntry.js index 35e9c4319..90fed29a1 100644 --- a/lib/deterministicmnlist/QuorumEntry.js +++ b/lib/deterministicmnlist/QuorumEntry.js @@ -43,7 +43,7 @@ const { * @class QuorumEntry * @param {string|Object|Buffer} [arg] - A Buffer, JSON string, * or Object representing a SMLQuorumEntry - * @param {Object} [llmqOverride] - LLMQ type override + * @param {Object} [llmqParamsOverride] - LLMQ type override * @constructor * @property {number} version * @property {number} llmqType @@ -58,18 +58,18 @@ const { * @property {string} quorumSig * @property {string} membersSig */ -function QuorumEntry(arg, llmqOverride = {}) { +function QuorumEntry(arg, llmqParamsOverride = {}) { if (arg) { if (arg instanceof QuorumEntry) { return arg.copy(); } if (BufferUtil.isBuffer(arg)) { - return QuorumEntry.fromBuffer(arg, llmqOverride); + return QuorumEntry.fromBuffer(arg, llmqParamsOverride); } if (_.isObject(arg)) { - return QuorumEntry.fromObject(arg, llmqOverride); + return QuorumEntry.fromObject(arg, llmqParamsOverride); } if (arg instanceof QuorumEntry) { @@ -77,7 +77,7 @@ function QuorumEntry(arg, llmqOverride = {}) { } if (isHexString(arg)) { - return QuorumEntry.fromHexString(arg, llmqOverride); + return QuorumEntry.fromHexString(arg, llmqParamsOverride); } throw new TypeError('Unrecognized argument for QuorumEntry'); } @@ -86,13 +86,13 @@ function QuorumEntry(arg, llmqOverride = {}) { /** * Parse buffer and returns QuorumEntry * @param {Buffer} buffer - * @param {Object} [llmqOverride] + * @param {Object} [llmqParamsOverride] * @return {QuorumEntry} */ -QuorumEntry.fromBuffer = function fromBuffer(buffer, llmqOverride = {}) { +QuorumEntry.fromBuffer = function fromBuffer(buffer, llmqParamsOverride = {}) { const bufferReader = new BufferReader(buffer); const SMLQuorumEntry = new QuorumEntry(); - SMLQuorumEntry.llmqOverride = llmqOverride; + SMLQuorumEntry.llmqParamsOverride = llmqParamsOverride; SMLQuorumEntry.isVerified = false; if (buffer.length < 100) { SMLQuorumEntry.isOutdatedRPC = true; @@ -162,11 +162,11 @@ QuorumEntry.fromBuffer = function fromBuffer(buffer, llmqOverride = {}) { /** * @param {string} string - * @param {Object} llmqOverride + * @param {Object} llmqParamsOverride * @return {QuorumEntry} */ -QuorumEntry.fromHexString = function fromString(string, llmqOverride = {}) { - return QuorumEntry.fromBuffer(Buffer.from(string, 'hex'), llmqOverride); +QuorumEntry.fromHexString = function fromString(string, llmqParamsOverride = {}) { + return QuorumEntry.fromBuffer(Buffer.from(string, 'hex'), llmqParamsOverride); }; /** @@ -236,10 +236,10 @@ QuorumEntry.prototype.toBufferForHashing = function toBufferForHashing() { /** * Create SMLQuorumEntry from an object * @param {SMLQuorumEntry} obj - * @param {Object} llmqOverride + * @param {Object} llmqParamsOverride * @return {QuorumEntry} */ -QuorumEntry.fromObject = function fromObject(obj, llmqOverride = {}) { +QuorumEntry.fromObject = function fromObject(obj, llmqParamsOverride = {}) { const SMLQuorumEntry = new QuorumEntry(); SMLQuorumEntry.isVerified = false; SMLQuorumEntry.isOutdatedRPC = false; @@ -256,7 +256,7 @@ QuorumEntry.fromObject = function fromObject(obj, llmqOverride = {}) { SMLQuorumEntry.quorumSig = obj.quorumSig; SMLQuorumEntry.membersSig = obj.membersSig; - SMLQuorumEntry.llmqOverride = llmqOverride; + SMLQuorumEntry.llmqParamsOverride = llmqParamsOverride; if (SMLQuorumEntry.signers === undefined) { SMLQuorumEntry.isOutdatedRPC = true; @@ -342,10 +342,10 @@ QuorumEntry.prototype.toObject = function toObject() { return result; }; -QuorumEntry.getParams = function getParams(llmqType, llmqOverride = {}) { +QuorumEntry.getParams = function getParams(llmqType, llmqParamsOverride = {}) { let llmqParams = constants.LLMQ_TYPE_PARAMS; - if (Object.keys(llmqOverride).length > 0) { - llmqParams = _.merge({}, constants.LLMQ_TYPE_PARAMS, llmqOverride); + if (Object.keys(llmqParamsOverride).length > 0) { + llmqParams = _.merge({}, constants.LLMQ_TYPE_PARAMS, llmqParamsOverride); } if (!llmqParams[llmqType]) { @@ -359,7 +359,7 @@ QuorumEntry.getParams = function getParams(llmqType, llmqOverride = {}) { * @return {number} */ QuorumEntry.prototype.getParams = function getParams() { - return QuorumEntry.getParams(this.llmqType, this.llmqOverride); + return QuorumEntry.getParams(this.llmqType, this.llmqParamsOverride); }; /** diff --git a/lib/deterministicmnlist/SimplifiedMNList.js b/lib/deterministicmnlist/SimplifiedMNList.js index 3d974fc25..c13a1d466 100644 --- a/lib/deterministicmnlist/SimplifiedMNList.js +++ b/lib/deterministicmnlist/SimplifiedMNList.js @@ -13,10 +13,10 @@ const { MASTERNODE_TYPE_HP } = require("../constants"); /** * @param {SimplifiedMNListDiff} simplifiedMNListDiff - * @param {Object} llmqOverride + * @param {Object} llmqParamsOverride * @constructor */ -function SimplifiedMNList(simplifiedMNListDiff = null, llmqOverride = {}) { +function SimplifiedMNList(simplifiedMNListDiff = null, llmqParamsOverride = {}) { this.baseBlockHash = constants.NULL_HASH; this.blockHash = constants.NULL_HASH; /** @@ -43,7 +43,7 @@ function SimplifiedMNList(simplifiedMNListDiff = null, llmqOverride = {}) { this.quorumsActive = false; this.cbTx = null; this.cbTxMerkleTree = null; - this.llmqOverride = llmqOverride; + this.llmqParamsOverride = llmqParamsOverride; if (simplifiedMNListDiff) { this.applyDiff(simplifiedMNListDiff); } @@ -58,7 +58,7 @@ SimplifiedMNList.prototype.applyDiff = function applyDiff( simplifiedMNListDiff ) { // This will copy an instance of SimplifiedMNListDiff or create a new instance - const diff = new SimplifiedMNListDiff(simplifiedMNListDiff, this.network, this.llmqOverride); + const diff = new SimplifiedMNListDiff(simplifiedMNListDiff, this.network, this.llmqParamsOverride); // only when we apply the first diff we set the network if (!this.network) { @@ -169,7 +169,7 @@ SimplifiedMNList.prototype.addAndMaybeRemoveQuorums = : 0; const maxAllowedQuorumsOfType = QuorumEntry.getParams( Number(quorumType), - this.llmqOverride, + this.llmqParamsOverride, ).maximumActiveQuorumsCount; if ( @@ -574,16 +574,16 @@ SimplifiedMNList.prototype.toSimplifiedMNListDiff = nVersion: this.nVersion, }, network, - this.llmqOverride, + this.llmqParamsOverride, ); }; /** * Recreates SML from json * @param {Object} smlJson - * @param {Object} llmqOverride + * @param {Object} llmqParamsOverride */ -SimplifiedMNList.fromJSON = function fromJSON(smlJson, llmqOverride = {}) { +SimplifiedMNList.fromJSON = function fromJSON(smlJson, llmqParamsOverride = {}) { const sml = new SimplifiedMNList(); sml.baseBlockHash = smlJson.baseBlockHash; sml.blockHash = smlJson.blockHash; @@ -601,7 +601,7 @@ SimplifiedMNList.fromJSON = function fromJSON(smlJson, llmqOverride = {}) { (mnRecord) => new SimplifiedMNListEntry(mnRecord) ); sml.quorumList = smlJson.quorumList.map( - (quorumEntry) => new QuorumEntry(quorumEntry, llmqOverride), + (quorumEntry) => new QuorumEntry(quorumEntry, llmqParamsOverride), ); sml.validMNs = smlJson.validMNs.map( (mnRecord) => new SimplifiedMNListEntry(mnRecord) diff --git a/lib/deterministicmnlist/SimplifiedMNListDiff.js b/lib/deterministicmnlist/SimplifiedMNListDiff.js index d96c6410c..7f8e46f9c 100644 --- a/lib/deterministicmnlist/SimplifiedMNListDiff.js +++ b/lib/deterministicmnlist/SimplifiedMNListDiff.js @@ -14,7 +14,7 @@ const Networks = require('../networks'); /** * @param {Buffer|Object|string} [arg] - A Buffer, JSON string, or Object representing a MnListDiff * @param {string} [network] - * @param {Object} [llmqOverride] + * @param {Object} [llmqParamsOverride] * @class SimplifiedMNListDiff * @property {string} baseBlockHash - sha256 * @property {string} blockHash - sha256 @@ -28,7 +28,7 @@ const Networks = require('../networks'); * @property {string} merkleRootMNList - merkle root of the whole mn list * @property {string} merkleRootQuorums - merkle root of the quorum list */ -function SimplifiedMNListDiff(arg, network, llmqOverride = {}) { +function SimplifiedMNListDiff(arg, network, llmqParamsOverride = {}) { if (arg) { const validNetwork = Networks.get(network); @@ -36,13 +36,13 @@ function SimplifiedMNListDiff(arg, network, llmqOverride = {}) { return arg.copy(); } if (BufferUtil.isBuffer(arg)) { - return SimplifiedMNListDiff.fromBuffer(arg, validNetwork, llmqOverride); + return SimplifiedMNListDiff.fromBuffer(arg, validNetwork, llmqParamsOverride); } if (_.isObject(arg)) { - return SimplifiedMNListDiff.fromObject(arg, validNetwork, llmqOverride); + return SimplifiedMNListDiff.fromObject(arg, validNetwork, llmqParamsOverride); } if (isHexString(arg)) { - return SimplifiedMNListDiff.fromHexString(arg, validNetwork, llmqOverride); + return SimplifiedMNListDiff.fromHexString(arg, validNetwork, llmqParamsOverride); } throw new TypeError( 'Unrecognized argument passed to SimplifiedMNListDiff constructor' @@ -54,10 +54,10 @@ function SimplifiedMNListDiff(arg, network, llmqOverride = {}) { * Creates MnListDiff from a Buffer. * @param {Buffer} buffer * @param {string} [network] - * @param {Object} [llmqOverride] + * @param {Object} [llmqParamsOverride] * @return {SimplifiedMNListDiff} */ -SimplifiedMNListDiff.fromBuffer = function fromBuffer(buffer, network, llmqOverride = {}) { +SimplifiedMNListDiff.fromBuffer = function fromBuffer(buffer, network, llmqParamsOverride = {}) { const bufferReader = new BufferReader(Buffer.from(buffer)); const data = {}; @@ -129,31 +129,31 @@ SimplifiedMNListDiff.fromBuffer = function fromBuffer(buffer, network, llmqOverr const quorumEntrySize = bufferReader.readVarintNum(); const entry = bufferReader.read(quorumEntrySize); - data.newQuorums.push(QuorumEntry.fromBuffer(entry, llmqOverride)); + data.newQuorums.push(QuorumEntry.fromBuffer(entry, llmqParamsOverride)); } data.merkleRootMNList = data.cbTx.extraPayload.merkleRootMNList; if (data.cbTx.extraPayload.version >= 2) { data.merkleRootQuorums = data.cbTx.extraPayload.merkleRootQuorums; } - return this.fromObject(data, network, llmqOverride); + return this.fromObject(data, network, llmqParamsOverride); }; /** * @param {string} hexString * @param {string} [network] - * @param {Object} [llmqOverride] + * @param {Object} [llmqParamsOverride] * @return {SimplifiedMNListDiff} */ SimplifiedMNListDiff.fromHexString = function fromHexString( hexString, network, - llmqOverride = {} + llmqParamsOverride = {} ) { return SimplifiedMNListDiff.fromBuffer( Buffer.from(hexString, 'hex'), network, - llmqOverride + llmqParamsOverride ); }; @@ -201,10 +201,10 @@ SimplifiedMNListDiff.prototype.toBuffer = function toBuffer() { * Creates MNListDiff from object * @param obj * @param {string|Network} [network] - * @param {Object} [llmqOverride] + * @param {Object} [llmqParamsOverride] * @return {SimplifiedMNListDiff} */ -SimplifiedMNListDiff.fromObject = function fromObject(obj, network, llmqOverride = {}) { +SimplifiedMNListDiff.fromObject = function fromObject(obj, network, llmqParamsOverride = {}) { const simplifiedMNListDiff = new SimplifiedMNListDiff(); const validNetwork = Networks.get(network); @@ -229,7 +229,7 @@ SimplifiedMNListDiff.fromObject = function fromObject(obj, network, llmqOverride ); simplifiedMNListDiff.deletedQuorums = obj.deletedQuorums.slice(); simplifiedMNListDiff.newQuorums = obj.newQuorums.map( - (quorumEntry) => new QuorumEntry(quorumEntry, llmqOverride) + (quorumEntry) => new QuorumEntry(quorumEntry, llmqParamsOverride) ); simplifiedMNListDiff.merkleRootMNList = obj.merkleRootMNList; if (obj.merkleRootQuorums) { @@ -258,10 +258,10 @@ SimplifiedMNListDiff.fromObject = function fromObject(obj, network, llmqOverride * This method constructs the diff from the JSON produced by JSON.sringify. * PLEASE DON'T PASS RESULT OF .toObject() to this method! * @param {Object} diffJSON - * @param {Object} [llmqOverride] + * @param {Object} [llmqParamsOverride] * @return {SimplifiedMNListDiff} */ -SimplifiedMNListDiff.fromJSON = function fromJSON(diffJSON, llmqOverride= {}) { +SimplifiedMNListDiff.fromJSON = function fromJSON(diffJSON, llmqParamsOverride= {}) { const cbTxMerkleTree = new PartialMerkleTree(); cbTxMerkleTree.totalTransactions = diffJSON.cbTxMerkleTree.totalTransactions; cbTxMerkleTree.merkleHashes = diffJSON.cbTxMerkleTree.merkleHashes; @@ -269,7 +269,7 @@ SimplifiedMNListDiff.fromJSON = function fromJSON(diffJSON, llmqOverride= {}) { return SimplifiedMNListDiff.fromObject( { - llmqOverride, + llmqParamsOverride, ...diffJSON, cbTxMerkleTree, }, diff --git a/lib/transaction/payload/commitmenttxpayload.js b/lib/transaction/payload/commitmenttxpayload.js index b3110457e..1e174b4f4 100644 --- a/lib/transaction/payload/commitmenttxpayload.js +++ b/lib/transaction/payload/commitmenttxpayload.js @@ -75,10 +75,10 @@ CommitmentTxPayload.prototype.constructor = AbstractPayload; /** * Parse raw payload * @param {Buffer} rawPayload - * @param {Object} llmqOverride + * @param {Object} llmqParamsOverride * @return {CommitmentTxPayload} */ -CommitmentTxPayload.fromBuffer = function fromBuffer(rawPayload, llmqOverride = {}) { +CommitmentTxPayload.fromBuffer = function fromBuffer(rawPayload, llmqParamsOverride = {}) { var payloadBufferReader = new BufferReader(rawPayload); var payload = new CommitmentTxPayload(); payload.version = payloadBufferReader.readUInt16LE(); @@ -93,7 +93,7 @@ CommitmentTxPayload.fromBuffer = function fromBuffer(rawPayload, llmqOverride = payload.quorumIndex = payloadBufferReader.readInt16LE(); } - const fixedCounterLength = QuorumEntry.getParams(payload.llmqtype, llmqOverride).size; + const fixedCounterLength = QuorumEntry.getParams(payload.llmqtype, llmqParamsOverride).size; payload.signersSize = payloadBufferReader.readVarintNum(); var signersBytesToRead = Math.floor((fixedCounterLength + 7) / 8) || 1; From 647eff93907bb1992042ead22bf1f952f746de8b Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Wed, 16 Apr 2025 21:30:21 +0700 Subject: [PATCH 6/6] style: fix too long line warning --- lib/deterministicmnlist/SimplifiedMNList.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/deterministicmnlist/SimplifiedMNList.js b/lib/deterministicmnlist/SimplifiedMNList.js index c13a1d466..94d519a77 100644 --- a/lib/deterministicmnlist/SimplifiedMNList.js +++ b/lib/deterministicmnlist/SimplifiedMNList.js @@ -58,7 +58,11 @@ SimplifiedMNList.prototype.applyDiff = function applyDiff( simplifiedMNListDiff ) { // This will copy an instance of SimplifiedMNListDiff or create a new instance - const diff = new SimplifiedMNListDiff(simplifiedMNListDiff, this.network, this.llmqParamsOverride); + const diff = new SimplifiedMNListDiff( + simplifiedMNListDiff, + this.network, + this.llmqParamsOverride, + ); // only when we apply the first diff we set the network if (!this.network) {