Skip to content

Commit e9ed91c

Browse files
authored
Merge pull request #394 from NEMStudios/task/g393_reapply_catbuffer
Applied catbuffer generator on aggregate
2 parents 7867c9f + 70f3ab9 commit e9ed91c

40 files changed

+1389
-186
lines changed

src/infrastructure/catbuffer/AggregateBondedTransactionBuilder.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121

2222
import { AggregateTransactionBodyBuilder } from './AggregateTransactionBodyBuilder';
2323
import { AmountDto } from './AmountDto';
24+
import { CosignatureBuilder } from './CosignatureBuilder';
25+
import { EmbeddedTransactionBuilder } from './EmbeddedTransactionBuilder';
2426
import { EntityTypeDto } from './EntityTypeDto';
2527
import { GeneratorUtils } from './GeneratorUtils';
2628
import { Hash256Dto } from './Hash256Dto';
@@ -50,7 +52,7 @@ export class AggregateBondedTransactionBuilder extends TransactionBuilder {
5052
* @param cosignatures Cosignatures data (fills remaining body space after transactions).
5153
*/
5254
// tslint:disable-next-line: max-line-length
53-
public constructor(signature: SignatureDto, signerPublicKey: KeyDto, version: number, network: NetworkTypeDto, type: EntityTypeDto, fee: AmountDto, deadline: TimestampDto, transactionsHash: Hash256Dto, transactions: Uint8Array, cosignatures: Uint8Array) {
55+
public constructor(signature: SignatureDto, signerPublicKey: KeyDto, version: number, network: NetworkTypeDto, type: EntityTypeDto, fee: AmountDto, deadline: TimestampDto, transactionsHash: Hash256Dto, transactions: EmbeddedTransactionBuilder[], cosignatures: CosignatureBuilder[]) {
5456
super(signature, signerPublicKey, version, network, type, fee, deadline);
5557
this.aggregateTransactionBody = new AggregateTransactionBodyBuilder(transactionsHash, transactions, cosignatures);
5658
}
@@ -94,7 +96,7 @@ export class AggregateBondedTransactionBuilder extends TransactionBuilder {
9496
*
9597
* @return Sub-transaction data (transactions are variable sized and payload size is in bytes).
9698
*/
97-
public getTransactions(): Uint8Array {
99+
public getTransactions(): EmbeddedTransactionBuilder[] {
98100
return this.aggregateTransactionBody.getTransactions();
99101
}
100102

@@ -103,7 +105,7 @@ export class AggregateBondedTransactionBuilder extends TransactionBuilder {
103105
*
104106
* @return Cosignatures data (fills remaining body space after transactions).
105107
*/
106-
public getCosignatures(): Uint8Array {
108+
public getCosignatures(): CosignatureBuilder[] {
107109
return this.aggregateTransactionBody.getCosignatures();
108110
}
109111

src/infrastructure/catbuffer/AggregateCompleteTransactionBuilder.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121

2222
import { AggregateTransactionBodyBuilder } from './AggregateTransactionBodyBuilder';
2323
import { AmountDto } from './AmountDto';
24+
import { CosignatureBuilder } from './CosignatureBuilder';
25+
import { EmbeddedTransactionBuilder } from './EmbeddedTransactionBuilder';
2426
import { EntityTypeDto } from './EntityTypeDto';
2527
import { GeneratorUtils } from './GeneratorUtils';
2628
import { Hash256Dto } from './Hash256Dto';
@@ -50,7 +52,7 @@ export class AggregateCompleteTransactionBuilder extends TransactionBuilder {
5052
* @param cosignatures Cosignatures data (fills remaining body space after transactions).
5153
*/
5254
// tslint:disable-next-line: max-line-length
53-
public constructor(signature: SignatureDto, signerPublicKey: KeyDto, version: number, network: NetworkTypeDto, type: EntityTypeDto, fee: AmountDto, deadline: TimestampDto, transactionsHash: Hash256Dto, transactions: Uint8Array, cosignatures: Uint8Array) {
55+
public constructor(signature: SignatureDto, signerPublicKey: KeyDto, version: number, network: NetworkTypeDto, type: EntityTypeDto, fee: AmountDto, deadline: TimestampDto, transactionsHash: Hash256Dto, transactions: EmbeddedTransactionBuilder[], cosignatures: CosignatureBuilder[]) {
5456
super(signature, signerPublicKey, version, network, type, fee, deadline);
5557
this.aggregateTransactionBody = new AggregateTransactionBodyBuilder(transactionsHash, transactions, cosignatures);
5658
}
@@ -94,7 +96,7 @@ export class AggregateCompleteTransactionBuilder extends TransactionBuilder {
9496
*
9597
* @return Sub-transaction data (transactions are variable sized and payload size is in bytes).
9698
*/
97-
public getTransactions(): Uint8Array {
99+
public getTransactions(): EmbeddedTransactionBuilder[] {
98100
return this.aggregateTransactionBody.getTransactions();
99101
}
100102

@@ -103,7 +105,7 @@ export class AggregateCompleteTransactionBuilder extends TransactionBuilder {
103105
*
104106
* @return Cosignatures data (fills remaining body space after transactions).
105107
*/
106-
public getCosignatures(): Uint8Array {
108+
public getCosignatures(): CosignatureBuilder[] {
107109
return this.aggregateTransactionBody.getCosignatures();
108110
}
109111

src/infrastructure/catbuffer/AggregateTransactionBodyBuilder.ts

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
*** along with Catapult. If not, see <http://www.gnu.org/licenses/>.
2020
**/
2121

22+
import { CosignatureBuilder } from './CosignatureBuilder';
23+
import { EmbeddedTransactionBuilder } from './EmbeddedTransactionBuilder';
24+
import { EmbeddedTransactionHelper } from './EmbeddedTransactionHelper';
2225
import { GeneratorUtils } from './GeneratorUtils';
2326
import { Hash256Dto } from './Hash256Dto';
2427

@@ -29,9 +32,9 @@ export class AggregateTransactionBodyBuilder {
2932
/** Reserved padding to align end of AggregateTransactionHeader on 8-byte boundary. */
3033
aggregateTransactionHeader_Reserved1: number;
3134
/** Sub-transaction data (transactions are variable sized and payload size is in bytes). */
32-
transactions: Uint8Array;
35+
transactions: EmbeddedTransactionBuilder[];
3336
/** Cosignatures data (fills remaining body space after transactions). */
34-
cosignatures: Uint8Array;
37+
cosignatures: CosignatureBuilder[];
3538

3639
/**
3740
* Constructor.
@@ -40,7 +43,8 @@ export class AggregateTransactionBodyBuilder {
4043
* @param transactions Sub-transaction data (transactions are variable sized and payload size is in bytes).
4144
* @param cosignatures Cosignatures data (fills remaining body space after transactions).
4245
*/
43-
public constructor(transactionsHash: Hash256Dto, transactions: Uint8Array, cosignatures: Uint8Array) {
46+
// tslint:disable-next-line: max-line-length
47+
public constructor(transactionsHash: Hash256Dto, transactions: EmbeddedTransactionBuilder[], cosignatures: CosignatureBuilder[]) {
4448
this.transactionsHash = transactionsHash;
4549
this.aggregateTransactionHeader_Reserved1 = 0;
4650
this.transactions = transactions;
@@ -62,9 +66,24 @@ export class AggregateTransactionBodyBuilder {
6266
// tslint:disable-next-line: max-line-length
6367
const aggregateTransactionHeader_Reserved1 = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 4));
6468
byteArray.splice(0, 4);
65-
const transactions = GeneratorUtils.getBytes(Uint8Array.from(byteArray), payloadSize);
66-
byteArray.splice(0, payloadSize);
67-
const cosignatures = Uint8Array.from(byteArray);
69+
let transactionsByteSize = payloadSize;
70+
const transactions: EmbeddedTransactionBuilder[] = [];
71+
while (transactionsByteSize > 0) {
72+
const item = EmbeddedTransactionHelper.loadFromBinary(Uint8Array.from(byteArray));
73+
transactions.push(item);
74+
const itemSize = item.getSize() + GeneratorUtils.getTransactionPaddingSize(item.getSize(), 8);
75+
transactionsByteSize -= itemSize;
76+
byteArray.splice(0, itemSize);
77+
}
78+
let cosignaturesByteSize = byteArray.length;
79+
const cosignatures: CosignatureBuilder[] = [];
80+
while (cosignaturesByteSize > 0) {
81+
const item = CosignatureBuilder.loadFromBinary(Uint8Array.from(byteArray));
82+
cosignatures.push(item);
83+
const itemSize = item.getSize();
84+
cosignaturesByteSize -= itemSize;
85+
byteArray.splice(0, itemSize);
86+
}
6887
return new AggregateTransactionBodyBuilder(transactionsHash, transactions, cosignatures);
6988
}
7089

@@ -91,7 +110,7 @@ export class AggregateTransactionBodyBuilder {
91110
*
92111
* @return Sub-transaction data (transactions are variable sized and payload size is in bytes).
93112
*/
94-
public getTransactions(): Uint8Array {
113+
public getTransactions(): EmbeddedTransactionBuilder[] {
95114
return this.transactions;
96115
}
97116

@@ -100,7 +119,7 @@ export class AggregateTransactionBodyBuilder {
100119
*
101120
* @return Cosignatures data (fills remaining body space after transactions).
102121
*/
103-
public getCosignatures(): Uint8Array {
122+
public getCosignatures(): CosignatureBuilder[] {
104123
return this.cosignatures;
105124
}
106125

@@ -114,8 +133,8 @@ export class AggregateTransactionBodyBuilder {
114133
size += this.transactionsHash.getSize();
115134
size += 4; // payloadSize
116135
size += 4; // aggregateTransactionHeader_Reserved1
117-
size += this.transactions.length;
118-
size += this.cosignatures.length;
136+
this.transactions.forEach((o) => size += EmbeddedTransactionHelper.serialize(o).length);
137+
this.cosignatures.forEach((o) => size += o.getSize());
119138
return size;
120139
}
121140

@@ -128,13 +147,20 @@ export class AggregateTransactionBodyBuilder {
128147
let newArray = Uint8Array.from([]);
129148
const transactionsHashBytes = this.transactionsHash.serialize();
130149
newArray = GeneratorUtils.concatTypedArrays(newArray, transactionsHashBytes);
131-
const payloadSizeBytes = GeneratorUtils.uintToBuffer(this.transactions.length, 4);
150+
// tslint:disable-next-line: max-line-length
151+
const payloadSizeBytes = GeneratorUtils.uintToBuffer(EmbeddedTransactionHelper.getEmbeddedTransactionSize(this.transactions), 4);
132152
newArray = GeneratorUtils.concatTypedArrays(newArray, payloadSizeBytes);
133153
// tslint:disable-next-line: max-line-length
134154
const aggregateTransactionHeader_Reserved1Bytes = GeneratorUtils.uintToBuffer(this.getAggregateTransactionHeader_Reserved1(), 4);
135155
newArray = GeneratorUtils.concatTypedArrays(newArray, aggregateTransactionHeader_Reserved1Bytes);
136-
newArray = GeneratorUtils.concatTypedArrays(newArray, this.transactions);
137-
newArray = GeneratorUtils.concatTypedArrays(newArray, this.cosignatures);
156+
this.transactions.forEach((item) => {
157+
const transactionsBytes = EmbeddedTransactionHelper.serialize(item);
158+
newArray = GeneratorUtils.concatTypedArrays(newArray, transactionsBytes);
159+
});
160+
this.cosignatures.forEach((item) => {
161+
const cosignaturesBytes = item.serialize();
162+
newArray = GeneratorUtils.concatTypedArrays(newArray, cosignaturesBytes);
163+
});
138164
return newArray;
139165
}
140166
}
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
// tslint:disable: jsdoc-format
2+
/**
3+
*** Copyright (c) 2016-present,
4+
*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved.
5+
***
6+
*** This file is part of Catapult.
7+
***
8+
*** Catapult is free software: you can redistribute it and/or modify
9+
*** it under the terms of the GNU Lesser General Public License as published by
10+
*** the Free Software Foundation, either version 3 of the License, or
11+
*** (at your option) any later version.
12+
***
13+
*** Catapult is distributed in the hope that it will be useful,
14+
*** but WITHOUT ANY WARRANTY; without even the implied warranty of
15+
*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16+
*** GNU Lesser General Public License for more details.
17+
***
18+
*** You should have received a copy of the GNU Lesser General Public License
19+
*** along with Catapult. If not, see <http://www.gnu.org/licenses/>.
20+
**/
21+
22+
import { GeneratorUtils } from './GeneratorUtils';
23+
import { KeyDto } from './KeyDto';
24+
import { MosaicBuilder } from './MosaicBuilder';
25+
import { ReceiptBuilder } from './ReceiptBuilder';
26+
import { ReceiptTypeDto } from './ReceiptTypeDto';
27+
28+
/** Binary layout for a balance change receipt. */
29+
export class BalanceChangeReceiptBuilder extends ReceiptBuilder {
30+
/** Mosaic. */
31+
mosaic: MosaicBuilder;
32+
/** Account public key. */
33+
targetPublicKey: KeyDto;
34+
35+
/**
36+
* Constructor.
37+
*
38+
* @param version Receipt version.
39+
* @param type Receipt type.
40+
* @param mosaic Mosaic.
41+
* @param targetPublicKey Account public key.
42+
*/
43+
public constructor(version: number, type: ReceiptTypeDto, mosaic: MosaicBuilder, targetPublicKey: KeyDto) {
44+
super(version, type);
45+
this.mosaic = mosaic;
46+
this.targetPublicKey = targetPublicKey;
47+
}
48+
49+
/**
50+
* Creates an instance of BalanceChangeReceiptBuilder from binary payload.
51+
*
52+
* @param payload Byte payload to use to serialize the object.
53+
* @return Instance of BalanceChangeReceiptBuilder.
54+
*/
55+
public static loadFromBinary(payload: Uint8Array): BalanceChangeReceiptBuilder {
56+
const byteArray = Array.from(payload);
57+
const superObject = ReceiptBuilder.loadFromBinary(Uint8Array.from(byteArray));
58+
byteArray.splice(0, superObject.getSize());
59+
const mosaic = MosaicBuilder.loadFromBinary(Uint8Array.from(byteArray));
60+
byteArray.splice(0, mosaic.getSize());
61+
const targetPublicKey = KeyDto.loadFromBinary(Uint8Array.from(byteArray));
62+
byteArray.splice(0, targetPublicKey.getSize());
63+
return new BalanceChangeReceiptBuilder(superObject.version, superObject.type, mosaic, targetPublicKey);
64+
}
65+
66+
/**
67+
* Gets mosaic.
68+
*
69+
* @return Mosaic.
70+
*/
71+
public getMosaic(): MosaicBuilder {
72+
return this.mosaic;
73+
}
74+
75+
/**
76+
* Gets account public key.
77+
*
78+
* @return Account public key.
79+
*/
80+
public getTargetPublicKey(): KeyDto {
81+
return this.targetPublicKey;
82+
}
83+
84+
/**
85+
* Gets the size of the object.
86+
*
87+
* @return Size in bytes.
88+
*/
89+
public getSize(): number {
90+
let size: number = super.getSize();
91+
size += this.mosaic.getSize();
92+
size += this.targetPublicKey.getSize();
93+
return size;
94+
}
95+
96+
/**
97+
* Serializes an object to bytes.
98+
*
99+
* @return Serialized bytes.
100+
*/
101+
public serialize(): Uint8Array {
102+
let newArray = Uint8Array.from([]);
103+
const superBytes = super.serialize();
104+
newArray = GeneratorUtils.concatTypedArrays(newArray, superBytes);
105+
const mosaicBytes = this.mosaic.serialize();
106+
newArray = GeneratorUtils.concatTypedArrays(newArray, mosaicBytes);
107+
const targetPublicKeyBytes = this.targetPublicKey.serialize();
108+
newArray = GeneratorUtils.concatTypedArrays(newArray, targetPublicKeyBytes);
109+
return newArray;
110+
}
111+
}

0 commit comments

Comments
 (0)