Skip to content
This repository has been archived by the owner on Jun 11, 2024. It is now read-only.

Commit

Permalink
♻️ Update multisignature protocol-specs
Browse files Browse the repository at this point in the history
- Update multisignature registration transaction creation based on the new schema defined in https://github.com/LiskHQ/lips/blob/main/proposals/lip-0041.md
- Run generate script to update the fixtures
  • Loading branch information
ishantiw committed Aug 16, 2022
1 parent 2aa7c0a commit dfc74fb
Show file tree
Hide file tree
Showing 2 changed files with 154 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
}
},
"output": {
"transaction": "0a040000000c12040000000018012080dea0cb052a200b211fce4b615083701cb8a8c99407e464b2f9aa4f367095322de1b77e5fcfbe328a01080412204a67646a446313db964c39370359845c52fce9225a3929770ef41448c258fd391220f1b9f4ee71b5d5857d3b346d441ca967f27870ebee88569db364fd13e28adba31a2057df5c3811961939f8dcfa858c6eaefebfaa4de942f7e703bf88127e0ee9cca41a20fa406b6952d377f0278920e3eb8da919e4cf5c68b02eeba5d8b3334fdc0369b63a406e766ce4c1cdaeda373f5514297be6bd7bbb89d3040f139a7ec8ea104d157413110c559db53aca8060c9dbb4f606124dbad1af13bc8fd4856bb370b73a081b053a403b028eb8863167552f940aae14706e4e73a895e7744f9a44857d25996e84dfc729de5fb9100e96e3a85e8ad010e81eb38b36369b5f129e13df201f6cb91557013a40a66ecfefd7c43b2ac97c462e02f992eba8188843814331cd4f5d562bca31a83434931442554c6aea55fdd114c69fc1e8713442ccba8d1cd45c03b03a9efc08083a40722be53bb2348ba9443abc30f3bcf1af380c383b5d5219f299159532dd5af2b1ba99664791a97f484cbda37e936a4f66d41edce69a054424026379142d90a10c3a4010118ff010662b0a0713a34474efa82ed951a1904220b5a1c2327732fd1795f77da38c0b12f42493544e75368a7e7d853700bebb053617648567c3d03c74680b"
"transaction": "0a040000000c12040000000018012080dea0cb052a200b211fce4b615083701cb8a8c99407e464b2f9aa4f367095322de1b77e5fcfbe329203080412204a67646a446313db964c39370359845c52fce9225a3929770ef41448c258fd391220f1b9f4ee71b5d5857d3b346d441ca967f27870ebee88569db364fd13e28adba31a2057df5c3811961939f8dcfa858c6eaefebfaa4de942f7e703bf88127e0ee9cca41a20fa406b6952d377f0278920e3eb8da919e4cf5c68b02eeba5d8b3334fdc0369b62240393b2dde69deb894048e827458ce1b47049823b68199f15a816bd046b91b56d3af210f8e7e2311d9fc8a4fa1adb175cd2fc9082b36ef670704fe3e7cc38b1c0a22407d0e06fabdf084b4199235f28dea01425293ab7786b9e5dbe416f7c5a1d1f337fdc36089175e6ea46a8a649200c775b414a32740a59cafbc6c6cafaf2c5df6092240f628934579a8e0bfb5fe231b5f8e461ba70e4e57f62865c85c4d405427da17d8b1cd5cfd736838f93ee682bb641257e635b444cdad10247c534884edd8d8b1032240c3da13778edce8e78f9682e4f1b1bc186eee5dee8ce86e608d08d3c4dd643f7039ca03da8339915e7e4ff4f47156026bf352b6e9a66edb04535121090a66100f3a406e766ce4c1cdaeda373f5514297be6bd7bbb89d3040f139a7ec8ea104d157413110c559db53aca8060c9dbb4f606124dbad1af13bc8fd4856bb370b73a081b05"
}
},
{
Expand Down Expand Up @@ -92,7 +92,7 @@
}
},
"output": {
"transaction": "0a040000000c12040000000018012080dea0cb052a200b211fce4b615083701cb8a8c99407e464b2f9aa4f367095322de1b77e5fcfbe32ac01080412200b211fce4b615083701cb8a8c99407e464b2f9aa4f367095322de1b77e5fcfbe12204a67646a446313db964c39370359845c52fce9225a3929770ef41448c258fd391220f1b9f4ee71b5d5857d3b346d441ca967f27870ebee88569db364fd13e28adba31a2057df5c3811961939f8dcfa858c6eaefebfaa4de942f7e703bf88127e0ee9cca41a20fa406b6952d377f0278920e3eb8da919e4cf5c68b02eeba5d8b3334fdc0369b63a4047857a942f4721dbb74d61c3f0cba226a4f262427f93bd2077ce5f2388d9a08bd98223f57694c65ec359ba12dc2760630a7027e94417ef50107c78ca0b59b2043a4047857a942f4721dbb74d61c3f0cba226a4f262427f93bd2077ce5f2388d9a08bd98223f57694c65ec359ba12dc2760630a7027e94417ef50107c78ca0b59b2043a40ddcbad747fcd5840f4551ff188983d52a0ed4dd147080c9525aed9e5ec180147c30d72dfc5db6871e8a7578d03d82cf2d3da85aeda648021d0fd784773bbd2013a40f56899e51a533dd8ab5263f7b152516b1b260c564a62af8cd5dc050e358566565b866e03e40cd0b14b4ebe0f34bb38a32696ee3408370eba4af166c79bdb31023a40e799a1dc921f073cc96950c268b515efeab61798f7dcc2355cd251b913c090001d18d8c7dd781af8bafc044cad63bd5e65058d852a7460fd1abcaf1fddbe51023a401250be4803832fcb6a46d774cfafb1dd0a6126001caea5ed9dcbe16f6c622ccd4c2ce0b6e8afd70bbffdaa97c764142deff44ed17aea9ae58edaa6324fa6f101"
"transaction": "0a040000000c12040000000018012080dea0cb052a200b211fce4b615083701cb8a8c99407e464b2f9aa4f367095322de1b77e5fcfbe32f603080412200b211fce4b615083701cb8a8c99407e464b2f9aa4f367095322de1b77e5fcfbe12204a67646a446313db964c39370359845c52fce9225a3929770ef41448c258fd391220f1b9f4ee71b5d5857d3b346d441ca967f27870ebee88569db364fd13e28adba31a2057df5c3811961939f8dcfa858c6eaefebfaa4de942f7e703bf88127e0ee9cca41a20fa406b6952d377f0278920e3eb8da919e4cf5c68b02eeba5d8b3334fdc0369b622407c36048821b4f5039f8889ddb4c45045b3749433511e52a4f2aa87fd6c92c50556cf5c9e903ca13a122140428214e480f75c45686b3334855387a79172909e082240833760d651ac8cf4a3be2c8c6e2a2b921d088b260a16299e733a166dbd0253761a7fd9aaad9a2673806ad5a817b4f1e7efe95782f378631b120c33aa274611062240526e6fd9ceb2c007aaaeed8c55b37a0cd4892306f95993a7c00450d4abc58462bf9e78245f725678fb1fa888ed74310a8d7ab77ec9dfc5efd6f0ef60a3832508224089d215620136122bab511409be3e710a64c62985d6aa0043aa7af050ff73ad6511ab248808076828637358067a24d4bb31f95f52d410e3e02ebe436aaf0c4d0d2240f9b7641654ae31bf3d1e0c19d0e9532562d8851a4f6f8901abb24c59ef42b6bc930fafa9851921f16a3eb0bfc7d6264b63678ebd086513dd3f8c5235bdbab1093a4047857a942f4721dbb74d61c3f0cba226a4f262427f93bd2077ce5f2388d9a08bd98223f57694c65ec359ba12dc2760630a7027e94417ef50107c78ca0b59b204"
}
},
{
Expand Down Expand Up @@ -121,7 +121,7 @@
}
},
"output": {
"transaction": "0a040000000c12040000000018012080dea0cb052a200b211fce4b615083701cb8a8c99407e464b2f9aa4f367095322de1b77e5fcfbe324608011a2057df5c3811961939f8dcfa858c6eaefebfaa4de942f7e703bf88127e0ee9cca41a20fa406b6952d377f0278920e3eb8da919e4cf5c68b02eeba5d8b3334fdc0369b63a4002e7b720d8fc98c0bbd87d6109949fae0fb0c7e0d7cf6a8f113553f6ec1aea7a2f60c7ff72601dc571dca17309046db44255b8bf5ead82a4624d54c56c838d093a4079f00e393836cc6764075f90213b219684db53006a09591bcf6ddbd8748e8ce787b7c0dedac97732a109ddbb5f19c7a0982c88c559fff6e853d74154500eda073a40e1f0ed7f3026c5075fd909c96f05a6f35e8a23ece262ec8cc1f83582b17fcf7236095a792648a71a810afdafc9d789919e9c33214be91aaf368ce302dfdc4405"
"transaction": "0a040000000c12040000000018012080dea0cb052a200b211fce4b615083701cb8a8c99407e464b2f9aa4f367095322de1b77e5fcfbe32ca0108011a2057df5c3811961939f8dcfa858c6eaefebfaa4de942f7e703bf88127e0ee9cca41a20fa406b6952d377f0278920e3eb8da919e4cf5c68b02eeba5d8b3334fdc0369b622407360ec64b254f0e8861efacd01ed03642147acd1eefdbdfeaef30e5ad699cf740c34019231a51d0a169d328fe8a413a2340547ff466e18d121afba7114052f01224037502c0f6a14a09d74865106d6d7e7153dcc8e97e8bd2b263d84f5993e07c770772a72e31e3cbd9a51f9875bbee002ec3bdec62e35de1036628b750da179a5023a4002e7b720d8fc98c0bbd87d6109949fae0fb0c7e0d7cf6a8f113553f6ec1aea7a2f60c7ff72601dc571dca17309046db44255b8bf5ead82a4624d54c56c838d09"
}
},
{
Expand Down Expand Up @@ -150,7 +150,7 @@
}
},
"output": {
"transaction": "0a040000000c12040000000018012080dea0cb052a200b211fce4b615083701cb8a8c99407e464b2f9aa4f367095322de1b77e5fcfbe3246080212204a67646a446313db964c39370359845c52fce9225a3929770ef41448c258fd391220f1b9f4ee71b5d5857d3b346d441ca967f27870ebee88569db364fd13e28adba33a40ef06c162f0ef540ad8e91918648646fb571ecdc50590f417df73b632ddbdff982b27492b8b0d2bc73b9f1ff527aab252d4466f991fab7618c4e18199fda91c0e3a40e474417f717fdf41c4c1b2f80279e76a1e3c51f8313d86e0e0bfdfe2d89b2ec8169b5a3b7592f96bb8ae236b180bfd7d9d7e5fe1112fb0103d2bf40926a6a2013a40a42442886ec6fdd366e6afd9eef853d651068cd4a382a344ed09d99bd8c4d3a5e433fffb10f0f9491fb988e88efa7b9e7226af0949ae63e4aceb1f45c9141e0b"
"transaction": "0a040000000c12040000000018012080dea0cb052a200b211fce4b615083701cb8a8c99407e464b2f9aa4f367095322de1b77e5fcfbe32ca01080212204a67646a446313db964c39370359845c52fce9225a3929770ef41448c258fd391220f1b9f4ee71b5d5857d3b346d441ca967f27870ebee88569db364fd13e28adba32240a1beee22d3c707d56cf41510124a71e869cde2bb63f0fc652d3c0afbf6d62e69e1f35a8626991481cb552b9f7a8b01acaeb91e0cee47ae456f733a7813c6320b2240936a70f12433d0e35ed733b2842dd6d9dd4ffbb02f644389374898bb5e8edd68da6cfaef89117671baa7bea38720855ec8146ebd077cff5cd2b79fc727eb2a053a40ef06c162f0ef540ad8e91918648646fb571ecdc50590f417df73b632ddbdff982b27492b8b0d2bc73b9f1ff527aab252d4466f991fab7618c4e18199fda91c0e"
}
},
{
Expand Down Expand Up @@ -179,7 +179,7 @@
}
},
"output": {
"transaction": "0a040000000c12040000000018012080dea0cb052a200b211fce4b615083701cb8a8c99407e464b2f9aa4f367095322de1b77e5fcfbe3246080212200b211fce4b615083701cb8a8c99407e464b2f9aa4f367095322de1b77e5fcfbe1220ff30ef40b7de42114137be46f1009d30e5c19809a73d5a162bc99f7e7681d63d3a404acb7986eeba3bbc25046561954e54700e2cb99618d37fa997cbb82c0df20fda228294b2ab12b0981b780f63c50d1932a8ebb0944b27350b548acfb97c19bc033a404acb7986eeba3bbc25046561954e54700e2cb99618d37fa997cbb82c0df20fda228294b2ab12b0981b780f63c50d1932a8ebb0944b27350b548acfb97c19bc033a4012cd713fb6a61173cf4c90548f317d68f9b83fa20f7ad1c365b81605909592a310cc3d1beb4ab299c23d4d9113863244b47cd0980428222503a47e791619fa0f"
"transaction": "0a040000000c12040000000018012080dea0cb052a200b211fce4b615083701cb8a8c99407e464b2f9aa4f367095322de1b77e5fcfbe32ca01080212200b211fce4b615083701cb8a8c99407e464b2f9aa4f367095322de1b77e5fcfbe1220ff30ef40b7de42114137be46f1009d30e5c19809a73d5a162bc99f7e7681d63d2240eb397bf11d1f59e671a1d3e7d405c858871f9fcd169d11365d681bdb4f4db612c5e5968fe2a35984bf855cbf8ceb791f3db44584837644fbe4078a240e9ea3032240e8cbff1007123c889054d4e049c24f33defbe066972759a8a685a8805df8b3baef1261f42b24c68f6ed05b40f5bfc4bfdd289b73cfed463da4ea17a8a6642b0f3a404acb7986eeba3bbc25046561954e54700e2cb99618d37fa997cbb82c0df20fda228294b2ab12b0981b780f63c50d1932a8ebb0944b27350b548acfb97c19bc03"
}
}
]
Expand Down
175 changes: 149 additions & 26 deletions protocol-specs/generators/multisignature_registration/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,60 @@

'use strict';

const { utils, ed } = require('@liskhq/lisk-cryptography');
const { utils, ed, address } = require('@liskhq/lisk-cryptography');
const { Codec } = require('@liskhq/lisk-codec');
const BaseGenerator = require('../base_generator');
const { baseTransactionSchema } = require('../../utils/schema');

const codec = new Codec();

const TAG_TRANSACTION = Buffer.from('LSK_TX_', 'utf8');
const MESSAGE_TAG_MULTISIG_REG = 'LSK_RMSG_';
const networkIdentifier = Buffer.from(
'e48feb88db5b5cf5ad71d93cdcd1d879b6d5ed187a36b0002cc34e0ef9883255',
'hex',
);

const multisigRegMsgSchema = {
$id: '/auth/command/regMultisigMsg',
type: 'object',
required: ['address', 'nonce', 'numberOfSignatures', 'mandatoryKeys', 'optionalKeys'],
properties: {
address: {
dataType: 'bytes',
fieldNumber: 1,
minLength: 20,
maxLength: 20,
},
nonce: {
dataType: 'uint64',
fieldNumber: 2,
},
numberOfSignatures: {
dataType: 'uint32',
fieldNumber: 3,
},
mandatoryKeys: {
type: 'array',
items: {
dataType: 'bytes',
minLength: 32,
maxLength: 32,
},
fieldNumber: 4,
},
optionalKeys: {
type: 'array',
items: {
dataType: 'bytes',
minLength: 32,
maxLength: 32,
},
fieldNumber: 5,
},
},
};

const accounts = {
targetAccount: {
passphrase: 'inherit moon normal relief spring bargain hobby join baby flash fog blood',
Expand Down Expand Up @@ -97,8 +138,8 @@ const outputHexAccount = account => ({
address: account.address,
});

const multisigRegAsset = {
$id: '/multisignature/registrationAsset',
const multisigRegParams = {
$id: '/multisignature/registrationParams',
type: 'object',
properties: {
numberOfSignatures: { dataType: 'uint32', fieldNumber: 1 },
Expand All @@ -112,27 +153,32 @@ const multisigRegAsset = {
items: { dataType: 'bytes' },
fieldNumber: 3,
},
signatures: {
type: 'array',
items: { dataType: 'bytes' },
fieldNumber: 4,
},
},
required: ['numberOfSignatures', 'mandatoryKeys', 'optionalKeys'],
required: ['numberOfSignatures', 'mandatoryKeys', 'optionalKeys', 'signatures'],
};

const getAssetBytes = asset => codec.encode(multisigRegAsset, asset);
const getParamsBytes = params => codec.encode(multisigRegParams, params);

const getSignBytes = tx => {
const assetBytes = getAssetBytes(tx.params);
const paramsBytes = getParamsBytes(tx.params);
const signingTx = {
...tx,
params: assetBytes,
params: paramsBytes,
signatures: [],
};
return codec.encode(baseTransactionSchema, signingTx);
};

const encode = tx => {
const assetBytes = getAssetBytes(tx.params);
const paramsBytes = getParamsBytes(tx.params);
const txWithAssetBytes = {
...tx,
params: assetBytes,
params: paramsBytes,
};
return codec.encode(baseTransactionSchema, txWithAssetBytes);
};
Expand All @@ -147,6 +193,13 @@ const createSignatureObject = (txBuffer, account) => ({
),
});

const createSignatureForMultisignature = (messageBytes, account) => ({
signature: Buffer.from(
ed.signData(MESSAGE_TAG_MULTISIG_REG, networkIdentifier, messageBytes, account.passphrase),
'hex',
),
});

const generateValidMultisignatureRegistrationTransaction = () => {
// basic transaction
const unsignedTransaction = {
Expand All @@ -168,6 +221,7 @@ const generateValidMultisignatureRegistrationTransaction = () => {
Buffer.from('fa406b6952d377f0278920e3eb8da919e4cf5c68b02eeba5d8b3334fdc0369b6', 'hex'),
],
numberOfSignatures: 4,
signatures: [],
},
};

Expand All @@ -185,10 +239,25 @@ const generateValidMultisignatureRegistrationTransaction = () => {
// Sender signs
tx.signatures.push(createSignatureObject(txBuffer, accounts.targetAccount).signature);
// Members sign in order
tx.signatures.push(createSignatureObject(txBuffer, accounts.mandatoryTwo).signature);
tx.signatures.push(createSignatureObject(txBuffer, accounts.mandatoryOne).signature);
tx.signatures.push(createSignatureObject(txBuffer, accounts.optionalOne).signature);
tx.signatures.push(createSignatureObject(txBuffer, accounts.optionalTwo).signature);
const messageBytes = codec.encode(multisigRegMsgSchema, {
address: address.getAddressFromPublicKey(tx.senderPublicKey),
nonce: tx.nonce,
numberOfSignatures: tx.params.numberOfSignatures,
mandatoryKeys: tx.params.mandatoryKeys,
optionalKeys: tx.params.optionalKeys,
});
tx.params.signatures.push(
createSignatureForMultisignature(messageBytes, accounts.mandatoryTwo).signature,
);
tx.params.signatures.push(
createSignatureForMultisignature(messageBytes, accounts.mandatoryOne).signature,
);
tx.params.signatures.push(
createSignatureForMultisignature(messageBytes, accounts.optionalOne).signature,
);
tx.params.signatures.push(
createSignatureForMultisignature(messageBytes, accounts.optionalTwo).signature,
);

const encodedTx = encode(tx);

Expand Down Expand Up @@ -232,6 +301,7 @@ const generateValidMultisignatureRegistrationSenderIsMemberTransaction = () => {
Buffer.from('fa406b6952d377f0278920e3eb8da919e4cf5c68b02eeba5d8b3334fdc0369b6', 'hex'),
],
numberOfSignatures: 4,
signatures: [],
},
signatures: [],
};
Expand All @@ -247,17 +317,34 @@ const generateValidMultisignatureRegistrationSenderIsMemberTransaction = () => {

const txBuffer = getSignBytes(tx);

// Sender signs
tx.signatures.push(createSignatureObject(txBuffer, accounts.targetAccount).signature);
const messageBytes = codec.encode(multisigRegMsgSchema, {
address: address.getAddressFromPublicKey(tx.senderPublicKey),
nonce: tx.nonce,
numberOfSignatures: tx.params.numberOfSignatures,
mandatoryKeys: tx.params.mandatoryKeys,
optionalKeys: tx.params.optionalKeys,
});
// Members sign in order
tx.signatures.push(createSignatureObject(txBuffer, accounts.targetAccount).signature);
tx.params.signatures.push(
createSignatureForMultisignature(messageBytes, accounts.targetAccount).signature,
);
// In the case where the Sender is part of mandatory its signature should be included too;
// in this case given the lexicographical order it happens to be first but could be in different order
tx.signatures.push(createSignatureObject(txBuffer, accounts.mandatoryTwo).signature);
tx.signatures.push(createSignatureObject(txBuffer, accounts.mandatoryOne).signature);
tx.signatures.push(createSignatureObject(txBuffer, accounts.optionalOne).signature);
tx.signatures.push(createSignatureObject(txBuffer, accounts.optionalTwo).signature);
tx.params.signatures.push(
createSignatureForMultisignature(messageBytes, accounts.mandatoryTwo).signature,
);
tx.params.signatures.push(
createSignatureForMultisignature(messageBytes, accounts.mandatoryOne).signature,
);
tx.params.signatures.push(
createSignatureForMultisignature(messageBytes, accounts.optionalOne).signature,
);
tx.params.signatures.push(
createSignatureForMultisignature(messageBytes, accounts.optionalTwo).signature,
);

// Sender signs
tx.signatures.push(createSignatureObject(txBuffer, accounts.targetAccount).signature);
const encodedTx = encode(tx);

return {
Expand Down Expand Up @@ -297,6 +384,7 @@ const generateValidMultisignatureRegistrationOnlyOptionalMembersTransaction = ()
Buffer.from('fa406b6952d377f0278920e3eb8da919e4cf5c68b02eeba5d8b3334fdc0369b6', 'hex'),
],
numberOfSignatures: 1,
signatures: [],
},
signatures: [],
};
Expand All @@ -314,9 +402,20 @@ const generateValidMultisignatureRegistrationOnlyOptionalMembersTransaction = ()

// Sender signs
tx.signatures.push(createSignatureObject(txBuffer, accounts.targetAccount).signature);
const messageBytes = codec.encode(multisigRegMsgSchema, {
address: address.getAddressFromPublicKey(tx.senderPublicKey),
nonce: tx.nonce,
numberOfSignatures: tx.params.numberOfSignatures,
mandatoryKeys: tx.params.mandatoryKeys,
optionalKeys: tx.params.optionalKeys,
});
// Members sign in order
tx.signatures.push(createSignatureObject(txBuffer, accounts.optionalOne).signature);
tx.signatures.push(createSignatureObject(txBuffer, accounts.optionalTwo).signature);
tx.params.signatures.push(
createSignatureForMultisignature(messageBytes, accounts.optionalOne).signature,
);
tx.params.signatures.push(
createSignatureForMultisignature(messageBytes, accounts.optionalTwo).signature,
);

const encodedTx = encode(tx);

Expand Down Expand Up @@ -354,6 +453,7 @@ const generateValidMultisignatureRegistrationOnlyMandatoryMembersTransaction = (
],
optionalKeys: [],
numberOfSignatures: 2,
signatures: [],
},
signatures: [],
};
Expand All @@ -371,9 +471,20 @@ const generateValidMultisignatureRegistrationOnlyMandatoryMembersTransaction = (

// Sender signs
tx.signatures.push(createSignatureObject(txBuffer, accounts.targetAccount).signature);
const messageBytes = codec.encode(multisigRegMsgSchema, {
address: address.getAddressFromPublicKey(tx.senderPublicKey),
nonce: tx.nonce,
numberOfSignatures: tx.params.numberOfSignatures,
mandatoryKeys: tx.params.mandatoryKeys,
optionalKeys: tx.params.optionalKeys,
});
// Members sign in order
tx.signatures.push(createSignatureObject(txBuffer, accounts.mandatoryTwo).signature);
tx.signatures.push(createSignatureObject(txBuffer, accounts.mandatoryOne).signature);
tx.params.signatures.push(
createSignatureForMultisignature(messageBytes, accounts.mandatoryTwo).signature,
);
tx.params.signatures.push(
createSignatureForMultisignature(messageBytes, accounts.mandatoryOne).signature,
);

const encodedTx = encode(tx);

Expand Down Expand Up @@ -425,6 +536,7 @@ const generateFormerSecondSignatureTransactioon = () => {
],
optionalKeys: [],
numberOfSignatures: 2,
signatures: [],
},
signatures: [],
};
Expand All @@ -442,9 +554,20 @@ const generateFormerSecondSignatureTransactioon = () => {

// Sender signs
tx.signatures.push(createSignatureObject(txBuffer, accounts.targetAccount).signature);
const messageBytes = codec.encode(multisigRegMsgSchema, {
address: address.getAddressFromPublicKey(tx.senderPublicKey),
nonce: tx.nonce,
numberOfSignatures: tx.params.numberOfSignatures,
mandatoryKeys: tx.params.mandatoryKeys,
optionalKeys: tx.params.optionalKeys,
});
// Members sign in order
tx.signatures.push(createSignatureObject(txBuffer, accounts.targetAccount).signature);
tx.signatures.push(createSignatureObject(txBuffer, secondSignature).signature);
tx.params.signatures.push(
createSignatureForMultisignature(messageBytes, accounts.targetAccount).signature,
);
tx.params.signatures.push(
createSignatureForMultisignature(messageBytes, secondSignature).signature,
);

const encodedTx = encode(tx);

Expand Down

0 comments on commit dfc74fb

Please sign in to comment.