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/AggregateTransaction.ts b/src/model/transaction/AggregateTransaction.ts index 9138b977b1..a14106085d 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. diff --git a/src/model/transaction/LockFundsTransaction.ts b/src/model/transaction/LockFundsTransaction.ts index 96b8bade5c..d4846d7149 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. diff --git a/src/model/transaction/ModifyMultisigAccountTransaction.ts b/src/model/transaction/ModifyMultisigAccountTransaction.ts index cac88b6e42..ebf3e2e98f 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,5 @@ export class ModifyMultisigAccountTransaction extends Transaction { .addModifications(this.modifications.map((modification) => modification.toDTO())) .build(); } + } diff --git a/src/model/transaction/MosaicDefinitionTransaction.ts b/src/model/transaction/MosaicDefinitionTransaction.ts index 2cafe9889d..f83cc9ca9a 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,5 @@ export class MosaicDefinitionTransaction extends Transaction { return mosaicDefinitionTransaction.build(); } + } diff --git a/src/model/transaction/MosaicSupplyChangeTransaction.ts b/src/model/transaction/MosaicSupplyChangeTransaction.ts index 2f8a8c18ec..36fc2d626e 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,5 @@ export class MosaicSupplyChangeTransaction extends Transaction { .addDelta(this.delta.toDTO()) .build(); } + } diff --git a/src/model/transaction/RegisterNamespaceTransaction.ts b/src/model/transaction/RegisterNamespaceTransaction.ts index 553100257b..cb21d7a370 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,5 @@ export class RegisterNamespaceTransaction extends Transaction { return registerNamespacetransaction.build(); } + } diff --git a/src/model/transaction/SecretLockTransaction.ts b/src/model/transaction/SecretLockTransaction.ts index 494069d833..2972d1cc15 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,5 @@ export class SecretLockTransaction extends Transaction { .addRecipient(this.recipient.plain()) .build(); } + } diff --git a/src/model/transaction/SecretProofTransaction.ts b/src/model/transaction/SecretProofTransaction.ts index 5e23e91c31..532bc21542 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,5 @@ export class SecretProofTransaction extends Transaction { .addProof(this.proof) .build(); } + } diff --git a/src/model/transaction/Transaction.ts b/src/model/transaction/Transaction.ts index 53e50e38dc..65a8fcc792 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. @@ -156,4 +156,17 @@ 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 replyGiven(deadline: Deadline = Deadline.create()): Transaction { + if (this.isUnannounced()) { + return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, {deadline}); + } + 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 0176762a97..c4608921de 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,5 @@ export class TransferTransaction extends Transaction { .addMessage(this.message) .build(); } + } diff --git a/test/model/transaction/Transaction.spec.ts b/test/model/transaction/Transaction.spec.ts index 673b3a824a..6d1987ecce 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', () => { @@ -98,6 +98,54 @@ describe('Transaction', () => { expect(transaction.hasMissingSignatures()).to.be.equal(true); }); }); + + describe('replyGiven', () => { + 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.replyGiven(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.replyGiven(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 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); + }); + }); }); class FakeTransaction extends Transaction { 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;