Skip to content

Commit de632e9

Browse files
committed
[sdk] fix: for aggregate transaction include payload size in the hash
1 parent 1162c1c commit de632e9

File tree

6 files changed

+17
-17
lines changed

6 files changed

+17
-17
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ The Symbol SDK for TypeScript / JavaScript allows you to develop web, mobile, an
1111

1212
## Important Notes
1313

14-
### _Catapult-Server_ Network Compatibility (catapult-server@1.0.3.5)
14+
### _Catapult-Server_ Network Compatibility (catapult-server@1.0.3.9)
1515

16-
Symbol network launched [catapult-client](https://github.com/symbol/symbol/releases), **it is recommended to use this package's 2.0.3 version and upwards for the Symbol public network**.
16+
Symbol network launched [catapult-client](https://github.com/symbol/symbol/releases), **it is recommended to use this package's 2.0.6 version and upwards for the Symbol public network**.
1717

1818
Find the complete release notes [here](CHANGELOG.md).
1919

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/model/transaction/Transaction.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,9 +156,9 @@ export abstract class Transaction {
156156
const transactionBodyIdx: number = generationHashIdx + generationHash.length;
157157
let transactionBody: Uint8Array = transactionBytes.slice(Transaction.Header_Size);
158158

159-
// in case of aggregate transactions, we hash only the merkle transaction hash.
159+
// in case of aggregate transactions, we hash only the merkle transaction hash plus the payload size.
160160
if (isAggregateTransaction) {
161-
transactionBody = transactionBytes.slice(Transaction.Header_Size, Transaction.Body_Index + 32);
161+
transactionBody = transactionBytes.slice(Transaction.Header_Size, Transaction.Body_Index + 32 + 4);
162162
}
163163

164164
// 5) concatenate binary hash parts
@@ -268,7 +268,7 @@ export abstract class Transaction {
268268
public getSigningBytes(payloadBytes: number[], generationHashBytes: number[]): number[] {
269269
const byteBufferWithoutHeader = payloadBytes.slice(4 + 64 + 32 + 8);
270270
if (this.type === TransactionType.AGGREGATE_BONDED || this.type === TransactionType.AGGREGATE_COMPLETE) {
271-
return generationHashBytes.concat(byteBufferWithoutHeader.slice(0, 52));
271+
return generationHashBytes.concat(byteBufferWithoutHeader.slice(0, 52 + 4)); // include the payload size of 4
272272
} else {
273273
return generationHashBytes.concat(byteBufferWithoutHeader);
274274
}

src/model/transaction/TransactionVersion.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,12 @@ export class TransactionVersion {
6565
* Aggregate complete transaction version.
6666
* @type {number}
6767
*/
68-
public static readonly AGGREGATE_COMPLETE = 2;
68+
public static readonly AGGREGATE_COMPLETE = 3;
6969

7070
/**
7171
* Aggregate bonded transaction version
7272
*/
73-
public static readonly AGGREGATE_BONDED = 2;
73+
public static readonly AGGREGATE_BONDED = 3;
7474

7575
/**
7676
* Lock transaction version

test/core/utils/TransactionMapping.spec.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -599,7 +599,7 @@ describe('TransactionMapping - createFromPayload', () => {
599599
expect(transaction.innerTransactions.length).to.be.equal(14);
600600

601601
const expectedHex =
602-
'F005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000298414100000000000000002B02000000000000752F1FD8FC07A3113A690D8D55EEC84C8E6C6B60E790F54C20828442E39EA46F48050000000000005D000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F00000000019854419826D27E1D0A26CA4E316F901E23E55C8711DB20DFD267760D0000000000000000746573742D6D65737361676500000051000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F0000000001984C412E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F010000000000000051000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F00000000019843422E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F010000000000000051000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F0000000001984C422E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F010000000000000059000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F0000000001984341C614558647D02037384A2FECA80ACE95B235D9B9D90035FA46102FE79ECCBA750100000003000000010000000000000055000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F0000000001984E41E803000000000000CFCBE72D994BE69B0013726F6F742D746573742D6E616D6573706163650000005A000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F0000000001985141010000000000000000000000000000005C1100000000000000000000000000000000000000000000000600000000000068000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F00000000019851426EC265194C0501D45C11000000000000000000000000000000000000000000009826D27E1D0A26CA4E316F901E23E55C8711DB20DFD2677666000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F00000000019844429826D27E1D0A26CA4E316F901E23E55C8711DB20DFD26776E8030000000000004CCCD78612DDF5CA01000A0000000000000000000000000066000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F00000000019844439826D27E1D0A26CA4E316F901E23E55C8711DB20DFD26776E8030000000000004CCCD78612DDF5CA01000A000000000000000000000000005E000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F00000000019844419826D27E1D0A26CA4E316F901E23E55C8711DB20DFD26776E80300000000000001000A0000000000000000000000000041000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F0000000001984E434CCCD78612DDF5CA4CCCD78612DDF5CA01000000000000008B000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F00000000019852429826D27E1D0A26CA4E316F901E23E55C8711DB20DFD267769B3155B37159DA50AA52D5967C509B410F5A36A3B1E31ECB5AC76675D79B4A5E200000B778A39A3663719DFC5E48C9D78431B1E45C2AF9DF538782BF199C189DABEAC7000000000058000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F0000000001984D439826D27E1D0A26CA4E316F901E23E55C8711DB20DFD26776E529AD1CBE7FC60D0500000000000000';
602+
'F005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000398414100000000000000002B02000000000000752F1FD8FC07A3113A690D8D55EEC84C8E6C6B60E790F54C20828442E39EA46F48050000000000005D000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F00000000019854419826D27E1D0A26CA4E316F901E23E55C8711DB20DFD267760D0000000000000000746573742D6D65737361676500000051000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F0000000001984C412E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F010000000000000051000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F00000000019843422E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F010000000000000051000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F0000000001984C422E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F010000000000000059000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F0000000001984341C614558647D02037384A2FECA80ACE95B235D9B9D90035FA46102FE79ECCBA750100000003000000010000000000000055000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F0000000001984E41E803000000000000CFCBE72D994BE69B0013726F6F742D746573742D6E616D6573706163650000005A000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F0000000001985141010000000000000000000000000000005C1100000000000000000000000000000000000000000000000600000000000068000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F00000000019851426EC265194C0501D45C11000000000000000000000000000000000000000000009826D27E1D0A26CA4E316F901E23E55C8711DB20DFD2677666000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F00000000019844429826D27E1D0A26CA4E316F901E23E55C8711DB20DFD26776E8030000000000004CCCD78612DDF5CA01000A0000000000000000000000000066000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F00000000019844439826D27E1D0A26CA4E316F901E23E55C8711DB20DFD26776E8030000000000004CCCD78612DDF5CA01000A000000000000000000000000005E000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F00000000019844419826D27E1D0A26CA4E316F901E23E55C8711DB20DFD26776E80300000000000001000A0000000000000000000000000041000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F0000000001984E434CCCD78612DDF5CA4CCCD78612DDF5CA01000000000000008B000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F00000000019852429826D27E1D0A26CA4E316F901E23E55C8711DB20DFD267769B3155B37159DA50AA52D5967C509B410F5A36A3B1E31ECB5AC76675D79B4A5E200000B778A39A3663719DFC5E48C9D78431B1E45C2AF9DF538782BF199C189DABEAC7000000000058000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F0000000001984D439826D27E1D0A26CA4E316F901E23E55C8711DB20DFD26776E529AD1CBE7FC60D0500000000000000';
603603
assertSerialization(aggregateTransaction, expectedHex);
604604
});
605605

@@ -627,7 +627,7 @@ describe('TransactionMapping - createFromPayload', () => {
627627
expect(transaction.innerTransactions[0].type).to.be.equal(TransactionType.TRANSFER);
628628

629629
const expectedHex =
630-
'0801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000298414200000000000000002B02000000000000F63955C291246AA32CD64E0A9533730433CC499F7FB856D1122203C955FA5F1E60000000000000005D000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F00000000019854419826D27E1D0A26CA4E316F901E23E55C8711DB20DFD267760D0000000000000000746573742D6D657373616765000000';
630+
'0801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000398414200000000000000002B02000000000000F63955C291246AA32CD64E0A9533730433CC499F7FB856D1122203C955FA5F1E60000000000000005D000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F00000000019854419826D27E1D0A26CA4E316F901E23E55C8711DB20DFD267760D0000000000000000746573742D6D657373616765000000';
631631
assertSerialization(aggregateTransaction, expectedHex);
632632
});
633633

@@ -651,7 +651,7 @@ describe('TransactionMapping - createFromPayload', () => {
651651
expect(transaction.hash).to.be.equal(signedTransaction.hash);
652652

653653
const expectedHex =
654-
'A800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000298414200000000000000002B0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000';
654+
'A800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000398414200000000000000002B0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000';
655655
assertSerialization(aggregateTransaction, expectedHex);
656656
});
657657

@@ -1399,7 +1399,7 @@ describe('TransactionMapping - createFromDTO (Transaction.toJSON() feed)', () =>
13991399
);
14001400

14011401
const expectedHex =
1402-
'0801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000298414100000000000000002B02000000000000F63955C291246AA32CD64E0A9533730433CC499F7FB856D1122203C955FA5F1E60000000000000005D000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F00000000019854419826D27E1D0A26CA4E316F901E23E55C8711DB20DFD267760D0000000000000000746573742D6D657373616765000000';
1402+
'0801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000398414100000000000000002B02000000000000F63955C291246AA32CD64E0A9533730433CC499F7FB856D1122203C955FA5F1E60000000000000005D000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F00000000019854419826D27E1D0A26CA4E316F901E23E55C8711DB20DFD267760D0000000000000000746573742D6D657373616765000000';
14031403
assertSerialization(aggregateTransaction, expectedHex);
14041404

14051405
const transaction = TransactionMapping.createFromDTO(aggregateTransaction.toJSON()) as AggregateTransaction;
@@ -1425,7 +1425,7 @@ describe('TransactionMapping - createFromDTO (Transaction.toJSON() feed)', () =>
14251425
);
14261426

14271427
const expectedHex =
1428-
'0801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000298414200000000000000002B02000000000000F63955C291246AA32CD64E0A9533730433CC499F7FB856D1122203C955FA5F1E60000000000000005D000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F00000000019854419826D27E1D0A26CA4E316F901E23E55C8711DB20DFD267760D0000000000000000746573742D6D657373616765000000';
1428+
'0801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000398414200000000000000002B02000000000000F63955C291246AA32CD64E0A9533730433CC499F7FB856D1122203C955FA5F1E60000000000000005D000000000000002E834140FD66CF87B254A693A2C7862C819217B676D3943267156625E816EC6F00000000019854419826D27E1D0A26CA4E316F901E23E55C8711DB20DFD267760D0000000000000000746573742D6D657373616765000000';
14291429
assertSerialization(aggregateTransaction, expectedHex);
14301430

14311431
const transaction = TransactionMapping.createFromDTO(aggregateTransaction.toJSON()) as AggregateTransaction;
@@ -1446,7 +1446,7 @@ describe('TransactionMapping - createFromDTO (Transaction.toJSON() feed)', () =>
14461446
);
14471447

14481448
const expectedHex =
1449-
'B800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000198484100000000000000002B0200000000000044B262C46CEABB8580969800000000000A00000000000000DF257CD2641F1210C47770818CA7EC94B1653A7266CEF385D01B78946D74E2BC';
1449+
'B800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000198484100000000000000002B0200000000000044B262C46CEABB8580969800000000000A000000000000000A1F654D2DC8B8AC8799AF47F810C5458DFC536E3EAD6630379BFC6A5C673ABD';
14501450
assertSerialization(lockTransaction, expectedHex);
14511451

14521452
const transaction = TransactionMapping.createFromDTO(lockTransaction.toJSON()) as LockFundsTransaction;

test/infrastructure/SerializeTransactionToJSON.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ describe('SerializeTransactionToJSON', () => {
333333
);
334334

335335
const json = validateToFromJson(aggregateTransaction);
336-
expect(json.transaction.version).to.be.equal(2);
336+
expect(json.transaction.version).to.be.equal(3);
337337
expect(json.transaction.type).to.be.equal(TransactionType.AGGREGATE_COMPLETE);
338338
expect(json.transaction.transactions.length).to.be.equal(1);
339339
});
@@ -356,7 +356,7 @@ describe('SerializeTransactionToJSON', () => {
356356
);
357357

358358
const json = validateToFromJson(aggregateTransaction);
359-
expect(json.transaction.version).to.be.equal(2);
359+
expect(json.transaction.version).to.be.equal(3);
360360
expect(json.transaction.type).to.be.equal(TransactionType.AGGREGATE_BONDED);
361361
expect(json.transaction.transactions.length).to.be.equal(1);
362362
});

0 commit comments

Comments
 (0)