19
19
*** along with Catapult. If not, see <http://www.gnu.org/licenses/>.
20
20
**/
21
21
22
+ import { CosignatureBuilder } from './CosignatureBuilder' ;
23
+ import { EmbeddedTransactionBuilder } from './EmbeddedTransactionBuilder' ;
24
+ import { EmbeddedTransactionHelper } from './EmbeddedTransactionHelper' ;
22
25
import { GeneratorUtils } from './GeneratorUtils' ;
23
26
import { Hash256Dto } from './Hash256Dto' ;
24
27
@@ -29,9 +32,9 @@ export class AggregateTransactionBodyBuilder {
29
32
/** Reserved padding to align end of AggregateTransactionHeader on 8-byte boundary. */
30
33
aggregateTransactionHeader_Reserved1 : number ;
31
34
/** Sub-transaction data (transactions are variable sized and payload size is in bytes). */
32
- transactions : Uint8Array ;
35
+ transactions : EmbeddedTransactionBuilder [ ] ;
33
36
/** Cosignatures data (fills remaining body space after transactions). */
34
- cosignatures : Uint8Array ;
37
+ cosignatures : CosignatureBuilder [ ] ;
35
38
36
39
/**
37
40
* Constructor.
@@ -40,7 +43,8 @@ export class AggregateTransactionBodyBuilder {
40
43
* @param transactions Sub-transaction data (transactions are variable sized and payload size is in bytes).
41
44
* @param cosignatures Cosignatures data (fills remaining body space after transactions).
42
45
*/
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 [ ] ) {
44
48
this . transactionsHash = transactionsHash ;
45
49
this . aggregateTransactionHeader_Reserved1 = 0 ;
46
50
this . transactions = transactions ;
@@ -62,9 +66,24 @@ export class AggregateTransactionBodyBuilder {
62
66
// tslint:disable-next-line: max-line-length
63
67
const aggregateTransactionHeader_Reserved1 = GeneratorUtils . bufferToUint ( GeneratorUtils . getBytes ( Uint8Array . from ( byteArray ) , 4 ) ) ;
64
68
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
+ }
68
87
return new AggregateTransactionBodyBuilder ( transactionsHash , transactions , cosignatures ) ;
69
88
}
70
89
@@ -91,7 +110,7 @@ export class AggregateTransactionBodyBuilder {
91
110
*
92
111
* @return Sub-transaction data (transactions are variable sized and payload size is in bytes).
93
112
*/
94
- public getTransactions ( ) : Uint8Array {
113
+ public getTransactions ( ) : EmbeddedTransactionBuilder [ ] {
95
114
return this . transactions ;
96
115
}
97
116
@@ -100,7 +119,7 @@ export class AggregateTransactionBodyBuilder {
100
119
*
101
120
* @return Cosignatures data (fills remaining body space after transactions).
102
121
*/
103
- public getCosignatures ( ) : Uint8Array {
122
+ public getCosignatures ( ) : CosignatureBuilder [ ] {
104
123
return this . cosignatures ;
105
124
}
106
125
@@ -114,8 +133,8 @@ export class AggregateTransactionBodyBuilder {
114
133
size += this . transactionsHash . getSize ( ) ;
115
134
size += 4 ; // payloadSize
116
135
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 ( ) ) ;
119
138
return size ;
120
139
}
121
140
@@ -128,13 +147,20 @@ export class AggregateTransactionBodyBuilder {
128
147
let newArray = Uint8Array . from ( [ ] ) ;
129
148
const transactionsHashBytes = this . transactionsHash . serialize ( ) ;
130
149
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 ) ;
132
152
newArray = GeneratorUtils . concatTypedArrays ( newArray , payloadSizeBytes ) ;
133
153
// tslint:disable-next-line: max-line-length
134
154
const aggregateTransactionHeader_Reserved1Bytes = GeneratorUtils . uintToBuffer ( this . getAggregateTransactionHeader_Reserved1 ( ) , 4 ) ;
135
155
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
+ } ) ;
138
164
return newArray ;
139
165
}
140
166
}
0 commit comments