@@ -34,10 +34,8 @@ import { DtoMapping } from '../../core/utils/DtoMapping';
3434import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping' ;
3535import { Address } from '../account/Address' ;
3636import { PublicAccount } from '../account/PublicAccount' ;
37- import { EncryptedMessage } from '../message/EncryptedMessage' ;
3837import { Message } from '../message/Message' ;
3938import { MessageType } from '../message/MessageType' ;
40- import { PlainMessage } from '../message/PlainMessage' ;
4139import { Mosaic } from '../mosaic/Mosaic' ;
4240import { NamespaceId } from '../namespace/NamespaceId' ;
4341import { NetworkType } from '../network/NetworkType' ;
@@ -50,6 +48,9 @@ import { TransactionInfo } from './TransactionInfo';
5048import { TransactionType } from './TransactionType' ;
5149import { TransactionVersion } from './TransactionVersion' ;
5250import { UnresolvedAddress } from '../account/UnresolvedAddress' ;
51+ import { EmptyMessage , PlainMessage } from '../message/PlainMessage' ;
52+ import { EncryptedMessage } from '../message/EncryptedMessage' ;
53+ import { PersistentHarvestingDelegationMessage } from '../message/PersistentHarvestingDelegationMessage' ;
5354
5455/**
5556 * Transfer transactions contain data about transfers of mosaics and message to another account.
@@ -121,7 +122,7 @@ export class TransferTransaction extends Transaction {
121122 /**
122123 * The transaction message of 2048 characters.
123124 */
124- public readonly message : Message ,
125+ public readonly message : Message = EmptyMessage ,
125126 signature ?: string ,
126127 signer ?: PublicAccount ,
127128 transactionInfo ?: TransactionInfo ,
@@ -140,8 +141,6 @@ export class TransferTransaction extends Transaction {
140141 const builder = isEmbedded
141142 ? EmbeddedTransferTransactionBuilder . loadFromBinary ( Convert . hexToUint8 ( payload ) )
142143 : TransferTransactionBuilder . loadFromBinary ( Convert . hexToUint8 ( payload ) ) ;
143- const messageType = builder . getMessage ( ) [ 0 ] ;
144- const messageHex = Convert . uint8ToHex ( builder . getMessage ( ) ) . substring ( 2 ) ;
145144 const signerPublicKey = Convert . uint8ToHex ( builder . getSignerPublicKey ( ) . key ) ;
146145 const networkType = builder . getNetwork ( ) . valueOf ( ) ;
147146 const signature = payload . substring ( 16 , 144 ) ;
@@ -152,9 +151,7 @@ export class TransferTransaction extends Transaction {
152151 const id = new UInt64 ( mosaic . mosaicId . unresolvedMosaicId ) . toHex ( ) ;
153152 return new Mosaic ( UnresolvedMapping . toUnresolvedMosaic ( id ) , new UInt64 ( mosaic . amount . amount ) ) ;
154153 } ) ,
155- messageType === MessageType . PlainMessage
156- ? PlainMessage . createFromPayload ( messageHex )
157- : EncryptedMessage . createFromPayload ( messageHex ) ,
154+ TransferTransaction . createMessageFromBuffer ( builder . getMessage ( ) ) ,
158155 networkType ,
159156 isEmbedded ? new UInt64 ( [ 0 , 0 ] ) : new UInt64 ( ( builder as TransferTransactionBuilder ) . fee . amount ) ,
160157 isEmbedded || signature . match ( `^[0]+$` ) ? undefined : signature ,
@@ -168,7 +165,7 @@ export class TransferTransaction extends Transaction {
168165 * @internal
169166 */
170167 protected validate ( ) : void {
171- if ( this . message . type === MessageType . PersistentHarvestingDelegationMessage ) {
168+ if ( this . message ? .type === MessageType . PersistentHarvestingDelegationMessage ) {
172169 if ( this . mosaics . length > 0 ) {
173170 throw new Error ( 'PersistentDelegationRequestTransaction should be created without Mosaic' ) ;
174171 } else if ( ! / ^ [ 0 - 9 a - f A - F ] { 264 } $ / . test ( this . message . payload ) ) {
@@ -211,13 +208,16 @@ export class TransferTransaction extends Transaction {
211208 * @returns {Uint8Array }
212209 */
213210 public getMessageBuffer ( ) : Uint8Array {
211+ if ( ! this . message || ! this . message . payload ) {
212+ return Uint8Array . of ( ) ;
213+ }
214214 const messgeHex =
215215 this . message . type === MessageType . PersistentHarvestingDelegationMessage
216216 ? this . message . payload
217217 : Convert . utf8ToHex ( this . message . payload ) ;
218218 const payloadBuffer = Convert . hexToUint8 ( messgeHex ) ;
219219 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
221221 ? payloadBuffer
222222 : GeneratorUtils . concatTypedArrays ( typeBuffer , payloadBuffer ) ;
223223 }
@@ -298,4 +298,25 @@ export class TransferTransaction extends Transaction {
298298 alias . find ( ( name ) => this . recipientAddress . equals ( name ) ) !== undefined
299299 ) ;
300300 }
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+ }
301322}
0 commit comments