@@ -34,10 +34,8 @@ import { DtoMapping } from '../../core/utils/DtoMapping';
34
34
import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping' ;
35
35
import { Address } from '../account/Address' ;
36
36
import { PublicAccount } from '../account/PublicAccount' ;
37
- import { EncryptedMessage } from '../message/EncryptedMessage' ;
38
37
import { Message } from '../message/Message' ;
39
38
import { MessageType } from '../message/MessageType' ;
40
- import { PlainMessage } from '../message/PlainMessage' ;
41
39
import { Mosaic } from '../mosaic/Mosaic' ;
42
40
import { NamespaceId } from '../namespace/NamespaceId' ;
43
41
import { NetworkType } from '../network/NetworkType' ;
@@ -50,6 +48,9 @@ import { TransactionInfo } from './TransactionInfo';
50
48
import { TransactionType } from './TransactionType' ;
51
49
import { TransactionVersion } from './TransactionVersion' ;
52
50
import { UnresolvedAddress } from '../account/UnresolvedAddress' ;
51
+ import { EmptyMessage , PlainMessage } from '../message/PlainMessage' ;
52
+ import { EncryptedMessage } from '../message/EncryptedMessage' ;
53
+ import { PersistentHarvestingDelegationMessage } from '../message/PersistentHarvestingDelegationMessage' ;
53
54
54
55
/**
55
56
* Transfer transactions contain data about transfers of mosaics and message to another account.
@@ -121,7 +122,7 @@ export class TransferTransaction extends Transaction {
121
122
/**
122
123
* The transaction message of 2048 characters.
123
124
*/
124
- public readonly message : Message ,
125
+ public readonly message : Message = EmptyMessage ,
125
126
signature ?: string ,
126
127
signer ?: PublicAccount ,
127
128
transactionInfo ?: TransactionInfo ,
@@ -140,8 +141,6 @@ export class TransferTransaction extends Transaction {
140
141
const builder = isEmbedded
141
142
? EmbeddedTransferTransactionBuilder . loadFromBinary ( Convert . hexToUint8 ( payload ) )
142
143
: TransferTransactionBuilder . loadFromBinary ( Convert . hexToUint8 ( payload ) ) ;
143
- const messageType = builder . getMessage ( ) [ 0 ] ;
144
- const messageHex = Convert . uint8ToHex ( builder . getMessage ( ) ) . substring ( 2 ) ;
145
144
const signerPublicKey = Convert . uint8ToHex ( builder . getSignerPublicKey ( ) . key ) ;
146
145
const networkType = builder . getNetwork ( ) . valueOf ( ) ;
147
146
const signature = payload . substring ( 16 , 144 ) ;
@@ -152,9 +151,7 @@ export class TransferTransaction extends Transaction {
152
151
const id = new UInt64 ( mosaic . mosaicId . unresolvedMosaicId ) . toHex ( ) ;
153
152
return new Mosaic ( UnresolvedMapping . toUnresolvedMosaic ( id ) , new UInt64 ( mosaic . amount . amount ) ) ;
154
153
} ) ,
155
- messageType === MessageType . PlainMessage
156
- ? PlainMessage . createFromPayload ( messageHex )
157
- : EncryptedMessage . createFromPayload ( messageHex ) ,
154
+ TransferTransaction . createMessageFromBuffer ( builder . getMessage ( ) ) ,
158
155
networkType ,
159
156
isEmbedded ? new UInt64 ( [ 0 , 0 ] ) : new UInt64 ( ( builder as TransferTransactionBuilder ) . fee . amount ) ,
160
157
isEmbedded || signature . match ( `^[0]+$` ) ? undefined : signature ,
@@ -168,7 +165,7 @@ export class TransferTransaction extends Transaction {
168
165
* @internal
169
166
*/
170
167
protected validate ( ) : void {
171
- if ( this . message . type === MessageType . PersistentHarvestingDelegationMessage ) {
168
+ if ( this . message ? .type === MessageType . PersistentHarvestingDelegationMessage ) {
172
169
if ( this . mosaics . length > 0 ) {
173
170
throw new Error ( 'PersistentDelegationRequestTransaction should be created without Mosaic' ) ;
174
171
} else if ( ! / ^ [ 0 - 9 a - f A - F ] { 264 } $ / . test ( this . message . payload ) ) {
@@ -211,13 +208,16 @@ export class TransferTransaction extends Transaction {
211
208
* @returns {Uint8Array }
212
209
*/
213
210
public getMessageBuffer ( ) : Uint8Array {
211
+ if ( ! this . message || ! this . message . payload ) {
212
+ return Uint8Array . of ( ) ;
213
+ }
214
214
const messgeHex =
215
215
this . message . type === MessageType . PersistentHarvestingDelegationMessage
216
216
? this . message . payload
217
217
: Convert . utf8ToHex ( this . message . payload ) ;
218
218
const payloadBuffer = Convert . hexToUint8 ( messgeHex ) ;
219
219
const typeBuffer = GeneratorUtils . uintToBuffer ( this . message . type , 1 ) ;
220
- return this . message . type === MessageType . PersistentHarvestingDelegationMessage
220
+ return this . message . type === MessageType . PersistentHarvestingDelegationMessage || ! this . message . payload
221
221
? payloadBuffer
222
222
: GeneratorUtils . concatTypedArrays ( typeBuffer , payloadBuffer ) ;
223
223
}
@@ -298,4 +298,25 @@ export class TransferTransaction extends Transaction {
298
298
alias . find ( ( name ) => this . recipientAddress . equals ( name ) ) !== undefined
299
299
) ;
300
300
}
301
+
302
+ /**
303
+ * @internal
304
+ */
305
+ private static createMessageFromBuffer ( messageBuffer : Uint8Array ) : Message {
306
+ if ( ! messageBuffer . length ) {
307
+ return EmptyMessage ;
308
+ }
309
+ const messageType = messageBuffer [ 0 ] ;
310
+ const messageHex = Convert . uint8ToHex ( messageBuffer ) . substring ( 2 ) ;
311
+ switch ( messageType ) {
312
+ case MessageType . PlainMessage :
313
+ return PlainMessage . createFromPayload ( messageHex ) ;
314
+ case MessageType . EncryptedMessage :
315
+ return EncryptedMessage . createFromPayload ( messageHex ) ;
316
+ case MessageType . PersistentHarvestingDelegationMessage :
317
+ return PersistentHarvestingDelegationMessage . createFromPayload ( messageHex ) ;
318
+ default :
319
+ throw new Error ( 'Message Type is not valid' ) ;
320
+ }
321
+ }
301
322
}
0 commit comments