From b70b333d99c85f1a4191ccfe91f0c646ecdfdb7b Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Tue, 29 Sep 2020 16:51:48 +0100 Subject: [PATCH] Fixed #682 - Return default (MIN) local datetime deadline value from embedded transaction --- .../transaction/CreateTransactionFromDTO.ts | 57 +++++++++++-------- src/model/transaction/Deadline.ts | 10 ++++ .../CreateTransactionFromDTO.spec.ts | 38 +++++++++++++ test/model/transaction/Deadline.spec.ts | 5 ++ 4 files changed, 87 insertions(+), 23 deletions(-) diff --git a/src/infrastructure/transaction/CreateTransactionFromDTO.ts b/src/infrastructure/transaction/CreateTransactionFromDTO.ts index b2314c04ba..face165824 100644 --- a/src/infrastructure/transaction/CreateTransactionFromDTO.ts +++ b/src/infrastructure/transaction/CreateTransactionFromDTO.ts @@ -124,6 +124,17 @@ const extractMessage = (message: any): Message => { return msgObj; }; +/** + * Extract deadline from json payload. + * @param deadline - deadline dto + */ +const extractDeadline = (deadline?: string): Deadline => { + if (!deadline) { + return Deadline.createEmtpy(); + } + return Deadline.createFromDTO(deadline); +}; + /** * @internal * Extract transaction meta data @@ -153,7 +164,7 @@ const CreateStandaloneTransactionFromDTO = (transactionDTO, transactionInfo): Tr return new TransferTransaction( transactionDTO.network, transactionDTO.version, - Deadline.createFromDTO(transactionDTO.deadline), + extractDeadline(transactionDTO.deadline), UInt64.fromNumericString(transactionDTO.maxFee || '0'), extractRecipient(transactionDTO.recipientAddress), extractMosaics(transactionDTO.mosaics), @@ -168,7 +179,7 @@ const CreateStandaloneTransactionFromDTO = (transactionDTO, transactionInfo): Tr return new NamespaceRegistrationTransaction( transactionDTO.network, transactionDTO.version, - Deadline.createFromDTO(transactionDTO.deadline), + extractDeadline(transactionDTO.deadline), UInt64.fromNumericString(transactionDTO.maxFee || '0'), transactionDTO.registrationType, transactionDTO.name, @@ -185,7 +196,7 @@ const CreateStandaloneTransactionFromDTO = (transactionDTO, transactionInfo): Tr return new MosaicDefinitionTransaction( transactionDTO.network, transactionDTO.version, - Deadline.createFromDTO(transactionDTO.deadline), + extractDeadline(transactionDTO.deadline), UInt64.fromNumericString(transactionDTO.maxFee || '0'), MosaicNonce.createFromNumber(transactionDTO.nonce), new MosaicId(transactionDTO.id), @@ -202,7 +213,7 @@ const CreateStandaloneTransactionFromDTO = (transactionDTO, transactionInfo): Tr return new MosaicSupplyChangeTransaction( transactionDTO.network, transactionDTO.version, - Deadline.createFromDTO(transactionDTO.deadline), + extractDeadline(transactionDTO.deadline), UInt64.fromNumericString(transactionDTO.maxFee || '0'), UnresolvedMapping.toUnresolvedMosaic(transactionDTO.mosaicId), transactionDTO.action, @@ -217,7 +228,7 @@ const CreateStandaloneTransactionFromDTO = (transactionDTO, transactionInfo): Tr return new MultisigAccountModificationTransaction( transactionDTO.network, transactionDTO.version, - Deadline.createFromDTO(transactionDTO.deadline), + extractDeadline(transactionDTO.deadline), UInt64.fromNumericString(transactionDTO.maxFee || '0'), transactionDTO.minApprovalDelta, transactionDTO.minRemovalDelta, @@ -234,7 +245,7 @@ const CreateStandaloneTransactionFromDTO = (transactionDTO, transactionInfo): Tr return new LockFundsTransaction( networkType, transactionDTO.version, - Deadline.createFromDTO(transactionDTO.deadline), + extractDeadline(transactionDTO.deadline), UInt64.fromNumericString(transactionDTO.maxFee || '0'), new Mosaic(new MosaicId(transactionDTO.mosaicId), UInt64.fromNumericString(transactionDTO.amount)), UInt64.fromNumericString(transactionDTO.duration), @@ -249,7 +260,7 @@ const CreateStandaloneTransactionFromDTO = (transactionDTO, transactionInfo): Tr return new SecretLockTransaction( transactionDTO.network, transactionDTO.version, - Deadline.createFromDTO(transactionDTO.deadline), + extractDeadline(transactionDTO.deadline), UInt64.fromNumericString(transactionDTO.maxFee || '0'), new Mosaic(mosaicId, UInt64.fromNumericString(transactionDTO.amount)), UInt64.fromNumericString(transactionDTO.duration), @@ -267,7 +278,7 @@ const CreateStandaloneTransactionFromDTO = (transactionDTO, transactionInfo): Tr return new SecretProofTransaction( transactionDTO.network, transactionDTO.version, - Deadline.createFromDTO(transactionDTO.deadline), + extractDeadline(transactionDTO.deadline), UInt64.fromNumericString(transactionDTO.maxFee || '0'), transactionDTO.hashAlgorithm, transactionDTO.secret, @@ -283,7 +294,7 @@ const CreateStandaloneTransactionFromDTO = (transactionDTO, transactionInfo): Tr return new MosaicAliasTransaction( transactionDTO.network, transactionDTO.version, - Deadline.createFromDTO(transactionDTO.deadline), + extractDeadline(transactionDTO.deadline), UInt64.fromNumericString(transactionDTO.maxFee || '0'), transactionDTO.aliasAction, NamespaceId.createFromEncoded(transactionDTO.namespaceId), @@ -298,7 +309,7 @@ const CreateStandaloneTransactionFromDTO = (transactionDTO, transactionInfo): Tr return new AddressAliasTransaction( transactionDTO.network, transactionDTO.version, - Deadline.createFromDTO(transactionDTO.deadline), + extractDeadline(transactionDTO.deadline), UInt64.fromNumericString(transactionDTO.maxFee || '0'), transactionDTO.aliasAction, NamespaceId.createFromEncoded(transactionDTO.namespaceId), @@ -313,7 +324,7 @@ const CreateStandaloneTransactionFromDTO = (transactionDTO, transactionInfo): Tr return new AccountAddressRestrictionTransaction( transactionDTO.network, transactionDTO.version, - Deadline.createFromDTO(transactionDTO.deadline), + extractDeadline(transactionDTO.deadline), UInt64.fromNumericString(transactionDTO.maxFee || '0'), transactionDTO.restrictionFlags, transactionDTO.restrictionAdditions ? transactionDTO.restrictionAdditions.map((addition) => extractRecipient(addition)) : [], @@ -328,7 +339,7 @@ const CreateStandaloneTransactionFromDTO = (transactionDTO, transactionInfo): Tr return new AccountOperationRestrictionTransaction( transactionDTO.network, transactionDTO.version, - Deadline.createFromDTO(transactionDTO.deadline), + extractDeadline(transactionDTO.deadline), UInt64.fromNumericString(transactionDTO.maxFee || '0'), transactionDTO.restrictionFlags, transactionDTO.restrictionAdditions ? transactionDTO.restrictionAdditions : [], @@ -343,7 +354,7 @@ const CreateStandaloneTransactionFromDTO = (transactionDTO, transactionInfo): Tr return new AccountMosaicRestrictionTransaction( transactionDTO.network, transactionDTO.version, - Deadline.createFromDTO(transactionDTO.deadline), + extractDeadline(transactionDTO.deadline), UInt64.fromNumericString(transactionDTO.maxFee || '0'), transactionDTO.restrictionFlags, transactionDTO.restrictionAdditions @@ -362,7 +373,7 @@ const CreateStandaloneTransactionFromDTO = (transactionDTO, transactionInfo): Tr return new AccountKeyLinkTransaction( transactionDTO.network, transactionDTO.version, - Deadline.createFromDTO(transactionDTO.deadline), + extractDeadline(transactionDTO.deadline), UInt64.fromNumericString(transactionDTO.maxFee || '0'), transactionDTO.linkedPublicKey, transactionDTO.linkAction, @@ -376,7 +387,7 @@ const CreateStandaloneTransactionFromDTO = (transactionDTO, transactionInfo): Tr return new MosaicGlobalRestrictionTransaction( transactionDTO.network, transactionDTO.version, - Deadline.createFromDTO(transactionDTO.deadline), + extractDeadline(transactionDTO.deadline), UInt64.fromNumericString(transactionDTO.maxFee || '0'), UnresolvedMapping.toUnresolvedMosaic(transactionDTO.mosaicId), UnresolvedMapping.toUnresolvedMosaic(transactionDTO.referenceMosaicId), @@ -395,7 +406,7 @@ const CreateStandaloneTransactionFromDTO = (transactionDTO, transactionInfo): Tr return new MosaicAddressRestrictionTransaction( transactionDTO.network, transactionDTO.version, - Deadline.createFromDTO(transactionDTO.deadline), + extractDeadline(transactionDTO.deadline), UInt64.fromNumericString(transactionDTO.maxFee || '0'), UnresolvedMapping.toUnresolvedMosaic(transactionDTO.mosaicId), UInt64.fromHex(transactionDTO.restrictionKey), @@ -412,7 +423,7 @@ const CreateStandaloneTransactionFromDTO = (transactionDTO, transactionInfo): Tr return new AccountMetadataTransaction( transactionDTO.network, transactionDTO.version, - Deadline.createFromDTO(transactionDTO.deadline), + extractDeadline(transactionDTO.deadline), UInt64.fromNumericString(transactionDTO.maxFee || '0'), extractRecipient(transactionDTO.targetAddress), UInt64.fromHex(transactionDTO.scopedMetadataKey), @@ -428,7 +439,7 @@ const CreateStandaloneTransactionFromDTO = (transactionDTO, transactionInfo): Tr return new MosaicMetadataTransaction( transactionDTO.network, transactionDTO.version, - Deadline.createFromDTO(transactionDTO.deadline), + extractDeadline(transactionDTO.deadline), UInt64.fromNumericString(transactionDTO.maxFee || '0'), extractRecipient(transactionDTO.targetAddress), UInt64.fromHex(transactionDTO.scopedMetadataKey), @@ -445,7 +456,7 @@ const CreateStandaloneTransactionFromDTO = (transactionDTO, transactionInfo): Tr return new NamespaceMetadataTransaction( transactionDTO.network, transactionDTO.version, - Deadline.createFromDTO(transactionDTO.deadline), + extractDeadline(transactionDTO.deadline), UInt64.fromNumericString(transactionDTO.maxFee || '0'), extractRecipient(transactionDTO.targetAddress), UInt64.fromHex(transactionDTO.scopedMetadataKey), @@ -462,7 +473,7 @@ const CreateStandaloneTransactionFromDTO = (transactionDTO, transactionInfo): Tr return new VrfKeyLinkTransaction( transactionDTO.network, transactionDTO.version, - Deadline.createFromDTO(transactionDTO.deadline), + extractDeadline(transactionDTO.deadline), UInt64.fromNumericString(transactionDTO.maxFee || '0'), transactionDTO.linkedPublicKey, transactionDTO.linkAction, @@ -476,7 +487,7 @@ const CreateStandaloneTransactionFromDTO = (transactionDTO, transactionInfo): Tr return new NodeKeyLinkTransaction( transactionDTO.network, transactionDTO.version, - Deadline.createFromDTO(transactionDTO.deadline), + extractDeadline(transactionDTO.deadline), UInt64.fromNumericString(transactionDTO.maxFee || '0'), transactionDTO.linkedPublicKey, transactionDTO.linkAction, @@ -490,7 +501,7 @@ const CreateStandaloneTransactionFromDTO = (transactionDTO, transactionInfo): Tr return new VotingKeyLinkTransaction( transactionDTO.network, transactionDTO.version, - Deadline.createFromDTO(transactionDTO.deadline), + extractDeadline(transactionDTO.deadline), UInt64.fromNumericString(transactionDTO.maxFee || '0'), transactionDTO.linkedPublicKey, transactionDTO.startEpoch, @@ -530,7 +541,7 @@ export const CreateTransactionFromDTO = (transactionDTO): Transaction => { transactionDTO.transaction.network, transactionDTO.transaction.type, transactionDTO.transaction.version, - Deadline.createFromDTO(transactionDTO.transaction.deadline), + extractDeadline(transactionDTO.transaction.deadline), UInt64.fromNumericString(transactionDTO.transaction.maxFee || '0'), innerTransactions, transactionDTO.transaction.cosignatures diff --git a/src/model/transaction/Deadline.ts b/src/model/transaction/Deadline.ts index fa0d6171c2..287929f191 100644 --- a/src/model/transaction/Deadline.ts +++ b/src/model/transaction/Deadline.ts @@ -52,6 +52,16 @@ export class Deadline { return new Deadline(deadlineDateTime); } + /** + * @internal + * Create an empty Deadline object using min local datetime. + * This is method is an internal method to cope with undefined deadline for embedded transactions + * @returns {Deadline} + */ + public static createEmtpy(): Deadline { + return new Deadline(LocalDateTime.MIN); + } + /** * @param value * @returns {Deadline} diff --git a/test/infrastructure/transaction/CreateTransactionFromDTO.spec.ts b/test/infrastructure/transaction/CreateTransactionFromDTO.spec.ts index 5046d4e49e..24767e1f97 100644 --- a/test/infrastructure/transaction/CreateTransactionFromDTO.spec.ts +++ b/test/infrastructure/transaction/CreateTransactionFromDTO.spec.ts @@ -19,6 +19,7 @@ import { CreateTransactionFromDTO } from '../../../src/infrastructure/transactio import { Address } from '../../../src/model/account/Address'; import { TransferTransaction } from '../../../src/model/transaction/TransferTransaction'; import ValidateTransaction from './ValidateTransaction'; +import { LocalDateTime } from 'js-joda'; describe('CreateTransactionFromDTO', () => { describe('TransferTransaction', () => { @@ -162,6 +163,43 @@ describe('CreateTransactionFromDTO', () => { }); }); + describe('Embedded transaction only', () => { + it('standalone', () => { + const transferTransactionDTO = { + id: '5CD2B76B2B3F0F0001751380', + meta: { + height: '78', + aggregateHash: 'D6A48BFD66920825D748D2CF92B025588F3A030C98633C442B4704BF407160B9', + aggregateId: '5F729AA24655A25B54840CB7', + index: 0, + }, + transaction: { + signerPublicKey: '2FC3872A792933617D70E02AFF8FBDE152821A0DF0CA5FB04CB56FC3D21C8863', + version: 1, + network: 144, + type: 16724, + recipientAddress: '6026D27E1D0A26CA4E316F901E23E55C8711DB20DF300144', + message: { + payload: '746573742D6D657373616765', + type: 0, + }, + mosaics: [ + { + id: '85BBEA6CC462B244', + amount: '10', + }, + ], + }, + }; + + const transferTransaction = CreateTransactionFromDTO(transferTransactionDTO) as TransferTransaction; + deepEqual(transferTransaction.recipientAddress, Address.createFromEncoded(transferTransactionDTO.transaction.recipientAddress)); + expect(transferTransaction.message.payload).to.be.equal('test-message'); + expect(transferTransaction.deadline.value).to.be.equal(LocalDateTime.MIN); + expect(transferTransaction.maxFee.toString()).to.be.equal('0'); + }); + }); + describe('NamespaceRegistrationTransaction', () => { describe('namespace', () => { it('standalone', () => { diff --git a/test/model/transaction/Deadline.spec.ts b/test/model/transaction/Deadline.spec.ts index 655045a7e6..b6bb7f93be 100644 --- a/test/model/transaction/Deadline.spec.ts +++ b/test/model/transaction/Deadline.spec.ts @@ -51,6 +51,11 @@ describe('Deadline', () => { expect(deadline.toDTO()[1]).to.be.equal(11); }); + it('should createComplete empty deadline', () => { + const deadline = Deadline.createEmtpy(); + expect(deadline.value).to.be.equal(LocalDateTime.MIN); + }); + it('make sure epochAdjustment is correct', () => { const epochAdjustment = new Date(Deadline.timestampNemesisBlock * 1000);