From 2b2d116c3ecaa843c30394c64b852e209310928d Mon Sep 17 00:00:00 2001 From: gimyboya Date: Wed, 11 Jul 2018 16:17:38 +0800 Subject: [PATCH 01/13] Exposed Deadline to the public in Transaction class --- package-lock.json | 2 +- src/model/transaction/Transaction.ts | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ef0dc0a72..294549bedd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nem2-sdk", - "version": "0.9.7", + "version": "0.10.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/src/model/transaction/Transaction.ts b/src/model/transaction/Transaction.ts index 53e50e38dc..c60a4d2206 100644 --- a/src/model/transaction/Transaction.ts +++ b/src/model/transaction/Transaction.ts @@ -14,16 +14,16 @@ * limitations under the License. */ -import {VerifiableTransaction} from 'nem2-library'; -import {Account} from '../account/Account'; -import {PublicAccount} from '../account/PublicAccount'; -import {NetworkType} from '../blockchain/NetworkType'; -import {UInt64} from '../UInt64'; -import {AggregateTransactionInfo} from './AggregateTransactionInfo'; -import {Deadline} from './Deadline'; -import {InnerTransaction} from './InnerTransaction'; -import {SignedTransaction} from './SignedTransaction'; -import {TransactionInfo} from './TransactionInfo'; +import { VerifiableTransaction } from 'nem2-library'; +import { Account } from '../account/Account'; +import { PublicAccount } from '../account/PublicAccount'; +import { NetworkType } from '../blockchain/NetworkType'; +import { UInt64 } from '../UInt64'; +import { AggregateTransactionInfo } from './AggregateTransactionInfo'; +import { Deadline } from './Deadline'; +import { InnerTransaction } from './InnerTransaction'; +import { SignedTransaction } from './SignedTransaction'; +import { TransactionInfo } from './TransactionInfo'; /** * An abstract transaction class that serves as the base class of all NEM transactions. @@ -56,7 +56,7 @@ export abstract class Transaction { /** * The deadline to include the transaction. */ - public readonly deadline: Deadline, + public deadline: Deadline, /** * The fee for the transaction. The higher the fee, the higher the priority of the transaction. * Transactions with high priority get included in a block before transactions with lower priority. From 75d0c366a71b4c4a1097381cece4491ee88889aa Mon Sep 17 00:00:00 2001 From: gimyboya Date: Mon, 16 Jul 2018 22:37:05 +0800 Subject: [PATCH 02/13] abstract function --- src/model/transaction/Transaction.ts | 10 ++++++++- test/model/transaction/Transaction.spec.ts | 24 +++++++++++++--------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/model/transaction/Transaction.ts b/src/model/transaction/Transaction.ts index c60a4d2206..d548100a11 100644 --- a/src/model/transaction/Transaction.ts +++ b/src/model/transaction/Transaction.ts @@ -56,7 +56,7 @@ export abstract class Transaction { /** * The deadline to include the transaction. */ - public deadline: Deadline, + public readonly deadline: Deadline, /** * The fee for the transaction. The higher the fee, the higher the priority of the transaction. * Transactions with high priority get included in a block before transactions with lower priority. @@ -156,4 +156,12 @@ export abstract class Transaction { const versionDTO = this.networkType.toString(16) + '0' + this.version.toString(16); return parseInt(versionDTO, 16); } + + /** + * @description re-aplly a given value to the transaction in an immutable way + * @param {Deadline} deadline + * @returns {Transaction} + * @memberof Transaction + */ + public abstract reaplygiven(deadline: Deadline, signedTransaction?: SignedTransaction): Transaction; } diff --git a/test/model/transaction/Transaction.spec.ts b/test/model/transaction/Transaction.spec.ts index 673b3a824a..4281fe826e 100644 --- a/test/model/transaction/Transaction.spec.ts +++ b/test/model/transaction/Transaction.spec.ts @@ -14,16 +14,16 @@ * limitations under the License. */ -import {expect} from 'chai'; -import {VerifiableTransaction} from 'nem2-library'; -import {NetworkType} from '../../../src/model/blockchain/NetworkType'; -import {Account} from '../../../src/model/model'; -import {Deadline} from '../../../src/model/transaction/Deadline'; -import {SignedTransaction} from '../../../src/model/transaction/SignedTransaction'; -import {Transaction} from '../../../src/model/transaction/Transaction'; -import {TransactionInfo} from '../../../src/model/transaction/TransactionInfo'; -import {TransactionType} from '../../../src/model/transaction/TransactionType'; -import {UInt64} from '../../../src/model/UInt64'; +import { expect } from 'chai'; +import { VerifiableTransaction } from 'nem2-library'; +import { NetworkType } from '../../../src/model/blockchain/NetworkType'; +import { Account } from '../../../src/model/model'; +import { Deadline } from '../../../src/model/transaction/Deadline'; +import { SignedTransaction } from '../../../src/model/transaction/SignedTransaction'; +import { Transaction } from '../../../src/model/transaction/Transaction'; +import { TransactionInfo } from '../../../src/model/transaction/TransactionInfo'; +import { TransactionType } from '../../../src/model/transaction/TransactionType'; +import { UInt64 } from '../../../src/model/UInt64'; describe('Transaction', () => { describe('isUnannounced', () => { @@ -108,4 +108,8 @@ class FakeTransaction extends Transaction { protected buildTransaction(): VerifiableTransaction { throw new Error('Method not implemented.'); } + + public reaplygiven(newdeadline: Deadline): Transaction { + throw new Error('Method not implemented.'); + } } From f5491004b24a5987f1af5ba49362c6aae7d371c6 Mon Sep 17 00:00:00 2001 From: gimyboya Date: Mon, 16 Jul 2018 22:37:32 +0800 Subject: [PATCH 03/13] reapply given for aggregate --- src/model/transaction/AggregateTransaction.ts | 48 ++++++++++++++----- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/src/model/transaction/AggregateTransaction.ts b/src/model/transaction/AggregateTransaction.ts index 9138b977b1..3537547b48 100644 --- a/src/model/transaction/AggregateTransaction.ts +++ b/src/model/transaction/AggregateTransaction.ts @@ -14,18 +14,18 @@ * limitations under the License. */ -import {AggregateTransaction as AggregateTransactionLibrary} from 'nem2-library'; -import {Account} from '../account/Account'; -import {PublicAccount} from '../account/PublicAccount'; -import {NetworkType} from '../blockchain/NetworkType'; -import {UInt64} from '../UInt64'; -import {AggregateTransactionCosignature} from './AggregateTransactionCosignature'; -import {Deadline} from './Deadline'; -import {InnerTransaction} from './InnerTransaction'; -import {SignedTransaction} from './SignedTransaction'; -import {Transaction} from './Transaction'; -import {TransactionInfo} from './TransactionInfo'; -import {TransactionType} from './TransactionType'; +import { AggregateTransaction as AggregateTransactionLibrary } from 'nem2-library'; +import { Account } from '../account/Account'; +import { PublicAccount } from '../account/PublicAccount'; +import { NetworkType } from '../blockchain/NetworkType'; +import { UInt64 } from '../UInt64'; +import { AggregateTransactionCosignature } from './AggregateTransactionCosignature'; +import { Deadline } from './Deadline'; +import { InnerTransaction } from './InnerTransaction'; +import { SignedTransaction } from './SignedTransaction'; +import { Transaction } from './Transaction'; +import { TransactionInfo } from './TransactionInfo'; +import { TransactionType } from './TransactionType'; /** * Aggregate innerTransactions contain multiple innerTransactions that can be initiated by different accounts. @@ -145,4 +145,28 @@ export class AggregateTransaction extends Transaction { || (this.signer !== undefined && this.signer.equals(publicAccount)); } + /** + * @description re-aplly a given value to the transaction in an immutable way + * @param {Deadline} deadline + * @returns {Transaction} + * @memberof Transaction + */ + public reaplygiven(newDeadline: Deadline): AggregateTransaction { + + if (this.isUnannounced) { + return new AggregateTransaction( + this.networkType, + this.type, + this.version, + newDeadline, + this.fee, + this.innerTransactions, + this.cosignatures, + this.signature, + this.signer); + } else { + throw new Error('Should not modify an announced transaction'); + } + } + } From 82f49ab160aab34fc8056ed5c8fe01016c03261f Mon Sep 17 00:00:00 2001 From: gimyboya Date: Mon, 16 Jul 2018 22:38:02 +0800 Subject: [PATCH 04/13] reapply given from Lock --- src/model/transaction/LockFundsTransaction.ts | 44 ++++++++++++++----- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/src/model/transaction/LockFundsTransaction.ts b/src/model/transaction/LockFundsTransaction.ts index 96b8bade5c..1668691bad 100644 --- a/src/model/transaction/LockFundsTransaction.ts +++ b/src/model/transaction/LockFundsTransaction.ts @@ -14,16 +14,16 @@ * limitations under the License. */ -import {HashLockTransaction, VerifiableTransaction} from 'nem2-library'; -import {PublicAccount} from '../account/PublicAccount'; -import {NetworkType} from '../blockchain/NetworkType'; -import {Mosaic} from '../mosaic/Mosaic'; -import {UInt64} from '../UInt64'; -import {Deadline} from './Deadline'; -import {SignedTransaction} from './SignedTransaction'; -import {Transaction} from './Transaction'; -import {TransactionInfo} from './TransactionInfo'; -import {TransactionType} from './TransactionType'; +import { HashLockTransaction, VerifiableTransaction } from 'nem2-library'; +import { PublicAccount } from '../account/PublicAccount'; +import { NetworkType } from '../blockchain/NetworkType'; +import { Mosaic } from '../mosaic/Mosaic'; +import { UInt64 } from '../UInt64'; +import { Deadline } from './Deadline'; +import { SignedTransaction } from './SignedTransaction'; +import { Transaction } from './Transaction'; +import { TransactionInfo } from './TransactionInfo'; +import { TransactionType } from './TransactionType'; /** * Lock funds transaction is used before sending an Aggregate bonded transaction, as a deposit to announce the transaction. @@ -114,4 +114,28 @@ export class LockFundsTransaction extends Transaction { .build(); } + /** + * @description re-aplly a given value to the transaction in an immutable way + * @param {Deadline} deadline + * @returns {Transaction} + * @memberof Transaction + */ + public reaplygiven(deadline: Deadline, signedTransaction: SignedTransaction): LockFundsTransaction { + + if (this.isUnannounced) { + return new LockFundsTransaction( + this.networkType, + this.type, + deadline, + this.fee, + this.mosaic, + this.duration, + signedTransaction, + this.signature, + this.signer); + } else { + throw new Error('Should not modify an announced transaction'); + } + } + } From eb2d6da097a85500f7fa6462c113cd7079a5a44f Mon Sep 17 00:00:00 2001 From: gimyboya Date: Mon, 16 Jul 2018 22:38:14 +0800 Subject: [PATCH 05/13] reapply given from modification --- .../ModifyMultisigAccountTransaction.ts | 42 +++++++++++++++---- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/src/model/transaction/ModifyMultisigAccountTransaction.ts b/src/model/transaction/ModifyMultisigAccountTransaction.ts index cac88b6e42..b460c0a71a 100644 --- a/src/model/transaction/ModifyMultisigAccountTransaction.ts +++ b/src/model/transaction/ModifyMultisigAccountTransaction.ts @@ -14,15 +14,15 @@ * limitations under the License. */ -import {MultisigModificationTransaction as ModifyMultisigAccountTransactionLibrary, VerifiableTransaction} from 'nem2-library'; -import {PublicAccount} from '../account/PublicAccount'; -import {NetworkType} from '../blockchain/NetworkType'; -import {UInt64} from '../UInt64'; -import {Deadline} from './Deadline'; -import {MultisigCosignatoryModification} from './MultisigCosignatoryModification'; -import {Transaction} from './Transaction'; -import {TransactionInfo} from './TransactionInfo'; -import {TransactionType} from './TransactionType'; +import { MultisigModificationTransaction as ModifyMultisigAccountTransactionLibrary, VerifiableTransaction } from 'nem2-library'; +import { PublicAccount } from '../account/PublicAccount'; +import { NetworkType } from '../blockchain/NetworkType'; +import { UInt64 } from '../UInt64'; +import { Deadline } from './Deadline'; +import { MultisigCosignatoryModification } from './MultisigCosignatoryModification'; +import { Transaction } from './Transaction'; +import { TransactionInfo } from './TransactionInfo'; +import { TransactionType } from './TransactionType'; /** * Modify multisig account transactions are part of the NEM's multisig account system. @@ -105,4 +105,28 @@ export class ModifyMultisigAccountTransaction extends Transaction { .addModifications(this.modifications.map((modification) => modification.toDTO())) .build(); } + + /** + * @description re-aplly a given value to the transaction in an immutable way + * @param {Deadline} deadline + * @returns {Transaction} + * @memberof Transaction + */ + public reaplygiven(newDeadline: Deadline): ModifyMultisigAccountTransaction { + + if (this.isUnannounced) { + return new ModifyMultisigAccountTransaction( + this.networkType, + this.version, + newDeadline, + this.fee, + this.minApprovalDelta, + this.minRemovalDelta, + this.modifications, + this.signature, + this.signer); + } else { + throw new Error('Should not modify an announced transaction'); + } + } } From c99bad3ae57e3ae14b1095626c1859f543638370 Mon Sep 17 00:00:00 2001 From: gimyboya Date: Mon, 16 Jul 2018 22:38:29 +0800 Subject: [PATCH 06/13] reapply given for definition --- .../MosaicDefinitionTransaction.ts | 51 +++++++++++++------ 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/src/model/transaction/MosaicDefinitionTransaction.ts b/src/model/transaction/MosaicDefinitionTransaction.ts index 2cafe9889d..3196ef4cb7 100644 --- a/src/model/transaction/MosaicDefinitionTransaction.ts +++ b/src/model/transaction/MosaicDefinitionTransaction.ts @@ -14,21 +14,17 @@ * limitations under the License. */ -import { - MosaicCreationTransaction as MosaicDefinitionTransactionLibrary, - mosaicId as mosaicIdLibrary, - VerifiableTransaction, -} from 'nem2-library'; -import {PublicAccount} from '../account/PublicAccount'; -import {NetworkType} from '../blockchain/NetworkType'; -import {MosaicId} from '../mosaic/MosaicId'; -import {MosaicProperties} from '../mosaic/MosaicProperties'; -import {NamespaceId} from '../namespace/NamespaceId'; -import {UInt64} from '../UInt64'; -import {Deadline} from './Deadline'; -import {Transaction} from './Transaction'; -import {TransactionInfo} from './TransactionInfo'; -import {TransactionType} from './TransactionType'; +import { MosaicCreationTransaction as MosaicDefinitionTransactionLibrary, mosaicId as mosaicIdLibrary, VerifiableTransaction } from 'nem2-library'; +import { PublicAccount } from '../account/PublicAccount'; +import { NetworkType } from '../blockchain/NetworkType'; +import { MosaicId } from '../mosaic/MosaicId'; +import { MosaicProperties } from '../mosaic/MosaicProperties'; +import { NamespaceId } from '../namespace/NamespaceId'; +import { UInt64 } from '../UInt64'; +import { Deadline } from './Deadline'; +import { Transaction } from './Transaction'; +import { TransactionInfo } from './TransactionInfo'; +import { TransactionType } from './TransactionType'; /** * Before a mosaic can be created or transferred, a corresponding definition of the mosaic has to be created and published to the network. @@ -129,4 +125,29 @@ export class MosaicDefinitionTransaction extends Transaction { return mosaicDefinitionTransaction.build(); } + + /** + * @description re-aplly a given value to the transaction in an immutable way + * @param {Deadline} deadline + * @returns {Transaction} + * @memberof Transaction + */ + public reaplygiven(newDeadline: Deadline): MosaicDefinitionTransaction { + + if (this.isUnannounced) { + return new MosaicDefinitionTransaction( + this.networkType, + this.version, + newDeadline, + this.fee, + this.parentId, + this.mosaicId, + this.mosaicName, + this.mosaicProperties, + this.signature, + this.signer); + } else { + throw new Error('Should not modify an announced transaction'); + } + } } From b804926a9d48344d6a02fe1df5921d4e6d2ff999 Mon Sep 17 00:00:00 2001 From: gimyboya Date: Mon, 16 Jul 2018 22:39:26 +0800 Subject: [PATCH 07/13] reapply given for supply --- .../MosaicSupplyChangeTransaction.ts | 44 ++++++++++++++----- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/src/model/transaction/MosaicSupplyChangeTransaction.ts b/src/model/transaction/MosaicSupplyChangeTransaction.ts index 2f8a8c18ec..dd339edd03 100644 --- a/src/model/transaction/MosaicSupplyChangeTransaction.ts +++ b/src/model/transaction/MosaicSupplyChangeTransaction.ts @@ -14,16 +14,16 @@ * limitations under the License. */ -import {MosaicSupplyChangeTransaction as MosaicSupplyChangeTransactionLibrary, VerifiableTransaction} from 'nem2-library'; -import {PublicAccount} from '../account/PublicAccount'; -import {NetworkType} from '../blockchain/NetworkType'; -import {MosaicId} from '../mosaic/MosaicId'; -import {MosaicSupplyType} from '../mosaic/MosaicSupplyType'; -import {UInt64} from '../UInt64'; -import {Deadline} from './Deadline'; -import {Transaction} from './Transaction'; -import {TransactionInfo} from './TransactionInfo'; -import {TransactionType} from './TransactionType'; +import { MosaicSupplyChangeTransaction as MosaicSupplyChangeTransactionLibrary, VerifiableTransaction } from 'nem2-library'; +import { PublicAccount } from '../account/PublicAccount'; +import { NetworkType } from '../blockchain/NetworkType'; +import { MosaicId } from '../mosaic/MosaicId'; +import { MosaicSupplyType } from '../mosaic/MosaicSupplyType'; +import { UInt64 } from '../UInt64'; +import { Deadline } from './Deadline'; +import { Transaction } from './Transaction'; +import { TransactionInfo } from './TransactionInfo'; +import { TransactionType } from './TransactionType'; /** * In case a mosaic has the flag 'supplyMutable' set to true, the creator of the mosaic can change the supply, @@ -103,4 +103,28 @@ export class MosaicSupplyChangeTransaction extends Transaction { .addDelta(this.delta.toDTO()) .build(); } + + /** + * @description re-aplly a given value to the transaction in an immutable way + * @param {Deadline} deadline + * @returns {Transaction} + * @memberof Transaction + */ + public reaplygiven(newDeadline: Deadline): MosaicSupplyChangeTransaction { + + if (this.isUnannounced) { + return new MosaicSupplyChangeTransaction( + this.networkType, + this.version, + newDeadline, + this.fee, + this.mosaicId, + this.direction, + this.delta, + this.signature, + this.signer); + } else { + throw new Error('Should not modify an announced transaction'); + } + } } From 380be823b72e2daa21f0c2dc1979510b668f5194 Mon Sep 17 00:00:00 2001 From: gimyboya Date: Mon, 16 Jul 2018 22:39:44 +0800 Subject: [PATCH 08/13] reapply given for namespace --- .../RegisterNamespaceTransaction.ts | 51 +++++++++++++------ 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/src/model/transaction/RegisterNamespaceTransaction.ts b/src/model/transaction/RegisterNamespaceTransaction.ts index 553100257b..45f650b139 100644 --- a/src/model/transaction/RegisterNamespaceTransaction.ts +++ b/src/model/transaction/RegisterNamespaceTransaction.ts @@ -14,21 +14,16 @@ * limitations under the License. */ -import { - NamespaceCreationTransaction as RegisterNamespaceTransactionLibrary, - subnamespaceNamespaceId, - subnamespaceParentId, - VerifiableTransaction, -} from 'nem2-library'; -import {PublicAccount} from '../account/PublicAccount'; -import {NetworkType} from '../blockchain/NetworkType'; -import {NamespaceId} from '../namespace/NamespaceId'; -import {NamespaceType} from '../namespace/NamespaceType'; -import {UInt64} from '../UInt64'; -import {Deadline} from './Deadline'; -import {Transaction} from './Transaction'; -import {TransactionInfo} from './TransactionInfo'; -import {TransactionType} from './TransactionType'; +import { NamespaceCreationTransaction as RegisterNamespaceTransactionLibrary, subnamespaceNamespaceId, subnamespaceParentId, VerifiableTransaction } from 'nem2-library'; +import { PublicAccount } from '../account/PublicAccount'; +import { NetworkType } from '../blockchain/NetworkType'; +import { NamespaceId } from '../namespace/NamespaceId'; +import { NamespaceType } from '../namespace/NamespaceType'; +import { UInt64 } from '../UInt64'; +import { Deadline } from './Deadline'; +import { Transaction } from './Transaction'; +import { TransactionInfo } from './TransactionInfo'; +import { TransactionType } from './TransactionType'; /** * Accounts can rent a namespace for an amount of blocks and after a this renew the contract. @@ -155,4 +150,30 @@ export class RegisterNamespaceTransaction extends Transaction { return registerNamespacetransaction.build(); } + + /** + * @description re-aplly a given value to the transaction in an immutable way + * @param {Deadline} deadline + * @returns {Transaction} + * @memberof Transaction + */ + public reaplygiven(newDeadline: Deadline): RegisterNamespaceTransaction { + + if (this.isUnannounced) { + return new RegisterNamespaceTransaction( + this.networkType, + this.version, + newDeadline, + this.fee, + this.namespaceType, + this.namespaceName, + this.namespaceId, + this.duration, + this.parentId, + this.signature, + this.signer); + } else { + throw new Error('Should not modify an announced transaction'); + } + } } From ec9747bda733bbf3a82601912e206ad56e7a543b Mon Sep 17 00:00:00 2001 From: gimyboya Date: Mon, 16 Jul 2018 22:39:55 +0800 Subject: [PATCH 09/13] reapply given for secrete --- .../transaction/SecretLockTransaction.ts | 48 ++++++++++++++----- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/src/model/transaction/SecretLockTransaction.ts b/src/model/transaction/SecretLockTransaction.ts index 494069d833..8959cb433f 100644 --- a/src/model/transaction/SecretLockTransaction.ts +++ b/src/model/transaction/SecretLockTransaction.ts @@ -13,17 +13,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {SecretLockTransaction as SecretLockTransactionLibrary, VerifiableTransaction} from 'nem2-library'; -import {Address} from '../account/Address'; -import {PublicAccount} from '../account/PublicAccount'; -import {NetworkType} from '../blockchain/NetworkType'; -import {Mosaic} from '../mosaic/Mosaic'; -import {UInt64} from '../UInt64'; -import {Deadline} from './Deadline'; -import {HashType, HashTypeLengthValidator} from './HashType'; -import {Transaction} from './Transaction'; -import {TransactionInfo} from './TransactionInfo'; -import {TransactionType} from './TransactionType'; +import { SecretLockTransaction as SecretLockTransactionLibrary, VerifiableTransaction } from 'nem2-library'; +import { Address } from '../account/Address'; +import { PublicAccount } from '../account/PublicAccount'; +import { NetworkType } from '../blockchain/NetworkType'; +import { Mosaic } from '../mosaic/Mosaic'; +import { UInt64 } from '../UInt64'; +import { Deadline } from './Deadline'; +import { HashType, HashTypeLengthValidator } from './HashType'; +import { Transaction } from './Transaction'; +import { TransactionInfo } from './TransactionInfo'; +import { TransactionType } from './TransactionType'; export class SecretLockTransaction extends Transaction { @@ -125,4 +125,30 @@ export class SecretLockTransaction extends Transaction { .addRecipient(this.recipient.plain()) .build(); } + + /** + * @description re-aplly a given value to the transaction in an immutable way + * @param {Deadline} deadline + * @returns {Transaction} + * @memberof Transaction + */ + public reaplygiven(newDeadline: Deadline): SecretLockTransaction { + + if (this.isUnannounced) { + return new SecretLockTransaction( + this.networkType, + this.version, + newDeadline, + this.fee, + this.mosaic, + this.duration, + this.hashType, + this.secret, + this.recipient, + this.signature, + this.signer); + } else { + throw new Error('Should not modify an announced transaction'); + } + } } From c4cdb1c20b31d295178daf65eed4661636cf1634 Mon Sep 17 00:00:00 2001 From: gimyboya Date: Mon, 16 Jul 2018 22:40:08 +0800 Subject: [PATCH 10/13] reapply given for secrete --- .../transaction/SecretProofTransaction.ts | 42 +++++++++++++++---- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/src/model/transaction/SecretProofTransaction.ts b/src/model/transaction/SecretProofTransaction.ts index 5e23e91c31..ee77abedee 100644 --- a/src/model/transaction/SecretProofTransaction.ts +++ b/src/model/transaction/SecretProofTransaction.ts @@ -13,15 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {SecretProofTransaction as SecretProofTransactionLibrary, VerifiableTransaction} from 'nem2-library'; -import {PublicAccount} from '../account/PublicAccount'; -import {NetworkType} from '../blockchain/NetworkType'; -import {UInt64} from '../UInt64'; -import {Deadline} from './Deadline'; -import {HashType, HashTypeLengthValidator} from './HashType'; -import {Transaction} from './Transaction'; -import {TransactionInfo} from './TransactionInfo'; -import {TransactionType} from './TransactionType'; +import { SecretProofTransaction as SecretProofTransactionLibrary, VerifiableTransaction } from 'nem2-library'; +import { PublicAccount } from '../account/PublicAccount'; +import { NetworkType } from '../blockchain/NetworkType'; +import { UInt64 } from '../UInt64'; +import { Deadline } from './Deadline'; +import { HashType, HashTypeLengthValidator } from './HashType'; +import { Transaction } from './Transaction'; +import { TransactionInfo } from './TransactionInfo'; +import { TransactionType } from './TransactionType'; export class SecretProofTransaction extends Transaction { @@ -95,4 +95,28 @@ export class SecretProofTransaction extends Transaction { .addProof(this.proof) .build(); } + + /** + * @description re-aplly a given value to the transaction in an immutable way + * @param {Deadline} deadline + * @returns {Transaction} + * @memberof Transaction + */ + public reaplygiven(newDeadline: Deadline): SecretProofTransaction { + + if (this.isUnannounced) { + return new SecretProofTransaction( + this.networkType, + this.version, + newDeadline, + this.fee, + this.hashType, + this.secret, + this.proof, + this.signature, + this.signer); + } else { + throw new Error('Should not modify an announced transaction'); + } + } } From 012b3a3c8c6950e44c87c20d3916bb1af5c07686 Mon Sep 17 00:00:00 2001 From: gimyboya Date: Mon, 16 Jul 2018 22:40:43 +0800 Subject: [PATCH 11/13] reapply given for transfer --- src/model/transaction/TransferTransaction.ts | 46 +++++++++++++++----- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/src/model/transaction/TransferTransaction.ts b/src/model/transaction/TransferTransaction.ts index 0176762a97..b4afd7be63 100644 --- a/src/model/transaction/TransferTransaction.ts +++ b/src/model/transaction/TransferTransaction.ts @@ -14,17 +14,17 @@ * limitations under the License. */ -import {TransferTransaction as TransferTransactionLibrary, VerifiableTransaction,} from 'nem2-library'; -import {Address} from '../account/Address'; -import {PublicAccount} from '../account/PublicAccount'; -import {NetworkType} from '../blockchain/NetworkType'; -import {Mosaic} from '../mosaic/Mosaic'; -import {UInt64} from '../UInt64'; -import {Deadline} from './Deadline'; -import {Message} from './Message'; -import {Transaction} from './Transaction'; -import {TransactionInfo} from './TransactionInfo'; -import {TransactionType} from './TransactionType'; +import { TransferTransaction as TransferTransactionLibrary, VerifiableTransaction } from 'nem2-library'; +import { Address } from '../account/Address'; +import { PublicAccount } from '../account/PublicAccount'; +import { NetworkType } from '../blockchain/NetworkType'; +import { Mosaic } from '../mosaic/Mosaic'; +import { UInt64 } from '../UInt64'; +import { Deadline } from './Deadline'; +import { Message } from './Message'; +import { Transaction } from './Transaction'; +import { TransactionInfo } from './TransactionInfo'; +import { TransactionType } from './TransactionType'; /** * Transfer transactions contain data about transfers of mosaics and message to another account. @@ -101,4 +101,28 @@ export class TransferTransaction extends Transaction { .addMessage(this.message) .build(); } + + /** + * @description re-aplly a given value to the transaction in an immutable way + * @param {Deadline} deadline + * @returns {Transaction} + * @memberof Transaction + */ + public reaplygiven(newDeadline: Deadline): TransferTransaction { + + if (this.isUnannounced) { + return new TransferTransaction( + this.networkType, + this.version, + newDeadline, + this.fee, + this.recipient, + this.mosaics, + this.message, + this.signature, + this.signer); + } else { + throw new Error('Should not modify an announced transaction'); + } + } } From 06cf5472eaa92989b8e5fd9a07c28c8a0180fc0c Mon Sep 17 00:00:00 2001 From: gimyboya Date: Tue, 17 Jul 2018 14:57:19 +0800 Subject: [PATCH 12/13] short implementation + test --- package.json | 1 + src/model/transaction/AggregateTransaction.ts | 24 --------- src/model/transaction/LockFundsTransaction.ts | 24 --------- .../ModifyMultisigAccountTransaction.ts | 23 --------- .../MosaicDefinitionTransaction.ts | 24 --------- .../MosaicSupplyChangeTransaction.ts | 23 --------- .../RegisterNamespaceTransaction.ts | 25 ---------- .../transaction/SecretLockTransaction.ts | 25 ---------- .../transaction/SecretProofTransaction.ts | 23 --------- src/model/transaction/Transaction.ts | 8 ++- src/model/transaction/TransferTransaction.ts | 23 --------- test/model/transaction/Transaction.spec.ts | 50 +++++++++++++++++-- .../transaction/TransferTransaction.spec.ts | 18 +++---- 13 files changed, 63 insertions(+), 228 deletions(-) diff --git a/package.json b/package.json index 1471f9cbbb..803e6292cf 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "scripts": { "pretest": "npm run build", "test": "mocha --ui bdd --recursive ./dist/test --timeout 90000", + "tran": "mocha --ui bdd --recursive ./dist/test/model/transaction/Transaction.spec --timeout 90000", "test:e2e": "mocha --ui bdd --recursive ./dist/e2e --timeout 90000", "test:all": "mocha --ui bdd --recursive ./dist/ --timeout 90000", "build": "rm -rf dist/ && tsc", diff --git a/src/model/transaction/AggregateTransaction.ts b/src/model/transaction/AggregateTransaction.ts index 3537547b48..a14106085d 100644 --- a/src/model/transaction/AggregateTransaction.ts +++ b/src/model/transaction/AggregateTransaction.ts @@ -145,28 +145,4 @@ export class AggregateTransaction extends Transaction { || (this.signer !== undefined && this.signer.equals(publicAccount)); } - /** - * @description re-aplly a given value to the transaction in an immutable way - * @param {Deadline} deadline - * @returns {Transaction} - * @memberof Transaction - */ - public reaplygiven(newDeadline: Deadline): AggregateTransaction { - - if (this.isUnannounced) { - return new AggregateTransaction( - this.networkType, - this.type, - this.version, - newDeadline, - this.fee, - this.innerTransactions, - this.cosignatures, - this.signature, - this.signer); - } else { - throw new Error('Should not modify an announced transaction'); - } - } - } diff --git a/src/model/transaction/LockFundsTransaction.ts b/src/model/transaction/LockFundsTransaction.ts index 1668691bad..d4846d7149 100644 --- a/src/model/transaction/LockFundsTransaction.ts +++ b/src/model/transaction/LockFundsTransaction.ts @@ -114,28 +114,4 @@ export class LockFundsTransaction extends Transaction { .build(); } - /** - * @description re-aplly a given value to the transaction in an immutable way - * @param {Deadline} deadline - * @returns {Transaction} - * @memberof Transaction - */ - public reaplygiven(deadline: Deadline, signedTransaction: SignedTransaction): LockFundsTransaction { - - if (this.isUnannounced) { - return new LockFundsTransaction( - this.networkType, - this.type, - deadline, - this.fee, - this.mosaic, - this.duration, - signedTransaction, - this.signature, - this.signer); - } else { - throw new Error('Should not modify an announced transaction'); - } - } - } diff --git a/src/model/transaction/ModifyMultisigAccountTransaction.ts b/src/model/transaction/ModifyMultisigAccountTransaction.ts index b460c0a71a..ebf3e2e98f 100644 --- a/src/model/transaction/ModifyMultisigAccountTransaction.ts +++ b/src/model/transaction/ModifyMultisigAccountTransaction.ts @@ -106,27 +106,4 @@ export class ModifyMultisigAccountTransaction extends Transaction { .build(); } - /** - * @description re-aplly a given value to the transaction in an immutable way - * @param {Deadline} deadline - * @returns {Transaction} - * @memberof Transaction - */ - public reaplygiven(newDeadline: Deadline): ModifyMultisigAccountTransaction { - - if (this.isUnannounced) { - return new ModifyMultisigAccountTransaction( - this.networkType, - this.version, - newDeadline, - this.fee, - this.minApprovalDelta, - this.minRemovalDelta, - this.modifications, - this.signature, - this.signer); - } else { - throw new Error('Should not modify an announced transaction'); - } - } } diff --git a/src/model/transaction/MosaicDefinitionTransaction.ts b/src/model/transaction/MosaicDefinitionTransaction.ts index 3196ef4cb7..f83cc9ca9a 100644 --- a/src/model/transaction/MosaicDefinitionTransaction.ts +++ b/src/model/transaction/MosaicDefinitionTransaction.ts @@ -126,28 +126,4 @@ export class MosaicDefinitionTransaction extends Transaction { return mosaicDefinitionTransaction.build(); } - /** - * @description re-aplly a given value to the transaction in an immutable way - * @param {Deadline} deadline - * @returns {Transaction} - * @memberof Transaction - */ - public reaplygiven(newDeadline: Deadline): MosaicDefinitionTransaction { - - if (this.isUnannounced) { - return new MosaicDefinitionTransaction( - this.networkType, - this.version, - newDeadline, - this.fee, - this.parentId, - this.mosaicId, - this.mosaicName, - this.mosaicProperties, - this.signature, - this.signer); - } else { - throw new Error('Should not modify an announced transaction'); - } - } } diff --git a/src/model/transaction/MosaicSupplyChangeTransaction.ts b/src/model/transaction/MosaicSupplyChangeTransaction.ts index dd339edd03..36fc2d626e 100644 --- a/src/model/transaction/MosaicSupplyChangeTransaction.ts +++ b/src/model/transaction/MosaicSupplyChangeTransaction.ts @@ -104,27 +104,4 @@ export class MosaicSupplyChangeTransaction extends Transaction { .build(); } - /** - * @description re-aplly a given value to the transaction in an immutable way - * @param {Deadline} deadline - * @returns {Transaction} - * @memberof Transaction - */ - public reaplygiven(newDeadline: Deadline): MosaicSupplyChangeTransaction { - - if (this.isUnannounced) { - return new MosaicSupplyChangeTransaction( - this.networkType, - this.version, - newDeadline, - this.fee, - this.mosaicId, - this.direction, - this.delta, - this.signature, - this.signer); - } else { - throw new Error('Should not modify an announced transaction'); - } - } } diff --git a/src/model/transaction/RegisterNamespaceTransaction.ts b/src/model/transaction/RegisterNamespaceTransaction.ts index 45f650b139..cb21d7a370 100644 --- a/src/model/transaction/RegisterNamespaceTransaction.ts +++ b/src/model/transaction/RegisterNamespaceTransaction.ts @@ -151,29 +151,4 @@ export class RegisterNamespaceTransaction extends Transaction { return registerNamespacetransaction.build(); } - /** - * @description re-aplly a given value to the transaction in an immutable way - * @param {Deadline} deadline - * @returns {Transaction} - * @memberof Transaction - */ - public reaplygiven(newDeadline: Deadline): RegisterNamespaceTransaction { - - if (this.isUnannounced) { - return new RegisterNamespaceTransaction( - this.networkType, - this.version, - newDeadline, - this.fee, - this.namespaceType, - this.namespaceName, - this.namespaceId, - this.duration, - this.parentId, - this.signature, - this.signer); - } else { - throw new Error('Should not modify an announced transaction'); - } - } } diff --git a/src/model/transaction/SecretLockTransaction.ts b/src/model/transaction/SecretLockTransaction.ts index 8959cb433f..2972d1cc15 100644 --- a/src/model/transaction/SecretLockTransaction.ts +++ b/src/model/transaction/SecretLockTransaction.ts @@ -126,29 +126,4 @@ export class SecretLockTransaction extends Transaction { .build(); } - /** - * @description re-aplly a given value to the transaction in an immutable way - * @param {Deadline} deadline - * @returns {Transaction} - * @memberof Transaction - */ - public reaplygiven(newDeadline: Deadline): SecretLockTransaction { - - if (this.isUnannounced) { - return new SecretLockTransaction( - this.networkType, - this.version, - newDeadline, - this.fee, - this.mosaic, - this.duration, - this.hashType, - this.secret, - this.recipient, - this.signature, - this.signer); - } else { - throw new Error('Should not modify an announced transaction'); - } - } } diff --git a/src/model/transaction/SecretProofTransaction.ts b/src/model/transaction/SecretProofTransaction.ts index ee77abedee..532bc21542 100644 --- a/src/model/transaction/SecretProofTransaction.ts +++ b/src/model/transaction/SecretProofTransaction.ts @@ -96,27 +96,4 @@ export class SecretProofTransaction extends Transaction { .build(); } - /** - * @description re-aplly a given value to the transaction in an immutable way - * @param {Deadline} deadline - * @returns {Transaction} - * @memberof Transaction - */ - public reaplygiven(newDeadline: Deadline): SecretProofTransaction { - - if (this.isUnannounced) { - return new SecretProofTransaction( - this.networkType, - this.version, - newDeadline, - this.fee, - this.hashType, - this.secret, - this.proof, - this.signature, - this.signer); - } else { - throw new Error('Should not modify an announced transaction'); - } - } } diff --git a/src/model/transaction/Transaction.ts b/src/model/transaction/Transaction.ts index d548100a11..c164c10c07 100644 --- a/src/model/transaction/Transaction.ts +++ b/src/model/transaction/Transaction.ts @@ -163,5 +163,11 @@ export abstract class Transaction { * @returns {Transaction} * @memberof Transaction */ - public abstract reaplygiven(deadline: Deadline, signedTransaction?: SignedTransaction): Transaction; + public reapplygiven(deadline: Deadline): Transaction { + if (this.isUnannounced()) { + return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, {deadline}); + } else { + throw new Error('an Announced transaction can\'t be modified'); + } + } } diff --git a/src/model/transaction/TransferTransaction.ts b/src/model/transaction/TransferTransaction.ts index b4afd7be63..c4608921de 100644 --- a/src/model/transaction/TransferTransaction.ts +++ b/src/model/transaction/TransferTransaction.ts @@ -102,27 +102,4 @@ export class TransferTransaction extends Transaction { .build(); } - /** - * @description re-aplly a given value to the transaction in an immutable way - * @param {Deadline} deadline - * @returns {Transaction} - * @memberof Transaction - */ - public reaplygiven(newDeadline: Deadline): TransferTransaction { - - if (this.isUnannounced) { - return new TransferTransaction( - this.networkType, - this.version, - newDeadline, - this.fee, - this.recipient, - this.mosaics, - this.message, - this.signature, - this.signer); - } else { - throw new Error('Should not modify an announced transaction'); - } - } } diff --git a/test/model/transaction/Transaction.spec.ts b/test/model/transaction/Transaction.spec.ts index 4281fe826e..ba6a825de3 100644 --- a/test/model/transaction/Transaction.spec.ts +++ b/test/model/transaction/Transaction.spec.ts @@ -98,6 +98,52 @@ describe('Transaction', () => { expect(transaction.hasMissingSignatures()).to.be.equal(true); }); }); + + describe('reapplygiven', () => { + it('should throw an error if the transaction is announced', () => { + const transaction = new FakeTransaction(TransactionType.TRANSFER, + NetworkType.MIJIN_TEST, + 1, + Deadline.create(), + UInt64.fromUint(0), + undefined, + undefined, + new TransactionInfo(UInt64.fromUint(100), 1, 'id_hash', 'hash', 'hash'), + ); + expect(() => { + transaction.reapplygiven(Deadline.create()); + }).to.throws('an Announced transaction can\'t be modified'); + }); + it('should return a new transaction', () => { + const transaction = new FakeTransaction(TransactionType.TRANSFER, + NetworkType.MIJIN_TEST, + 1, + Deadline.create(), + UInt64.fromUint(0), + undefined, + undefined, + ); + + const newTransaction = transaction.reapplygiven(Deadline.create()); + expect(newTransaction).to.not.equal(transaction); + }); + it('should overide deadline properly', () => { + const transaction = new FakeTransaction(TransactionType.TRANSFER, + NetworkType.MIJIN_TEST, + 1, + Deadline.create(), + UInt64.fromUint(0), + undefined, + undefined, + ); + + const newTransaction = transaction.reapplygiven(Deadline.create(3)); + const equal = newTransaction.deadline.value.equals(transaction.deadline.value); + const after = newTransaction.deadline.value.isAfter(transaction.deadline.value); + expect(equal).to.be.equal(false); + expect(after).to.be.equal(true); + }); + }); }); class FakeTransaction extends Transaction { @@ -108,8 +154,4 @@ class FakeTransaction extends Transaction { protected buildTransaction(): VerifiableTransaction { throw new Error('Method not implemented.'); } - - public reaplygiven(newdeadline: Deadline): Transaction { - throw new Error('Method not implemented.'); - } } diff --git a/test/model/transaction/TransferTransaction.spec.ts b/test/model/transaction/TransferTransaction.spec.ts index de8f92d844..b0c1647d01 100644 --- a/test/model/transaction/TransferTransaction.spec.ts +++ b/test/model/transaction/TransferTransaction.spec.ts @@ -14,15 +14,15 @@ * limitations under the License. */ -import {expect} from 'chai'; -import {Account} from '../../../src/model/account/Account'; -import {Address} from '../../../src/model/account/Address'; -import {XEM} from '../../../src/model/mosaic/XEM'; -import {Deadline} from '../../../src/model/transaction/Deadline'; -import {PlainMessage} from '../../../src/model/transaction/PlainMessage'; -import {TransferTransaction} from '../../../src/model/transaction/TransferTransaction'; -import {TestingAccount} from '../../conf/conf.spec'; -import {NetworkType} from '../../../src/model/blockchain/NetworkType'; +import { expect } from 'chai'; +import { Account } from '../../../src/model/account/Account'; +import { Address } from '../../../src/model/account/Address'; +import { NetworkType } from '../../../src/model/blockchain/NetworkType'; +import { XEM } from '../../../src/model/mosaic/XEM'; +import { Deadline } from '../../../src/model/transaction/Deadline'; +import { PlainMessage } from '../../../src/model/transaction/PlainMessage'; +import { TransferTransaction } from '../../../src/model/transaction/TransferTransaction'; +import { TestingAccount } from '../../conf/conf.spec'; describe('TransferTransaction', () => { let account: Account; From 142da277c8e64ebdbc5bf246eb035446d41651a0 Mon Sep 17 00:00:00 2001 From: gimyboya Date: Tue, 17 Jul 2018 16:04:31 +0800 Subject: [PATCH 13/13] followed Aleix style --- package.json | 1 - src/model/transaction/Transaction.ts | 5 ++--- test/model/transaction/Transaction.spec.ts | 10 ++++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 803e6292cf..1471f9cbbb 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,6 @@ "scripts": { "pretest": "npm run build", "test": "mocha --ui bdd --recursive ./dist/test --timeout 90000", - "tran": "mocha --ui bdd --recursive ./dist/test/model/transaction/Transaction.spec --timeout 90000", "test:e2e": "mocha --ui bdd --recursive ./dist/e2e --timeout 90000", "test:all": "mocha --ui bdd --recursive ./dist/ --timeout 90000", "build": "rm -rf dist/ && tsc", diff --git a/src/model/transaction/Transaction.ts b/src/model/transaction/Transaction.ts index c164c10c07..65a8fcc792 100644 --- a/src/model/transaction/Transaction.ts +++ b/src/model/transaction/Transaction.ts @@ -163,11 +163,10 @@ export abstract class Transaction { * @returns {Transaction} * @memberof Transaction */ - public reapplygiven(deadline: Deadline): Transaction { + public replyGiven(deadline: Deadline = Deadline.create()): Transaction { if (this.isUnannounced()) { return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, {deadline}); - } else { - throw new Error('an Announced transaction can\'t be modified'); } + throw new Error('an Announced transaction can\'t be modified'); } } diff --git a/test/model/transaction/Transaction.spec.ts b/test/model/transaction/Transaction.spec.ts index ba6a825de3..6d1987ecce 100644 --- a/test/model/transaction/Transaction.spec.ts +++ b/test/model/transaction/Transaction.spec.ts @@ -99,7 +99,7 @@ describe('Transaction', () => { }); }); - describe('reapplygiven', () => { + describe('replyGiven', () => { it('should throw an error if the transaction is announced', () => { const transaction = new FakeTransaction(TransactionType.TRANSFER, NetworkType.MIJIN_TEST, @@ -111,7 +111,7 @@ describe('Transaction', () => { new TransactionInfo(UInt64.fromUint(100), 1, 'id_hash', 'hash', 'hash'), ); expect(() => { - transaction.reapplygiven(Deadline.create()); + transaction.replyGiven(Deadline.create()); }).to.throws('an Announced transaction can\'t be modified'); }); it('should return a new transaction', () => { @@ -124,7 +124,7 @@ describe('Transaction', () => { undefined, ); - const newTransaction = transaction.reapplygiven(Deadline.create()); + const newTransaction = transaction.replyGiven(Deadline.create()); expect(newTransaction).to.not.equal(transaction); }); it('should overide deadline properly', () => { @@ -137,9 +137,11 @@ describe('Transaction', () => { undefined, ); - const newTransaction = transaction.reapplygiven(Deadline.create(3)); + const newDeadline = Deadline.create(3); + const newTransaction = transaction.replyGiven(newDeadline); const equal = newTransaction.deadline.value.equals(transaction.deadline.value); const after = newTransaction.deadline.value.isAfter(transaction.deadline.value); + expect(newTransaction.deadline).to.be.equal(newDeadline); expect(equal).to.be.equal(false); expect(after).to.be.equal(true); });