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' ;
2225import { GeneratorUtils } from './GeneratorUtils' ;
2326import { 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}
0 commit comments